web-dev-qa-db-ja.com

mysqlバイナリログファイルが空かどうかを判断する方法は?

データベースのバックアップが必要かどうかを判断するために、mysqlbinlogファイルにデータが含まれているかどうかを確認しようとしています。 (バックアップ中に、新しいbinlogファイルを作成し、ファイル名を記録します。その後、そのbinlogの内容をチェックして、最後のバックアップ以降に何かが発生したかどうかを確認できます。)

Binlogファイルが実際に空になったことを知る方法はありますか?おそらくmysqlbinlogコマンドを使用していますか?

SHOW MASTER STATUSからpositionを確認しますが、位置はmysqlのバージョンによって異なるようです...バージョン内で一定ですか?私のバージョンのmysql(5.6.11)は、位置120で新しいバイナリログを開始します。

別のアプローチは、binlogが作成された時刻を記録し、その後に変更が加えられたかどうかを確認することですが、そのようなバックアッププロセスの速度に依存することは私を緊張させます。

1
AmadeusDrZaius

空のバイナリログに関しては、バージョン固有です。

  • MySQL5.6の120
  • MySQL5.5の107
  • MySQL5.1の106
  • 98(MySQL 4.1/5.0)

私はこれをDBAStackExchangeで何度も議論しました

あなたの場合、あなたはただ一つのコマンドを実行する必要があります

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日前にこれについて言及しました: マスター/マスター/スレーブレプリケーション

そうすれば、アプリケーションのダウンタイムがなく、空のバイナリログを待つ必要がありません。

3
RolandoMySQLDBA