MySQL を別ポートで立ち上げて、特定の DB のみレプリケーションする

開発環境上でレプリケーションをする必要が生じた。
server1(master) - server2(slave)

しかし、


1, server2 の MySQL は普通に使っているため、別ポートで MySQL を立ち上げる必要がある。
2, server1(master) 全ての DB を slave 側でレプリケーションしたくない。


という作業をしたのでメモしとく。


まず server2 の別ポートで MySQL を立てる。
http://brass.to/blog/multi_mysql.html
上記記事が大変役に立った。ありがとうございました。

$ sudo mkdir /var/lib/mysql2
$ sudo cp /etc/my.cnf /etc/my2.cnf
$ sudo vi /etc/my2.cnf
datadir = /var/lib/mysql2
port    = 3307
socket  = /var/lib/mysql2/mysql.sock
log-error = /var/log/mysqld2.log
pid-file  = /var/run/mysqld/mysqld2.pid


とかして、起動スクリプトを上記URLのように編集したりする。
/etc/init.d/mysqld2 とかを見ると、

 45 start(){
 46     touch "$errlogfile"
 47     chown mysql:mysql "$errlogfile"
 48     chmod 0640 "$errlogfile"
 49     [ -x /sbin/restorecon ] && /sbin/restorecon "$errlogfile"
 50     if [ ! -d "$datadir/mysql" ] ; then
 51         action $"Initializing MySQL database: " /usr/bin/mysql_install_db
 52         ret=$?


とかあるのに、datadir の初期化がうまくいかなかったので手で実行した><

 $ sudo /usr/bin/mysql_install_db --basedir=/usr --datadir=/var/lib/mysql2 --user=mysql --pid-file=/var/run/mysqld/mysqld2.pid --skip-external-locking --port=3307 --socket=/var/lib/mysql2/mysql.sock


これで、mysql という db ができて、

$ sudo /etc/init.d/mysqld2 start
$ sudo /etc/init.d/mysqld2 stop


などとして実行できるようになった。
コマンドライン・クライアントの起動の時は以下のように。

$ mysql -uroot -p --socket=/var/lib/mysql2/mysql.sock


次にレプリケーションの設定。
基本的なレプリケーションの仕方は変わらないのでここでは省く。


slave の /etc/my2.cnf に

replicate-do-db    = db_name1
replicate-do-db    = db_name2


みたいにすれば、指定した DB だけをレプリケートするようでうまくいった。


    • replicate-* オプションがないなど、ルールが単純な場合は、この手順により、スレーブがマスタから受信するすべてのクエリを実行するという結果を生成します。それ以外には、この結果は設定オプションに依存します。ノート:「do」 および 「ignore」 のオプション、またはワイルド カードなどのオプションの混在を避けることで、ルール セットの設定効果を決定する作業が簡素化します。


参考


http://brass.to/blog/multi_mysql.html
http://dev.mysql.com/doc/refman/5.1/ja/replication-rules.html
http://www.irori.org/doc/mysql-rep.html