1.mysql 主備配置設定
主庫配置 同步帳號
CREATE USER 'repl'@'%' IDENTIFIED WITH mysql_native_password BY 'Ron_master_1';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
flush privileges;
2.主庫配置 /etc/my.cnf
[mysqld]
log-bin=/mysql/data/binlogs/mysql-bin
server-id=1
3.備庫配置 /etc/my.cnf
[mysqld]
log-bin=/mysql/data/binlogs/mysql-bin
relay_log=/mysql/data/binlogs/mysql-relay-bin
server-id=2
log_slave_updates=1
read_only=1
開啟read_only
一般來說 備庫是不用配置 log-bin , 除非該slave 是 其他slave 的master
4. 查看主庫 log 狀態
show master status;
5.登入備庫設定 主庫的 bin 及 position 參數
CHANGE MASTER TO
MASTER_HOST='10.10.17.27',
MASTER_USER='repl',
MASTER_PASSWORD='Ron_master_1',
MASTER_LOG_FILE='mysql-bin.000002',
MASTER_LOG_POS=794;
確認 data 下的 auto.cnf 的 uuid 跟主庫不同
修改server-uuid
查詢show variables like '%server_uuid%';
啟動 slave 同步
start slave;
備庫查看狀態........
show slave status\G;
這邊可以看到相關的主庫資訊
Slave_io_running , slave_sql_running 都是 YES
Last_IO_Errno , Last_SQL_Errno 也都是 0
表示同步啟動沒問題,,,
--------------測試數據同步
-------------- 停止 slave 同步
stop slave ;
--------------備庫指定從主庫某一個 Position 開始同步
備庫先停掉同步
stop slave ;
主備兩邊的資料目前都是一致的
接下來主庫一直做資料異動
查看 主庫 bin 及 position 參數
show master status;
備庫開始從這一點開始進行同步
CHANGE MASTER TO
MASTER_HOST='10.10.17.27',
MASTER_USER='repl',
MASTER_PASSWORD='Ron_master_1',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=2236;
start slave ;
主庫這時候新增一筆 id = 4
備庫 這邊只會查詢到 id = 1,2 及剛剛新增的 id = 4
不過此時要注意, 主庫刪除 id= 3 時, 因備庫沒有 id = 3
這時同步會停止且出現 Last_Errno: 1032 錯誤
同步停在 master log mysql-bin.000001, end_log_pos 2815
--------------解決方法1
因為我們知道 備庫是少 id = 3 , 這時候備庫手動新增 id = 3 上去
在執行
start slave ; 同步就可以再次執行 id = 3 也被刪除了
--------------解決方法2
備庫執行show slave status\G;
裡頭的錯誤訊息
Last_SQL_Error: Could not execute Delete_rows event on table DBA.dba_test; Can't find record in 'dba_test', Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND; the event's master log mysql-bin.000001, end_log_pos 2815
錯誤很明顯的跟你說 是這邊表 table DBA.dba_test 有問題且停在 master log mysql-bin.000001, end_log_pos 2815 位置
直接從主庫找 bin log 的紀錄 看看執行哪一條SQL 出現錯誤
mysqlbinlog --no-defaults --base64-output=decode-rows -v -v /mysql/data/mysql-bin.000001 | grep -A 200 '2815' > error_sql.txt
執行delete 出現錯誤, 把資料補回去備庫後, 就可以在執行同步了