Mysql8主從復(fù)制解讀(兼容低高版本)
Mysql主從復(fù)制
理論知識(shí)
主從復(fù)制必要前提
- 主從復(fù)制必要的條件:
- 主庫(kù)開(kāi)啟binlog日志(設(shè)置log-bin參數(shù))
- 主從server-id不同
- 從庫(kù)服務(wù)器能連同主庫(kù)
實(shí)現(xiàn)原理
原理:實(shí)現(xiàn)整個(gè)主從復(fù)制,需要由slave服務(wù)器上的IO進(jìn)程和Sql進(jìn)程共同完成;要實(shí)現(xiàn)主從復(fù)制,首先必須打開(kāi)Master端的binary log(bin-log)功能,因?yàn)檎麄€(gè)MySQL 復(fù)制過(guò)程實(shí)際上就是Slave從Master端獲取相應(yīng)的二進(jìn)制日志,然后再在自己本地(slave端)按照?qǐng)?zhí)行日志中所記錄的順序,全部操作一遍。
- ---在主庫(kù)上把有數(shù)據(jù)更改的(DDL DML DCL)sql語(yǔ)句都記錄到二進(jìn)制日志(Binary Log)中。
- ---備庫(kù)的I/O線程將主庫(kù)上的日志復(fù)制到自己的中繼日志(Relay Log)中。
- ---備庫(kù)的SQL線程讀取中繼日志中的事件,將其重放到備庫(kù)數(shù)據(jù)庫(kù)之上。
binlog的三種類(lèi)型
binlog有三種模式:statement模式、mixed模式和row模式。
- statement模式記錄的是SQL語(yǔ)句
- row模式記錄的是每一行數(shù)據(jù)的變化
- mixed模式是自動(dòng)組合 STATEMENT 和 ROW 模式,按照最優(yōu)方式來(lái)記錄日志。
- Binlog日志的開(kāi)啟和關(guān)閉可以通過(guò)設(shè)置MySQL的配置文件實(shí)現(xiàn)。
配置步驟
- 兩臺(tái)機(jī)器時(shí)間一致
- 對(duì)主庫(kù)已有的數(shù)據(jù)庫(kù)不會(huì)進(jìn)行自動(dòng)同步。
- 主從同步之前,主庫(kù)上已有數(shù)據(jù)庫(kù)備份,需要在從庫(kù)上手動(dòng)導(dǎo)入同步
| 操作系統(tǒng) | IP | mysql版本 | 主從類(lèi)型 |
|---|---|---|---|
| Anolis OS8.9 | 192.168.200.81 | mysql8.4 | 主 |
| Anolis OS8.9 | 192.168.200.83 | mysql8.4 | 從 |
需要注意:mysql 版本不同,有些命令是不同的
show master status; 不能用了
查看主節(jié)點(diǎn)binlog的命令
# mysql 8.4版本前使用這條命令查看 show master status; # MySQL 8.4版本后使用這條命令查看 SHOW BINARY LOG STATUS;
change master to不能用了
從節(jié)點(diǎn)配置主節(jié)點(diǎn)信息的命令
# MSQL 8.23前 CHANGE MASTER TO MASTER_HOST='192.168.200.81', MASTER_USER='nomax', MASTER_PASSWORD='nomax', MASTER_LOG_FILE='binlog.000003', MASTER_LOG_POS=158; # MSQL 8.23后 CHANGE REPLICATION SOURCE TO SOURCE_HOST='192.168.200.81', SOURCE_USER='nomax', SOURCE_PASSWORD='nomax', SOURCE_LOG_FILE='binlog.000003', SOURCE_LOG_POS=158;
start slave不能用了
# 開(kāi)啟同步 start replica ; #8.0.22之后 start slave ; #8.0.22之前 #停止同步 stop replica ; #8.0.22之后 stop slave ; #8.0.22之前 #清空之前的主從復(fù)制配置信息 reset replica ; #8.0.22之后 reset slave ; #8.0.22之前
show slave status不能用了
查看從節(jié)點(diǎn)狀態(tài)的
# 查看狀態(tài),\G表示行轉(zhuǎn)列,便于查看 show replica status\G ; #8.0.22之后 show slave status\G ; #8.0.22之前
一、主節(jié)點(diǎn)配置(在192.168.200.81操作)
主從節(jié)點(diǎn)配置的差異:由于后續(xù)需要演示主從切換,所以無(wú)論是主從節(jié)點(diǎn),都需要提前開(kāi)啟binlog和relaylog。故而這里主從配置基本一致,具體配置選項(xiàng)差異只有:server_id、read-only選項(xiàng)
編輯/etc/my.cnf
#==================== 主從同步配置========================= #節(jié)點(diǎn)id編號(hào),各個(gè)mysql的server_id需要唯一 server_id=1 #指定binlog和binglog index的文件名 log_bin=/data/log/mysql/mysql-bin log_bin_index=/data/log/mysql/mysql-bin.index #[可選]0(默認(rèn))表示讀寫(xiě)(主機(jī)),1表示只讀(從機(jī)) read-only=0 #[可選]啟用中繼日志 relay-log=/data/log/mysql/mysql-relay #[可選] 單個(gè)binlog最大的文件大小,默認(rèn)是1G max_binlog_size=500M #[可選]設(shè)置binlog格式.STATEMENT,row,mixed binlog_format=row #[可選]設(shè)置日志文件保留的時(shí)長(zhǎng),單位是秒(默認(rèn)不刪除文件) #binlog_expire_logs_seconds=6000 #[可選]設(shè)置不要復(fù)制的數(shù)據(jù)庫(kù) #binlog-ignore-db=test #[可選]設(shè)置需要復(fù)制的數(shù)據(jù)庫(kù),默認(rèn)全部記錄。比如:binlog-do-db=atguigu_master_slave #binlog-do-db=需要復(fù)制的主數(shù)據(jù)庫(kù)名字
- relay-log中繼日志可以看主從復(fù)制之間的細(xì)節(jié)
- log_bin_index,用來(lái)索引,主從復(fù)制時(shí)提供日志文件順序
- binlog_format=row
- row哪里更改都會(huì)記錄下來(lái),不會(huì)出現(xiàn)無(wú)法正確復(fù)制的問(wèn)題。很詳細(xì),缺點(diǎn)是日志量大
- read-only=0 主的設(shè)置0讀寫(xiě),從的設(shè)置1只讀
修改配置后重啟數(shù)據(jù)庫(kù):
systemctl restart mysql or service mysql restart
二、從節(jié)點(diǎn)配置(在192.168.200.83操作)
##節(jié)點(diǎn)id編號(hào),各個(gè)mysql的server_id需要唯一 server_id=2 #指定binlog和binglog index的文件名 log_bin=/data/mysql/binlog log_bin_index=/data/mysql/binlog.index #[可選]啟用中繼日志 relay-log=/data/mysql/mysql-relay #[可選] 單個(gè)binlog最大的文件大小,默認(rèn)是1G max_binlog_size=500M #[可選]設(shè)置binlog格式.STATEMENT,row,mixed binlog_format=row #[可選]0(默認(rèn))表示讀寫(xiě)(主機(jī)),1表示只讀(從機(jī)) read-only=1 # #[可選]設(shè)置日志文件保留的時(shí)長(zhǎng),單位是秒(默認(rèn)不刪除文件) # #binlog_expire_logs_seconds=6000 # #[可選]設(shè)置不要復(fù)制的數(shù)據(jù)庫(kù) # #binlog-ignore-db=test # #[可選]設(shè)置需要復(fù)制的數(shù)據(jù)庫(kù),默認(rèn)全部記錄。比如:binlog-do-db=atguigu_master_slave # #binlog-do-db=需要復(fù)制的主數(shù)據(jù)庫(kù)名字
主從節(jié)點(diǎn)配置的差異:開(kāi)啟binlog和relaylog,具體配置選項(xiàng)差異只有:server_id、read-only選項(xiàng)
在從節(jié)點(diǎn)登錄主節(jié)點(diǎn)服務(wù)器獲取服務(wù)器公鑰
防止后續(xù)出現(xiàn)從節(jié)點(diǎn)連接主節(jié)點(diǎn)服務(wù)器報(bào)無(wú)公鑰的錯(cuò)誤
mysql -u nomax -pnomax -h 192.168.200.81 -P3306 --get-server-public-key
- 修改配置后重啟數(shù)據(jù)庫(kù):
systemctl restart mysql or service mysql restart
三、創(chuàng)建用于主從同步的用戶(hù)(主從都要?jiǎng)?chuàng)建)
root 用戶(hù)也可以但是不安全
MySQL8新版本
#創(chuàng)建nomax用戶(hù) CREATE USER'nomax'@'%' IDENTIFIED BY'nomax'; #給nomax用戶(hù)授予數(shù)據(jù)同步的權(quán)限 GRANT replication slave on *.* to 'nomax'@'%'; #刷新權(quán)限 flush privileges;
mysql5老版本
GRANT REPLICATION SLAVE ON *.* TO 'nomax'@'%' identified by 'nomax'; flush privileges;
參數(shù)解析
新版本需要先創(chuàng)建用戶(hù)
老版本權(quán)限用戶(hù)可一起生成
GRANT replication slave:授予改用戶(hù)從庫(kù)中進(jìn)行復(fù)制的權(quán)限ON *.*:第一個(gè) * 代表數(shù)據(jù)庫(kù)名,第二個(gè) * 代表表名,*.*意味著所有數(shù)據(jù)庫(kù)中的所有表。TO 'nomax':用戶(hù)名字'@'%':表示用戶(hù)可以在任何主機(jī)連接數(shù)據(jù)庫(kù)identified by 'nomax':為用戶(hù)設(shè)置nomax的密碼
- 查詢(xún)確認(rèn)創(chuàng)建的用戶(hù)
SELECT User FROM mysql.user;
四、開(kāi)啟主從復(fù)制
- 查看主節(jié)點(diǎn)binlog執(zhí)行位置(主節(jié)點(diǎn)192.168.200.81來(lái)執(zhí)行以下命令)
# mysql8.4的 SHOW BINARY LOG STATUS; # mysql8及其以前的 SHOW BINARY STATUS;
mysql> SHOW BINARY LOG STATUS; +------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | mysql-bin.000013 | 158 | | | | +------------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec)
- 從節(jié)點(diǎn)開(kāi)啟主節(jié)點(diǎn)同步操作(從節(jié)點(diǎn)192.168.200.83來(lái)執(zhí)行以下命令):
#從節(jié)點(diǎn)配置連接主的信息 CHANGE REPLICATION SOURCE TO #主節(jié)點(diǎn)的IP SOURCE_HOST='192.168.200.81', #主節(jié)點(diǎn)的端口號(hào) SOURCE_PORT=3306, #主節(jié)點(diǎn)的用戶(hù) SOURCE_USER='nomax', #主節(jié)點(diǎn)的密碼 SOURCE_PASSWORD='nomax', #通過(guò) SHOW BINARY LOG STATUS;查看 SOURCE_LOG_FILE='mysql-bin.000013', SOURCE_LOG_POS=158; #開(kāi)啟從節(jié)點(diǎn)備份 start replica; #查看從節(jié)點(diǎn)的狀態(tài) show replica status \G;
方便復(fù)制版本 CHANGE REPLICATION SOURCE TO SOURCE_HOST='192.168.200.81', SOURCE_PORT=3306, SOURCE_USER='nomax', SOURCE_PASSWORD='nomax', SOURCE_LOG_FILE='mysql-bin.000013', SOURCE_LOG_POS=158; start replica; show replica status \G;
CHANGE REPLICATION SOURCE TO SOURCE_HOST=‘192.168.200.81’, SOURCE_LOG_FILE=‘mysql-bin.000013’, SOURCE_LOG_POS=158, SOURCE_PORT=3306, SOURCE_USER=‘nomax’, SOURCE_PASSWORD=‘nomax’;
確保下面四項(xiàng)參數(shù)正確
Replica_IO_Running: YesReplica_SQL_Running: YesLast_IO_Error:Last_SQL_Error:

