ほとんどのガイドでは、あるテーブルを別のデータベースにコピーするために、mysqldumpと単純なSQLを推奨しています。 Linux Shell cpはどうですか?単純にできますか
MyISAMのコピーは非常に簡単で、InnoDBを使用すると完全に100%リスク(自殺に近い)になります。
あなたの質問から、あなたは育てました
cp /db1/mytable.frm /db2/mytable.frm
これで問題ありません。ただし、.frmだけを移動することはできません。すべてのコンポーネントを移動する必要があります。質問から、db1.mytableというテーブルを見てみましょう。通常のインストールでは、テーブルは/ var/lib/mysql/db1にあります。テーブルを構成する3つのファイルがあります。
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が動作するインフラストラクチャのため、コピーは非常に危険です。 2つの基本的なインフラストラクチャがあります。1)innodb_file_per_tableが無効、2)innodb_file_per_tableが有効
InnoDBのアキレス腱は、ibdata1と呼ばれるシステムテーブルスペースファイルです(通常は/ var/lib/mysqlにあります)。 そのファイルに含まれるもの ?
Innodb_file_per_tableを無効にすると、これらすべてのタイプのInnoDB情報がibdata1内に存在します。 ibdata1外のInnoDBテーブルの唯一の症状は、InnoDBテーブルの.frmファイルです。すべてのInnoDBデータを一度にコピーするには、/ var/lib/mysqlをすべてコピーする必要があります。
個々のInnoDBテーブルをコピーすることは完全に不可能です。データの論理表現とそれに対応するインデックス定義としてテーブルのダンプを抽出するには、mysqldumpを実行する必要があります。次に、そのダンプを同じサーバーまたは別のサーバー上の別のデータベースにロードします。
Innodb_file_per_tableを有効にすると、テーブルデータとそのインデックスが.frmファイルの横のデータベースフォルダーに格納されます。たとえば、テーブルdb1.mytableの場合、ibdata1の外部にあるそのInnoDBテーブルの明示は次のようになります。
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を使用します。
MySQL datadir全体をコピーすることは、MySQLサービスが停止していて、データベースサーバー全体をコピーしたいという前提で、実用的な手法です。
これは、大きなインデックスを持つデータベースをシフトするのに便利なテクニックです。mysqlダンプにはインデックスが含まれません。インデックスはインポート時に再生成する必要があります。このテクニックは、MySQLスレーブを設定するときに役立ちます。
個々のファイルのコピーは、使用中のテーブルスキーマによって異なりますが、ほとんどの場合、適切なソリューションではありません。
xtrabackup w/ow w/o innobackupexラッパーを使用すると、myisamデータベースとinnodbデータベースの両方で問題ありません。なお、innodbデータベースの復元は、xtrabackupを使用しても、単にファイルをコピーバックするだけではありません。さらに情報が必要かどうかを教えてください
いいえ、mysqdumpを使用してバックアップし、mysql cliユーティリティを使用して復元します。frmファイルをコピーすると、テーブル構造のみがコピーされ、内部のデータはコピーされません。innodbを使用している場合、ファイルを直接コピーすることはできません。
最善の方法は、テーブルをダンプして復元することです。