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


11

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

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

回答:


21

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にあります)。そのファイルには何が含まれていますか?

  • テーブルデータページ
  • テーブルインデックスページ
  • テーブルメタデータ(テーブルスペースID管理リスト)
  • MVCCデータ(トランザクション分離と ACIDコンプライアンスをサポートするため)

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にあり、それを回避する方法はまったくありません。REDOログと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を使用します。


4
他の応答はこれを言ったので、おそらく「言うまでもない」かもしれませんが、とにかく言うのは良いことです。データベースがアイドル状態の場合でもInnoDBはファイルへの書き込みを続けるため、MySQLの実行中にファイルをコピーすると破損がほぼ確実になります。この問題を回避するには、シャットダウンするか、ファイルシステムのスナップショットを作成するか、Percona XtraBackupを使用します。
シュヴァルツ男爵

1
いつものように素晴らしい答え、@ Rolando!私が持っている唯一の大きな質問:単純なMySQLダンプおよびインポートを実行するのではなく、なぜこれを実行したいのですか?完全なデータベースサイズを想定していますが、それを提示する必要があります。
JakeGould 14

1
@JakeGould mysqldumpスクリプトをmysqlにロードするには、大量のSQLを処理し、一度に数千行を挿入し、CPUサイクルを使用し、プランのクランキングを実行し、インデックスを再構築します(BTree挿入、リーフノードスプリット、リバランスキー、非各テーブルスキャン) -作成するのに一意)だけで同じテーブルを作成します。MyISAMの場合、なぜ車輪を再発明するのですか?ただのコピー.frm.MYDおよび.MYI
RolandoMySQLDBA 2014

@JakeGould InnoDBの場合、rsyncですべてのInnoDBを使用していたライブデータベースをコピーしました。rsyncを使用してコピーした後、mysqlのシャットダウンを実行し、最後のrsyncを実行し、問題なくmysqlを再起動しました。:私は前のような記事を書いたserverfault.com/questions/288140/...
RolandoMySQLDBA

8

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

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

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


2
説明すると、サービス自体を停止する必要はありません。ファイルシステムに対応している場合は、LVMスナップショットを実行し、それからバックアップできます。または、ファイルシステム自体をフリーズします。
thinice

個人がダウンタイムを食べることができる限り、これは最も簡単な方法です。+1 !!!
RolandoMySQLDBA 2012年

2

使用xtrabackup / OW W / O innobackupexラッパーwが、あなたはMyISAMテーブルとInnoDBのデータベースの両方の罰金になります。なお、innodbデータベースの復元は、xtrabackupを使用しても、単にファイルをコピーするだけではありません。さらに情報が必要かどうかを教えてください


1

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.