報(bào)錯(cuò):
Last_IO_Error: Error connecting to source 'nomax@192.168.200.81:3306'. This was attempt 10/10, with a delay of 60 seconds between attempts. Message: Authentication plugin 'caching_sha2_password' reported error: Authentication requires secure connection.

- 原因:根據(jù)上一張密碼傳輸方式的第3條,該插件發(fā)現(xiàn)連接未加密,因此需要使用RSA加密來(lái)傳輸密碼。但是,服務(wù)器不會(huì)將公用密鑰發(fā)送給客戶(hù)端,并且客戶(hù)端未提供公用密鑰,因此它無(wú)法加密密碼并且連接失敗
解決方法:
- 使用復(fù)制用戶(hù)請(qǐng)求服務(wù)器公鑰
mysql -u nomax -pnomax -h 192.168.200.81 -P3306 --get-server-public-key
在這種情況下,服務(wù)器將RSA公鑰發(fā)送給客戶(hù)端,后者使用它來(lái)加密密碼并將結(jié)果返回給服務(wù)器。插件使用服務(wù)器端的RSA私鑰解密密碼,并根據(jù)密碼是否正確來(lái)接受或拒絕連接。
重新在從庫(kù)配置change masrer to并且start slave,復(fù)制可以正常啟動(dòng):
#停止主從復(fù)制 #清空之前的主從復(fù)制配置信息 stop replica; reset replica; #從新配置主從復(fù)制 CHANGE REPLICATION SOURCE TO SOURCE_HOST='192.168.200.81', SOURCE_PORT=3306, SOURCE_USER='nomax', SOURCE_PASSWORD='nomax', SOURCE_LOG_FILE='mysql-bin.000013', SOURCE_LOG_POS=158; start replica; show replica status \G;
五、主從同步驗(yàn)證
- 也可以用navicat去試試,倆IP的數(shù)據(jù)庫(kù)都連上進(jìn)行創(chuàng)建庫(kù)表啥的操作
- 主節(jié)點(diǎn)上進(jìn)行建庫(kù)、建表、插入表數(shù)據(jù)操作
#創(chuàng)建數(shù)據(jù)庫(kù)
mysql> create database test_db;
Query OK, 1 row affected (0.03 sec)
#查看數(shù)據(jù)庫(kù)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test_db |
+--------------------+
5 rows in set (0.06 sec)
#切換數(shù)據(jù)庫(kù)
mysql> use test_db;
Database changed
#創(chuàng)建表
mysql> CREATE TABLE `t_test` (
-> `id` int(11) NOT NULL,
-> `age` int(11) DEFAULT NULL,
-> `score` int(11) DEFAULT NULL,
-> PRIMARY KEY (`id`)
-> ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;
Query OK, 0 rows affected, 3 warnings (0.10 sec)
#插入表數(shù)據(jù)
mysql> INSERT INTO `t_test` VALUES (1, 2, 1);
Query OK, 1 row affected (0.01 sec)
#插入表數(shù)據(jù)
mysql> INSERT INTO `t_test` VALUES (222, 22, 19);
Query OK, 1 row affected (0.01 sec)
#查看表
mysql> show tables;
+-------------------+
| Tables_in_test_db |
+-------------------+
| t_test |
+-------------------+
1 row in set (0.00 sec)
#查看表數(shù)據(jù)
mysql> select * from t_test;
+-----+------+-------+
| id | age | score |
+-----+------+-------+
| 1 | 2 | 1 |
| 222 | 22 | 19 |
+-----+------+-------+
2 rows in set (0.00 sec)
檢查從節(jié)點(diǎn)192.168.200.83是否也都同步成功:
如下所示,從節(jié)點(diǎn)也都自動(dòng)完成了主節(jié)點(diǎn)上所進(jìn)行的相關(guān)操作~
mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | | test_db | +--------------------+ 5 rows in set (0.00 sec) #切換數(shù)據(jù)庫(kù) mysql> use test_db; Database changed #查看表 mysql> show tables; +-------------------+ | Tables_in_test_db | +-------------------+ | t_test | +-------------------+ 1 row in set (0.00 sec) #查詢(xún)表數(shù)據(jù) mysql> select * from t_test; +-----+------+-------+ | id | age | score | +-----+------+-------+ | 1 | 2 | 1 | | 222 | 22 | 19 | +-----+------+-------+ 2 rows in set (0.00 sec)
至此,主從同步部署完成
六、故障切換
mysql主從,主節(jié)點(diǎn)宕機(jī),如何進(jìn)行切換
- 在從節(jié)點(diǎn)執(zhí)行(版本以8.4為例,之前的命令不同參考本文理論知識(shí)模塊命令注意)
mysql> stop replica; mysql> reset replica;
- 查看是否是只讀模式
mysql> show variables like 'read_only'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | read_only | ON | +---------------+-------+ 1 row in set (0.00 sec)
只讀模式需要修改my.cnf文件,注釋read-only=1并重啟mysql服務(wù)。
或者不重啟使用命令臨時(shí)關(guān)閉只讀,但下次重啟后失效:set global read_only=off;
- 查看
mysql> show replica status\G
- 在程序中將原來(lái)主庫(kù)IP地址改為現(xiàn)在的從庫(kù)IP地址,測(cè)試應(yīng)用連接是否正常
stop replica;mysql> reset replica;
查看是否是只讀模式
mysql> show variables like ‘read_only'; ±--------------±------+ | Variable_name | Value | ±--------------±------+ | read_only | ON | ±--------------±------+ 1 row in set (0.00 sec)
**只讀模式需要修改my.cnf文件,注釋read-only=1并重啟mysql服務(wù)。**
**或者不重啟使用命令臨時(shí)關(guān)閉只讀,但下次重啟后失效:`set global read_only=off;`**
查看
mysql> show replica status\G
**在程序中將原來(lái)主庫(kù)IP地址改為現(xiàn)在的從庫(kù)IP地址,測(cè)試應(yīng)用連接是否正常**
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
使用pt-kill根據(jù)一定的規(guī)則來(lái)kill連接的方法
pt-kill 是一個(gè)優(yōu)秀的kill MySQL連接的一個(gè)工具,是percona toolkit的一部分,在因?yàn)榭臻e連接較多導(dǎo)致超過(guò)最大連接數(shù)、某個(gè)有問(wèn)題的sql導(dǎo)致mysql負(fù)載很高時(shí),都需要將一些連接kill掉,這個(gè)工具主要就是這個(gè)用途2016-04-04
MySQL中的SHOW FULL PROCESSLIST命令實(shí)現(xiàn)
SHOW FULL PROCESSLIST命令是MySQL中一個(gè)非常有用的工具,可以幫助我們理解和監(jiān)控MySQL服務(wù)器的狀態(tài),本文主要介紹了MySQL中的SHOW FULL PROCESSLIST命令,感興趣的可以了解一下2023-11-11
連接mysql連接超時(shí)報(bào)錯(cuò)問(wèn)題以及解決
這篇文章主要介紹了連接mysql連接超時(shí)報(bào)錯(cuò)問(wèn)題以及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11
MySQL數(shù)據(jù)類(lèi)型DECIMAL用法詳解
這篇文章主要介紹了MySQL數(shù)據(jù)類(lèi)型DECIMAL用法詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02
MySQL數(shù)據(jù)庫(kù)的主從同步配置與讀寫(xiě)分離
這篇文章主要介紹了MySQL數(shù)據(jù)庫(kù)的主從同步配置與讀寫(xiě)分離,需要的朋友可以參考下2018-01-01
MySQL 常見(jiàn)存儲(chǔ)引擎的優(yōu)劣
眾所周知,MySql 提供了很多存儲(chǔ)引擎,這里來(lái)比較一下常見(jiàn)引擎的優(yōu)劣。幫助大家選擇合適的存儲(chǔ)引擎2021-06-06

