web-dev-qa-db-ja.com

mysqldumpバックアップが破損していないことを確認します

mysqldumpを使用してデータベースをバックアップするcronタスクがあります-私の主な懸念は破損です。バックアップを手動でインポートしてチェックするのではなく、毎回バックアップをチェック/検証する最善の方法は破損がないことです。

Background: mysql 5.5。*とInnoDBを実行しています。サーバーから直接mysqldumpを実行しています。現在、master/slaveまたはmaster/masterを使用していませんが、役立つ場合は変更できます。現在、DBは1メガバイト未満であり、近い将来には50メガバイト未満になるため、この場合は実際にスケールを考慮する必要はありません。

7
sam

バックアップを確認する最善の方法は、バックアップからデータベースを復元することです。

これを行うもう1つの理由は、復元時間の短縮です。

4
akuzminsky

考慮したいことが2つあります

バックアッププロセス

復元を行う以外に方法はありません。これは、mysqldumpの単なる再生です。 [〜#〜] pitr [〜#〜] を実行する必要がある場合は、実行する必要があります mysqlbinlog 該当するbinlogに対して、必要な日時までイベントを再生します。

Mysqldumpが配置されているディスクが故障した場合、またはmysqldumpにBLOB内の文字シーケンスが含まれているために復元できない場合は、定期的にこれを行う必要があります。

バックアップの整合性

Mysqldを問題なく起動できるはずです。 mysqldを実行したら、各テーブルの使いやすさをテストする必要があります。これは、次のクエリを実行して実行できます。

_SELECT CONCAT('CHECK TABLE ',dbtb,';') FROM
(SELECT CONCAT(table_schema,'.',table_name) dbtb FROM
information_schema.tables WHERE table_schema NOT IN
('information_schema','performance_schema','mysql')) A;
_

これにより、MyISAM、InnoDB、ARCHIVE、CSVテーブルごとに CHECK TABLE コマンドが作成され、それらの整合性がチェックされます。これをスクリプトに出力して、スクリプトを実行できます。 CHECK TABLEコマンドを使用すると、すべてのテーブルを単一のコマンドとしてチェックすることもできます。クエリを変更して、テーブル名をコンマ区切りのリストとして収集し、先頭に追加できます。

_SELECT CONCAT('CHECK TABLE ',dbtblist,';') FROM
(SELECT GROUP_CONCAT(table_schema,'.',table_name) dbtblist FROM
information_schema.tables WHERE table_schema NOT IN
('information_schema','performance_schema','mysql')) A;
_

警告:GROUP_CONCAT()関数のデフォルトの制限は1024文字です。テーブルの数が少ない場合は、すべてのテーブルをリストするのではなく、リストされた最後のテーブルが切り取られ、エラーが発生します。コマンドの前に_SET SESSION group_concat_max_len = 10000;_を付けて、戻り値を長くすることができます。

これは私のラップトップでのMySQL 5.6.16(Windows)のサンプルです。

_mysql> SELECT CONCAT('CHECK TABLE ',dbtblist,';') FROM
    -> (SELECT GROUP_CONCAT(table_schema,'.',table_name) dbtblist FROM
    -> information_schema.tables WHERE table_schema NOT IN
    -> ('information_schema','performance_schema','mysql')) A;
+----------------------------------------------------------------------------+
| CONCAT('CHECK TABLE ',dbtblist,';')                                        |
+----------------------------------------------------------------------------+
| CHECK TABLE ayman.articles,ayman.topics,test.nuoji,test.prod,test.prodcat; |
+----------------------------------------------------------------------------+
1 row in set (0.01 sec)

mysql>
_

次に、その出力を変数に保存し、コマンドラインから実行します。コマンドを実行する前に、_group_concat_max_len_を一時的に増やしていることに注意してください。

_MYSQL_USER=root
MYSQL_PASS=rootpass
MYSQL_CONN="-u${MYSQL_USER} -p${MYSQL_PASS}"
SQL="SET SESSION group_concat_max_len = 1048576;"
SQL="${SQL} SELECT CONCAT('CHECK TABLE ',dbtblist,';') FROM"
SQL="${SQL} (SELECT GROUP_CONCAT(table_schema,'.',table_name) dbtblist FROM"
SQL="${SQL} information_schema.tables WHERE table_schema NOT IN"
SQL="${SQL} ('information_schema','performance_schema','mysql')) A"
mysql ${MYSQL_CONN} -ANe"${SQL}" | mysql ${MYSQL_CONN}
_

試してみる !!!

4
RolandoMySQLDBA

通常のmysqldump一貫性のために私が従うアプローチ

下記のフローでシェルスクリプトを記述し、「mysqlbackup.sh」として保存します

  • マスター上

!#/ usr/bin/bash

  • FORループでデータベース名をスプールし、db1.sqlのような独自の.sqlsを作成します。

  • mysqldump -uroot -pPASSWORD --single-transaction "db1"> /backup/mysql/TODAY_DATE/db1.sql

  • cd/backup/mysql /

  • tar -czvf TODAY_DATE.tar.gz TODAY_DATE#Tar Gun Zipディレクトリ

  • gzip -t /backup/mysql/TODAY_DATE.tar.gz#gzipの整合性チェック用

  • scp /backup/mysql/TODAY_DATE.tar.gzファイルから別のサーバーへ#サーバーレベルの障害を最小障害点としてカバーするため、またはSANまたはマルチプレックスで障害のレベルに応じて、データセンターレベル、ネットワークレベルなど

  • 7日の保持期間内に古いバックアップをパージおよびローテーション(ローカルサーバーから復元する必要性に応じて)

crontab -l

00 3 * * * /usr/scripts/mysqlbackup.sh 2> /usr/scripts/log_mysqlbackup.date +%Y_%m_%d_M.err

Nagiosまたはnetcoolを監視して、ファイル/usr/scripts/log_mysqlbackup.date +%Y_%m_%d_M.errを指すようにします。

err_file="/usr/scripts/log_mysqlbackup.`date +%Y_%m_%d_M`.err "

if [[ -s $err_file ]]
then
"Trigger alert -> Alerting team should call DB Team to fix it by rerunning backup"
fi
  • 他のチェック基準を追加して、アラートをトリガーすることができます。たとえば、バックアップファイルのサイズは3GBを超える必要があり(取得する標準バックアップサイズによって異なります)、小さい場合はアラームをトリガーします。 mysqlbackup.shでこれらの基準を解析し、基準を満たして問題が発生した場合は、>> /usr/scripts/log_mysqlbackup.date +%Y_%m_%d_M.errに詳細を書き込みます。監視ツールは、errファイルにサイズがある場合にアラートをトリガーするため。

  • Sqldumpにmaster-binlog-fileとmaster-binlog-positionが記録されているため、後で適用するバイナリログファイルがある場合、これはPITRの場合に役立ちます。

その他のレベルのチェック:

  • 1か月に1回、多重化されたすべてのデバイス(つまり、ローカルサーバー/外部サーバー/ SAN /テープ)からランダムバックアップを復元してみてください。

これにより、バックアップデータの整合性が確保され、緊急の復元時に無効なバックアップデータが使用される事態を回避できます。

1
Mannoj

MySQLダンプは基本的に、データベーススキーマを作成し、そこにすべてのデータを挿入する大きなSQLスクリプトテキストファイルであることを覚えておいてください。したがって、mysqldumpが正しく終了すると、すべてが正常に行われたことをかなり確信で​​きます(もちろん、正しいデータベースをバックアップしていると仮定します!)

Mysqldumpファイルが破損してしまう可能性のある方法は知りません(ファイルシステムに問題があった場合を除きます。この場合、ファイルが破損する可能性があります)。 MySQLは(当然のことながら)かなりうるさいです。データベース内に破損したテーブルがある場合、データベースの整合性を保護するために、mysqldがクラッシュし、mysqldumpを終了できません。

0
dr_