Linux安裝Mysql8.0.20并配置主從復(fù)制(一主一從,雙主雙從)
1. 主從復(fù)制解釋
將主數(shù)據(jù)庫(kù)的增刪改查等操作記錄到二進(jìn)制日志文件中,從庫(kù)接收主庫(kù)日志文件,根據(jù)最后一次更新的起始位置,同步復(fù)制到從數(shù)據(jù)庫(kù)中,使得主從數(shù)據(jù)庫(kù)保持一致。
2. 主從復(fù)制的作用
- 高可用性:主數(shù)據(jù)庫(kù)異??汕袚Q到從數(shù)據(jù)庫(kù)
- 負(fù)載均衡:實(shí)現(xiàn)讀寫分離
- 備份:進(jìn)行日常備份
3. Mysql主從復(fù)制過(guò)程

Binary log:主數(shù)據(jù)庫(kù)的二進(jìn)制日志;Relay log:從服務(wù)器的中繼日志。
復(fù)制過(guò)程:
(1)主數(shù)據(jù)庫(kù)在每次事務(wù)完成前,將該操作記錄到binlog日志文件中;
(2)從數(shù)據(jù)庫(kù)中有一個(gè)I/O線程,負(fù)責(zé)連接主數(shù)據(jù)庫(kù)服務(wù),并讀取binlog日志變化,如果發(fā)現(xiàn)有新的變動(dòng),則將變動(dòng)寫入到relay-log,否則進(jìn)入休眠狀態(tài);
(3)從數(shù)據(jù)庫(kù)中的SQL Thread讀取中繼日志,并串行執(zhí)行SQL事件,使得從數(shù)據(jù)庫(kù)與主數(shù)據(jù)庫(kù)始終保持一致。
注意事項(xiàng):
(1)涉及時(shí)間函數(shù)時(shí),會(huì)出現(xiàn)數(shù)據(jù)不一致。原因是,復(fù)制過(guò)程的兩次IO操作和網(wǎng)絡(luò)、磁盤效率等問題勢(shì)必導(dǎo)致時(shí)間戳不一致;
(2)涉及系統(tǒng)函數(shù)時(shí),會(huì)出現(xiàn)不一致。如:@@hostname,獲取主機(jī)名稱,主從數(shù)據(jù)庫(kù)服務(wù)器名稱不一致導(dǎo)致數(shù)據(jù)不一致;
(3)......
4. 一主一從配置

