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 ... と出ていたら何かが間違っているので見なおしてみましょう。