カテゴリー別アーカイブ: MySQL

MySQLを同一サーバーで複数立ち上げた時の接続方法

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も同じ仕様のようです。気をつけましょう。