2020年9月23日 星期三

mysql 8 主備配置




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 出現錯誤, 把資料補回去備庫後, 就可以在執行同步了