服務(wù)器劃分
| 服務(wù)器IP | 角色 |
|---|---|
| 192.168.133.129 | Master1 |
| 192.168.133.130 | Slave1 |
主數(shù)據(jù)庫(kù)安裝
# 進(jìn)入目錄 cd /opt # 下載安裝包 wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.20-linux-glibc2.12-x86_64.tar.xz # 解壓 tar -xvf mysql-8.0.20-linux-glibc2.12-x86_64.tar.xz # 拷貝到/usr/local mv /opt/mysql-8.0.20-linux-glibc2.12-x86_64 /usr/local # 進(jìn)入/usr/local cd /usr/local # 修改名稱為mysql-8.0.20 mv mysql-8.0.20-linux-glibc2.12-x86_64 mysql-8.0.20 # 創(chuàng)建存放數(shù)據(jù)文件夾 mkdir /usr/local/mysql-8.0.20/data # 創(chuàng)建用戶及用戶組 groupadd mysql useradd -g mysql mysql # 授權(quán) chown -R mysql.mysql /usr/local/mysql-8.0.20 # 初始化數(shù)據(jù)庫(kù)(記錄臨時(shí)密碼) cd /usr/local/mysql-8.0.20/ ./bin/mysqld --user=mysql --lower-case-table-names=1 --basedir=/usr/local/mysql-8.0.20/ --datadir=/usr/local/mysql-8.0.20/data/ --initialize ; # 配置my.cnf vi /etc/my.cnf # 清空,使用下面內(nèi)容 // 文件內(nèi)容開始 [mysqld] basedir=/usr/local/mysql-8.0.20 datadir=/usr/local/mysql-8.0.20/data character-set-server=utf8 lower-case-table-names=1 default_authentication_plugin=mysql_native_password # 主從復(fù)制-主機(jī)配置 # 主服務(wù)器唯一ID server-id=1 # 啟用二進(jìn)制日志 log-bin=mysql-bin # 設(shè)置不要復(fù)制的數(shù)據(jù)庫(kù)(可設(shè)置多個(gè)) binlog-ignore-db=sys binlog-ignore-db=mysql binlog-ignore-db=information_schema binlog-ignore-db=performance_schema # 設(shè)置需要復(fù)制的數(shù)據(jù)庫(kù)(可設(shè)置多個(gè)) binlog-do-db=test # 設(shè)置logbin格式 binlog_format=STATEMENT // 文件內(nèi)容結(jié)束 # 建立Mysql服務(wù) cp -a ./support-files/mysql.server /etc/init.d/mysql chmod +x /etc/init.d/mysql chkconfig --add mysql # 檢查服務(wù)是否生效 chkconfig --list mysql # 啟動(dòng)、停止、重啟 service mysql start service mysql stop service mysql restart # 創(chuàng)建軟連接 ln -s /usr/local/mysql-8.0.20/bin/mysql /usr/bin # 登錄(使用臨時(shí)密碼) mysql -uroot -p # 修改密碼 ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'new password'; # 退出,使用新密碼登錄 quit mysql -uroot -p # 修改root權(quán)限,增加遠(yuǎn)程連接 use mysql update user set host ='%' where user='root'; alter user 'root'@'%' identified with mysql_native_password by 'new password'; flush privileges; # 退出 quit
從數(shù)據(jù)庫(kù)安裝
和主數(shù)據(jù)庫(kù)安裝一致,但配置文件內(nèi)容不同。
# 配置my.cnf vi /etc/my.cnf # 清空,使用下面內(nèi)容 // 文件內(nèi)容開始 [mysqld] basedir=/usr/local/mysql-8.0.20 datadir=/usr/local/mysql-8.0.20/data character-set-server=utf8 lower-case-table-names=1 default_authentication_plugin=mysql_native_password # 主從復(fù)制-從機(jī)配置 # 從服務(wù)器唯一ID server-id=2 # 啟用中繼日志 relay-log=mysql-relay // 文件內(nèi)容結(jié)束
關(guān)閉主從數(shù)據(jù)庫(kù)服務(wù)器防火墻或開放3306端口
# 查看防火墻狀態(tài) systemctl status firewalld # 關(guān)閉防火墻 systemctl stop firewalld
主從數(shù)據(jù)庫(kù)測(cè)試是否已經(jīng)可以遠(yuǎn)程訪問
# 主數(shù)據(jù)庫(kù)服務(wù)器測(cè)試從數(shù)據(jù)庫(kù) mysql -uroot -p -h192.168.133.130 -P3306 # 從數(shù)據(jù)庫(kù)服務(wù)器測(cè)試主數(shù)據(jù)庫(kù) mysql -uroot -p -h192.168.133.129 -P3306
主數(shù)據(jù)庫(kù)創(chuàng)建用戶slave并授權(quán)
# 登錄 mysql -uroot -p # 創(chuàng)建用戶 create user 'slave'@'%' identified with mysql_native_password by 'password'; # 授權(quán) grant replication slave on *.* to 'slave'@'%'; # 刷新權(quán)限 flush privileges;
從數(shù)據(jù)庫(kù)驗(yàn)證slave用戶是否可用
復(fù)制代碼 代碼如下:mysql -uslave -p -h192.168.133.129 -P3306
主數(shù)據(jù)庫(kù)查詢服務(wù)ID及Master狀態(tài)
# 登錄 mysql -uroot -p # 查詢server_id是否可配置文件中一致 show variables like 'server_id'; # 若不一致,可設(shè)置臨時(shí)ID(重啟失效) set global server_id = 1; # 查詢Master狀態(tài),并記錄 File 和 Position 的值 show master status; # 注意:執(zhí)行完此步驟后退出主數(shù)據(jù)庫(kù),防止再次操作導(dǎo)致 File 和 Position 的值發(fā)生變化
從數(shù)據(jù)庫(kù)中設(shè)置主數(shù)據(jù)庫(kù)
# 登錄 mysql -uroot -p # 查詢server_id是否可配置文件中一致 show variables like 'server_id'; # 若不一致,可設(shè)置臨時(shí)ID(重啟失效) set global server_id = 2; # 設(shè)置主數(shù)據(jù)庫(kù)參數(shù) change master to master_host='192.168.133.129',master_port=3306,master_user='slave',master_password='password',master_log_file='mysql-bin.000002',master_log_pos=156; # 開始同步 start slave; # 若出現(xiàn)錯(cuò)誤,則停止同步,重置后再次啟動(dòng) stop slave; reset slave; start slave; # 查詢Slave狀態(tài) show slave status\G # 查看是否配置成功 # 查看參數(shù) Slave_IO_Running 和 Slave_SQL_Running 是否都為yes,則證明配置成功。若為no,則需要查看對(duì)應(yīng)的 Last_IO_Error 或 Last_SQL_Error 的異常值。
測(cè)試
通過(guò)工具連接主從數(shù)據(jù)庫(kù)或者在服務(wù)器連接。
注意:主數(shù)據(jù)庫(kù)的配置文件中配置了需要同步的數(shù)據(jù)庫(kù),因此只會(huì)同步配置的數(shù)據(jù)庫(kù),不配置則同步全部。
# 在主數(shù)據(jù)庫(kù)創(chuàng)建數(shù)據(jù)庫(kù)test create database test; # 從數(shù)據(jù)庫(kù)查看 show databases; # 在主數(shù)據(jù)庫(kù)創(chuàng)建表 use test; create table t_user(id int, name varchar(20)); # 插入數(shù)據(jù) insert into t_user values(1, 'C3Stones'); # 在從數(shù)據(jù)庫(kù)查看 use test; select * from t_user; # 其他刪改查操作請(qǐng)自行測(cè)試
5. 雙主雙從配置
雙主雙從即兩臺(tái)主機(jī)分別存在兩臺(tái)從機(jī),每臺(tái)從機(jī)只復(fù)制對(duì)應(yīng)的主機(jī),兩臺(tái)主機(jī)互為主備。

