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