Mysql主從同步簡介
指一台服務器充當主數據庫服務器,另一台或多台服務器充當從數據庫服務器,主服務器中的數據自動復制到從服務器之中。對於多級復制,數據庫服務器即可充當主機,也可充當從機。MySQL主從復制的基礎是主服務器對數據庫修改記錄二進制日志,從服務器通過主服務器的二進制日志自動執行更新。
一句話表示就是,主數據庫做什么,從數據庫就跟着做什么。
mysql復制的類型
- 1.基於語句的復制 :主庫把sql語句寫入到bin log中,完成復制
- 2.基於行數據的復制:主庫把每一行數據變化的信息作為事件,寫入到bin log,完成復制
- 3.混合復制:上面兩個結合體,默認用語句復制,出問題時候自動切換成行數據復制
tip:和上面相對應的日志格式也有三種:STATEMENT,ROW,MIXED。
- STATEMENT模式(SBR)
每一條會修改數據的sql語句會記錄到binlog中。優點是並不需要記錄每一條sql語句和每一行的數據變化,減少了binlog日志量,節約IO,提高性能。缺點是在某些情況下會導致master-slave中的數據不一致(如sleep()函數, last_insert_id(),以及user-defined functions(udf)等會出現問題)
-
ROW模式(RBR)
不記錄每條sql語句的上下文信息,僅需記錄哪條數據被修改了,修改成什么樣了。而且不會出現某些特定情況下的存儲過程、或function、或trigger的調用和觸發無法被正確復制的問題。缺點是會產生大量的日志,尤其是alter table的時候會讓日志暴漲。 -
MIXED模式(MBR)
以上兩種模式的混合使用,一般的復制使用STATEMENT模式保存binlog,對於STATEMENT模式無法復制的操作使用ROW模式保存binlog,MySQL會根據執行的SQL語句選擇日志保存方式。
mysql主從復制原理
1.Master 數據庫只要發生變化,立馬記錄到Binary log 日志文件中
2.Slave數據庫啟動一個I/O thread連接Master數據庫,請求Master變化的二進制日志
3.Slave I/O獲取到的二進制日志,保存到自己的Relay log 日志文件中。
4.Slave 有一個 SQL thread定時檢查Realy log是否變化,變化那么就更新數據

為什么要用mysql 的主從
1.實現服務器負載均衡
即可以通過在主服務器和從服務器之間切分處理客戶查詢的負荷,從而得到更好的客戶相應時間。通常情況下,數據庫管理員會有兩種思路。
一是在主服務器上只實現數據的更新操作。包括數據記錄的更新、刪除、新建等等作業。而不關心數據的查詢作業。數據庫管理員將數據的查詢請求全部 轉發到從服務器中。這在某些應用中會比較有用。如某些應用,像基金凈值預測的網站。其數據的更新都是有管理員更新的,即更新的用戶比較少。而查詢的用戶數 量會非常的多。此時就可以設置一台主服務器,專門用來數據的更新。同時設置多台從服務器,用來負責用戶信息的查詢
二是在主服務器上與從服務器切分查詢的作業。在這種思路下,主服務器不單單要完成數據的更新、刪除、插入等作業,同時也需要負擔一部分查詢作業。而從服務器的話,只負責數據的查詢。當主服務器比較忙時,部分查詢請求會自動發送到從服務器重,以降低主服務器的工作負荷。
2.通過復制實現數據的異地備份
可以定期的將數據從主服務器上復制到從服務器上,這無疑是先了數據的異地備份。在傳統的備份體制下,是將數據備份在本地。此時備份 作業與數據庫服務器運行在同一台設備上,當備份作業運行時就會影響到服務器的正常運行。有時候會明顯的降低服務器的性能。同時,將備份數據存放在本地,也 不是很安全。如硬盤因為電壓等原因被損壞或者服務器被失竊,此時由於備份文件仍然存放在硬盤上,數據庫管理員無法使用備份文件來恢復數據。這顯然會給企業 帶來比較大的損失。
3.提高數據庫系統的可用性
數據庫復制功能實現了主服務器與從服務器之間數據的同步,增加了數據庫系統的可用性。當主服務器出現問題時,數據庫管理員可以馬上讓從服務器作為主服務器,用來數據的更新與查詢服務。然后回過頭來再仔細的檢查主服務器的問題。此時一般數據庫管理員也會采用兩種手段。
一是主服務器故障之后,雖然從服務器取代了主服務器的位置,但是對於主服務器可以采取的操作仍然做了一些限制。如仍然只能夠進行數據的查詢,而 不能夠進行數據的更新、刪除等操作。這主要是從數據的安全性考慮。如現在一些銀行系統的升級,在升級的過程中,只能夠查詢余額而不能夠取錢。這是同樣的道 理。
二是從服務器真正變成了主服務器。當從服務器切換為主服務器之后,其地位完全與原先的主服務器相同。此時可以實現對數據的查詢、更新、刪除等操 作。為此就需要做好數據的安全性工作。即數據的安全策略,要與原先的主服務器完全相同。否則的話,就可能會留下一定的安全隱患
Mysql主從同步配置
環境准備
服務器系統:CentOS 7.4
Mysql版本:5.8
mysql1(master): 192.168.0.1:3306
mysql2(slave): 192.168.0.2:3306
1、在2個服務器上分別安裝Mysql服務,參考:【Linux】CentOS 7.4 安裝 MySQL 8.0.12 解壓版
2、master數據庫,創建復制用戶並授權
登錄mysql服務
1)新增用戶
命令:create user 'replace'@'%' identified by '123456';
2)給用戶授權
命令:grant all privileges on *.* to 'replace'@'%' with grant option;
3)刷新權限
命令:flush privileges;
2、配置mysql master服務
編輯master節點上的mysql的配置文件
命令:vim /etc/my.conf
1 # -----主從配置 主節點----- 2 3 #主服務器唯一ID 4 server-id=1 5 #啟用二進制日志 6 log-bin=mysql-bin 7 # 設置不要復制的數據庫(可設置多個) 8 binlog-ignore-db=mysql 9 binlog-ignore-db=information_schema 10 #設置需要復制的數據庫 11 binlog-do-db=test_slave 12 #設置logbin格式 13 binlog_format=STATEMENT
3、重啟master mysql服務
4、查詢master狀態
命令:show master status;
5、master binlog日志查看
位置:./data/mysql-bin.000002
查看命令:./data/mysql-bin.000002
6、配置mysql slave服務
編輯slave節點上的mysql的配置文件
命令:vim /etc/my.conf
1 # -----主從配置 從節點----- 2 3 #從服務器唯一ID 4 server-id=2 5 #啟用中繼日志 6 relay-log=mysql-relay
7、重啟slave mysql服務
8、在slave上配置復制主機
1)登錄slave mysql服務
2)執行一下命令
1 CHANGE MASTER TO 2 MASTER_HOST = '192.168.0.1', 3 MASTER_USER = 'replace', 4 MASTER_PASSWORD = '123456', 5 MASTER_PORT = 3306, 6 MASTER_LOG_FILE='mysql-bin.000002', 7 MASTER_LOG_POS=2676;
注意:
# MASTER_LOG_FILE='mysql-bin.000002',#與主庫File 保持一致
# MASTER_LOG_POS=2676 , #與主庫Position 保持一致
3)啟動從服務器復制功能
啟動從服務命令:start slave;
停止從服務命令:stop slave;
重置主節點命令:reset master;
如果要重新配置主從,需要新停止從服務->重只主節點->設置主節點信息->啟動從服務
4)查看從服務信息
命令:show slave status\G;
#下面兩個參數都是Yes,則說明主從配置成功!
# Slave_IO_Running: Yes
# Slave_SQL_Running: Yes
驗證Mysql主從同步
1、登錄master,創建數據庫 test_slave
1 CREATE DATABASE test_slave;
2、創建表
1 CREATE TABLE `test_tbl` ( 2 `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 3 `title` varchar(100) NOT NULL, 4 `update_date` date DEFAULT NULL, 5 PRIMARY KEY (`id`) 6 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
3、插入數據
1 INSERT INTO `test_slave`.`test_tbl`(`id`, `title`, `update_date`) VALUES (1, '白色', '2020-07-10');
4、更新數據
1 UPDATE `test_slave`.`test_tbl` SET `title` = '黑色', `update_date` = '2020-07-10' WHERE `id` = 1;
查看master 和 slave 節點數據是否相同