MySQL8.0のGTIDを確認してみた

MySQL8.0のGTIDを確認してみた
tags: MySQL GTID mysqldump
author: btm_m_kazama
はじめに
皆さん、こんにちは。株式会社BTMの風間と申します。
MySQL8.0のGTIDについて確認する機会があったので、その時の内容を書きたいと思います。
GTIDを確認したきっかけ
開発中の動作確認で「DBの状態をある時点に繰り返し戻したい」場面がありました。
mysqldumpでダンプを取ってインポートしようとしたところ、以下のWarningが出力されました:
Warning: A partial dump from a server that has GTIDs will by default include the GTIDs of all transactions, even those that changed suppressed parts of the database. If you don't want to restore GTIDs, pass --set-gtid-purged=OFF. To make a complete dump, pass --all-databases --triggers --routines --events. Warning: A dump from a server that has GTIDs enabled will by default include the GTIDs of all transactions, even those that were executed during its extraction and might not be represented in the dumped data. This might result in an inconsistent data dump.
この時、「GTIDって何?」「このダンプをそのまま使って良いの?」と思い、調べることにしました。
GTIDについて
公式ドキュメントやネット記事をもとに整理すると、GTIDは以下の通りです:
- Global Transaction Identifierの略
- ソースサーバーでコミットされた各トランザクションに付与される一意の識別子
- フォーマットは
source_id:transaction_id
(UUID:シーケンス番号) - GTIDセットは1つ以上のGTIDまたはGTID範囲の集合を指す
- 有効化には
gtid_mode=ON
(デフォルトはOFF)とenforce_gtid_consistency=ON
が必要 - 内部的には
mysql.gtid_executed
テーブルとバイナリログに保持される
バイナリログについて
- データ変更イベントを記録する。SELECTなど読み取り専用操作は記録されない
- デフォルトでON、通常
/var/lib/mysql/binlog.*
に出力 SHOW BINARY LOGS
で一覧、SHOW MASTER STATUS
で現在ログ、SHOW BINLOG EVENTS IN 'ファイル名'
で中身の一部確認- 全内容には
mysqlbinlog
を使用
GTID/バイナリログの用途
- レプリケーション:ソース→レプリカ間で同じGTIDを使い、どこまで同期されたか管理
- ポイントタイムリカバリ:GTIDで特定位置までロールフォワード
GTIDを確認してみる
実際に動かしてみましょう。
確認内容
gtid_mode=ON
時の記録・ログ出力gtid_mode=OFF
時の未記録・未出力- GTIDの一意性
検証環境
※ローカル検証用にroot・無パスワードでの起動です。実運用では絶対にやめてください。
WSL2+Docker Composeで以下3コンテナを用意:
services: db1: > mysql_gtid_on1 (gtid_mode=ON) db2: > mysql_gtid_on2 (gtid_mode=ON, 比較用) db3: > mysql_gtid_off (gtid_mode=OFF) volumes: - ./conf/my.cnf:/etc/my.cnf # enforce_gtid_consistency=ON, gtid_mode=ON
起動&接続
% docker compose up -d # docker exec -it mysql_gtid_on1 bash # コンテナ1に接続 # mysql -u root -p -h localhost test # MySQLに接続
gtid_mode=ON時の挙動 (mysql_gtid_on1)
モード確認
mysql> SELECT @@gtid_mode; -- ON
GTID記録
mysql> SELECT * FROM mysql.gtid_executed; -- 値あり
バイナリログ一覧/現在ログ
mysql> SHOW BINARY LOGS; mysql> SHOW MASTER STATUS;
中身確認
mysql> SHOW BINLOG EVENTS IN 'binlog.000002';
# mysqlbinlog /var/lib/mysql/binlog.000002
gtid_mode=ON時の一意性 (mysql_gtid_on2)
mysql> SELECT * FROM mysql.gtid_executed; -- 別UUID
gtid_mode=OFF時の挙動 (mysql_gtid_off)
mysql> SELECT @@gtid_mode; -- OFF mysql> SELECT * FROM mysql.gtid_executed; -- Empty mysql> SHOW BINARY LOGS; -- ログは出力される mysql> SHOW BINLOG EVENTS IN 'binlog.000002'; # mysqlbinlog /var/lib/mysql/binlog.000002 -- Previous-GTIDsなし
SQL実行での変化
CREATE/INSERTを実行し、再度バイナリログとGTID_executedを確認すると:
- gtid_mode=ON時 → GTID付与&記録
- gtid_mode=OFF時 → Anonymous_GTIDとしてログに残るがテーブルに記録されない
ダンプ&インポート検証
各コンテナのデータ差分をdumpし、mysql_gtid_on1で取り込んで動作を確認:
--set-gtid-purged=OFF
なし → 既存GTID重複でエラー- ON2のダンプ取り込み → 正常、GTID_executedに追加、バイナリログには出力なし
- OFFのダンプ取り込み → 正常、SQLログはONに戻され、バイナリログに再度出力
結論:mysqldump時に--set-gtid-purged=OFF
を指定すれば安全にインポート可能です。
まとめ
GTIDの動作を実際に確認し、ダンプ→インポートの最適なオプションを検証しました。
今後はレプリケーション構築やリカバリ手順にも挑戦してみます。
株式会社BTMではエンジニアの採用をしております。
ご興味がある方はぜひ こちら をご覧ください。
-
SNS
-
投稿日
-
カテゴリー
BTM Useful