MySQL主從復(fù)制

什么是主從復(fù)制?

主從復(fù)制是指將主數(shù)據(jù)庫的DDL和DML操作通過二進制日志傳到從數(shù)據(jù)庫上,然后在從數(shù)據(jù)庫上對這些日志進行重新執(zhí)行,從而使從數(shù)據(jù)庫和主數(shù)據(jù)庫的數(shù)據(jù)保持一致。

主從復(fù)制的原理

  • MySql主庫在事務(wù)提交時會把數(shù)據(jù)變更作為事件記錄在二進制日志Binlog中;
  • 主庫推送二進制日志文件Binlog中的事件到從庫的中繼日志RelayLog中,之后從庫根據(jù)中繼日志重做數(shù)據(jù)變更操作,通過邏輯復(fù)制來達到主庫和從庫的數(shù)據(jù)一致性;
  • MySql通過三個線程來完成主從庫間的數(shù)據(jù)復(fù)制,其中Binlog Dump線程跑在主庫上,I/O線程和SQL線程跑在從庫上;
  • 當(dāng)在從庫上啟動復(fù)制時,首先創(chuàng)建I/O線程連接主庫,主庫隨后創(chuàng)建BinlogDump線程讀取數(shù)據(jù)庫事件并發(fā)送給I/O線程,I/O線程獲取到事件數(shù)據(jù)后更新到從庫的中繼日志Relay Log中去,之后從庫上的SQL線程讀取中繼日志Relay Log中更新的數(shù)據(jù)庫事件并應(yīng)用,如下圖所示
image.png

主實例搭建

  • 修改配置文件/etc/my.cnf,配置信息如下:
[mysqld]
## 設(shè)置server_id,同一局域網(wǎng)中需要唯一
server_id=101 
## 指定不需要同步的數(shù)據(jù)庫名稱
binlog-ignore-db=mysql  
## 開啟二進制日志功能
log-bin=mysql-bin  
## 設(shè)置二進制日志使用內(nèi)存大?。ㄊ聞?wù))
binlog_cache_size=1M  
## 設(shè)置使用的二進制日志格式(mixed,statement,row)
binlog_format=mixed  
## 二進制日志過期清理時間。默認值為0,表示不自動清理。
expire_logs_days=7  
## 跳過主從復(fù)制中遇到的所有錯誤或指定類型的錯誤,避免slave端復(fù)制中斷。
## 如:1062錯誤是指一些主鍵重復(fù),1032錯誤是因為主從數(shù)據(jù)庫數(shù)據(jù)不一致
slave_skip_errors=1062  
  • 重啟mysql-master
systemctl restart mysqld.service
  • 創(chuàng)建數(shù)據(jù)同步用戶
mysql -uroot -p
mysql> CREATE USER 'slave'@'%' IDENTIFIED BY 'slave123';
mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';

從實例搭建

  • 修改配置文件/etc/my.cnf,配置信息如下:
[mysqld]
## 設(shè)置server_id,同一局域網(wǎng)中需要唯一
server_id=102 
## 指定不需要同步的數(shù)據(jù)庫名稱
binlog-ignore-db=mysql  
## 開啟二進制日志功能
log-bin=mysql-bin  
## 設(shè)置二進制日志使用內(nèi)存大?。ㄊ聞?wù))
binlog_cache_size=1M  
## 設(shè)置使用的二進制日志格式(mixed,statement,row)
binlog_format=mixed  
## 二進制日志過期清理時間。默認值為0,表示不自動清理。
expire_logs_days=7  
## 跳過主從復(fù)制中遇到的所有錯誤或指定類型的錯誤,避免slave端復(fù)制中斷。
## 如:1062錯誤是指一些主鍵重復(fù),1032錯誤是因為主從數(shù)據(jù)庫數(shù)據(jù)不一致
slave_skip_errors=1062  
  • 重啟mysql-slave
systemctl restart mysqld.service
  • 在從數(shù)據(jù)庫中配置主從復(fù)制
change master to master_host='192.168.0.177', master_user='slave', master_password='slave123', master_port=3306, master_log_file='mysql-bin.000001', master_log_pos=154, master_connect_retry=30;
  • 查看從數(shù)據(jù)庫狀態(tài)發(fā)現(xiàn)已經(jīng)同步


    image.png

主從復(fù)制測試

主從復(fù)制的測試方法有很多,可以在主實例中創(chuàng)建一個數(shù)據(jù)庫,看看從實例中是否有該數(shù)據(jù)庫,如果有,表示主從復(fù)制已經(jīng)搭建成功。
在主實例中創(chuàng)建一個數(shù)據(jù)庫test_db;
在從實例中查看數(shù)據(jù)庫,發(fā)現(xiàn)也有一個test_db數(shù)據(jù)庫,可以判斷主從復(fù)制已經(jīng)搭建成功。

主從復(fù)制重置

主實例
mysql> reset master;
mysql> show master status;
從實例
mysql> change master to master_host='192.168.0.177', master_user='slave', master_password='slave123', master_port=3306, master_log_file='mysql-bin.000001', master_log_pos=154, master_connect_retry=30;

start slave;
show slave status \G
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容