ブログ

Blog

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

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