web-dev-qa-db-ja.com

ファイルをコピーしてMySQLデータベースをコピーできますか?ファイルには正確に何が含まれていますか?

MySQLデータベースとUbuntu Linuxマシンを使用しています。

私のデータベースdb_testという名前のパス/var/lib/mysql/db_testの下に、.frm.MYD.MYIのようなファイルサフィックスが次のようにあることに気づきました。

/var/lib/mysql/db_test# ls

cars.frm 
cars.MYD 
cars.MYI

customers.frm
customers.MYD
customers.MYI

departments.frm
departments.MYD
departments.MYI

... 

.frm.MYD.MYIファイルグループは、データベース内の1つのテーブルにマップされているようです。

次の2つの質問をします。

  1. 3つのファイルは正確に何をしていますか?

  2. パス/var/lib/mysql/の下に新しいディレクトリを作成し、db_test_2と言って、すべてのファイルをdb_test_1ディレクトリからdb_test_2にコピーすると、新しいデータベースdb_test_2も作成されますdb_test_1とまったく同じ内容(テーブル)を持つもの

この物理的にデータベースファイルを移動するアクションは、次のコマンドラインアクションと同じ結果になりますか?

  1. データベースをダンプするdb_test_1 out

  2. 新しいデータベースを作成するdb_test_2

  3. 次に、db_test_1データベースを新しいデータベースにダンプしますdb_test_2

その場合、mysqldumpを使用してデータベースをコピーする(またはMySQLのあるDBから別のDBにデータをインポートする)よりも、ファイルを移動する方がはるかに高速です。これについての意見は?

13
Mellon
  1. AFAIR、.frmはディスクリプションファイル(データベーステーブルの構造が記述されている)、. MYDはデータのあるファイル、.MYIはインデックスのあるファイルです。

  2. はい、コピーがはるかに速くなります。しかし、1つの問題があります。それはアトミックではありません。高負荷状態では、コピーされたファイルは一貫性がなく、場合によってはまったく破損することもあります。特に、InnoDBなどの「スマート」エンジンを使用している場合はなおさらです。

編集: p.s.これらのファイルは安全にコピーできますが、その前にmysqlサーバーを停止する必要があります。

5
rvs

これを正確に行うコマンドラインツールがあります:mysqlhotcopy

これは、myisamテーブルで正常に機能しますが、InnoDbテーブルでは機能しません。

Lvmを使用してサーバーを構成し、/ var/lib/mysqlを専用ボリュームに配置した場合、ここですべてのデータベースを非常に高速かつ非ブロック的にバックアップすることをお勧めします。

mysql -U root -p
  > flush tables with read lock;

これにより、すべてのテーブルがディスクにフラッシュされ、すべての読み取り/書き込み操作がブロックされます

  > system "lvcreate -s -L 1G -n lvMysql_snap /dev/vg_myserver/lv_mysql" ;

構成に合わせる必要があります。これにより、データベースのファイルシステムのスナップショットが作成されます。時間はかかりません

  > unlock tables;

これが行われ、R/W操作が再開されます。

これで、/ dev/vg_myserver/lvMysql_snapをマウントして、データベースのtarアーカイブを作成できます。

4
Olivier S

これはMyISAMでは機能しますが、InnoDBでは機能しません。参照 https://serverfault.com/a/367321/57569

その答えから、InnoDBについて:

.frmと.ibdファイルを単にコピーすることを考えているなら、痛い世界に向かっていることになります。 InnoDBテーブルの.frmおよび.ibdファイルのコピーは、.ibdファイルのテーブルスペースIDがibdata1ファイルのmetdataのテーブルスペースIDエントリと正確に一致することが保証できる場合にのみ有効です。

0
Peter V. Mørch