GNU/Linux >> Linux の 問題 >  >> Linux

読み取りと書き込みがアクティブなライブ システムで mysqldump を実行する最も安全な方法は?

すべてのデータは InnoDB です

これにより、データの正確なポイント イン タイム スナップショットが得られます:

mysqldump -uuser -ppass --single-transaction --routines --triggers --all-databases > backup_db.sql

--single-transaction 着信変更を受け取りながら、ダンプがチェックポイントより前のすべてのデータをキャプチャできるようにするチェックポイントを生成します。これらの着信変更はダンプの一部になりません。これにより、すべてのテーブルで同じ時点が保証されます。

--routines すべてのストアド プロシージャとストアド関数をダンプします

--triggers それらを持つ各テーブルのすべてのトリガーをダンプします

すべてのデータは MyISAM または InnoDB/MyISAM の混合

グローバル読み取りロックを課し、mysqldump を実行し、グローバル ロックを解放する必要があります

mysql -uuser -ppass -Ae"FLUSH TABLES WITH READ LOCK; SELECT SLEEP(86400)" &
sleep 5
mysql -uuser -ppass -ANe"SHOW PROCESSLIST" | grep "SELECT SLEEP(86400)" > /tmp/proclist.txt
SLEEP_ID=`cat /tmp/proclist.txt | awk '{print $1}'`
echo "KILL ${SLEEP_ID};" > /tmp/kill_sleep.sql
mysqldump -uuser -ppass --single-transaction --routines --triggers --all-databases > backup_db.sql
mysql -uuser -ppass -A < /tmp/kill_sleep.sql

試してみてください!!!

更新 2012-06-22 08:12 EDT

合計データが 50MB 未満であるため、別のオプションがあります。バックグラウンドで SLEEP コマンドを起動してグローバル読み取りロックを 86400 秒 (その 24 時間) 保持し、プロセス ID を取得して外部で強制終了する代わりに、OS ではなく mysql で 5 秒のタイムアウトを設定してみましょう:

SLEEP_TIMEOUT=5
SQLSTMT="FLUSH TABLES WITH READ LOCK; SELECT SLEEP(${SLEEP_TIMEOUT})"
mysql -uuser -ppass -Ae"${SQLSTMT}" &
mysqldump -uuser -ppass --single-transaction --routines --triggers --all-databases > backup_db.sql

これは、非常に小規模なデータベースに対するよりクリーンでシンプルなアプローチです。


  • InnoDB テーブルの場合、--single-transaction を使用する必要があります 別の回答で述べたように、オプション。
  • MyISAM には --lock-tables があります .

公式ドキュメントはこちら


これが私がやった方法です。 FLUSH TABLES WITH READ LOCK を使用しているため、すべてのケースで機能するはずです .

#!/bin/bash

DB=example
DUMP_FILE=export.sql

# Lock the database and sleep in background task
mysql -uroot -proot $DB -e "FLUSH TABLES WITH READ LOCK; DO SLEEP(3600);" &
sleep 3

# Export the database while it is locked
mysqldump -uroot -proot --opt $DB > $DUMP_FILE

# When finished, kill the previous background task to unlock
kill $! 2>/dev/null
wait $! 2>/dev/null

echo "Finished export, and unlocked !"

シェル sleep コマンドは、mysqllock コマンドを実行するバックグラウンド タスクが mysqldump の開始前に実行されるようにするためのものです。 1 秒に短縮できますが、それでも問題ないはずです。 30 秒に増やして、その 30 秒間に別のクライアントから任意のテーブルに値を挿入してみてください。

mysqldump を使用する代わりに、この手動のバックグラウンド ロックを使用すると、2 つの利点があります。 オプション --single-transaction--lock-tables :

<オール>
  • MyISAM/InnoDB テーブルが混在している場合、これによりすべてがロックされます。
  • mysqldump 以外のコマンドを実行することもできます 同じロック期間中。 SHOW MASTER STATUS; でバイナリ ログの位置を取得する必要があるため、マスター ノードでレプリケーションをセットアップする場合などに便利です。 (データベースのロックを解除する前に) 作成したダンプの正確な状態で、レプリケーション スレーブを作成できるようにします。

  • Linux
    1. LvmとDm-cryptでトリミングしますか?

    2. DISMを使用してシステムイメージを修復する

    3. Btrfs ファイル システムを作成してマウントする方法 (例で説明)

    1. EclipseとAndroidSdkの問題?

    2. ライブCDでシステムを更新できますか?

    3. Linux で find コマンドを使用して、スペースのあるファイルを検索して削除する

    1. 例を使用して Linux のシャットダウンおよび再起動コマンドを使用する方法

    2. ポリシーとメカニズム

    3. システムがアイドル状態で、再びアクティブになったときにコマンドを実行する