LoginSignup
15

More than 5 years have passed since last update.

pt-table-syncでmysqlのmasterとslaveの差分を吸収する

Last updated at Posted at 2014-11-10

運用しているサーバ群でslave1号とslave2号に差分があることがわかった。
App側でカウントするとその数がたまに異なることがあることがあって発覚。

普通の運用上は起こりえないことだとは思いますが、Slave側で書き込める別権限でデータベースの操作を直接していたことで発生。

差分を埋めるために、percona-toolkitのpt-table-syncを使用したが、日本語のリファレンスがなくて結構苦戦したので、忘備録的に使用方法を記録する
なお、インストールはpecona-toolkitの本家でrpmをダウンロードしてインストールしてください。

注意点
全てのサーバにある程度の権限を持つ同名のユーザが必要。
pt-online-schema-changeを使うためにも割り切ってユーザを作ってしまいましょう。

整合性の検証 - pt-table-checksum

Masterに打つことでスレーブとの差分を確認できる
pt-table-checksum (DSN)
DSNにはサーバ情報への接続情報。カンマ区切りで記述する

h=*** ホスト名
u=*** ユーザ名
p=*** パスワード
D=*** データベース名
t=*** テーブル名

データベースを指定して確認したい場合は、Dを設定していてもdatabasesオプションを入れる(DB分だけカンマ区切り)
pt-table-checksum h=chksv.com,u=myiser,p=mypass,D=myDB,t=mytable --databases myDB

うまくイケばめでたしだが、レプリケーションをするDBを指定していたり、レプリケーションをしないDB設定があると怒られる
(省略)
Please read the --check-replication-filters documentation to learn how to solve this problem.

--no-check-replication-filtersオプションを付ける
pt-table-checksum --no-check-replication-filters h=chksv.com,u=myiser,p=mypass,D=myDB,t=mytable --databases myDB

開発ではうまく動いたが、本番ではログフォーマットがMIXEDになってて、オプションつけて無理やりやると壊れるかもなんて脅されました。怖くてやっていません。
(追記2014/11/11:当社環境ではmasterがmysql5.1系でslaveが5.6系を使っていて、slaveの方で5.6オススメ設定になってるbinlog-formatがMIXEDなことがこの警告文の原因でした。
この設定の場合レプリケーションを破壊することはないと判断し、後日本番でも実行しました)

差分吸収ツール - pt-table-sync

うちでの用途はスレーブとの差分を吸収すること。
このツールの注意点として、マスターを更新することでスレーブに反映させること。
スレーブを一台ずつ運用を止めてやんわりと差分を吸収したかったのにできないっぽい

--sync-to-masterオプションと--replicaのオプションやらで色々な書き方ができるのだが、うちでの用途を満たす設定は2つ。
運用中のサーバに打つつもりなので後者を選択。

① マスターに命令を出して全サーバとの差分を潰す
pt-table-sync --dry-run --replicate myDB.mytable h=master.chksv.com,u=myiser,p=mypass,D=myDB,t=mytable

② 1台のスレーブとの差分を潰す
pt-table-sync --dry-run --replicate myDB.mytable --sync-to-master h=slave.chksv.com,u=myiser,p=mypass,D=myDB,t=mytable

ドハマりした点:
DB名とテーブル名の指定を--replicateの後にも、DSN内にも両方記述しないと動かない。
なぜかはよくわからないけど、両方にかけば動く。書かないと動かない。

実際に実行する

[接続確認]
pt-table-sync --dry-run --replicate myDB.mytable --sync-to-master h=slave.chksv.com,u=myiser,p=mypass,D=myDB,t=mytable

[差分の件数確認(大量のAlter文も生成されます)]
pt-table-sync --print --verbose --replicate myDB.mytable --sync-to-master h=slave.chksv.com,u=myiser,p=mypass,D=myDB,t=mytable

[実行]
pt-table-sync --execute --verbose --replicate myDB.mytable --sync-to-master h=slave.chksv.com,u=myiser,p=mypass,D=myDB,t=mytable

本来は件数の確認はpt-table-checksumでするべき。だけど、一応"--print --verbose"でも出力できる。
1台のスレーブとの差分を確認したいときはこれしかないのではないでしょうか。

また、実行前にはバックアップをきっちりと取ってから実行しましょう。マニュアルもなるべく目を通しましょう。
とはいえ、日本語資料がほぼなかったので、使ってみた事例として参考になれば。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15