mysqldump
を使用してデータベースをバックアップするcronタスクがあります-私の主な懸念は破損です。バックアップを手動でインポートしてチェックするのではなく、毎回バックアップをチェック/検証する最善の方法は破損がないことです。
Background: mysql 5.5。*とInnoDBを実行しています。サーバーから直接mysqldump
を実行しています。現在、master/slaveまたはmaster/masterを使用していませんが、役立つ場合は変更できます。現在、DBは1メガバイト未満であり、近い将来には50メガバイト未満になるため、この場合は実際にスケールを考慮する必要はありません。
バックアップを確認する最善の方法は、バックアップからデータベースを復元することです。
これを行うもう1つの理由は、復元時間の短縮です。
考慮したいことが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}
_
通常の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の場合に役立ちます。
その他のレベルのチェック:
これにより、バックアップデータの整合性が確保され、緊急の復元時に無効なバックアップデータが使用される事態を回避できます。
MySQLダンプは基本的に、データベーススキーマを作成し、そこにすべてのデータを挿入する大きなSQLスクリプトテキストファイルであることを覚えておいてください。したがって、mysqldumpが正しく終了すると、すべてが正常に行われたことをかなり確信できます(もちろん、正しいデータベースをバックアップしていると仮定します!)
Mysqldumpファイルが破損してしまう可能性のある方法は知りません(ファイルシステムに問題があった場合を除きます。この場合、ファイルが破損する可能性があります)。 MySQLは(当然のことながら)かなりうるさいです。データベース内に破損したテーブルがある場合、データベースの整合性を保護するために、mysqldがクラッシュし、mysqldumpを終了できません。