テーブルをロックせずにMySQLDumpを実行する


437

ライブプロダクションデータベースをローカルの開発データベースにコピーしたい。本番データベースをロックせずにこれを行う方法はありますか?

私は現在使用しています:

mysqldump -u root --password=xxx -h xxx my_db1 | mysql -u root --password=xxx -h localhost my_db1

しかし、実行中は各テーブルをロックしています。


もう1つの最新のソリューション:Percona XtraBackupを使用して、トランザクション処理に関する中断なしに運用データベースをダンプすることもできます。ホットバックアップが可能です。つまり、現在の活動には影響しません。こちらをご覧ください:percona.com/software/mysql-database/percona-xtrabackup(私はPerconaとは何の関係もありません。)
delx

回答:


625

--lock-tables=falseオプションは機能しますか?

マニュアルページによると、InnoDBテーブルをダンプする場合は、次の--single-transactionオプションを使用できます。

--lock-tables, -l

Lock all tables before dumping them. The tables are locked with READ
LOCAL to allow concurrent inserts in the case of MyISAM tables. For
transactional tables such as InnoDB and BDB, --single-transaction is
a much better option, because it does not need to lock the tables at
all.

以下のためのInnoDB DB

mysqldump --single-transaction=TRUE -u username -p DB

23
innodb DBの場合mysqldump --single-transaction = TRUE -u username -p DB
AMB

19
innodbとmyisamがある場合はどうなりますか?
CMCDragonkai 2015

これはデフォルトでオンになっていますか?
CMCDragonkai 2015

明らかにオン(つまりロック)?
evandrix

290

これは遅すぎる年齢ですが、トピックを検索している人には適しています。innoDBを使用しておらず、ダンプ中にロックする心配がない場合は、次のオプションを使用してください。

--lock-tables=false

1
ウォーレンの回答に感謝します。これは非常に役に立ち、魅力のように機能しました。
ギャビン

7
'--lock-table = false --quick'を使用すると、サーバーリソースが最も少なくなります
SyntaxGoonoo

43
ただし、テーブルのロックについて心配する必要があります。mysqldumpの実行中に複数のテーブルが書き込まれる場合(および外部キーを使用する場合)、ダンプに一貫性がない可能性があります。データを復元して、不整合なデータに対してJOINクエリを実行するまではわかりません。JOINはMysqlではなくアプリケーションで使用されるため(MyISAMテーブルを使用)、不整合なデータが検出されるまでに時間がかかる場合があります。復元は問題なく機能し、mysqlは不整合について警告しません。したがって:MyIsam->常にテーブルをロックします。InnoDB->使用します--single-transaction
コスタ

12
@Costa MyISAMテーブルには、テーブルのロックで十分だとは思いません。mysqldump がアプリケーションによって実行されるクエリの間にテーブルロックすると、同じ不整合が発生します。答えはさらに簡単です。MyISAM->代わりにInnoDBを使用します。
cdhowie 2015

@Costaは間違いなくテーブルのロックについて心配する必要がありますが、一貫したダンプが必要な場合のみです。あなたがそうしないいくつかのまれなケースがあります。たとえば、データベース全体のダンプ(デバッグ)の粗雑なfgrep:ユーザーが本番データベースのダンプを作成するためにユーザーが最大20分間待機することを望まないでしょう(実話)。ASAPだけでなくCONSISTENTもダンプすることが重要な場合は、複製されたスレーブをダンプするか、または低レベルのスナップショット(lvm、zfs、btrfsなど)を使用してくださいFLUSH TABLES WITH READ LOCK
Alex Offshore

44

答えは、使用しているストレージエンジンによって異なります。理想的なシナリオは、InnoDBを使用している場合です。その場合は、--single-transactionフラグを使用できます。これにより、ダンプの開始時にデータベースの一貫したスナップショットが提供されます。


35

--skip-add-locks 私を助けました


2
または--compactを使用して、スキップロックを他の最適化に含めます。
ppostma1 2013年

77
これにより、LOCK TABLESおよびUNLOCK TABLESステートメントがダンプファイルから削除されます。エクスポート中のロックには影響しません。
dabest1 2015年

