centos8平台搭建mysql8數據庫主從同步


一,兩台服務器的規划

    a服務器:主機名:yjweb  ip: 121.122.123.47        角色:主庫      server-id:1

    j服務器:主機名: os3   ip:  121.122.123.134       角色:從庫      server-id:2

 

說明:1,主庫上此前已經存在有數據,我們要把數據導出

          2,我們只有一個庫需要同步:數據庫名稱:meet

          3,  mysql數據庫的版本:8.0.19,

              注意要盡量保持兩台數據庫的版本一致,主庫盡量不要高於從庫的版本

 

說明:劉宏締的架構森林是一個專注架構的博客,地址:https://www.cnblogs.com/architectforest

         對應的源碼可以訪問這里獲取: https://github.com/liuhongdi/

 說明:作者:劉宏締 郵箱: 371125307@qq.com

 

二,主庫:查看配置文件,確保可以做主從同步:

[root@yjweb ~]$ more /etc/my.cnf 

 

有兩個關鍵配置項:

server-id = 1

log-bin = /data/mysql/binlog/mysql-bin

 

說明:主庫的server-id要和從庫的server-id區分開,

         主庫要做log-bin,二進制日志用來供主從復制時使用

說明:因為mysql8中,binlog_format 變量的默認值是row,

          我們不再手動聲明這個配置變量

 

三,主庫:創建同步賬號

說明:這個賬號是供從庫從來訪問主庫的,所以'backup'@'121.122.123.134',ip是從庫的ip

 

[root@yjweb ~]# /usr/local/soft/mysql/bin/mysql -u root -p

 

1,創建一個同步賬號,並授權:

mysql> create user 'backup'@'121.122.123.134' identified by 'backuppassword';
Query OK, 0 rows affected (0.00 sec)

mysql> grant replication slave on *.* to backup@121.122.123.134;
Query OK, 0 rows affected (0.00 sec)

 

2,檢查創建是否成功?

mysql> select * from mysql.user where User='backup';

 

3,檢查當前用戶獲得的授權

mysql> show grants for backup@121.122.123.134;
+--------------------------------------------------------------+
| Grants for backup@121.122.123.134                            |
+--------------------------------------------------------------+
| GRANT REPLICATION SLAVE ON *.* TO `backup`@`121.122.123.134` |
+--------------------------------------------------------------+
1 row in set (0.00 sec)

 

4,使新建賬號生效

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

 

四,主庫:導出待同步數據庫中的數據

說明:除了把數據導出,重點是記錄下主庫當前的日志位置

1,加全局的讀鎖,避免在導數據時有寫操作

mysql> FLUSH TABLES WITH READ LOCK;
Query OK, 0 rows affected (0.00 sec)

 

2,查看當前的日志文件和位置,並記錄下來

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000014 |    55813 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

 

3,另開一個終端,導出需要同步的數據庫的數據

[root@yjweb ~]# /usr/local/soft/mysql/bin/mysqldump --port=3306 -u root -prootpassword --databases meet --lock-tables=false --> /root/meet.sql

說明:導出的數據文件需要上傳到從庫所在的服務器

 

4,回到剛才所在的mysql終端:解除鎖定:

mysql> UNLOCK TABLES;
Query OK, 0 rows affected (0.00 sec)

 

五,  主庫:檢查防火牆配置

[root@yjweb ~]# firewall-cmd --list-all

 

檢查是否已經把從庫的ip加入到防火牆

例如:

 rich rules:
        rule family="ipv4" source address="121.122.123.134" accept

 

六,從庫:導入數據

1,關掉web服務,避免有訪問進入

[root@os3 ~]# systemctl stop nginx

 

2,如果當前存在同步數據庫,先刪除數據

mysql> drop database meet;
Query OK, 19 rows affected (0.24 sec)

 

3,導入數據

把主庫上導出的sql文件復制到從庫上(這一步是在主庫上執行)

[root@yjweb ~]# scp ./meet.sql root@121.122.123.134:/root/ 

 

從庫上,執行導入

[root@os3 conf]# /data/software/mysql/bin/mysql --host=127.0.0.1 --port=3306 -u root -prootpassword < /root/meet.sql

 

七,從庫:配置主從

[root@os3 ~]# vi /etc/my.cnf

主要配置以下各項:

server-id = 2
replicate-do-db = meet 
read_only         = 1

 

說明:replicate-do-db   用來指定要復制的數據庫

         read_only    普通用戶(非root)訪問時只有只讀的權限,不能做寫操作

說明:修改my.cnf配置文件完成后,不要忘記重啟mysql數據庫服務,

         使配置生效,否則會報如下錯誤:

