web-dev-qa-db-ja.com

Linux / mysql:mysqlコマンドをcpコマンドで1つのdbから別のdbにコピーしても安全ですか?

ほとんどのガイドでは、あるテーブルを別のデータベースにコピーするために、mysqldumpと単純なSQLを推奨しています。 Linux Shell cpはどうですか?単純にできますか

11
giorgio79

MyISAMのコピーは非常に簡単で、InnoDBを使用すると完全に100%リスク(自殺に近い)になります。

あなたの質問から、あなたは育てました

cp /db1/mytable.frm /db2/mytable.frm

MyISAM

これで問題ありません。ただし、.frmだけを移動することはできません。すべてのコンポーネントを移動する必要があります。質問から、db1.mytableというテーブルを見てみましょう。通常のインストールでは、テーブルは/ var/lib/mysql/db1にあります。テーブルを構成する3つのファイルがあります。

  • /var/lib/mysql/db1/mytable.frm
  • /var/lib/mysql/db1/mytable.MYD(テーブルデータベース)
  • /var/lib/mysql/db1/mytable.MYI(テーブルインデックス)

1つのテーブルを移動するには、3つのファイルすべてを移動する必要があります。すべてのテーブルがMyISAMストレージエンジンを使用している場合、mysqlをシャットダウンしてコピーすることができます。テーブルのコピーを作成して別のデータベースに配置するだけの場合は、SQLを使用してそれを行う必要があります。

たとえば、db1.mytableをデータベースdb2にコピーする場合は、次のようにします。

CREATE TABLE db2.mytable LIKE db1.mytable;
ALTER TABLE db2.mytable DISABLE KEYS;
INSERT INTO db2.mytable SELECT * FROM db1.mytable;
ALTER TABLE db2.mytable ENABLE KEYS;

これで、テーブルをdb1からdb2に移動するだけで、これを実行できます。

ALTER TABLE db1.mytable RENAME db2.mytable;

InnoDB

InnoDBが動作するインフラストラクチャのため、コピーは非常に危険です。 2つの基本的なインフラストラクチャがあります。1)innodb_file_per_tableが無効、2)innodb_file_per_tableが有効

InnoDBのアキレス腱は、ibdata1と呼ばれるシステムテーブルスペースファイルです(通常は/ var/lib/mysqlにあります)。 そのファイルに含まれるもの

InnoDB(innodb_file_per_tableが無効)

Innodb_file_per_tableを無効にすると、これらすべてのタイプのInnoDB情報がibdata1内に存在します。 ibdata1外のInnoDBテーブルの唯一の症状は、InnoDBテーブルの.frmファイルです。すべてのInnoDBデータを一度にコピーするには、/ var/lib/mysqlをすべてコピーする必要があります。

個々のInnoDBテーブルをコピーすることは完全に不可能です。データの論理表現とそれに対応するインデックス定義としてテーブルのダンプを抽出するには、mysqldumpを実行する必要があります。次に、そのダンプを同じサーバーまたは別のサーバー上の別のデータベースにロードします。

InnoDB(innodb_file_per_tableが有効)

Innodb_file_per_tableを有効にすると、テーブルデータとそのインデックスが.frmファイルの横のデータベースフォルダーに格納されます。たとえば、テーブルdb1.mytableの場合、ibdata1の外部にあるそのInnoDBテーブルの明示は次のようになります。

  • /var/lib/mysql/db1/mytable.frm
  • /var/lib/mysql/db1/mytable.ibd

Db1.mytableのすべてのメタデータは依然としてibdata1にあり、それを回避する方法は絶対にありません。やり直しログとMVCCデータもibdata1で引き続き使用できます。

警告(または危険 ロボットはロストインスペースで言う

.frmと.ibdファイルを単にコピーすることを考えているなら、あなたは傷つく世界に並ぶでしょう。 InnoDBテーブルの.frmおよび.ibdファイルのコピーは、.ibdファイルのテーブルスペースIDがibdata1ファイルのmetdataのテーブルスペースIDエントリと正確に一致することが保証できる場合にのみ有効です。

このテーブルスペースIDの概念について、DBA StackExchangeで2つの投稿を書きました

以下は、テーブルスペースIDが一致しない場合に.ibdファイルをibdata1に再アタッチする方法に関する優れたリンクです。 http://www.chriscalender.com/?tag=innodb-error-tablespace-id-in-file 。これを読んだ後、私が自殺の近くで言った理由がわかるはずです。

InnoDBの場合、必要なのはこれだけです

CREATE TABLE db2.mytable LIKE db1.mytable;
INSERT INTO db2.mytable SELECT * FROM db1.mytable;

innoDBテーブルのコピーを作成します。別のDBサーバーに移行する場合は、mysqldumpを使用します。

21
RolandoMySQLDBA

MySQL datadir全体をコピーすることは、MySQLサービスが停止していて、データベースサーバー全体をコピーしたいという前提で、実用的な手法です。

これは、大きなインデックスを持つデータベースをシフトするのに便利なテクニックです。mysqlダンプにはインデックスが含まれません。インデックスはインポート時に再生成する必要があります。このテクニックは、MySQLスレーブを設定するときに役立ちます。

個々のファイルのコピーは、使用中のテーブルスキーマによって異なりますが、ほとんどの場合、適切なソリューションではありません。

8
Coops

xtrabackup w/ow w/o innobackupexラッパーを使用すると、myisamデータベースとinnodbデータベースの両方で問題ありません。なお、innodbデータベースの復元は、xtrabackupを使用しても、単にファイルをコピーバックするだけではありません。さらに情報が必要かどうかを教えてください

2
Gabor Vincze

いいえ、mysqdumpを使用してバックアップし、mysql cliユーティリティを使用して復元します。frmファイルをコピーすると、テーブル構造のみがコピーされ、内部のデータはコピーされません。innodbを使用している場合、ファイルを直接コピーすることはできません。

最善の方法は、テーブルをダンプして復元することです。

1
aleroot