| 角色 | IP | OS | 軟體版本 |
|---|---|---|---|
| Master | 192.168.0.1 | FreeBSD 5.4 | Apache 2.0.55, PHP 4.4.0, MySQL 4.1.15 |
| Slave | 192.168.0.2 | FreeBSD 5.4 | 同版本 |
架構:單向複寫,Master 為寫入來源,Slave 主動拉取同步。
# 兩台同步執行
cd /usr/ports/databases/mysql41-server
make install clean
# 複製中型配置範本
cp /usr/local/mysql/share/mysql/my-medium.cnf /usr/local/mysql/var/my.cnf
/usr/local/mysql/var/my.cnf[mysqld]
server-id = 1
log-bin = mysql-bin
binlog-do-db = abc # 只同步 abc 資料庫
# sql-bin-update-same # 註:此參數非標準,建議移除
重啟:/usr/local/mysql/bin/mysqladmin shutdown && /usr/local/mysql/bin/mysqld_safe --user=mysql &
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.0.2' IDENTIFIED BY 'slavepass';
FLUSH PRIVILEGES;
/usr/local/mysql/var/my.cnf[mysqld]
server-id = 2
master-host = 192.168.0.1
master-user = repl
master-password = slavepass
master-port = 3306
replicate-do-db = abc
# 可選:relay-log 相關參數
FLUSH TABLES WITH READ LOCK; → SHOW MASTER STATUS; 記下 File/Position。mysqldump --master-data=1 abc > abc.sql 或打包 datadir)。mysql abc < abc.sql。UNLOCK TABLES;。/usr/local/mysql/bin/mysqladmin shutdown
/usr/local/mysql/bin/mysqld_safe --user=mysql &
mysql -u root -p
CHANGE MASTER TO
MASTER_HOST='192.168.0.1',
MASTER_USER='repl',
MASTER_PASSWORD='slavepass',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=98;
START SLAVE;
SHOW SLAVE STATUS\G
-- Master 執行
CREATE TABLE test_sync (id INT PRIMARY KEY, val VARCHAR(20));
INSERT INTO test_sync VALUES (1, 'hello');
-- Slave 查詢
SELECT * FROM abc.test_sync;
-- 應立即看到資料
/usr/local/etc/rc.d/mysql-server.sh,加入 mysql_enable="YES" 至 /etc/rc.conf。ipfw/pf 需開放 3306 兩向通訊。fsync 行為正確。mysqlcheck -o abc 優化表。bind-address。Last_SQL_Error,常見重複鍵、外鍵、字元集不符。binlog-do-db/replicate-do-db 設定一致,且無跨資料庫查詢。