Linux安裝Mysql8.0.20并配置主從復(fù)制(一主一從,雙主雙從)
1. 主從復(fù)制解釋
將主數(shù)據(jù)庫的增刪改查等操作記錄到二進(jìn)制日志文件中,從庫接收主庫日志文件,根據(jù)最后一次更新的起始位置,同步復(fù)制到從數(shù)據(jù)庫中,使得主從數(shù)據(jù)庫保持一致。
2. 主從復(fù)制的作用
- 高可用性:主數(shù)據(jù)庫異??汕袚Q到從數(shù)據(jù)庫
- 負(fù)載均衡:實(shí)現(xiàn)讀寫分離
- 備份:進(jìn)行日常備份
3. Mysql主從復(fù)制過程
Binary log:主數(shù)據(jù)庫的二進(jìn)制日志;Relay log:從服務(wù)器的中繼日志。
復(fù)制過程:
(1)主數(shù)據(jù)庫在每次事務(wù)完成前,將該操作記錄到binlog日志文件中;
(2)從數(shù)據(jù)庫中有一個(gè)I/O線程,負(fù)責(zé)連接主數(shù)據(jù)庫服務(wù),并讀取binlog日志變化,如果發(fā)現(xiàn)有新的變動(dòng),則將變動(dòng)寫入到relay-log,否則進(jìn)入休眠狀態(tài);
(3)從數(shù)據(jù)庫中的SQL Thread讀取中繼日志,并串行執(zhí)行SQL事件,使得從數(shù)據(jù)庫與主數(shù)據(jù)庫始終保持一致。
注意事項(xiàng):
(1)涉及時(shí)間函數(shù)時(shí),會(huì)出現(xiàn)數(shù)據(jù)不一致。原因是,復(fù)制過程的兩次IO操作和網(wǎng)絡(luò)、磁盤效率等問題勢必導(dǎo)致時(shí)間戳不一致;
(2)涉及系統(tǒng)函數(shù)時(shí),會(huì)出現(xiàn)不一致。如:@@hostname,獲取主機(jī)名稱,主從數(shù)據(jù)庫服務(wù)器名稱不一致導(dǎo)致數(shù)據(jù)不一致;
(3)......
4. 一主一從配置
服務(wù)器劃分
服務(wù)器IP | 角色 |
---|---|
192.168.133.129 | Master1 |
192.168.133.130 | Slave1 |
主數(shù)據(jù)庫安裝
# 進(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ù)庫(記錄臨時(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ù)庫(可設(shè)置多個(gè)) binlog-ignore-db=sys binlog-ignore-db=mysql binlog-ignore-db=information_schema binlog-ignore-db=performance_schema # 設(shè)置需要復(fù)制的數(shù)據(jù)庫(可設(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ù)庫安裝
和主數(shù)據(jù)庫安裝一致,但配置文件內(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ù)庫服務(wù)器防火墻或開放3306端口
# 查看防火墻狀態(tài) systemctl status firewalld # 關(guān)閉防火墻 systemctl stop firewalld
主從數(shù)據(jù)庫測試是否已經(jīng)可以遠(yuǎn)程訪問
# 主數(shù)據(jù)庫服務(wù)器測試從數(shù)據(jù)庫 mysql -uroot -p -h192.168.133.130 -P3306 # 從數(shù)據(jù)庫服務(wù)器測試主數(shù)據(jù)庫 mysql -uroot -p -h192.168.133.129 -P3306
主數(shù)據(jù)庫創(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ù)庫驗(yàn)證slave用戶是否可用
復(fù)制代碼 代碼如下:mysql -uslave -p -h192.168.133.129 -P3306
主數(shù)據(jù)庫查詢服務(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ù)庫,防止再次操作導(dǎo)致 File 和 Position 的值發(fā)生變化
從數(shù)據(jù)庫中設(shè)置主數(shù)據(jù)庫
# 登錄 mysql -uroot -p # 查詢server_id是否可配置文件中一致 show variables like 'server_id'; # 若不一致,可設(shè)置臨時(shí)ID(重啟失效) set global server_id = 2; # 設(shè)置主數(shù)據(jù)庫參數(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,則需要查看對應(yīng)的 Last_IO_Error 或 Last_SQL_Error 的異常值。
測試
通過工具連接主從數(shù)據(jù)庫或者在服務(wù)器連接。
注意:主數(shù)據(jù)庫的配置文件中配置了需要同步的數(shù)據(jù)庫,因此只會(huì)同步配置的數(shù)據(jù)庫,不配置則同步全部。
# 在主數(shù)據(jù)庫創(chuàng)建數(shù)據(jù)庫test create database test; # 從數(shù)據(jù)庫查看 show databases; # 在主數(shù)據(jù)庫創(chuàng)建表 use test; create table t_user(id int, name varchar(20)); # 插入數(shù)據(jù) insert into t_user values(1, 'C3Stones'); # 在從數(shù)據(jù)庫查看 use test; select * from t_user; # 其他刪改查操作請自行測試
5. 雙主雙從配置
雙主雙從即兩臺(tái)主機(jī)分別存在兩臺(tái)從機(jī),每臺(tái)從機(jī)只復(fù)制對應(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ù)庫請參考上述安裝主數(shù)據(jù)庫
四個(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ù)庫(可設(shè)置多個(gè)) binlog-ignore-db=sys binlog-ignore-db=mysql binlog-ignore-db=information_schema binlog-ignore-db=performance_schema # 設(shè)置需要復(fù)制的數(shù)據(jù)庫(可設(shè)置多個(gè)) binlog-do-db=test # 設(shè)置logbin格式 binlog_format=STATEMENT # 寫入操作更新二進(jìn)制日志文件 log-slave-updates # 自增長字段起始值,默認(rèn)值為1,取值范圍:1 ~ 65535 auto-increment-increment=2 # 自增長字段遞增量,取值范圍: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ù)庫(可設(shè)置多個(gè)) binlog-ignore-db=sys binlog-ignore-db=mysql binlog-ignore-db=information_schema binlog-ignore-db=performance_schema # 設(shè)置需要復(fù)制的數(shù)據(jù)庫(可設(shè)置多個(gè)) binlog-do-db=test # 設(shè)置logbin格式 binlog_format=STATEMENT # 寫入操作更新二進(jìn)制日志文件 log-slave-updates # 自增長字段起始值,默認(rèn)值為1,取值范圍:1 ~ 65535 auto-increment-increment=2 # 自增長字段遞增量,取值范圍: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ù)庫均重啟
service restart mysql
四臺(tái)服務(wù)器均關(guān)閉防火墻
systemctl stop firewalld
兩臺(tái)主數(shù)據(jù)庫分別創(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ù)庫驗(yàn)證slave用戶是否可用
# 主數(shù)據(jù)庫1服務(wù)器測試 mysql -uslave -p -h192.168.133.130 -P3306 mysql -uslave -p -h192.168.133.131 -P3306 # 從數(shù)據(jù)庫1服務(wù)器測試主數(shù)據(jù)庫1 mysql -uroot -p -h192.168.133.129 -P3306 # 主數(shù)據(jù)庫2服務(wù)器測試 mysql -uslave -p -h192.168.133.129 -P3306 mysql -uslave -p -h192.168.133.132 -P3306 # 從數(shù)據(jù)庫1服務(wù)器測試主數(shù)據(jù)庫1 mysql -uroot -p -h192.168.133.131 -P3306
兩臺(tái)主數(shù)據(jù)庫查詢服務(wù)ID及Master狀態(tài)
# 登錄 mysql -uroot -p # 查詢server_id是否可配置文件中一致 show variables like 'server_id'; # 若不一致,可設(shè)置臨時(shí)ID(重啟失效) # 主數(shù)據(jù)庫1 set global server_id = 1; # 主數(shù)據(jù)庫2 set global server_id = 3; # 查詢Master狀態(tài),并記錄 File 和 Position 的值 show master status; # 注意:執(zhí)行完此步驟后退出主數(shù)據(jù)庫,防止再次操作導(dǎo)致 File 和 Position 的值發(fā)生變化
從數(shù)據(jù)庫1中設(shè)置主數(shù)據(jù)庫1
# 登錄 mysql -uroot -p # 查詢server_id是否可配置文件中一致 show variables like 'server_id'; # 若不一致,可設(shè)置臨時(shí)ID(重啟失效) set global server_id = 2; # 設(shè)置主數(shù)據(jù)庫參數(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,則需要查看對應(yīng)的 Last_IO_Error 或 Last_SQL_Error 的異常值。
從數(shù)據(jù)庫2中設(shè)置主數(shù)據(jù)庫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,則需要查看對應(yīng)的 Last_IO_Error 或 Last_SQL_Error 的異常值。
主數(shù)據(jù)庫1中設(shè)置主數(shù)據(jù)庫2
# 登錄 mysql -uroot -p # 設(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,則需要查看對應(yīng)的 Last_IO_Error 或 Last_SQL_Error 的異常值。
主數(shù)據(jù)庫2中設(shè)置主數(shù)據(jù)庫1
# 登錄 mysql -uroot -p # 設(shè)置主數(shù)據(jù)庫參數(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,則需要查看對應(yīng)的 Last_IO_Error 或 Last_SQL_Error 的異常值。
測試
通過工具連接雙主雙從數(shù)據(jù)庫或者在服務(wù)器連接。
注意:主數(shù)據(jù)庫的配置文件中配置了需要同步的數(shù)據(jù)庫,因此只會(huì)同步配置的數(shù)據(jù)庫,不配置則同步全部。
# 在主數(shù)據(jù)庫1創(chuàng)建數(shù)據(jù)庫test create database test; # 其他三個(gè)數(shù)據(jù)庫查看 show databases; # 在主數(shù)據(jù)庫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ù)庫查看 use test; select * from t_user; # 其他刪改查操作請自行測試
到此這篇關(guān)于Linux安裝Mysql8.0.20并配置主從復(fù)制(一主一從,雙主雙從) 的文章就介紹到這了,更多相關(guān)Mysql8.0.20安裝并配置主從復(fù)制內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
如何利用MySQL查詢varbinary中存儲(chǔ)的數(shù)據(jù)
varbinary 類型和char與varchar類型是相似的,他們是包含字節(jié)流而不是字符流,他們有二進(jìn)制字符的集合和順序,他們的對比,排序是基于字節(jié)的數(shù)值進(jìn)行的,本文給大家介紹如何利用MySQL查詢varbinary中存儲(chǔ)的數(shù)據(jù),感興趣的朋友一起看看吧2023-07-07MySQL5.6下windows msi安裝詳細(xì)介紹
這篇文章主要介紹了MySQL5.6下windows msi安裝詳細(xì)介紹,介紹的非常詳細(xì),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-08-08MySQL數(shù)據(jù)庫主從復(fù)制延時(shí)超長的解決方法
這篇文章主要給大家介紹了關(guān)于MySQL數(shù)據(jù)庫主從復(fù)制延時(shí)超長的解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用MySQL具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06MySQL遞歸查找樹形結(jié)構(gòu)(這個(gè)方法太實(shí)用了!)
對于數(shù)據(jù)庫中的樹形結(jié)構(gòu)數(shù)據(jù),如部門表,有時(shí)候,我們需要知道某部門的所有下屬部分或者某部分的所有上級部門,這時(shí)候就需要用到mysql的遞歸查詢,下面這篇文章主要給大家介紹了關(guān)于MySQL遞歸查找樹形結(jié)構(gòu)的相關(guān)資料,需要的朋友可以參考下2022-11-11mysql復(fù)制中臨時(shí)表的運(yùn)用技巧
數(shù)據(jù)庫損壞,也沒有備份。剛好二進(jìn)制日志全部保存完好,幸福了。導(dǎo)入二進(jìn)制日志到MYSQL2012-09-09Mysql數(shù)據(jù)庫慢查詢常用優(yōu)化方式
數(shù)據(jù)庫SQL優(yōu)化是老生常談的問題,下面這篇文章主要給大家介紹了關(guān)于Mysql數(shù)據(jù)庫慢查詢常用優(yōu)化方式,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-05-05MySQL數(shù)據(jù)導(dǎo)入導(dǎo)出的三種辦法總結(jié)
當(dāng)我們需要切換數(shù)據(jù)庫或備份數(shù)據(jù)時(shí),導(dǎo)入和導(dǎo)出數(shù)據(jù)庫是一個(gè)常見的操作,下面這篇文章主要給大家介紹了關(guān)于MySQL數(shù)據(jù)導(dǎo)入導(dǎo)出的三種辦法,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-05-05