データベースのバックアップが必要かどうかを判断するために、mysqlbinlogファイルにデータが含まれているかどうかを確認しようとしています。 (バックアップ中に、新しいbinlogファイルを作成し、ファイル名を記録します。その後、そのbinlogの内容をチェックして、最後のバックアップ以降に何かが発生したかどうかを確認できます。)
Binlogファイルが実際に空になったことを知る方法はありますか?おそらくmysqlbinlog
コマンドを使用していますか?
SHOW MASTER STATUS
からposition
を確認しますが、位置はmysqlのバージョンによって異なるようです...バージョン内で一定ですか?私のバージョンのmysql(5.6.11)は、位置120で新しいバイナリログを開始します。
別のアプローチは、binlogが作成された時刻を記録し、その後に変更が加えられたかどうかを確認することですが、そのようなバックアッププロセスの速度に依存することは私を緊張させます。
空のバイナリログに関しては、バージョン固有です。
120
107
106
98
(MySQL 4.1/5.0)私はこれをDBAStackExchangeで何度も議論しました
Nov 19, 2014
: MySQL 5.6DBからMySQL5.1を複製するための質問Jun 26, 2013
: mysql binlogをステートメント形式から行形式に変換することは可能ですか?Oct 20, 2011
: ディスク容量が停止したときにMy SQL DBマスターからマスターへのレプリケーションを処理する方法Feb 04, 2011
: MySQLマスターbinlogの破損あなたの場合、あなたはただ一つのコマンドを実行する必要があります
SHOW MASTER STATUS;
これにより、mysqldが書き込んでいる現在のバイナリログと位置がわかります。たまたま、ログの位置はファイルサイズでもあります。
バックアップを開始する前に空のbinlogを確認する方法の例を次に示します。
MYSQL_USER=root
MYSQL_PASS=rootpassword
MYSQL_CONN="-u${MYSQL_USER} -p${MYSQL_PASS}"
#
# Find out the MySQL Version
#
SQL="SELECT VERSION()"
VERS=`mysql ${MYSQL_CONN} -ANe$"${SQL}"`
MYSQL_VERSION=`echo "${VERS}" | sed 's/\./ /g' | sed 's/ /./' | awk '{print $1}'`
case "${MYSQL_VERSION}" in
"5.0") EMPTY_BINLOG_SIZE=98 ;;
"5.1") EMPTY_BINLOG_SIZE=106 ;;
"5.5") EMPTY_BINLOG_SIZE=107 ;;
"5.6") EMPTY_BINLOG_SIZE=120 ;;
esac
#
# Get the Current Master Log's Position
#
SQL="SHOW MASTER STATUS"
LOGPOS=`mysql ${MYSQL_CONN} -ANe$"${SQL}" | awk '{print $2}'`
#
# Compare log position to an empty log size
#
OK_TO_BACKUP=0
if [ ${LOGPOS} -eq ${EMPTY_BINLOG_SIZE} ]; then OK_TO_BACKUP=1 ; fi
if [ ${OK_TO_BACKUP} -eq 1 ]; then
...
fi
すべてのテーブルがInnoDBStorage Engineを使用している場合は、ある時点でデータをダンプし、ログファイルと位置をキャプチャし、それでもINSERT、UPDATE、およびDELETEをすべて同時に許可できます(実行しないでください)。バックアップ中の任意のDDL)。オプション--single-transaction
および--master-data=2
を指定してmysqldumpを使用すると、23行目にログファイル/位置が書き込まれます。
6日前にこれについて言及しました: マスター/マスター/スレーブレプリケーション
そうすれば、アプリケーションのダウンタイムがなく、空のバイナリログを待つ必要がありません。