2010年4月13日 星期二

MySQL 設定 Replication (Master - Slave)

文章出自 johnpupu

MySQL 設定寫入 Master 後, 自動 Replication 到 Slave 去, 運作基本原理是:

INSERT/UPDATE/DELETE 語法, 自動寫入 Master 的 binlog file.
由 GRANT REPLICATION 授權的帳號, 自動將 SQL 語法 repl 到 Slave 的 DB 執行.
因而完成 Replication 的動作.

Master

1. 複制 my.cnf

甲、#cp /usr/local/share/mysql/my-large.cnf /etc/my.cnf


2. 修改my.cnf

甲、server-id = 1

乙、log-bin=mysql-bin

丙、expire-logs-days = 7

丁、max_binlog_size = 268435456

戊、# 若是 innodb, 且有用 transaction 的話, 需再加入下面兩行
innodb_flush_log_at_trx_commit=1
sync_binlog=1

3. # mysql -u root -p # 進入 mysql

甲、# 先假設 帳號 repl, 密碼 repl_pass, 此步驟是 設定 repl 的帳號/密碼,
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%' IDENTIFIED BY 'repl_pass';
# 格式:
mysql > GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%' IDENTIFIED BY 'repl_pass';
# (Replace with a real password!)

乙、# 先讓 DB 不要再寫資料進去
mysql> FLUSH TABLES WITH READ LOCK;

丙、# 這邊資料都要記好, 等一下設定 Slave 要用
mysql> SHOW MASTER STATUS;

+----------------------+------------+------------------+----------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+----------------------+------------+------------------+----------------------+
| mysql-bin.000014 | 232 | | |
+----------------------+------------+------------------+----------------------+


4. # 離開, 準備倒資料
mysql> quit

5. # 倒資料
cp –Rp /var/db/mysql /mnt/nas

6. # dump 完資料後, 進去 mysql 解除唯讀
mysql> UNLOCK TABLES;





Slave

7. 複制 my.cnf

甲、#cp /usr/local/share/mysql/my-large.cnf /etc/my.cnf


8. 修改my.cnf

甲、server-id = 2 # server-id 不能與其它機器相同

乙、log-bin=mysql-bin

丙、expire-logs-days = 7

丁、max_binlog_size = 268435456

戊、# 若是 innodb, 且有用 transaction 的話, 需再加入下面兩行
innodb_flush_log_at_trx_commit=1
sync_binlog=1

9. 複制mysql 資料夾過來

甲、# mv /var/db/mysql /var/db/mysql.bak

乙、# cp -Rp /mnt/nas/mysql /var/db/mysql

10. 設定slave

甲、mysql> CHANGE MASTER TO
MASTER_HOST='MASTER_HOSTNAME',
MASTER_USER='repl',
MASTER_PASSWORD='repl_pass',
MASTER_LOG_FILE='mysql-bin.000014',
MASTER_LOG_POS=232;
# 這邊就要用到之前 Master 抄下來的值

乙、# 這樣子就會開始 Replication 了, 會將 LOG_POS 之後新的資料開始 sync 回來
mysql> START SLAVE;

丙、# 檢查一下設定
mysql> show master status;



丁、# 檢查一下設定, 看是不是有異常狀況
mysql> show slave status;


測試

11. 在 master: mysql> create database test2;

12. 在 slave: mysql> show database; # 應該會看到 test2


0 意見: