一,兩台服務器的規划
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)