TL;DR
XtraBackupは8.0.23で
--lock-ddl
がデフォルトでONになったxtrabackup --lock-ddl
はLOCK INSTANCE FOR BACKUP
を呼び出すxtrabackup --backup
の最中にFLUSH NO_WRITE_TO_BINLOG BINARY LOGS
が実行されるが、LOCK INSTANCE FOR BACKUP
の最中にbinlogがローテーションしてもパージが走らない。よって、バックアップ間隔の間に
max_binlog_size
未満のバイナリログしか吐かない = スイッチされるのがxtrabackupのタイミングだけのノードはバイナリログがパージされずに残り続けるように見えるmax_binlog_size を小さくしてxb以外のタイミングでもローテーションが走るようにしてやればOK
それか、バックアップスクリプトの中ででもxbが終了した後に
FLUSH BINARY LOGS
を呼んでやればOK
- 前提知識として、「バイナリログのパージはバイナリログがスイッチした時にだけ `binlog_expire_logs_seconds` が評価される
どういうことかというと、
mysql80 8> SET GLOBAL binlog_expire_logs_seconds = 1;
Query OK, 0 rows affected (0.13 sec)
こうやってバイナリログのパージを1秒にしてやっても
$ xtrabackup -S /usr/mysql/8.0.39/data/mysql.sock -uroot --stream=xbstream --backup > /dev/null
$ ll bin.*
-rw-r----- 1 yoku0825 yoku0825 238 Sep 17 15:42 bin.000339
-rw-r----- 1 yoku0825 yoku0825 238 Sep 17 15:43 bin.000340
-rw-r----- 1 yoku0825 yoku0825 197 Sep 17 15:43 bin.000341
-rw-r----- 1 yoku0825 yoku0825 39 Sep 17 15:43 bin.index
バイナリログが消えていないし
$ xtrabackup -S /usr/mysql/8.0.39/data/mysql.sock -uroot --stream=xbstream --backup > /dev/null
$ ll bin.*
-rw-r----- 1 yoku0825 yoku0825 238 Sep 17 15:42 bin.000339
-rw-r----- 1 yoku0825 yoku0825 238 Sep 17 15:43 bin.000340
-rw-r----- 1 yoku0825 yoku0825 238 Sep 17 15:44 bin.000341
-rw-r----- 1 yoku0825 yoku0825 197 Sep 17 15:44 bin.000342
-rw-r----- 1 yoku0825 yoku0825 52 Sep 17 15:44 bin.index
もう一度やっても消えない。むしろ FLUSH BINARY LOGS
で新しいのができるのでファイルの数は増える。
手打ちでも再現できる。
$ mysql80
mysql80 15> LOCK INSTANCE FOR BACKUP;
Query OK, 0 rows affected (0.10 sec)
mysql80 15> FLUSH BINARY LOGS;
Query OK, 0 rows affected (0.02 sec)
$ ll bin.*
-rw-r----- 1 yoku0825 yoku0825 238 Sep 17 15:42 bin.000339
-rw-r----- 1 yoku0825 yoku0825 238 Sep 17 15:43 bin.000340
-rw-r----- 1 yoku0825 yoku0825 238 Sep 17 15:44 bin.000341
-rw-r----- 1 yoku0825 yoku0825 238 Sep 17 15:46 bin.000342
-rw-r----- 1 yoku0825 yoku0825 197 Sep 17 15:46 bin.000343
-rw-r----- 1 yoku0825 yoku0825 65 Sep 17 15:46 bin.index
エラーログをよく見るとワーニングが出ているはず。
2024-09-17T15:43:40.409504+09:00 10 [Warning] [MY-014054] [Server] Could not purge binary logs since another session is executing LOCK INSTANCE FOR BACKUP. Wait for that session to release the lock.
LOCK INSTANCE FOR BACKUP
の外で FLUSH BINARY LOGS
すればすぐに消える。
mysql80 15> UNLOCK INSTANCE;
Query OK, 0 rows affected (0.11 sec)
mysql80 15> FLUSH BINARY LOGS;
Query OK, 0 rows affected (0.22 sec)
$ ll bin.*
-rw-r----- 1 yoku0825 yoku0825 238 Sep 17 15:48 bin.000343
-rw-r----- 1 yoku0825 yoku0825 197 Sep 17 15:48 bin.000344
-rw-r----- 1 yoku0825 yoku0825 26 Sep 17 15:48 bin.index
デフォルトのmax_binlog_sizeは1GBなので、ワーストケース(binlogがパージされずに残り続けて容量が食い切られるケース)では、
- 今朝のバックアップで binlog.000001 からbinlog.000002にスイッチする
- 今日いちにちでbinlog.000002が800MBまで書き込まれる
- 明日の朝のバックアップでbinlog.000002がbinlog.000003にスイッチされる。
LOCK INSTANCE FOR BACKUP
で保護されているのでbinlog.000001はexpireしていても削除されない - 明日いちにちでbinlog.000003が800MBまで(略
となって、binlogがいつまでもパージされずに残り続ける。
という訳で、
max_binlog_size を小さくしてxb以外のタイミングでもローテーションが走るようにしてやればOK(binlog.000003がxtrabackup以外のタイミングでスイッチすれば、binlog.000001~000002はパージ対象になる)
それか、バックアップスクリプトの中ででもxbが終了した後に
FLUSH BINARY LOGS
を呼んでやればOK(xbが終了した後にスイッチすれば過去のbinlogはパージ対象になる)
参考までに。
0 件のコメント :
コメントを投稿