2012年8月16日 星期四

[MySQL] MySQL Replication (master slave)

以下實作一個範例為將 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/

沒有留言:

張貼留言