Fatal error: The slave I/O thread stops because master and slave have equal MySQL server ids; 
these ids must be different for replication to work
(or the --replicate-same-server-id option must be used on slave but this does not always make sense;
please check the manual before using it)

 

八,從庫:執行同步:

停止從庫同步

mysql> stop slave;
Query OK, 0 rows affected, 1 warning (0.00 sec)

配置連接到主庫的信息

mysql> change master to master_host='121.122.123.47',master_port=3306,master_user='backup',master_password='backuppassword',master_log_file='mysql-bin.000014',master_log_pos=55813;
Query OK, 0 rows affected, 1 warning (0.03 sec)

 

開啟從庫同步

mysql> start slave;
Query OK, 0 rows affected (0.00 sec)

 

九,從庫:檢查同步情況

1,查看從庫的狀態

mysql> show slave status;

重點看這兩項:

Slave_IO_Running | Slave_SQL_Running

這兩項必須是

 Yes              | Yes

 

2,可以主庫上發生update或insert修改后,在從庫查看是否修改是否已生效

   

說明:以上mysql的主從同步搭建已完成 ,后面是附加的信息

 

十,show slave status主從同步情況的信息解讀:

1,查看主庫的信息:

Master_Host:#主庫服務器地址
Master_User:#用來訪問主庫的用戶名
Master_Port:#主庫mysqld的端口

 

2,Slave_IO_Running 和Slave_SQL_Running兩個線程的狀態

Slave_IO線程負責把主庫的bin日志(Master_Log)內容,投遞到從庫的中繼日志上(Relay_Log)。

Slave_SQL線程負責把中繼日志上的語句在從庫上執行一遍。

Yes表示正常,No表示異常.

如果兩個線程的狀態都是yes,表示同步正常,

如果有一項是no,此時注意查看以下四項:

Last_IO_Error 保存了發生io錯誤的原因

Last_IO_Error_Timestamp 記錄了發生io錯誤的時間

Last_SQL_Error 保存了發生sql錯誤的原因

Last_SQL_Error_Timestamp 記錄了發生sql錯誤的時間

 

3,如何判斷主從同步的差距?

Master_Log_File  # I/O線程當前正在讀取的主服務器二進制額日志文件的名稱

Relay_Master_Log_File  #由SQL線程執行的同步的主服務器二進制日志文件的名稱

如果以上兩個文件名相同,則表示讀取和執行的是同一個二進制文件

 

Read_Master_Log_Pos: #在當前的主服務器二進制日志中,I/O線程正在讀取的位置

Exec_Master_Log_Pos:#來自主服務器的二進制日志的由SQL線程執行的上一個時間的位置

如果以上兩個位置的數字相同則表示讀取和執行的進度完全同步

 

4,Replicate_Do_DB :此處是同步的數據庫的名字

5,  Slave_IO_State:顯示為wait ,例如:Waiting for master to send event

    表示relay日志中的sql語句已經全部執行完畢

6,Seconds_Behind_Master:

    slave的SQL線程與I/O線程的時間差

    如果兩台機器之間網絡較差,有可能這個值很低,

    但從庫上的同步落后主庫較多,

    所以不能完全依據它來判斷同步的情況

 

十一,三種二進制日志格式的含義:

binlog的格式有三種:STATEMENT,ROW,MIXED。

 

1,STATEMENT模式(SBR)

每一條會修改數據的sql語句會記錄到binlog中。

優點是並不需要記錄每一條sql語句和每一行的數據變化,減少了binlog日志量,節約IO,提高性能。

缺點是有可能會導致master-slave中的數據不一致(如sleep()函數, last_insert_id(),以及user-defined functions(udf)等會出現問題)

 

2,ROW模式(RBR)

不記錄每條sql語句的上下文信息,僅需記錄哪條數據被修改了,修改成什么樣了。

優點:不會出現某些特定情況下的存儲過程、或function、或trigger的調用和觸發無法被正確復制的問題。

缺點:會產生大量的日志,尤其是alter table的時候會讓日志暴漲。

 

3, MIXED模式(MBR)

以上兩種模式的混合使用,

一般的復制使用STATEMENT模式保存binlog,

對於STATEMENT模式無法復制的操作使用ROW模式保存binlog,

MySQL會根據執行的SQL語句選擇日志保存方式。

 

說明:row格式最安全,目前也是mysql8的默認格式

 

十二,查看mysql數據庫的版本和centos的版本:

[root@yjweb ~]# /usr/local/soft/mysql/bin/mysqld -V
/usr/local/soft/mysql/bin/mysqld  Ver 8.0.19 for linux-glibc2.12 on x86_64 (MySQL Community Server - GPL)

 

[root@yjweb ~]# cat /etc/redhat-release
CentOS Linux release 8.0.1905 (Core) 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM