41から始めました

文字通り41歳から始めたブログです。DB(MySQL)を使ってお仕事してるので、DB周りの話を中心に最近始めたこととかをTwitterのノリで書いています。なお、本サイトにおいて示されている見解は私個人の見解であり、所属団体や組織を代表するものではありません。

MHSレプリカでトランザクションをスキップする方法

はじめに

MySQL HeatWave Service いわゆるMHS(MDS またはHeatWave)のレプリカでトランザクションをスキップする場合、MySQLのドキュメントにある方法だと全てが使えるわけじゃないので書いておきます。

特にソースがGTID無効(非GTID)にしたレプリケーションの場合が分かりづらかったので参考にしてください。

MHSで非GTIDレプリにてトランザクションをスキップするには

MHSがレプリカかつソースがGTIDが無効な場合、ここにあるいくつかの方法が使えません。

使えるのは

mysql>CHANGE MASTER TO MASTER_LOG_FILE='source_log_name', MASTER_LOG_POS=source_log_pos;

またはMySQL 8.0.24以降なら

mysql>CHANGE REPLICATION SOURCE TO SOURCE_LOG_FILE='source_log_name', SOURCE_LOG_POS=source_log_pos;

のいずれかです。

スキップ作業の流れ

作業の流れとしては

1.mysqlbinlogコマンドでソースのバイナリログを確認

2.スキップしていいクエリ・ポジションを確認

3.STOP REPLICA;

4.CHANGE MASTER またはCHANGE REPLICATION SOURCEでスキップ

5.START REPLICA;

となります。

MHSで使えない方法

その1 SET GLOBALが使えない

MHSでは残念ながらSET GLOBALが使えない。つまり

mysql>SET GLOBAL sql_slave_skip_counter = N;

mysql>SET GLOBAL sql_replica_skip_counter = N;

トランザクションをスキップすることができない。(実行すると以下のエラーが出る)

ERROR: 1227 (42000): Access denied; you need (at least one of) the SUPER or SYSTEM_VARIABLES_ADMIN privilege(s) for this operation

では、Configuration(MySQLで言うmy.cnf|my.iniのようなもの)で設定すればいいじゃないかと思うだろうが、sql_slave_skip_counter やsql_replica_skip_counter は変更できる変数ではない。

ここにあるものだけが変更できる。

その2 CHANGE REPLICATION SOURCE TO SOURCE_AUTO_POSITION=1;も使えない

CHANGE MASTER TO MASTER_AUTO_POSITION=1; やCHANGE REPLICATION SOURCE TO SOURCE_AUTO_POSITION=1;を使った場合もエラーが出る

ERROR 1227 (42000): Access denied; you need (at least one of) the SUPER or REPLICATION_SLAVE_ADMIN privilege(s) for this operation

そのため、トランザクションをスキップしたい場合、最初に書いた方法となる。

MHSでGTIDレプリにてトランザクションをスキップするには

ここに書かれている以下の方法でスキップする。

SET GTID_NEXT='aaa-bbb-ccc-ddd:N';
BEGIN;
COMMIT;
SET GTID_NEXT='AUTOMATIC';

ただし

GTID版もドキュメントにある方法全部が使えるわけではなく、以下のコマンドは実行できないので注意が必要。

FLUSH LOGS;
PURGE BINARY LOGS TO 'binlog.000xxx';

原因としてはこちらも実行するための権限が無いためです。

おまけ

OCI MHS APIを使うと同じようなことができるっぽいが、それは試してない。

AssignTargetUuidHandling — oci 2.119.1 documentation

バイナリログファイル名をlast_configured_log_filenameに、ポジションをlast_configured_log_offsetに設定するようだ。

OCI MHS API、今度試してみるか。

さいごに

こういうこと書くとMHS不便やなー、使いづらそうだなーとか思うかもしれませんが、ゴリッゴリにいじらなくて済むようになってると考えたら逆にスッキリしてますよね。

DBAが余計なことを考えなくて済むようにしてるので、実際には移行してしまえば何かしらやりようはあるので慣れます。

問題はドキュメントが分かりづらかったり、記載が足りなかったりすることなので、それは内部でプッシュし続けていきます。