web-dev-qa-db-ja.com

タイムアウトなしでmysqlの毎日のバックアップダンプを完了する方法は?

毎日のMysqlデータベースバックアップを完了するための最良の方法は何ですか、バックアップダンプ中に重大なmysqlデータベース接続タイムアウトが発生しています

ダンプとgzipを使用します

cronには次の行があります。

 1 1 * * * root Nice -n 19 /etc/automysqlbackup.sh

ダンプ中に問題が発生します。

4
Tom

論理バックアップ(スクリプトで使用されるようなmysqldump)はデータベースをロックします。これにより、クライアントの操作が中断されます。

ミッションクリティカルなデータベースをバックアップするための私のアプローチは、OpenSolarisでInnoDBを使用し、datadirとlogsdirのZFSスナップショットを毎日取得することです。

これらのスナップショットは、オフサイトサーバーにコピーされます。

innoDBはトランザクションであり、スナップショットはアトミックであるため、スナップショットを取得する前にサーバーをシャットダウンする必要はありません(サーバーからの回復は、突然の停電からの回復と同じです。InnoDBはそれをサポートします)。

2
Omry

Mysqlデータベースをネットワーク(NFS)共有にダンプしていますか?同様のタイムアウトの問題が発生したため、次の2つのオプションを使用してmysqlデーモンを再起動する必要がありました。

/etc/my.cnf

[mysqld]
net_read_timeout=300
net_write_timeout=300

最新の結果をお知らせください。

Stivi

2
StiviZi

私はotherreceiveに同意します。ロックがタイムアウトの原因である可能性があります。その場合は、mysqlスレーブを作成し、そのダンプを実行できます(できれば別のハードウェアで、ただし何でも)。これにより、ダンプの発生中にマスターデータベースがロックされるのを防ぎ、ダンプが終了するとスレーブがマスターに追いつきます。

1
evilchili
  • ジッピングが問題の場合。 mysqlサーバーに接続している別のマシンからバックアップジョブを実行し、そこでZipします。
  • mysql5でのダンプの代わりに、mysqlhotcopyを使用することもできます。
  • しかし、繰り返しになりますが、ディスクIOが遅すぎます。それらはどのような種類のディスクですか、あなたが持っているioの量はどれくらいですか...?
1
lepole

MySQLデータファイルをLVMボリュームで実行している場合は、スナップショットを作成するだけで済みます。実証済みのソリューションについては、 mylvmbackup をご覧ください。

1
joschi

実際に使用できるダンプを作成するには、一貫性のあるダンプファイルを作成するためにmysqlをロックする必要があります。これがタイムアウトの原因であると私は信じています。

1
theotherreceive

私が使用する方法(FreeBSDのPostgresの場合)は次のとおりです。

スレーブサーバーをセットアップします(メインDBが落雷に見舞われた場合に備えて、スレーブサーバーはありますか?)
スレーブのデータディレクトリが独自のファイルシステム上にあることを確認してください(後で作業が楽になります!)

  1. バックアップ時にスレーブサーバーを停止します(レプリケーション停止)
  2. データのファイルシステムスナップショットを作成しますFS(5〜10秒かかります)
  3. スレーブを再起動します(レプリケーションが再開されます)
  4. スナップショットをマウントし、必要に応じてその内容をバックアップします
    • スナップショットであるため変更されません。また、DBが停止したときに作成されたため、良好な静止状態であることが保証されます。
  5. スナップショットをアンマウントして削除します。

これはMySQLでも同じです。

サーバー/ FSがスナップショットを実行できない場合は、手順3を最後に移動し、手順2と5を省略します(バックアップの間、レプリケーションは停止しますが、一貫したバックアップが保証されます。これはスレーブであるため、クライアントはそれが起こっていることさえ知らない)。

1
voretaq7

InnoDBを使用していますか?もしそうなら、Perconaのxtrabackupツールを見てください。または、より具体的には、xtrabackupをラップし、特にMyISAMテーブルをダンプするためのサポートを追加するinnobackupexスクリプトを使用します。

オンラインバックアップ(InnoDBのゼロロック)を実行でき、出力は有効なmysqlデータディレクトリであり、コピーして復元できるため、通常、ダンプを復元するよりもはるかに高速に復元できます。

また、他のマシンへのバックアップのストリーミング、増分バックアップもサポートしており、非常に堅牢で便利なツールです。

私はこれを使用して、500GB以上の範囲の非常にビジーなデータベースをまったく問題なくバックアップし、負荷が特に激しい場合でもレプリケーションの遅延をほとんど発生させません。

これは、バックアップを取り、バックアップのログを適用して復元できるようにする使用例です。

innobackupex /var/backups/db
innobackupex --apply-log --use-memory=1G /var/backups/db

ボックスにそのバックアップを復元すると、次のようになります(mysqlデータディレクトリのパスはディストリビューションによって異なる場合があります)。

cp -r /var/backups/db /var/lib/mysql/data
chown -R mysql:mysql /var/lib/mysql/data

このツールのPerconaのドキュメントは非常に優れているので、そこで詳細を読むことができます。

http://www.percona.com/doc/percona-xtrabackup/innobackupex/innobackupex_script.html

何をするにしても、復元部分を含めて、必ずテストしてください。

0
gtuhl

すべてのテーブルがInnoDBの場合は、-single-transactionを使用してmysqldumpを実行できます。これにより、データベースを一貫した状態でダンプしながら、テーブルに対する他の更新を他のトランザクション内で実行できるようになります。この機能を利用できるように、いくつかのシステムをInnoDBに移行しました。

0

すべてのテーブルがInnoDBの場合は、-single-transactionを使用できます。これにより、データベースが短時間だけロックされ、トランザクションで使用可能な内部の一貫性のあるスナップショットに依存してバックアップが完了します。

そうでない場合は、他のことをする必要があります。 Linuxを使用している場合は、LVMを使用していて、LVM用のスペースがあれば、LVMスナップショットを使用できます(スナップショットを作成する間もフラッシュテーブルが必要ですが、スナップショットは高速です)。

基盤となるストレージデバイス(RAIDコントローラーなど)がスナップショットをサポートしている場合は、それらのいずれかを使用することもできます。

0
MarkR