• このエントリーをはてなブックマークに追加

【mariaDB】useで指定したDBによってレプリケーションが失敗する事象

  • このエントリーをはてなブックマークに追加

mariadb
zaco muraです。
最近CentOS7と一緒にmariaDBも扱っていますが、そこでかなりハマったことがあったので整理も含めて書いておきます。

事象の概要

mariaDBにログインした後、選択するDB(use句で指定するDB)によって、データがレプリケーションされたりされなかったりする事象。

原因

mariaDB(mysqlも?)の仕様。(バグのような気もする。。)

環境

OS : CentOS7.1.1503
mariaDB : 10.0.17-MariaDB, for Linux (x86_64)

構成

図のようなマスターDBと複数のスレーブ(レプリカ)DBがいて、スレーブ毎にレプリケーションするスキーマが異なります。
全体

事象詳細

上記の構成の時に、あるスキーマのテーブルを更新しようとします。
その際、スキーマを指定しない状態で更新のSQL文を実行します。

$ mysql -u root -p    ### <== このように、スキーマを指定しない
Enter password:
MariaDB [(none)]>  ### <=== none と表示されていることからスキーマ指定されていないことがわかる

### このままスキーマを指定せず更新コマンドを実行
MariaDB [(none)]> update all.table1 set updated_at = now() where id = 1;
Query OK, 1 row affected (0.01 sec)  ### <== 更新成功と表示され、特にエラーは出ない

上記の手順で更新を実行した場合、以下図のように更新は成功するものの、slave01には更新が反映されず、slave02に更新が反映されてしまう(=スキーマが無いのでレプリケーションがエラー停止)する事象が発生します。
失敗事象

回避策

以下のように、明示的にスキーマを指定すれば回避できます。

MariaDB [(none)]> use all;  ### <== このSQL文でスキーマを明示的に指定
MariaDB [all]> update table1 set updated_at = now() where id = 1;

また、mariaDBにログインするときに指定してもOKです。

$ mysql -u root -p all
Enter password:
MariaDB [all]> update table1 set updated_at = now() where id = 1;

まとめると

このように、明示的にスキーマを指定しない場合、レプリケーションが失敗してしまうことがあります。
そもそもの作法としてはスキーマを指定するのが正しいようなので、それを守るということですね。
DBはいろいろ難しいですね。。

スポンサーリンク
Sponsords Link
  • このエントリーをはてなブックマークに追加

ZacoDesign

スポンサーリンク
Sponsords Link