原理:主庫的所有變更操作(寫入更新)都會視為事件,寫入二進制日志文件中。從庫通過讀取主庫的二進制日志文件,並在從庫中執行這些事件,達到主從同步。
准備兩台服務器,分別在兩台服務器進行以下配置:
cd /etc/my.cnf.d
vim mysql-server.conf
主數據庫配置核心部分
#設置同步的binary log二進制日志文件名前綴,默認為binlog
log-bin=mysql-bin
#服務器唯一id,默認為1 主數據庫和從數據庫的server-id不能重復
server-id=1
#需要復制的數據庫
binlog-do-db=test
#過濾,也就是指定哪個數據庫不用同步
binlog-ignore-db=mysql
#為每個session分配的內存,在事務過程中用來存儲二進制日志的緩存
binlog_cache_size=1M
#主從復制的格式(mixed,statement,row,默認格式是statement。建議是設置為row,主從復制時數據更加能夠統一)
binlog_format=row
#設置二進制日志自動刪除/過期的天數,避免占用磁盤空間。默認值為0,表示不自動刪除。
expire_logs_days=7
#跳過主從復制中遇到的所有錯誤或指定類型的錯誤,避免slave端復制中斷。
#如:1062錯誤是指一些主鍵重復,1032錯誤是因為主從數據庫數據不一致
slave_skip_errors=1062
重啟數據庫
service mysqld restart
執行mysql語句
create user 'root'@'%' identified by '123456';
grant replication slave on *.* to 'root'@'%';
flush privileges;
show master status \G
*__將File及Position復制下來,從庫配置會用到上面的信息__*
cd /etc/my.cnf.d
vim mysql-server.conf
從庫數據庫配置核心部分
# 設置同步的binary log二進制日志文件名前綴,默認是binlog
log-bin=mysql-bin
# 服務器唯一ID 主數據庫和從數據庫的server-id不能重復
server-id=2
###可選配置
# 需要主從復制的數據庫
replicate-do-db=test
# 復制過濾:也就是指定哪個數據庫不用同步(mysql庫一般不同步)
binlog-ignore-db=mysql
# 為每個session分配的內存,在事務過程中用來存儲二進制日志的緩存
binlog_cache_size=1M
# 主從復制的格式(mixed,statement,row,默認格式是statement。建議是設置為row,主從復制時數據更加能夠統一)
binlog_format=row
# 設置二進制日志自動刪除/過期的天數,避免占用磁盤空間。默認值為0,表示不自動刪除。
expire_logs_days=7
# 跳過主從復制中遇到的所有錯誤或指定類型的錯誤,避免slave端復制中斷。
# 如:1062錯誤是指一些主鍵重復,1032錯誤是因為主從數據庫數據不一致
slave_skip_errors=1062
# relay_log配置中繼日志,默認采用 主機名-relay-bin 的方式保存日志文件
relay_log=replicas-mysql-relay-bin
# log_slave_updates表示slave將復制事件寫進自己的二進制日志
log_slave_updates=1
# 防止改變數據(只讀操作,除了特殊的線程)
read_only=1
重啟數據庫
service mysqld restart
執行mysql語句
mysql:
change master to MASTER_HOST='192.168.0.23',MASTER_PORT=3306,MASTER_USER='root',MASTER_PASSWORD='tw369.com',MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=156;
flush privileges;
start slave;/stop slave;
show slave status \G
確認結果
如果 Slave_IO_Running=YES、Slave_SQL_Running=Yes、Slave_IO_State=Waiting for master to send event 則表示成功
常見問題處理
show slave status \G
檢查Last_Error的信息,在Master檢索日志
mysqlbinlog --no-defaults -v -v --base64-output=DECODE-ROWS mysql-bin.000001 | grep -A '10' 55154294
手工干預處理后,忽略掉錯誤的一致性問題,重新開啟同步
stop slave;set global sql_slave_skip_counter=1;start slave;show slave status\G;
如反復出現,類似於常見BUG,則忽略掉相關的錯誤
vim /etc/my.cnf
slave-skip-errors = 1032,xxxx,xxxx ....
重啟服務
