本文講解如何實現MySQL數據庫的主從複製功能。使用的機器爲Windows上的數據庫作爲主服務器,Linux上的數據庫作爲從服務器,實現一主一從的配置。
基本原理
實現主從複製,主機master和從機slave的工作方式如下圖所示。
MySQL複製過程分成三步:
- master將改變記錄到二進制日誌(binary log)。這些記錄過程叫做二進制日誌事件,binary log events;
- slave將master的binary log events拷貝到它的中繼日誌(relay log);
- slave重做中繼日誌中的事件,將改變應用到自己的數據庫中。 MySQL複製是異步的且串行化的。
複製的基本原則
- 每個slave只有一個master(類似Java中的單繼承)
- 每個slave只能有一個唯一的服務器ID
- 每個master可以有多個salve
複製的最大問題:延時
配置過程
注意,實現一主一從的配置,要求兩者的mysql版本要一致(本人使用的都是mysql5.7.25的版本),並且主從配置信息都在[mysqld]下,且最好都是小寫。
修改主機配置
將主機設置爲本機Windows下的數據庫,其配置文件位於mysql的安裝目錄中的my.ini下。並修改以下的配置信息:
- [必須] 主機服務器唯一ID:server-id=1
- [必須] 啓用二進制日誌:bin-log=自己本地的路徑/data/mysqlbin
- [可選] 啓用錯誤日誌:log-err=自己本地的路徑/data/mysqlerr
- [可選] 根目錄:basedir=自己本地的路徑
- [可選] 臨時目錄:tmpdir=自己本地的路徑
- [可選] 數據目錄:datadir=自己本地的路徑/data/
- [可選] read-only=0,設置主機爲可讀可寫
- [可選] 設置不要複製的數據庫:binlog-ignore-db=mysql
- [可選] 設置需要複製的數據庫:binlog-do-db=主數據庫名字
修改好後保存,並重啓mysql服務。
修改從機配置
從機配置文件位於Linux上的/etc/my.cnf文件,修改的配置信息位於[mysqld]標籤下
- [必須] 從服務器唯一ID:server-id=2(不能和主機相同)
- [可選] 啓用二進制日誌
修改好配置文件後,保存,重啓mysql服務。
建立連接並授權
- 關閉主機和從機上的防火牆。windows手動關閉,linux通過systemctl stop firewalld關閉。
【主機配置】
- 主機給從機授權:
#%可以改爲從機的ip地址,%表示任意ip都可以連
GRANT REPLICATION SLAVE ON *.* TO 'zhangsan'@'%' IDENTIFIED BY '123456';
flush privileges;
- 查看master的狀態,並記錄File和Position的值(表示要從哪個文件的哪個位置開始複製)
show master status;
【從機配置】
- 在從機上配置主機(主機IP需要改爲自己的windows的ip,File名字和位置改爲上圖記錄的值)
CHANGE MASTER TO MASTER_HOST='10.1.18.79', #更改ip
MASTER_USER='zhangsan',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysqlbin.000001',MASTER_LOG_POS=604; #更改文件名和位置
- 啓動主從複製功能
start slave;
- 查看是否配置成功
show slave status\G
下面兩個參數必須都是Yes,則說明主從配置成功!
- 停止主從複製功能(測試好後再來停止)
stop slave;
測試
在經過上述的配置之後,從機可從主機複製數據。
【主機創建數據】
create database mydb58;
use mydb58;
create table dog(id int not null, name varchar(20));
insert into dog values (1, 'ww1'); #插入1號汪汪
【從機檢查數據】
至此,MySQL主從複製成功配置完成。