MySQLのレプリケーションを勉強しています。同一サーバーで2つのMySQLを動かしたのですが、スレーブへの接続が難しかったので紹介します。
プログラムは、Oracleのバイナリを使い、Ubuntuのパッケージはアンインストールしました。MySQLのバージョンは5.7.18です。
インストールは、やさしく学べるMySQL運用・管理入門【5.7対応】を見て行いました。
インストール後、同じホストでMySQLをマスターとスレーブで2つ立ち上げました。
起動は簡単で、コンソールを2つ開いてそれぞれ別個に構成ファイルを指定して立ち上げます。
./mysqld --defaults-file=../etc/my.cnf & ./mysqld --defaults-file=../etc/my-slave.cnf &
もちろん、my.cnfとmy-slave.cnfのserver_idや、datadirは異なっています。スレーブ側のportは3307、Unixソケット名は/tmp/mysqlslave.sockです。
ここで、mysqlクライアントでマスターとスレーブの両方に接続しようとしましたが問題が起こりました。次のように2つ接続しましたが、結果は両方ともマスターにつながりました。
./mysql -uroot
./mysql -uroot -P3307
自分は、スレーブ上で作業していると思い込んでいて、マスターにマスターのスレーブになれと命令してしまいました。もちろんエラーになってそんなことできません。
調べてみると、接続方法としてLinux上ではTCP/IPではなく、Unixソケットが優先されるのだそうです。port番号だけでは無視されます。ホスト名にlocalhostを指定してもだめでした。
NGの例
./mysql -uroot -P3307 ./mysql -uroot -hlocalhost -P3307
そこで、スレーブに接続するには次のようにIPアドレス127.0.0.1を使うかソケット名を使うと接続できました。--protocolオプションでTCPを指定しても接続できます。
OKの例
./mysql -uroot -h127.0.0.1 -P3307 ./mysql -uroot --host=127.0.0.1 --port=3307 ./mysql -uroot -P3307 --protocol=tcp ./mysql -uroot -S/tmp/mysqlslave.sock ./mysql -uroot --socket=/tmp/mysqlslave.sock
ホスト名は、localhostだとUnixソケットで、127.0.0.1とIPアドレスにするとTCP/IPが使われます。なんという仕様でしょう。
--protocolオプションでプロトコルを指定すればOKです。
ソケット名を-Sオプションで指定するともちろん接続できますが、ソケット名を一つ一つ覚えるのは大変です。
mysqladminも同じ仕様のようです。気をつけましょう。