MySQL 5.6 リファレンスマニュアル  /  ...  /  レプリケーションおよびバイナリロギングのオプションと変数

17.1.4 レプリケーションおよびバイナリロギングのオプションと変数

以降のセクションでは、mysqld オプション、およびレプリケーションで使用されてバイナリログを制御するためのサーバー変数の情報について説明します。レプリケーションマスターとレプリケーションスレーブで使用されるオプションと変数のうち、バイナリロギングに関係するオプションおよび変数であるものは、別途説明します。これらのオプションと変数に関する基本情報するクイックリファレンス表のセットも含まれています。

特に重要なものは --server-id オプションです。

コマンド行形式 --server-id=#
システム変数 名前 server_id
変数スコープ グローバル
動的変数 はい
許可されている値 数値
デフォルト 0
最小値 0
最大値 4294967295


マスターおよび各スレーブでは、--server-id オプションを使用して、範囲が 1 から 232 − 1 の一意レプリケーション ID を確立する必要があります一意とは、各 ID が、ほかのレプリケーションマスターまたはスレーブで使用されるほかのあらゆる ID と異なっている必要があるということです。たとえば、server-id=3

--server-id を省略すると、デフォルト ID は 0 になり、この場合、マスターはすべてのスレーブからの接続を拒否し、スレーブはマスターへの接続を拒否します。MySQL 5.6 では、サーバー ID が明示的に 0 に設定されていても、デフォルトの使用が許可されていても、サーバーは server_id システム変数を 1 に設定します。これは MySQL 5.7 で修正された既知の問題です。



MySQL 5.6 以降、サーバーはユーザーが指定する --server-id に加えて真の UUID を生成します。これは、グローバルな読み取り専用変数 server_uuid として使用できます。

導入 5.6.0
システム変数 名前 server_uuid
変数スコープ グローバル
動的変数 いいえ
許可されている値 文字列

起動時、MySQL サーバーは次のように自動的に UUID を取得します。

  1. ファイル data_dir/auto.cnf に書かれている UUID を読み取って使用しようとします (ここで、data_dir はサーバーのデータディレクトリ)。

  2. data_dir/auto.cnf が見つからない場合、新しい UUID を生成してこのファイルに保存します (必要に応じてファイルを作成します)。

auto.cnf ファイルは、my.cnf または my.ini ファイルに使用されるものに類似した形式です。MySQL 5.6 では、auto.cnf に単一 server_uuid 設定と値を含む、単一 [auto] セクションのみがあります。ファイルの内容は次に示すものに似ています。


auto.cnf ファイルは自動的に生成されます。このファイルを書き込んだり修正したりしようとしないでください。

MySQL 5.6 以降では、MySQL レプリケーションを使用するときに、マスターとスレーブは互いの UUID がわかります。スレーブの UUID の値は SHOW SLAVE HOSTS の出力で確認できます。START SLAVE が実行されたあとは (前ではありません)、マスターの UUID の値はスレーブでは SHOW SLAVE STATUS の出力で確認できます。


STOP SLAVE または RESET SLAVE ステートメントを発行しても、スレーブで使用されるマスターの UUID はリセットされません

MySQL 5.6.5 以降では、サーバーの server_uuid は、そのサーバーで発生するトランザクションの GTID でも使用されます。詳細は、セクション17.1.3「グローバルトランザクション識別子を使用したレプリケーション」を参照してください。

起動時に、スレーブ I/O スレッドは、そのマスターの UUID がそれ自身と等しい場合、--replicate-same-server-id オプションが設定されている場合を除き、エラーを生成して中断します。また次のどちらかが true の場合、スレーブ I/O スレッドは警告を生成します。

  • 予期された server_uuid を持つマスターが存在しない。

  • CHANGE MASTER TO ステートメントがこれまで実行されなかったのみ、マスターの server_uuid が変化した。


MySQL 5.6 で server_uuid システム変数が追加されても、このセクションですでに説明したように、MySQL レプリケーションの準備と実行の一部として MySQL サーバーごとに一意の --server-id を設定する必要があることは変わりません。

Download this Manual
EPUB - 7.5Mb
HTML Download (TGZ) - 7.1Mb
HTML Download (Zip) - 7.2Mb
User Comments
  Posted by kit chen on September 16, 2002
If you're attempting to use both
be aware that you need to actually say
because the rewrite rule apparently happens before
the do-db rule.

thanks to Therion on opn/freenode for
troubleshooting this with me.
  Posted by Michael Babcock on November 8, 2002
I was about to post the same comment, but as it
applies to replicate-wild-do-table.

replicate-wild-do-table = LocalTableName.%
replicate-rewrite-db = RemoteTableName ->
  Posted by Ken Allan on November 25, 2002
Be really careful with the use of the
replicate-wild-do-table=db_name.% configuration
option. In 4.0.4, this option caused updates to
any specified tables to not work for me.

