本文分享自華為云社區(qū)《結(jié)合實戰(zhàn),我為MySQL主從復(fù)制總結(jié)了幾張圖!》,作者: 冰 河。
MySQL官方文檔
MySQL 主從復(fù)制官方文檔鏈接地址如下所示:
http://dev.mysql.com/doc/refman/8.0/en/replication.html
MySQL 主從復(fù)制方式
MySQL5.6 開始主從復(fù)制有兩種方式:基于日志(binlog)、基于 GTID(全局事務(wù)標示符)。 這里,我們主要講基于日志(binlog)的復(fù)制。 關(guān)于GTID的主從復(fù)制,我們后面再詳細討論。
MySQL主從復(fù)制原理
MySQL主從復(fù)制原理,也稱為A/B原理。
(1) Master 將數(shù)據(jù)改變記錄到二進制日志(binary log)中,也就是配置文件 log-bin 指定的文件, 這些記錄叫做二進制日志事件(binary log events);
(2) Slave 通過 I/O 線程讀取 Master 中的 binary log events 并寫入到它的中繼日志(relay log);
(3) Slave 重做中繼日志中的事件,把中繼日志中的事件信息一條一條的在本地執(zhí)行一次,完 成數(shù)據(jù)在本地的存儲,從而實現(xiàn)將改變反映到它自己的數(shù)據(jù)(數(shù)據(jù)重放)。
主從配置注意事項
(1)主從服務(wù)器操作系統(tǒng)版本和位數(shù)一致;
(2) Master 和 Slave 數(shù)據(jù)庫的版本要一致;
(3) Master 和 Slave 數(shù)據(jù)庫中的數(shù)據(jù)要一致;
(4) Master 開啟二進制日志,Master 和 Slave 的 server_id 在局域網(wǎng)內(nèi)必須唯一;
主從配置的簡要步驟
1、Master 上的配置
(1) 安裝數(shù)據(jù)庫;
(2) 修改數(shù)據(jù)庫配置文件,指明 server_id,開啟二進制日志(log-bin);
(3) 啟動數(shù)據(jù)庫,查看當(dāng)前是哪個日志,position 號是多少;
(4) 登錄數(shù)據(jù)庫,授權(quán)數(shù)據(jù)復(fù)制用戶(IP 地址為從機 IP 地址,如果是雙向主從,這里的 還需要授權(quán)本機的 IP 地址,此時自己的 IP 地址就是從 IP 地址);
(5) 備份數(shù)據(jù)庫(記得加鎖和解鎖);
(6) 傳送備份數(shù)據(jù)到 Slave 上;
(7) 啟動數(shù)據(jù)庫;
以下步驟,為單向主從搭建成功,想搭建雙向主從需要的步驟:
(1) 登錄數(shù)據(jù)庫,指定 Master 的地址、用戶、密碼等信息(此步僅雙向主從時需要);
(2) 開啟同步,查看狀態(tài);
2、Slave 上的配置
(1) 安裝數(shù)據(jù)庫;
(2) 修改數(shù)據(jù)庫配置文件,指明 server_id(如果是搭建雙向主從的話,也要開啟二進制 日志 log-bin);
(3) 啟動數(shù)據(jù)庫,還原備份;
(4) 查看當(dāng)前是哪個日志,position 號是多少(單向主從此步不需要,雙向主從需要);
(5) 指定 Master 的地址、用戶、密碼等信息;
(6) 開啟同步,查看狀態(tài)。
單向主從環(huán)境搭建
安裝數(shù)據(jù)庫
參考《MySQL之——源碼編譯MySQL8.x+升級gcc+升級cmake(親測完整版)》。
配置Master的my.cnf
[root@liuyazhuang131 ~]# vi /etc/my.cnf
# 在 [mysqld] 中增加以下配置項 # 設(shè)置 server_id,一般設(shè)置為 IP server_id=131 # 復(fù)制過濾:需要備份的數(shù)據(jù)庫,輸出 binlog #binlog-do-db=liuyazhuang # 復(fù)制過濾:不需要備份的數(shù)據(jù)庫,不輸出(mysql 庫一般不同步) binlog-ignore-db=mysql # 開啟二進制日志功能,可以隨便取,最好有含義 log-bin=lyz-mysql-bin ## 為每個 session 分配的內(nèi)存,在事務(wù)過程中用來存儲二進制日志的緩存 binlog_cache_size=1M ## 主從復(fù)制的格式(mixed,statement,row,默認格式是 statement) binlog_format=mixed # 二進制日志自動刪除/過期的天數(shù)。默認值為 0,表示不自動刪除。 expire_logs_days=7 # 跳過主從復(fù)制中遇到的所有錯誤或指定類型的錯誤,避免 slave 端復(fù)制中斷。 # 如:1062 錯誤是指一些主鍵重復(fù),1032 錯誤是因為主從數(shù)據(jù)庫數(shù)據(jù)不一致 slave_skip_errors=1062
復(fù)制過濾可以讓你只復(fù)制服務(wù)器中的一部分數(shù)據(jù),有兩種復(fù)制過濾:
(1) 在 Master 上過濾二進制日志中的事件;
(2) 在 Slave 上過濾中繼日志中的事件。如下:
MySQL 對于二進制日志 (binlog)的復(fù)制類型
(1) 基于語句的復(fù)制:在 Master 上執(zhí)行的 SQL 語句,在 Slave 上執(zhí)行同樣的語句。MySQL 默 認采用基于語句的復(fù)制,效率比較高。一旦發(fā)現(xiàn)沒法精確復(fù)制時,會自動選著基于行的復(fù)制。
(2) 基于行的復(fù)制:把改變的內(nèi)容復(fù)制到 Slave,而不是把命令在 Slave 上執(zhí)行一遍。從MySQL5.0 開始支持。
(3) 混合類型的復(fù)制:默認采用基于語句的復(fù)制,一旦發(fā)現(xiàn)基于語句的無法精確的復(fù)制時,就會采用基于行的復(fù)制。
重啟Master庫
啟動/重啟 Master 數(shù)據(jù)庫服務(wù),登錄數(shù)據(jù)庫,創(chuàng)建數(shù)據(jù)同步用戶,并授予相應(yīng)的權(quán)限
[root@liuyazhuang131 ~]# service mysql restart
[root@liuyazhuang131 ~]# mysql -uroot -proot
##創(chuàng)建數(shù)據(jù)同步用戶,并授予相應(yīng)的權(quán)限 mysql> grant replication slave, replication client on *.* to 'repl'@'192.168.209.132' identified by '123456'; Query OK, 0 rows affected (0.00 sec) ## 刷新授權(quán)表信息 mysql> flush privileges; Query OK, 0 rows affected (0.00 sec) ## 查看 position 號,記下 position 號(從機上需要用到這個 position 號和現(xiàn)在的日志文件) mysql> show master status; +----------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +----------------------+----------+--------------+------------------+-------------------+ | lyz-mysql-bin.000001 | 1312 | | mysql | | +----------------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec)
模擬業(yè)務(wù)數(shù)據(jù)庫
創(chuàng)建 lyz 庫、表,并寫入一定量的數(shù)據(jù),用于模擬現(xiàn)有的業(yè)務(wù)系統(tǒng)數(shù)據(jù)庫
create database if not exists lyz default charset utf8 collate utf8_general_ci; use lyz; DROP TABLE IF EXISTS `lyz_user`; CREATE TABLE `lyz_user` ( `Id` int(11) NOT NULL AUTO_INCREMENT, `userName` varchar(255) NOT NULL DEFAULT '' COMMENT '用戶名', `pwd` varchar(255) NOT NULL DEFAULT '' COMMENT '密碼', PRIMARY KEY (`Id`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COMMENT='用戶信息表'; INSERT INTO `lyz_user` VALUES (1,'yixiaoqun','123456');
實現(xiàn)初始數(shù)據(jù)一致
為保證 Master 和 Slave 的數(shù)據(jù)一致,我們采用主備份,從還原來實現(xiàn)初始數(shù)據(jù)一致
## 先臨時鎖表 mysql> flush tables with read lock; Query OK, 0 rows affected (0.00 sec) ## 這里我們實行全庫備份,在實際中,我們可能只同步某一個庫,那也可以只備份一個庫 [root@liuyazhuang131 mysql]# mysqldump -u root -proot lyz > /tmp/lyz.sql [root@liuyazhuang131 mysql]# cd /tmp [root@liuyazhuang131 tmp]# ll | grep lyz.sql -rw-r--r-- 1 root root 2031 Apr 25 01:18 lyz.sql # 注意:實際生產(chǎn)環(huán)境中大數(shù)據(jù)量(超 2G 數(shù)據(jù))的備份,建議不要使用 mysqldump 進行 比分,因為會非常慢。此時推薦使用 XtraBackup 進行備份。 # 解鎖表 mysql> unlock tables; Query OK, 0 rows affected (0.00 sec)
將 Master 上備份的數(shù)據(jù)遠程傳送到 Slave 上,以用于 Slave 配置時恢復(fù)數(shù)據(jù)
[root@liuyazhuang131 tmp]# scp /tmp/lyz.sql root@192.168.209.132:/tmp/lyz.sql The authenticity of host '192.168.209.132 (192.168.209.132)' can't be established. RSA key fingerprint is da:70:7b:d5:0c:16:b3:1a:53:b7:3d:9f:20:01:26:3e. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '192.168.209.132' (RSA) to the list of known hosts. root@192.168.209.132's password: lyz.sql
配置Slave庫
接下來處理 Slave(192.168.209.132),配置文件只需修改一項,其余配置用命令來操作
[root@liuyazhuang132 ]# vi /etc/my.cnf # 在 [mysqld] 中增加以下配置項 # 設(shè)置 server_id,一般設(shè)置為 IP server_id=132 # 復(fù)制過濾:需要備份的數(shù)據(jù)庫,輸出 binlog #binlog-do-db=lyz # 復(fù)制過濾:不需要備份的數(shù)據(jù)庫,不輸出(mysql 庫一般不同步) binlog-ignore-db=mysql # 開啟二進制日志,以備 Slave 作為其它 Slave 的 Master 時使用 log-bin=lyz-mysql-slave1-bin ## 為每個 session 分配的內(nèi)存,在事務(wù)過程中用來存儲二進制日志的緩存 binlog_cache_size = 1M # 主從復(fù)制的格式(mixed,statement,row,默認格式是 statement) binlog_format=mixed # 二進制日志自動刪除/過期的天數(shù)。默認值為 0,表示不自動刪除。 expire_logs_days=7 # 跳過主從復(fù)制中遇到的所有錯誤或指定類型的錯誤,避免 slave 端復(fù)制中斷。 # 如:1062 錯誤是指一些主鍵重復(fù),1032 錯誤是因為主從數(shù)據(jù)庫數(shù)據(jù)不一致 slave_skip_errors=1062 ## relay_log 配置中繼日志 relay_log=lyz-mysql-relay-bin ## log_slave_updates 表示 slave 將復(fù)制事件寫進自己的二進制日志 log_slave_updates=1 ##防止改變數(shù)據(jù)(除了特殊的線程) read_only=1
如果Slave為其它的Slave的Master時,必須設(shè)置bin_log,在這里,我開啟了二進制日志,而且顯式的命名(默認名稱為hostname),但是如果hostname改變則會出現(xiàn)問題。
relay_log配置中繼日志,log_slave_updates表示slave將復(fù)制事件 寫進自己的二進制日志.當(dāng)設(shè)置log_slave_updates時,你可以讓slave扮演其它slave的master.此時,slave把sql線程執(zhí)行的事件寫進自己的二進制日志(binary log)然后,它的slave可以獲取這些事件并執(zhí)行它。如下圖所示(發(fā)送復(fù)制事件到其它的Slave):
還原備份數(shù)據(jù)
保存后重啟MySQL服務(wù),還原備份數(shù)據(jù)
[root@liuyazhuang132 ~]# service mysql restart Shutting down MySQL. SUCCESS! Starting MySQL.. SUCCESS!
Slave上創(chuàng)建相同庫
[root@liuyazhuang132 ~]# mysql -uroot -proot
mysql> use lyz;
Database changed
導(dǎo)入數(shù)據(jù)
[root@liuyazhuang132 ~]# mysql -uroot -proot lyz < /tmp/lyz.sql [root@liuyazhuang132 ~]# mysql -uroot -proot mysql> use lyz; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> select * from lyz_user; +----+-----------+--------+ | Id | userName | pwd | +----+-----------+--------+ | 1 | yixiaoqun | 123456 | +----+-----------+--------+ 1 row in set (0.00 sec)
Slave庫添加參數(shù)
登錄Slave數(shù)據(jù)庫,添加相關(guān)參數(shù):Master的IP、端口、同步用戶、密碼、position號、讀取哪個日志文件
change master to master_host='192.168.209.131',master_user='repl',master_password='123456',master_port=3306, master_log_file='lyz-mysql-bin.000001',master_log_pos=1312,master_connect_retry=30;
上面執(zhí)行的命令的解釋:
- master_host=‘192.168.209.131’ ##Master的IP地址
- master_user=‘repl’ ##用于同步數(shù)據(jù)的用戶(在Master中授權(quán)的用戶)
- master_password=‘123456’ ##同步數(shù)據(jù)用戶的密碼
- master_port=3306 ##master數(shù)據(jù)庫服務(wù)的端口
- master_log_file=‘lyz-mysql-bin.000001’ ##指定Slave從哪個日志文件開始讀取復(fù)制文件(可在Master上使用show master status查看到日志文件名)
- master_log_pos=429 ##從哪個POSITION號開始讀
- master_connect_retry=30 #當(dāng)重新建立主從連接時,如果連接建立失敗,間隔多久后重試,單位為秒,默認設(shè)置為60秒,同步延遲調(diào)優(yōu)參數(shù)。
查看主從同步狀態(tài)
show slave status\G;
可看到Slave_IO_State為空,Slave_IO_Runngin和Slave_SQL_Running是No,表時Slave還是沒有開始復(fù)制過程。
開啟主從同步
mysql> start slave;
再次查看同步狀態(tài)
#show slave status\G;
主要看以下兩個參數(shù),這兩個參數(shù)如果是Yes,就表示數(shù)據(jù)同步正常
Slave_IO_Running:Yes
Slave_SQL_Running:Yes
可查看master和slave上線程的狀態(tài),在master上,可以看到slave的I/O線程創(chuàng)建的連接
Master:mysql>show processlist\G;
1.row為處理slave的I/O線程的連接。
2.row為處理MySQL客戶連接線程。
3.row為處理本地命令行的線程
Slave:mysql>show processlist\G;
1.row為處理slave的I/O線程的連接。
2.row為處理MySQL客戶連接線程。
3.row為處理本地命令行的線程
主從數(shù)據(jù)復(fù)制同步測試
Master: mysql> insert into lyz_user values(2,'test1','123456'); Slave: mysql> start slave;
經(jīng)過以上配置,在192.168.209.131上對數(shù)據(jù)庫/表進行增刪改查,創(chuàng)建/刪除數(shù)據(jù)庫/表都會同步到192.168.209.132數(shù)據(jù)庫上了。
至此,整個配置過程結(jié)束。
?文章來源地址http://www.zghlxwxcb.cn/news/detail-837787.html
點擊關(guān)注,第一時間了解華為云新鮮技術(shù)~文章來源:http://www.zghlxwxcb.cn/news/detail-837787.html
?
到了這里,關(guān)于用幾張圖實戰(zhàn)講解MySQL主從復(fù)制的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!