服務(wù)器劃分
| 服務(wù)器IP | 角色 |
|---|---|
| 192.168.133.129 | Master1 |
| 192.168.133.130 | Slave1 |
| 192.168.133.131 | Master2 |
| 192.168.133.132 | Slave2 |
安裝數(shù)據(jù)庫(kù)請(qǐng)參考上述安裝主數(shù)據(jù)庫(kù)
四個(gè)配置文件替換如下:
(1)Mater1
[mysqld] basedir=/usr/local/mysql-8.0.20 datadir=/usr/local/mysql-8.0.20/data character-set-server=utf8 lower-case-table-names=1 default_authentication_plugin=mysql_native_password # 主從復(fù)制-主機(jī)1配置 # 主服務(wù)器唯一ID server-id=1 # 啟用二進(jìn)制日志 log-bin=mysql-bin # 設(shè)置不要復(fù)制的數(shù)據(jù)庫(kù)(可設(shè)置多個(gè)) binlog-ignore-db=sys binlog-ignore-db=mysql binlog-ignore-db=information_schema binlog-ignore-db=performance_schema # 設(shè)置需要復(fù)制的數(shù)據(jù)庫(kù)(可設(shè)置多個(gè)) binlog-do-db=test # 設(shè)置logbin格式 binlog_format=STATEMENT # 寫入操作更新二進(jìn)制日志文件 log-slave-updates # 自增長(zhǎng)字段起始值,默認(rèn)值為1,取值范圍:1 ~ 65535 auto-increment-increment=2 # 自增長(zhǎng)字段遞增量,取值范圍:1 ~ 65535 auto-increment-offset=1
(2)Mater2
[mysqld] basedir=/usr/local/mysql-8.0.20 datadir=/usr/local/mysql-8.0.20/data character-set-server=utf8 lower-case-table-names=1 default_authentication_plugin=mysql_native_password # 主從復(fù)制-主機(jī)2配置 # 主服務(wù)器唯一ID server-id=3 # 啟用二進(jìn)制日志 log-bin=mysql-bin # 設(shè)置不要復(fù)制的數(shù)據(jù)庫(kù)(可設(shè)置多個(gè)) binlog-ignore-db=sys binlog-ignore-db=mysql binlog-ignore-db=information_schema binlog-ignore-db=performance_schema # 設(shè)置需要復(fù)制的數(shù)據(jù)庫(kù)(可設(shè)置多個(gè)) binlog-do-db=test # 設(shè)置logbin格式 binlog_format=STATEMENT # 寫入操作更新二進(jìn)制日志文件 log-slave-updates # 自增長(zhǎng)字段起始值,默認(rèn)值為1,取值范圍:1 ~ 65535 auto-increment-increment=2 # 自增長(zhǎng)字段遞增量,取值范圍:1 ~ 65535 auto-increment-offset=2
(3)Slave1
[mysqld] basedir=/usr/local/mysql-8.0.20 datadir=/usr/local/mysql-8.0.20/data character-set-server=utf8 lower-case-table-names=1 default_authentication_plugin=mysql_native_password # 主從復(fù)制-從機(jī)1配置 # 從服務(wù)器唯一ID server-id=2 # 啟用中繼日志 relay-log=mysql-relay
(4)Slave2
[mysqld] basedir=/usr/local/mysql-8.0.20 datadir=/usr/local/mysql-8.0.20/data character-set-server=utf8 lower-case-table-names=1 default_authentication_plugin=mysql_native_password # 主從復(fù)制-從機(jī)2配置 # 從服務(wù)器唯一ID server-id=4 # 啟用中繼日志 relay-log=mysql-relay
雙主雙從數(shù)據(jù)庫(kù)均重啟
service restart mysql
四臺(tái)服務(wù)器均關(guān)閉防火墻
systemctl stop firewalld
兩臺(tái)主數(shù)據(jù)庫(kù)分別創(chuàng)建用戶slave并授權(quán)
# 登錄 mysql -uroot -p # 創(chuàng)建用戶 create user 'slave'@'%' identified with mysql_native_password by 'password'; # 授權(quán) grant replication slave on *.* to 'slave'@'%'; # 刷新權(quán)限 flush privileges;
主從數(shù)據(jù)庫(kù)驗(yàn)證slave用戶是否可用
# 主數(shù)據(jù)庫(kù)1服務(wù)器測(cè)試 mysql -uslave -p -h192.168.133.130 -P3306 mysql -uslave -p -h192.168.133.131 -P3306 # 從數(shù)據(jù)庫(kù)1服務(wù)器測(cè)試主數(shù)據(jù)庫(kù)1 mysql -uroot -p -h192.168.133.129 -P3306 # 主數(shù)據(jù)庫(kù)2服務(wù)器測(cè)試 mysql -uslave -p -h192.168.133.129 -P3306 mysql -uslave -p -h192.168.133.132 -P3306 # 從數(shù)據(jù)庫(kù)1服務(wù)器測(cè)試主數(shù)據(jù)庫(kù)1 mysql -uroot -p -h192.168.133.131 -P3306
兩臺(tái)主數(shù)據(jù)庫(kù)查詢服務(wù)ID及Master狀態(tài)
# 登錄 mysql -uroot -p # 查詢server_id是否可配置文件中一致 show variables like 'server_id'; # 若不一致,可設(shè)置臨時(shí)ID(重啟失效) # 主數(shù)據(jù)庫(kù)1 set global server_id = 1; # 主數(shù)據(jù)庫(kù)2 set global server_id = 3; # 查詢Master狀態(tài),并記錄 File 和 Position 的值 show master status; # 注意:執(zhí)行完此步驟后退出主數(shù)據(jù)庫(kù),防止再次操作導(dǎo)致 File 和 Position 的值發(fā)生變化
從數(shù)據(jù)庫(kù)1中設(shè)置主數(shù)據(jù)庫(kù)1
# 登錄 mysql -uroot -p # 查詢server_id是否可配置文件中一致 show variables like 'server_id'; # 若不一致,可設(shè)置臨時(shí)ID(重啟失效) set global server_id = 2; # 設(shè)置主數(shù)據(jù)庫(kù)參數(shù) change master to master_host='192.168.133.129',master_port=3306,master_user='slave',master_password='password',master_log_file='mysql-bin.000003',master_log_pos=156; # 開始同步 start slave; # 若出現(xiàn)錯(cuò)誤,則停止同步,重置后再次啟動(dòng) stop slave; reset slave; start slave; # 查詢Slave狀態(tài) show slave status\G # 查看是否配置成功 # 查看參數(shù) Slave_IO_Running 和 Slave_SQL_Running 是否都為yes,則證明配置成功。若為no,則需要查看對(duì)應(yīng)的 Last_IO_Error 或 Last_SQL_Error 的異常值。
從數(shù)據(jù)庫(kù)2中設(shè)置主數(shù)據(jù)庫(kù)2
# 登錄 mysql -uroot -p # 查詢server_id是否可配置文件中一致 show variables like 'server_id'; # 若不一致,可設(shè)置臨時(shí)ID(重啟失效) set global server_id = 4; # 設(shè)置主數(shù)據(jù)參數(shù) change master to master_host='192.168.133.131',master_port=3306,master_user='slave',master_password='password',master_log_file='mysql-bin.000001',master_log_pos=156; # 開始同步 start slave; # 若出現(xiàn)錯(cuò)誤,則停止同步,重置后再次啟動(dòng) stop slave; reset slave; start slave; # 查詢Slave狀態(tài) show slave status\G # 查看是否配置成功 # 查看參數(shù) Slave_IO_Running 和 Slave_SQL_Running 是否都為yes,則證明配置成功。若為no,則需要查看對(duì)應(yīng)的 Last_IO_Error 或 Last_SQL_Error 的異常值。
主數(shù)據(jù)庫(kù)1中設(shè)置主數(shù)據(jù)庫(kù)2
# 登錄 mysql -uroot -p # 設(shè)置主數(shù)據(jù)庫(kù)參數(shù) change master to master_host='192.168.133.131',master_port=3306,master_user='slave',master_password='password',master_log_file='mysql-bin.000001',master_log_pos=156; # 開始同步 start slave; # 若出現(xiàn)錯(cuò)誤,則停止同步,重置后再次啟動(dòng) stop slave; reset slave; start slave; # 查詢Slave狀態(tài) show slave status\G # 查看是否配置成功 # 查看參數(shù) Slave_IO_Running 和 Slave_SQL_Running 是否都為yes,則證明配置成功。若為no,則需要查看對(duì)應(yīng)的 Last_IO_Error 或 Last_SQL_Error 的異常值。
主數(shù)據(jù)庫(kù)2中設(shè)置主數(shù)據(jù)庫(kù)1
# 登錄 mysql -uroot -p # 設(shè)置主數(shù)據(jù)庫(kù)參數(shù) change master to master_host='192.168.133.129',master_port=3306,master_user='slave',master_password='password',master_log_file='mysql-bin.000003',master_log_pos=156; # 開始同步 start slave; # 若出現(xiàn)錯(cuò)誤,則停止同步,重置后再次啟動(dòng) stop slave; reset slave; start slave; # 查詢Slave狀態(tài) show slave status\G # 查看是否配置成功 # 查看參數(shù) Slave_IO_Running 和 Slave_SQL_Running 是否都為yes,則證明配置成功。若為no,則需要查看對(duì)應(yīng)的 Last_IO_Error 或 Last_SQL_Error 的異常值。
測(cè)試
通過(guò)工具連接雙主雙從數(shù)據(jù)庫(kù)或者在服務(wù)器連接。
注意:主數(shù)據(jù)庫(kù)的配置文件中配置了需要同步的數(shù)據(jù)庫(kù),因此只會(huì)同步配置的數(shù)據(jù)庫(kù),不配置則同步全部。
# 在主數(shù)據(jù)庫(kù)1創(chuàng)建數(shù)據(jù)庫(kù)test create database test; # 其他三個(gè)數(shù)據(jù)庫(kù)查看 show databases; # 在主數(shù)據(jù)庫(kù)1創(chuàng)建表 use test; create table t_user(id int, name varchar(20)); # 插入數(shù)據(jù) insert into t_user values(1, 'C3Stones'); # 其他三個(gè)數(shù)據(jù)庫(kù)查看 use test; select * from t_user; # 其他刪改查操作請(qǐng)自行測(cè)試
到此這篇關(guān)于Linux安裝Mysql8.0.20并配置主從復(fù)制(一主一從,雙主雙從) 的文章就介紹到這了,更多相關(guān)Mysql8.0.20安裝并配置主從復(fù)制內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
windows 安裝解壓版 mysql5.7.28 winx64的詳細(xì)教程
這篇文章主要介紹了windows 安裝解壓版 mysql5.7.28 winx64的詳細(xì)教程,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12
數(shù)據(jù)庫(kù)報(bào)錯(cuò):Unknown column 'xxx' in
但凡寫過(guò)sql語(yǔ)句的人估計(jì)都曾經(jīng)碰到過(guò)類似于Unknown column ‘xxx’ in ‘where clause’的問題,這篇文章主要給大家介紹了關(guān)于數(shù)據(jù)庫(kù)報(bào)錯(cuò):Unknown column 'xxx' in 'where clause'問題的解決過(guò)程,需要的朋友可以參考下2023-03-03
MySQL報(bào)1045錯(cuò)誤的幾種可能場(chǎng)景
mysql數(shù)據(jù)庫(kù)中常常會(huì)遇見1045錯(cuò)誤,本文主要介紹了MySQL報(bào)1045錯(cuò)誤的幾種可能場(chǎng)景,具有一定的參考價(jià)值,感興趣的可以了解一下2024-02-02
mysql提示[Warning] Invalid (old?) table or database name問題的解決方
今天一個(gè)朋友的上服務(wù)器出現(xiàn)[Warning] Invalid (old?) table or database name問題,通過(guò)分析binlog日志發(fā)現(xiàn),在以下sql語(yǔ)句中出現(xiàn)問題,由于涉及敏感內(nèi)容,用sql語(yǔ)法表示2012-07-07

