私たちのmysqlバージョンは、「5.2を使用するportbld-freebsd7.2(AMD64)用のmysql Ver 14.14 Distrib 5.1.35」です。
単純なマスター/スレーブ関係で、レプリケーションを備えた2つのデータベースサーバーがあります。 mysql2
はマスター、mysql1
はスレーブです。 1年前、mysql
がマスターで、mysql2
がスレーブでした。ハードウェアの障害時には、役割を逆にする必要がありました。
マスターでは、server_id(server-id)を明示的に設定します
[root@mysql2 ~]# grep server-id my.cnf
server-id = 2
[root@mysql2 ~]# mysql -e "SHOW VARIABLES LIKE 'server_id'"
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id | 2 |
+---------------+-------+
ただし、この設定はスレーブのmy.cnfで設定されていません。
[root@mysql1 ~]# grep server-id my.cnf
おっと。 server_idはデフォルトで1に設定されているため、これは問題になりません。
[root@mysql1 ~]# mysql -e "SHOW VARIABLES LIKE 'server_id'"
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id | 1 |
+---------------+-------+
Mysqlを再起動すると、レプリケーションは正常に機能します。
ただし、手動で「STOP SLAVE」「START SLAVE」を実行すると、エラーが発生します。
[root@mysql1 ~]# mysql -e "STOP SLAVE;"
[root@mysql1 ~]# mysql -e "START SLAVE;"
ERROR 1200 (HY000) at line 1: The server is not configured as slave; fix in config file or with CHANGE MASTER TO
My.cnfに値を明示的に設定しないと、なぜこのエラーが発生するのですか?再起動時にレプリケーションが機能するのに、「スレーブの停止」時にレプリケーションが機能しないのはなぜですか。 「奴隷を始めなさい」?
server_id
にデフォルト値を割り当てたようです。デフォルトのmy.cnfによると、server_id
はデフォルトで1
になります。
# required unique id between 1 and 2^32 - 1
# defaults to 1 if master-Host is not set
# but will not function as a master if omitted
#server-id = 1
修正は、バロンシュワルツが http://www.xaprb.com/blog/2007/08/01/why-mysql-server-not-スレーブとして設定済み/
server-id = 1
2つのサーバーが同じserver_idを持つことはできません。また、 マスターから--server-idを省略した場合、デフォルトIDは0です。この場合、マスターはすべてのスレーブからの接続を拒否し、スレーブはマスターへの接続を拒否します 。
詳細については、 セクション15.1.1.2「レプリケーションスレーブ構成の設定」 を参照してください。
両方のサーバーのserver_id値が異なる場合でも、新しいマスターで バイナリログが有効になっている ことを確認してください。