一、介紹
簡稱AB複製,在A主機上做create、update、insert、drop、delete等數據庫、表、記錄的增、刪、改操作,B主機上會自動做數據庫、表、記錄的同步更新。
主從複製,是用來建立一個和主數據庫完全一樣的數據庫環境,稱爲從數據庫,主數據庫一般是準實時的業務數據庫 事務處理庫,從庫做查詢庫
二、A工作原理(即工作過程)
a. 在主庫上把數據更改記錄到二進制日誌(Binary Log)中。
b. 備庫將主庫上的日誌複製到自己的中繼日誌(Relay Log)中。
c. 備庫讀取中繼日誌中的事件,將其重放到備庫數據庫之上。
三、AB複製的一主一從模式工作過程
A主機: create database db1 ----> 會將此命令自動寫入本機的二進制日誌文件中
B主機:
I/O線程: 監測並讀A主機上的二進制日誌文件新增的內容,且將新內容寫入到B主機自己的中繼日誌文件中
SQL線程 : 讀取B主機上中繼日誌文件中心的SQL語句,並且自動執行這些SQL語句。最終在B主機上創建了db1這個庫。
四、主從複製的作用
一是確保數據安全;做數據的熱備,作爲後備數據庫,主數據庫服務器故障後,可切換到從數據庫繼續工作,避免數據的丟失。
二是提升I/O性能;隨着日常生產中業務量越來越大,I/O訪問頻率越來越高,單機無法滿足,此時做多庫的存儲,有效降低磁盤I/O訪問的頻率,提高了單個設備的I/O性能。
三是讀寫分離,使數據庫能支持更大的併發;在報表中尤其重要。由於部分報表sql語句非常的慢,導致鎖表,影響前臺服務。如果前臺使用master,報表使用slave,那麼報表sql將不會造成前臺鎖,保證了前臺速度
實驗準備(本實驗都在VMware中完成)
兩臺主機,分爲安裝MySQL,一臺作爲主庫,一臺作爲從庫
1、主庫 IP:192.168.112.130
2、從庫 IP:192.168.112.140
3、一個寫好的test.sql表
1、主庫參數配置
在C盤下打開這個目錄(注:programData爲隱藏文件!!!)
打開 my.ini 配置文件
C:\ProgramData\MySQL\MySQL Server 5.7
[mysqld]
# Binary Logging.
# log-bin ---把這一行的註釋取消,並改爲以下
log-bin=binlog
# server ID
Server-id=1
Binlog_format=row ---添加這一行
打開命令提示符(cmd)
net stop mysql57 ---停止mysql
net start mysql57 ---啓動mysql
2、配置從庫參數
在C盤下打開這個目錄(注:programData爲隱藏文件!!!)
打開 my.ini 配置文件
C:\ProgramData\MySQL\MySQL Server 5.7
[mysqld]
# Binary Logging
# log-bin
relay-log = relay-bin ---添加這個
# server ID
server-id = 2 ---改一下ID
打開Data文件,裏面有一個 auto.cnf
把UUID的最後一個字母改成其他的,因爲我們這個兩個主機是複製出來的,所以會出現UUID相同的狀況
[auto]server-uuid=bb8a3677-f728-11ea-913a-000c29035395 ---末尾最後一個數字隨便改成什麼都可以
打開命令提示符運行以下命令
net stop mysql57 停止
net start mysql57 啓動
3、回到主庫操作
把數據表test.sql文件複製到C盤下面
建立一個數據庫名叫 test(以下命令在數據庫中進行)
reate database test default character set utf8;
然後在命令提示符(cmd)上把我們的數據表文件複製到新建立的 test庫中
Mysql -uroot -pXXGC.lab123 test < C:\test.sql
主庫創建同步賬號(數據庫中進行)
create user 'edc'@'%' identified by '123456';
grant replication slave on *.* to 'edc'@'%';
查看主庫binlog文件位置
show master logs;
展示日誌文件
show binlog events in ‘binlog.000001’
刷新日誌文件
Flush logs;
再運行
show master logs
可以看到已經多了一個000002的日誌文件
4、回到從庫操作
把數據表test.sql文件複製到C盤下面
建立一個數據庫名叫 test(以下命令在數據庫中進行)
reate database test default character set utf8;
然後在命令提示符(cmd)上把我們的數據表文件複製到新建立的 test庫中
Mysql -uroot -pXXGC.lab123 test < C:\test.sql
在新建的test數據庫裏執行此操作
CHANGE MASTER TO MASTER_HOST='192.168.112.130',
MASTER_PORT=3306,
MASTER_USER='edc',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='binlog.000002',
MASTER_LOG_POS=154;
開啓主從複製 並檢查狀態
Start SLAVE;
Show SLAVE status;
這個時候就可以在主庫裏面寫數據,然後可以看到從庫就已經同步了;
此文檔寫於2020/12/18