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つの質問をします。
3つのファイルは正確に何をしていますか?
パス/var/lib/mysql/
の下に新しいディレクトリを作成し、db_test_2
と言って、すべてのファイルをdb_test_1
ディレクトリからdb_test_2
にコピーすると、新しいデータベースdb_test_2
も作成されますdb_test_1
とまったく同じ内容(テーブル)を持つもの
この物理的にデータベースファイルを移動するアクションは、次のコマンドラインアクションと同じ結果になりますか?
データベースをダンプするdb_test_1
out
新しいデータベースを作成するdb_test_2
次に、db_test_1
データベースを新しいデータベースにダンプしますdb_test_2
?
その場合、mysqldump
を使用してデータベースをコピーする(またはMySQLのあるDBから別のDBにデータをインポートする)よりも、ファイルを移動する方がはるかに高速です。これについての意見は?
AFAIR、.frmはディスクリプションファイル(データベーステーブルの構造が記述されている)、. MYDはデータのあるファイル、.MYIはインデックスのあるファイルです。
はい、コピーがはるかに速くなります。しかし、1つの問題があります。それはアトミックではありません。高負荷状態では、コピーされたファイルは一貫性がなく、場合によってはまったく破損することもあります。特に、InnoDBなどの「スマート」エンジンを使用している場合はなおさらです。
編集: p.s.これらのファイルは安全にコピーできますが、その前にmysqlサーバーを停止する必要があります。
これを正確に行うコマンドラインツールがあります: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アーカイブを作成できます。
これはMyISAMでは機能しますが、InnoDBでは機能しません。参照 https://serverfault.com/a/367321/57569
その答えから、InnoDBについて:
.frmと.ibdファイルを単にコピーすることを考えているなら、痛い世界に向かっていることになります。 InnoDBテーブルの.frmおよび.ibdファイルのコピーは、.ibdファイルのテーブルスペースIDがibdata1ファイルのmetdataのテーブルスペースIDエントリと正確に一致することが保証できる場合にのみ有効です。