I had read in the documentation that this was
needed for cross database updates, but it was
causing my same database updates to fail.

I had the following options set in my slave my.cnf:
server-id = 16
master-host = 64.xx.xx.xx
master-user = replicator
master-password = *****
replicate-wild-do-table = banner.%
replicate-do-db = banner
report-host = 64.xx.xx.xx

Also, worth mentioning is that there seems to be
some limit in the server-id's, initially i set my
server-id to 15001 and this caused replication to
fail silently to even start up. Changed it to 16,
and it works perfectly, all this despite the
alleged limit of 2^32-1.

  Posted by Fajar Nugraha on June 9, 2003
I have this setup working :

A -> B -> A

I got in running with mysql 4.0.13-max, using MyISAM and InnoDB tables.

Here's how I do it on A:
- enable bin-log (just add log-bin in /etc/my.cnf. Restart mysqld if necessary.)
- create a replication user on A (I give it all privileges. You probably shouldn't do that).
- execute query
- do
tar -cvf /tmp/mysql-snapshot.tar /path/to/data-dir
- execute query
write down the result for
- modify /etc/my.cnf to include
- shutdown mysqld on A (my root is password-protected, and I do it from another terminal)
mysqladmin -uroot -p shutdown
- start it back up

on B (make sure there are NO update queries on B at this point):
- make sure mysqld is dead
- copy and untar mysql-snapshot.tar created earlier
- copy my.cnf from A, put DIFFERENT number in server_id.
- start mysqld (make sure binary log is enabled)
- execute queries (this is where you put the values you got earlier from SHOW MASTER STATUS on A):
MASTER_USER='<replication user name>',
MASTER_PASSWORD='<replication password>',
MASTER_LOG_FILE='<recorded log file name>',
MASTER_LOG_POS=<recorded log offset>;
- execute query
write down the values

At this point you got A->B replication

on A again:
- copy B's *.bin.* (binary logs), put it in A's data dir
- execute queries (this is where you put the values you got earlier from SHOW MASTER STATUS on B):
MASTER_USER='<replication user name>',
MASTER_PASSWORD='<replication password>',
MASTER_LOG_FILE='<recorded log file name>',
MASTER_LOG_POS=<recorded log offset>;

And you're done! If you do what I do, you will have the same user on both A and B, and this replication setup :

A -> B -> A

You can now execute any query on any of them, and it will appear on both. You can even call it a mysql cluster.
  Posted by Steve Rapaport on July 22, 2003
Very nice, but remember that in my experience, setting up a working replication is the EASY part. The hard part is always what to do after one machine fails, to reset both
and restart the replication properly.

With A->B replication this is easy -- either switch masters as described in the Replication FAQ, or copy the slave back to the master, reset all the logs, and start again.

With A->B->A replication I would never be certain that I had reset correctly, or even that all my last transactions before the failure were all on the same machine! So I wouldn't do it. It's a low-reliability system, which kind of defeats the purpose (for me) of replication.
  Posted by Paul Howell on January 31, 2006
Fajar Nugraha has a great tip a few comments above me, however, he is missing one important step. On B, you need to do another GRANT to create a user so that A can access B as a slave.
  Posted by Justin Swanhart on March 15, 2007

slave-skip-errors is _not_ a good idea on dual-masters. If you have a dual-master setup you must ensure that writes go to one master, or that you run version 5+ and use the auto_increment offset and increment options.

If you use the slave-skip-errors option suggested by a previous commenter you will end up with hopelessly inconsistent data. With the slave-skip-errors set as suggested there will be records on one machine with the same primary key id, but different column values.

It is also difficult to ascertain the proper log positions when trying to restore a failed master when both masters are written to.
  Posted by Zoltán Pósfai on January 12, 2009
The above ABA setup has a couple of shortcomings everyone has to be aware before using it. (I've been using it for years...)

Never use both sides for writes as statements need time to get to the slave. For example:
- Sending two update on the same value makes it unpredictable which one will be the final one (you may even end up with different values on the two sides)
- Doing queries that use auto-incremented fields may give different results depending on which node you are when you just incremented the field.
- If sync breaks you loose the executed but not replicated queries on one side. If the sync breaks because of connection error between A-B but they are reachable from clients, you may en up with a completely screwed up db! (example client->frontend, replication->backend)

This setup is more a kind of HA/switchover setup than clustering...

If you want HA and clustering and use only 'basic' mysql features do:

- ABA setup in failover setup
- add VRRP'ed IP seen by slave farm as master (and same users to A and B; you may as well fire up the ABA setup for the 'mysql' db)
- separate rw and ro operations in clients, use A(B) for writes and use the slave farm for ro
- loadbalance between slaves (choose you flavour for lb)

Sign Up Login You must be logged in to post a comment.