InnoDBのアーキテクチャでは、4つの基本的な種類の情報ページを使用する必要があります
- テーブルデータページ
- テーブルインデックスページ
- テーブルメタデータ
- MVCCデータ(トランザクション分離と ACIDコンプライアンスをサポートするため)
- ロールバックセグメント
- スペースを元に戻す
- ダブルライトバッファー(OSキャッシュへの依存を防ぐためのバックグラウンド書き込み)
- バッファーの挿入(一意でないセカンダリインデックスへの変更の管理)
ibdata1の図解をご覧ください
デフォルトでは、もしinnodb_file_per_tableが無効になっています。これにより、4つの情報ページタイプすべてがibdata1という単一のファイルを取得します。多くの人々は、複数のibdataファイルを作成してデータを分散させようとします。これは、データおよびインデックスページの断片化につながる可能性があります。
これが、デフォルトのibdata1ファイルのみを使用してInnoDBインフラストラクチャをクリーンアップすることをよく推奨する理由です。
InnoDBが機能するインフラストラクチャのため、コピーは非常に危険です。2つの基本的なインフラストラクチャがあります
- innodb_file_per_tableは無効です
- innodb_file_per_tableが有効になっています
ではinnodb_file_per_tableを無効にすると、InnoDBの情報のすべてのこれらのタイプは、ibdata1と内に住んでいます。ibdata1以外のInnoDBテーブルの唯一の症状は、InnoDBテーブルの.frmファイルです。すべてのInnoDBデータを一度にコピーするには、/ var / lib / mysqlをすべてコピーする必要があります。
個々のInnoDBテーブルをコピーすることはまったく不可能です。テーブルのダンプをデータとそれに対応するインデックス定義の論理表現として抽出するには、MySQLダンプする必要があります。次に、そのダンプを同じサーバーまたは別のサーバー上の別のデータベースにロードします。
ではもしinnodb_file_per_tableが有効になって、テーブルのデータとそのインデックスは次の.frmファイルにデータベースフォルダに住んでいます。たとえば、テーブルdb1.mytableの場合、ibdata1以外のInnoDBテーブルのマニフェストは次のようになります。
/var/lib/mysql/db1/mytable.frm
/var/lib/mysql/db1/mytable.ibd
システム表領域 ibdata1
db1.mytableのすべてのメタデータはまだibdata1にあり、それを回避する方法はまったくありません。REDOログとMVCCデータもibdata1と共に存続します。
テーブルの断片化に関しては、ibdata1に何が起こるかを示します。
- innodb_file_per_tableが有効:
ALTER TABLE db1.mytable ENGINE=InnoDB;
またはでdb1.mytablesを縮小できますOPTIMIZE TABLE db1.mytable;
。これにより、/ var / lib / mysql / db1 / mytable.ibdは物理的に小さくなり、断片化は発生しません。
- innodb_file_per_tableが無効になっています。db1.mytablesをibdata1と一緒に、
ALTER TABLE db1.mytable ENGINE=InnoDB;
またはibdata1と一緒に圧縮することはできませんOPTIMIZE TABLE db1.mytable;
。どちらかのコマンドを実際に実行して、テーブルを連続させ、読み書きを高速化します。残念ながら、それはibdata1の最後に発生します。これにより、ibdata1は急速に成長します。これは私のInnoDB Cleanup Postで完全に説明されています。
.frmおよび.ibdファイルを単にコピーすることを考えているなら、あなたは痛む世界に並んでいます。InnoDBテーブルの.frmおよび.ibdファイルのコピーは、.ibdファイルのテーブルスペースIDがibdata1ファイルのメタデータのテーブルスペースIDエントリと正確に一致することを保証できる場合にのみ有効です。
このテーブルスペースIDの概念について、DBA StackExchangeに2つの投稿を書きました。
テーブルスペースIDが一致しない場合に.ibdファイルをibdata1に再アタッチする方法については、http://www.chriscalender.com/?tag = innodb-error-tablespace-id-in-fileを参照してください。これを読んだ後、.ibdファイルをコピーすることは単純にクレイジーであることにすぐに気付くはずです。
InnoDBの場合、移動するのはこれだけです。
CREATE TABLE db2.mytable LIKE db1.mytable;
INSERT INTO db2.mytable SELECT * FROM db1.mytable;
InnoDBテーブルのコピーを作成します。
別のDBサーバーに移行する場合は、mysqldumpを使用します。
すべてのデータベースのすべてのInnoDBテーブルを混合することに関して、実際にそうすることの知恵を見ることができます。雇用主のDB / Webホスティング会社には、1つのデータベースにテーブルがあり、その制約が同じMySQLインスタンス内の別のデータベースの別のテーブルにマッピングされている1つのMySQLクライアントがあります。1つの共通のメタデータリポジトリにより、複数のデータベース間でトランザクションサポートとMVCC操作性が可能になります。