mysqlデータベースをバックアップするにはどうすればよいですか?


15

データベースをバックアップしたいが、サーバーに負荷がかかっている日中。バックアップが、同じサーバー上で実行されているApacheや他のデータベースに影響を与えないことが重要です。

mysqldumpコマンドを使用することは可能ですが、低い優先度でコマンドを実行してください。

これどうやってするの?

アップデート: ルックスが好きだけでは動作しませんmysqldumpを持つ素敵なを使用して mysqldumpをスポーン新しいプロセス以来。


mysqlhotcopyを見たことがありますか?

@fsb mysqlhotcopyはOPが望むものをどのようにサポートしますか?
トマス14

回答:


8

サーバーの書き込み負荷に対処できる予備のサーバーがある場合は、そのサーバーへのレプリケーションをセットアップしてから、スレーブサーバーからバックアップできます。これには、バックアップ中にレプリケーションを停止し、データベースサーバーに影響を与えることなく、すべてのデータベースまたは1つのデータベース内のすべてのテーブルでデータの一貫したスナップショットを取得できるという利点もあります。これは、リソースがある場合にMySQLをバックアップするために常にお勧めする設定です。

おまけとして、低速の長時間実行クエリに使用できる読み取り専用のスレーブがあります。


残念ながら、このオプションはほとんどの作業のように見えますが、メインサーバーへの影響を最小限に抑えたい場合、唯一の本当のオプションだと思います。
andyuk

2
運用に影響を与えたくない場合に、適切に静止したバックアップを取得する唯一の方法です。スローダウンmysqldumpすると、長いロックが保持されるか、テーブルが同期しなくなるためです。
ダンキャリー

15

アンディ、今では解決策を見つけるのに十分な時間があると推測しています。私は最近、これに対する解決策を思いつきました。これはtsheetsうまく機能しており、共有したいと思いました。

cstreamは、UNIX ddのような汎用のストリーム処理ツールであり、通常はコマンドラインで構築されたパイプで使用されます。cstreamが便利なのは、すべての入力に対して最大帯域幅を指定できることです。これは、次のような簡単なコマンドでmysqldumpコマンドのディスクIOを制限できることを意味します。

mysqldump --single-transaction --quick -u <USER> -p<PASS> <Database> | cstream -t 1000000 > backup.sql

すべてのInnoDBテーブルを使用するデータベースをバックアップすると仮定すると、上記のコマンドは安全で(他のクエリには影響しません)、mysqldumpを実行し、ディスク読み取りを1秒あたり1メガバイトに制限します。-tパラメーターを使用して帯域幅を調整し、顧客のエクスペリエンスに影響を与えずに環境でバックアップを実行できる値に調整します。


テストしたばかりで、私は魅力のように動作します!ブランドンを共有していただきありがとうございます!
sucotronic

4

FWIWまた、これをpv(http://linux.die.net/man/1/pv)で実行できるはずです。

mysqldump --single-transaction --quick -u -p | pv --rate-limit 1m>宛先(または| ncまたは| tar cfj backup.bz2-)

これの良い点は、進行状況を監視するためのさまざまなオプションと、既に実行中のプロセスにオプションを渡すことができる-Rオプションです。--rate-limitは、転送速度を変更します。


1

innodbを使用する場合、--throttle オプションを指定してxtrabackupを試すことができます

同様にioniceを見て、それで mysqldumpを実行できます。

または、mysqlでバイナリロギングを有効にし、1週間/夜間に1回フルダンプを実行し、1-2時間ごとにbin-logを安全な場所にコピーしたい場合があります。また、バックアップ専用の読み取り専用スレーブもオプションです。


0

Linuxまたは別の* nixバリアントで実行している場合は、次の方法で実行できます。

nice -n ## mysqldump

これにより、スケジューリングの優先順位が低くなります。スケジューリング優先順位の範囲は-20(最高の優先順位)から19(最低の優先順位)です。-n引数を省略した場合、niceのデフォルトは10です。


0

cron.d / mysql_dump:

17 22 * * * backup touch /home/backup/all_databases.sql && chmod 600 /home/backup \ 
/all_databases.sql && ionice -n 7 /usr/bin/mysqldump -u root -ppassword --opt --all- \
databases > /home/backup/all_databases.sql && nice -n 20 bzip2 -f \
/home/backupall_databases.sql

I / O優先度の場合はionice、CPU優先度の場合はniceです。

vmstat 5を実行し、WAと表示されている列を確認します。高い値は、CPUがI / Oを待機していることを意味します。ioniceを使用します。CPU負荷だけの場合はniceを使用します。

更新への応答:

あなたは正しいようです。それはナイスではないmysqlを呼び出します。これにはreniceを使用し、実行後にnice値を設定できると思います。

ただし、ATMをダンプして有用なスクリプトを作成するのに十分な大きさのデータベースがありません。

あなたのリンクが示唆しているように、複製は行く一つの方法です。アントホストでレプリケート、停止、ダンプします。


0

MySQLデータをLVに配置し、LV のスナップショットを取得してMySQLデータファイルをtarsする素敵なmylvmbackupジョブを使用します。この方法では、テーブルをロックせず、アプリケーションへの影響をIO負荷のみに最小限に抑えます。


0

ピーク時に常に実行しないようにすることができます。どの優先順位を使用しても、ダンプはすべてのテーブルでロックを必要とします。


それは真実ではありません。テーブルがInnoDBの場合、読み取りのためにテーブルにロックはかけられません。
-dr01
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.