11
いいえ、それはあなたが探しているものではありません!dabest1のコメントを参照してください。これは、mysqldumpの実行中にテーブルがロックされないようにするためのものではありません。これは質問に対する答えではありません。
2016

@dabestと@orrdは正解です--skip-add-locks。ダンプの復元が速くなるだけです。これは正解ではありません
dr_ 2016年



10

正直なところ、テーブルをロックしない場合、ダンプから一貫性のないデータが取得されるように、このためのレプリケーションをセットアップします。

ダンプに時間がかかる場合は、すでにダンプされたテーブルが、ダンプされようとしているテーブルとともに変更されている可能性があります。

したがって、テーブルをロックするか、レプリケーションを使用します。


このDB全体はほぼ完全に読み取り専用であるため、変更されることをあまり心配していません。
グレッグ、

2
このコメントは正しくありません。MVCCはInnoDBをロックせずに一貫した状態を読み取ることができます。
Scott Hyndman 2012年

5
レプリケーションがまだ設定されていない場合は、ダンプを実行して設定する必要があります。同じ問題が存在します。
Matt Connolly

3
レプリケーションがまだ設定されていない場合は、ダンプを実行してデータの整合性を確保するために、テーブルをロックする必要があります。それはキャッチ22だので
JordanC

9

これは、元の回答に遅れたと言った人に比べて遅くなっていますが、私の場合(Windows 7上のWAMPを介したMySQL)は、以下を使用する必要がありました。

--skip-lock-tables

これは、エラーせずにダンプINFORMATION_SCHEMAに私のために働いていたものです「アクセスがユーザーに対して拒否『をは、debian-SYS-のmaint』 @データベース『INFORMATION_SCHEMA』から『localhost』のLOCK TABLESを使用して」
ルイF・リベイロ

6
    mysqldump -uuid -ppwd --skip-opt --single-transaction --max_allowed_packet=1G -q db |   mysql -u root --password=xxx -h localhost db

賛成投票、これは私のために働きました--skip-opt --single-transaction --max_allowed_pa​​cket = 1Gを追加するだけです
Steven Lizarazo

1
この目的で「--skip-opt」を使用することはお勧めしません。これは、元の質問が要求したものよりもはるかに多くのことを行います。それはそれは文字セット、などなどは含まれていません、クイックモードオフになります
orrd

3

MySQL Workbenchを使用する場合は、データエクスポートで、[詳細オプション]をクリックし、[ロックテーブル]オプションをオフにします。

ここに画像の説明を入力してください


1

これらのアプローチのどれも私にとってうまくいかなかったので、私は単に以下を行いました:

mysqldump [...] | grep -v "LOCK TABLE" | mysql [...]

LOCK TABLE <x>UNLOCK TABLESコマンドの両方を除外します。

注:うまくいけば、データにはその文字列が含まれていません!


2
ダンプ中の--skip-add-locksも同様です
codewandler


0

別の遅い答え:

(Linux環境で)サーバーデータベースのホットコピーを作成しようとしていて、すべてのテーブルのデータベースエンジンがMyISAMである場合は、を使用する必要がありますmysqlhotcopy

ドキュメントによると:

FLUSH TABLES、LOCK TABLES、cpまたはscpを使用してデータベースのバックアップを作成します。これはデータベースまたは単一のテーブルのバックアップを作成する高速な方法ですが、データベースディレクトリが配置されている同じマシンでのみ実行できます。mysqlhotcopyは、MyISAMおよびARCHIVEテーブルのバックアップに対してのみ機能します。

LOCK TABLES時間は、サーバがMySQLのファイルをコピーすることができた時間(それはダンプをしない)に依存します。


0

今日も同じ問題に直面しましたが、コマンドラインにアクセスできませんでした。そのため、メモ帳エディターでSQLファイルを開き、テーブルの下の行を削除しました

LOCK TABLES `yourtable name` WRITE;

次に、開発環境にインポートしました。正常に機能します。それが誰かを助けることを願って

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