MySQLのmaster/slave環境を作る

1つのサーバーでmaster/slave環境を作ります。
ここではmyqsld_multiを利用します。

複数のmysqldをたてる

まず、既に /var/lib/mysql のような場所で1つ動いていると仮定します(こいつがマスターになります
元の環境を汚したくないので、/usr/local/var/の下にmysql2とmysql3を作ることにします。

mkdir /usr/local/var/mysql2
mkdir /usr/local/var/mysql3
mysql_install_db --datadir=/usr/local/var/mysql2
mysql_install_db --datadir=/usr/local/var/mysql3

次に、mysqlのconfファイルであるmy.cnfを編集します。
ここでも既存の環境を汚したくないので、my_multi.cnfを用意します。

[mysqld]
user=mysql
symbolic-links=0
character-set-server = utf8

[mysqld_multi]
mysqld=/usr/bin/mysqld_safe
mysqladmin=/usr/bin/mysqladmin

[mysqld2]
datadir=/usr/local/var/mysql2
socket=/usr/local/var/mysql2/mysql.sock
pid-file=/usr/local/var/mysql2/hostname.pid2
port=3307
server-id=2

[mysqld3]
datadir=/usr/local/var/mysql3
socket=/usr/local/var/mysql3/mysql.sock
pid-file=/usr/local/var/mysql3/hostname.pid3
port=3308
server-id=3

masterとslaveを設定する

もともとあったmysqlデータベースをmasterにするために、一部、my.cnfを編集します。
log-binとserver-id=1を加えました。

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
symbolic-links=0
character-set-server = utf8
log-bin
server-id=1

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

mysqlを再起動します。
その後、レプリケーション用のユーザーを作成します。

mysql> GRANT REPLICATION SLAVE ON *.* TO repl@localhost IDENTIFIED BY 'mysql';

次に、現在のクエリログの位置を調べるために、以下のコマンドを打ちます。

mysql> show master status;
+-------------------+----------+--------------+------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| mysqld-bin.000002 |   961659 |              |                  |
+-------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

あと、既にデータベースがある場合は、mysqldumpでデータをコピーします。
ちなみにこの間は、テーブルに変更が加えられない前提です。

mysqldump -u root -hlocalhost -p hoge > ~/dump.sql

これをslaveに教えてあげます。
まずmysqlを起動します。

mysqld_multi --defaults-file=/etc/my_multi.cnf start
mysqladmin -u root password 'mysql' --socket=/usr/local/var/mysql2/mysql.sock
mysqladmin -u root password 'mysql' --socket=/usr/local/var/mysql3/mysql.sock

次に、mysqldumpした結果を取り込みます。

mysql -uroot -pmysql -hlocalhost --socket=/usr/local/var/mysql3/mysql.sock hoge < ~/dump.sql
mysql -uroot -pmysql -hlocalhost --socket=/usr/local/var/mysql3/mysql.sock hoge < ~/dump.sql

最後に、マスターの登録をします。これをそれぞれのデータベースで行います。

mysql> CHANGE MASTER TO MASTER_HOST='localhost', MASTER_USER='repl', MASTER_PASSWORD='mysql', MASTER_LOG_FILE='mysqld-bin.000002', MASTER_LOG_POS=961659;


これでおしまいです。
masterでINSERTするとslaveにも反映されてると思います。

slaveでshow slave statusを打ったときに、
Got fatal error 1236 from master when reading data ... と出ていたら何かが間違っているので見なおしてみましょう。