MySQL主從服務器鏈式復制配置(ubuntu) 服務器結構: A、B、C三台服務器; 其中A為新聞數據源,A為B的Master,B為A的Slave,同時也是C的Master; B服務器從A復制部分數據,C備份A的所有數據; 配置: Master A的配置 sudo vi /etc/mysql/my.cnf 刪除以下參數前的注釋並修改 server-id = 1 //分配server-id log-bin = master-bin //默認mysql-bin,可以不修改 log-bin-index = master-bin.index //非必須 bind-adress = 0.0.0.0 //默認127.0.0.1 不修改可能導致無法訪問 修改系統防火牆使B服務器可以訪問3306端口,(詳查ufw命令) 重啟mysql: sudo /init.d/mysql restart 通過語句: GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO user@'ip B' IDENTIFIED BY 'password'; 給B服務器建立一個可以連接到A的帳號 進入mysql,通過: show master status; 查看A的狀態,記錄下file的位置和postion的參數 Slave B的配置 sudo vi /etc/mysql/my.cnf server-id = 2 log-bin = slave-bin bind-address = 0.0.0.0 relay-log-index = slave-relay-bin.index //非必須 relay-log = slave-relay-bin //非必須 添加參數: log-slave-updates = 1 //通常情況,從服務器從主服務器接收到的更新不記入它的二進制日志。 //該選項告訴從服務器將其SQL線程執行的更新記入到從服務器自己的二進制日志。 replicate_wild_do_table = copy_db.copy_table //表示需要復制的庫中的表,可以善用% replicate_wild_ignore_table = ignore_db.ignore_table //不復制的表 至於為什麼不使用replicate_do_db和replicate_ignore_db參數, 是為了方式跨庫更新時出錯,如果能確保不會跨庫更新可考慮 重啟mysql,進入本機mysql 執行以下語句: CHANGE MASTER TO MASTER_HOST='server A ip', MASTER_PORT=3306, MASTER_USER='user', MASTER_PASSWORD='password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=0; //MASTER_LOG_FILE和MASTER_LOG_POS對應A中的file位置和postion參數,表示開始復制的bin文件和位置 start slave; //啟動Slave show slave status; //查看Slave_IO_State參數,如果是Waiting for master to send event,則正常 //正常狀態下Slave_IO_Running與Slave_SQL_Running均為yes //如不能正常鏈接,根據Slave_IO_State,Slave_IO_Running,Slave_SQL_Running,Last_IO_Error //等參數查找失敗原因 通過: show master status; 命令記錄file位置和postion參數; 給C服務器分配一個帳號用於同步; 方法參照A,防火牆設置參照A; Slave C的配置 sudo vi /etc/mysql/my.cnf server-id = 3 relay-log-index = slave-relay-bin.index //非必須 relay-log = slave-relay-bin //非必須 通過CHANGE MASTER TO語句來修改master的參數,參照B的配置; 通過 show slave status; 檢查C的狀態,參照B