本教程環境
服務器:CentOS7.7(推薦使用該版本)
需安裝docker,安裝docker環境教程請移步 https://blog.csdn.net/weixin_44790046/article/details/105612438
一、搭建主數據庫
注意:主從複製需要注意的地方
● 主DB server和從DB server數據庫的版本一致
● 主DB server和從DB server數據庫數據一致
● 主DB server開啓二進制日誌,主DB server和從DB server的server_id都必須唯一
1)創建目錄
#進入根目錄
cd /
#創建目錄
mkdir -p mysql/master
cd mysql/master
mkdir conf data
2)創建配置文件
cd conf/
#創建配置文件
vim my.cnf
#在裏面寫入如下內容
[mysqld]
server-id = 1 #服務id,不可重複
log-bin = mysql-bin #開啓二進制日誌
3)拉取mysql5.7鏡像
docker pull mysql:5.7
鏡像已拉取
4)創建mysql容器
docker run -d \
--name mysql_master \
-v /mysql/master/data:/var/lib/mysql \
-v /mysql/master/conf/my.cnf:/etc/my.cnf \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=362623 \
mysql:5.7
5)查看目錄是否掛載成功(重要),如果/mysql/master/data
目錄有如下文件說明掛載成功
6)進入容器登錄mysql(可以用遠程連接工具連接)
docker exec -it mysql_master /bin/bash
7)創建一個同步用戶以及授權
create user 'admin'@'%' identified by '362623';
grant replication slave on *.* to 'admin'@'%';
flush privileges;
看到mysql數據庫中多了一個admin用戶
如果執行過程中出現[Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and錯誤
#解決方案,在my.cnf配置文件中添加如下設置
sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION'
8)查看mysql二進制日誌功能是否開啓
#查看mysql二進制日誌功能是否開啓
show variables like '%log_bin%';
#查看master狀態
show master status;
#查看二進制日誌相關的配置項
show global variables like 'binlog%';
#查看s erver相關的配置項
show global variables like 'server%';
出現這個日誌文件就可以了,後面要用這兩個信息
二、搭建從數據庫
1)創建目錄
#進入根目錄
cd /
#創建目錄
mkdir -p mysql/slave01
cd mysql/slave01
mkdir conf data
2)創建配置文件
cd conf/
#創建配置文件
vim my.cnf
#在裏面寫入如下內容
[mysqld]
server-id = 2 #服務id,不可重複
創建mysql從數據庫容器
#創建容器
docker run -d \
--name mysql_slave01 \
-v /mysql/slave01/data:/var/lib/mysql \
-v /mysql/slave01/conf/my.cnf:/etc/my.cnf \
-p 3307:3306 \
-e MYSQL_ROOT_PASSWORD=362623 \
mysql:5.7
4)查看目錄是否掛載成功(重要),如果/mysql/slave01/data
目錄有如下文件說明掛載成功
5)進入容器登錄mysql(可以用遠程連接工具連接)
docker exec -it mysql_slave01 /bin/bash
6)設置主庫master的相關信息(注意:以下執行sql都是在從庫中執行
)
#設置主庫master的相關信息
CHANGE MASTER TO
master_host='192.168.200.131', #你的宿主機ip
master_user='admin', #上面在主數據庫添加的用戶名
master_password= '362623', #上面在主數據庫添加的用戶名密碼
master_port=3306, #主數據庫端口
master_log_file='mysql-bin.000003', #主數據庫搭建最後一步的那兩個信息
master_log_pos=741; #主數據庫搭建最後一步的那兩個信息
7)啓動同步
start slave;
注意:這裏如果執行
start slave
命令出現Slave failed to initialize relay log info structure from the repository
錯誤,那麼就是執行reset slave;
命令清除記錄再次執行第6步設置主庫master的相關信息
8)查看master狀態,如果紅框兩項都爲yes那麼恭喜你搭建成功
show slave status;
三、修改主從複製模式
#查看mysql_master二進制日誌相關的配置項
show global variables like 'binlog%';
可以看到當前模式默認爲ROW(基於行的複製)
在查看二進制日誌相關參數內容中,會發現默認的模式爲ROW ,其實在MySQL中提供了有3種模式,基於SQL語句的複製(statement-based replication, SBR) ,基於行的複製(row-based replication, RBR) ,混合模式複製(mixed-based replication, MBR)。對應的, binlog的格式也有三種: STATEMENT , ROW , MIXED。
STATEMENT模式(SBR)
- 優點是並不需要記錄每一條sql語句和每一 行的數據變化 ,減少了binlog日誌量,節約IO ,提高性能。
- 缺點是在某些情況下會導致master-slave中的數據不一致(如sleep)函數 ,last_insert_id() ,以及user-defined functions(udf)等會出現問題
ROW模式( RBR )
- 不記錄每條sql語句的上下文信息,僅需記錄哪條數據被修改了,修改成什麼樣了。而且不會出現某些特定情況下
的存儲過程、或function、 或trgger的調用和觸發無法被正確複製的問題。缺點是會產生大量的日誌,尤其是
alter table的時候會讓日誌暴漲。
MIXED模式( MBR )
- 以上兩種模式的混合使用,一般的複製使用STATEMENT模式保存binlog ,對於STATEMENT模式無法複製的操作使
用ROW模式保存binlog , MySQL會根據執行的SQL語句選擇日誌保存方式。
建議使用MIXED模式。
修改主庫配置文件my.cnf
#追加下面配置
binlog_format = MIXED
#重啓並查看日誌
docker restart mysql_master && docker logs -f mysql_master
#再次查看二進制日誌相關的配置項
show global variables like 'binlog%';
測試
在主庫中新建ceshi
數據庫並創建user
表,在裏面添加一條記錄
我們發現從庫也有了這張表和數據
至此,我們就實現了主從複製,當我們去執行寫入的操作就可以寫入到主庫中,當執行查的操作就去從庫查詢,這樣就節省了主庫的壓力。