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)讀寫(xiě)分離
- 備份:進(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)寫(xiě)入到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ò)、磁盤(pán)效率等問(wèn)題勢(shì)必導(dǎo)致時(shí)間戳不一致;
(2)涉及系統(tǒng)函數(shù)時(shí),會(huì)出現(xiàn)不一致。如:@@hostname,獲取主機(jī)名稱(chēng),主從數(shù)據(jù)庫(kù)服務(wù)器名稱(chēng)不一致導(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 # 修改名稱(chēng)為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)建用戶(hù)及用戶(hù)組 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)容開(kā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)容開(kā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ù)器防火墻或開(kāi)放3306端口
# 查看防火墻狀態(tài) systemctl status firewalld # 關(guān)閉防火墻 systemctl stop firewalld
主從數(shù)據(jù)庫(kù)測(cè)試是否已經(jīng)可以遠(yuǎn)程訪問(wè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)建用戶(hù)slave并授權(quán)
# 登錄 mysql -uroot -p # 創(chuàng)建用戶(hù) 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用戶(hù)是否可用
復(fù)制代碼 代碼如下:mysql -uslave -p -h192.168.133.129 -P3306
主數(shù)據(jù)庫(kù)查詢(xún)服務(wù)ID及Master狀態(tài)
# 登錄 mysql -uroot -p # 查詢(xún)server_id是否可配置文件中一致 show variables like 'server_id'; # 若不一致,可設(shè)置臨時(shí)ID(重啟失效) set global server_id = 1; # 查詢(xún)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 # 查詢(xún)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; # 開(kāi)始同步 start slave; # 若出現(xiàn)錯(cuò)誤,則停止同步,重置后再次啟動(dòng) stop slave; reset slave; start slave; # 查詢(xún)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 # 寫(xiě)入操作更新二進(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 # 寫(xiě)入操作更新二進(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)建用戶(hù)slave并授權(quán)
# 登錄 mysql -uroot -p # 創(chuàng)建用戶(hù) 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用戶(hù)是否可用
# 主數(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ù)查詢(xún)服務(wù)ID及Master狀態(tài)
# 登錄 mysql -uroot -p # 查詢(xún)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; # 查詢(xún)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 # 查詢(xún)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; # 開(kāi)始同步 start slave; # 若出現(xiàn)錯(cuò)誤,則停止同步,重置后再次啟動(dòng) stop slave; reset slave; start slave; # 查詢(xún)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 # 查詢(xún)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; # 開(kāi)始同步 start slave; # 若出現(xiàn)錯(cuò)誤,則停止同步,重置后再次啟動(dòng) stop slave; reset slave; start slave; # 查詢(xún)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; # 開(kāi)始同步 start slave; # 若出現(xiàn)錯(cuò)誤,則停止同步,重置后再次啟動(dòng) stop slave; reset slave; start slave; # 查詢(xún)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; # 開(kāi)始同步 start slave; # 若出現(xiàn)錯(cuò)誤,則停止同步,重置后再次啟動(dòng) stop slave; reset slave; start slave; # 查詢(xún)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)文章
如何利用MySQL查詢(xún)varbinary中存儲(chǔ)的數(shù)據(jù)
varbinary 類(lèi)型和char與varchar類(lèi)型是相似的,他們是包含字節(jié)流而不是字符流,他們有二進(jìn)制字符的集合和順序,他們的對(duì)比,排序是基于字節(jié)的數(shù)值進(jìn)行的,本文給大家介紹如何利用MySQL查詢(xún)varbinary中存儲(chǔ)的數(shù)據(jù),感興趣的朋友一起看看吧2023-07-07
MySQL5.6下windows msi安裝詳細(xì)介紹
這篇文章主要介紹了MySQL5.6下windows msi安裝詳細(xì)介紹,介紹的非常詳細(xì),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-08-08
MySQL數(shù)據(jù)庫(kù)主從復(fù)制延時(shí)超長(zhǎng)的解決方法
這篇文章主要給大家介紹了關(guān)于MySQL數(shù)據(jù)庫(kù)主從復(fù)制延時(shí)超長(zhǎng)的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用MySQL具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06
MySQL遞歸查找樹(shù)形結(jié)構(gòu)(這個(gè)方法太實(shí)用了!)
對(duì)于數(shù)據(jù)庫(kù)中的樹(shù)形結(jié)構(gòu)數(shù)據(jù),如部門(mén)表,有時(shí)候,我們需要知道某部門(mén)的所有下屬部分或者某部分的所有上級(jí)部門(mén),這時(shí)候就需要用到mysql的遞歸查詢(xún),下面這篇文章主要給大家介紹了關(guān)于MySQL遞歸查找樹(shù)形結(jié)構(gòu)的相關(guān)資料,需要的朋友可以參考下2022-11-11
mysql復(fù)制中臨時(shí)表的運(yùn)用技巧
數(shù)據(jù)庫(kù)損壞,也沒(méi)有備份。剛好二進(jìn)制日志全部保存完好,幸福了。導(dǎo)入二進(jìn)制日志到MYSQL2012-09-09
Mysql數(shù)據(jù)庫(kù)慢查詢(xún)常用優(yōu)化方式
數(shù)據(jù)庫(kù)SQL優(yōu)化是老生常談的問(wèn)題,下面這篇文章主要給大家介紹了關(guān)于Mysql數(shù)據(jù)庫(kù)慢查詢(xún)常用優(yōu)化方式,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-05-05
MySQL數(shù)據(jù)導(dǎo)入導(dǎo)出的三種辦法總結(jié)
當(dāng)我們需要切換數(shù)據(jù)庫(kù)或備份數(shù)據(jù)時(shí),導(dǎo)入和導(dǎo)出數(shù)據(jù)庫(kù)是一個(gè)常見(jiàn)的操作,下面這篇文章主要給大家介紹了關(guān)于MySQL數(shù)據(jù)導(dǎo)入導(dǎo)出的三種辦法,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-05-05

