以下實作一個範例為將 Master's Mysql 內的 test 資料庫同步至 Slave's Mysql 內的 test 資料庫
Master:
1. vi /etc/my.cnf
加入
server-id=1
log-bin=/var/lib/mysql/mysql-bin #mysql 會根據這麼 log 檔去同步資料
binlog-do-db=test #設定那個 database 做同步, 在這裡以 test 為例
2.重新啟動 MySQL
service mysqld restart
3.匯出 test 資料庫的資料(加 -l 是要把目前 table lock 起來再輸出)
mysqldump -l -u root -p test > test.sql
4.將sql傳送到 slave 的機器上
scp test.sql root@192.168.1.2:~/test.sql
5.進入MySQL command mode
mysql -u root -p
6.建立一個做為 replication 的帳號密碼
在此是建立一個帳號為 replication 密碼為 abc123 為例
mysql> CREATE USER 'replication'@'%' IDENTIFIED BY 'abc123';
給予 replication 帳號擁有 replicaiton 的權限
mysql> GRANT REPLICATION SLAVE ON *.* TO 'replication'@'%';
Slave:
1. 建立一個 test 資料庫
mysql -u root -p
mysql> CREATE DATABASE `test` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
2. 匯入資料
mysql -u root -p test < test.sql
3. vi /etc/my.cnf
加入
server-id=2
#不能重複
log-slave-updates #告訴 slave 去 master 抓資料
log-bin=mysql-bin
binlog_format=mixed
relay-log=hostname-relay-bin
replicate-do-db=test #需要同步的 database name
master-connect-retry=60 #取得資料發生錯誤多久重試嘗試(以秒單位)
read-only=1
#很重要, 將 slave 的資料庫設為唯讀, 因為如果資料表格發生衝突時, 該資料表將不會再同步。另外要注意的是此選項對於 root 和擁有 replication 的帳號沒用, 這些帳號還是有寫入權限
4. service mysqld restart
5. mysql -u root -p
修改 slave 的設定值
mysql> CHANGE MASTER TO MASTER_HOST='192.168.1.1',
MASTER_USER='replication', MASTER_PASSWORD='abc123';
這裡帳號密碼請填入 master 所建立的
清空原設定 以下指令是如果原本有建立過replication可用此指令清除資料
mysql> CHANGE MASTER TO MASTER_LOG_FILE='', MASTER_LOG_POS=0;
6. 啟動 slave
mysql> SLAVE START;
7. 確認是否有啟動
mysql> SHOW SLAVE STATUS;
必須看到以下 2 個狀能為 Yes
Slave_IO_Running Yes
Slave_SQL_Running Yes
如不是 Yes 請查看 /var/log/mysqld.log
為你的系統建一個普通的帳密(上述如果開放寫入, 發生衝突即無法同步)
mysql> CREATE USER 'test'@'%' IDENTIFIED BY 'eabc123';
給予 test 帳號存取 test 資料庫權限
mysql> GRANT ALL ON test.* TO 'test'@'%';
ref:
http://homeserver.com.tw/%E7%86%B1%E9%96%80%E6%9B%B8%E7%B1%A4/mysql-master-slave/
http://blog.wu-boy.com/2008/12/mysql-%E5%AF%A6%E5%81%9A-mysql-master-master-replication-%E5%90%8C%E6%AD%A5/