?以下筆記都是基于黑馬程序員的面試題寫的:
Mysql定位慢查詢-CSDN博客
Mysql索引-CSDN博客
MySQL事物相關-CSDN博客
MySQL主從同步集群(Docker搭建)-CSDN博客
MySQL相關面試問題總結-CSDN博客
????????主從同步(Master-Slave Replication)是數據庫集群中常用的高可用、高并發解決方案,通過將主數據庫(Master)的數據變更同步到從數據庫(Slave),實現數據的多副本存儲和讀寫分離。
一、主從同步的核心目標
- 數據備份:從庫作為主庫的副本,避免單庫故障導致數據丟失。
- 讀寫分離:主庫負責寫操作(INSERT/UPDATE/DELETE),從庫負責讀操作(SELECT),分散數據庫壓力,提升并發能力。
- 故障轉移:主庫故障時,可將從庫切換為主庫,保證服務連續性。
二、工作原理
MySQL主從復制的核心就是二進制日志。
二進制日志(BINLOG)記錄了所有的 DDL(數據定義語言)語句和 DML(數據操縱語言)語句,但不包括數據查詢(SELECT、SHOW)語句。
復制分成三步:
- Master 主庫在事務提交時,會把數據變更記錄在二進制日志文件 Binlog 中。
- 從庫讀取主庫的二進制日志文件 Binlog ,寫入到從庫的中繼日志 Relay Log 。
- slave重做中繼日志中的事件,將改變反映它自己的數據。
三、主從同步的常見架構
一主一從:最簡單的架構,主庫寫入,從庫備份 + 讀。
一主多從:主庫連接多個從庫,分擔更多讀壓力(如電商詳情頁的高頻查詢)。
級聯復制(主 -> 從 -> 從):主庫只同步給一個從庫,該從庫再同步給其他從庫,減輕主庫的 binlog 發送壓力。
四、Docker搭建MySQL主從同步集群
1.環境
centos7,MySQL8.0.19、MobaXterm
目的:
實現MySQL主從同步集群——一主一從
2.步驟
1.拉取鏡像并創建網絡
拉取鏡像:
docker pull mysql:8.0.19
創建網絡:
docker network create mysql-net
2.創建掛載目錄
master:
創建掛載目錄:
mkdir -p mysql-demo/master3307/{conf,data,logs}
vi /home/hl/mysql-demo/master3307/conf/my.cnf?
vi /home/hl/mysql-demo/master3307/logs/mysql-slow.log
將以下內容復制進my.cnf:
[mysqld]
# 開啟慢查詢日志
slow_query_log = 1
# 慢查詢日志路徑(需對應容器內路徑,已掛載到本地 /docker/mysql/logs)
slow_query_log_file = /var/log/mysql/mysql-slow.log
# 慢查詢閾值(單位:秒,超過此值的 SQL 會被記錄)
long_query_time = 1# 主庫唯一ID(必須與從庫不同)
server-id=1
# 開啟binlog,日志文件名前綴
log_bin=mysql-bin
# 二進制日志過期清理時間。默認值為0,表示不自動清理。
expire_logs_days=7
賦予權限:
chown -R 999:999 /home/hl/mysql-demo/master3307/logs
slave操作同上,my.cnf內容不同:
[mysqld]
# 從庫唯一ID(必須與主庫不同)
server-id = 2
# 中繼日志文件名前綴
relay_log = mysql-relay-bin
# 從庫設為只讀(可選,增強安全性,root用戶不受限)
read_only = 1
3.創建容器
docker run -d \--name mysql-master \--network mysql-net \-p 3307:3306 \-e MYSQL_ROOT_PASSWORD=1234 \-v /home/hl/mysql-demo/master3307/conf:/etc/mysql/conf.d \-v /home/hl/mysql-demo/master3307/data:/var/lib/mysql \-v /home/hl/mysql-demo/master3307/logs:/var/log/mysql \mysql:8.0.19
docker run -d \--name mysql-slave \--network mysql-net \-p 3308:3306 \-e MYSQL_ROOT_PASSWORD=1234 \-v /home/hl/mysql-demo/slave3308/conf:/etc/mysql/conf.d \-v /home/hl/mysql-demo/slave3308/data:/var/lib/mysql \-v /home/hl/mysql-demo/slave3308/logs:/var/log/mysql \mysql:8.0.19
4.配置主庫
進入主庫 MySQL 命令行,查看慢日志是否開啟:
# 進入容器
docker exec -it mysql8 bash# 登錄 MySQL
mysql -u root -p# 查看慢查詢配置
SHOW VARIABLES LIKE 'slow_query_log'; # 應顯示 ON
SHOW VARIABLES LIKE 'long_query_time'; # 應顯示 1.000000
SHOW VARIABLES LIKE 'slow_query_log_file'; # 應顯示日志路徑
不用退出,執行 SQL 創建用于從庫同步的用戶(如repl
,密碼repl123
):
-- 刪除原用戶(若存在)
DROP USER 'repl'@'%';
-- 重新創建用戶,指定認證插件為 mysql_native_password
CREATE USER 'repl'@'%' IDENTIFIED WITH mysql_native_password BY 'repl123';
-- 授予復制權限
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
-- 刷新權限
FLUSH PRIVILEGES;-- 查看主庫binlog信息(記錄文件名和位置,后續從庫配置需要)
SHOW MASTER STATUS;
需記錄File
和Position:
5.配置從庫
進入從庫,執行 SQL 配置主庫連接信息(替換為實際的File
、Position
、主庫 IP / 容器名):
-- 停止同步(若已配置過)
STOP SLAVE;-- 配置主庫信息
CHANGE MASTER TOMASTER_HOST='mysql-master', # 主庫容器名(或主機IP,需在同一網絡)MASTER_USER='repl', # 主庫創建的同步用戶MASTER_PASSWORD='repl123', # 同步用戶密碼MASTER_LOG_FILE='mysql-bin.000003', # 主庫SHOW MASTER STATUS中的FileMASTER_LOG_POS=1750; # 主庫SHOW MASTER STATUS中的Position-- 啟動同步
START SLAVE;-- 查看從庫同步狀態(關鍵看Slave_IO_Running和Slave_SQL_Running是否為Yes)
SHOW SLAVE STATUS\G
若輸出中:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
則表示主從同步配置成功。
3.驗證主從同步
主庫插入數據:
主庫 MySQL 命令行執行:
USE test;
CREATE TABLE t1 (id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(20));
INSERT INTO t1 (name) VALUES ('test1'), ('test2');
從庫查詢數據:
從庫 MySQL 命令行執行:
USE test;
SELECT * FROM t1;
若能查詢到主庫插入的test1
和test2
,則同步成功。
五、相關面試問題
5.1 主從同步的原理是什么?
? ? ? ? 主從同步的核心就是二進制文件binlog,其中記錄了全部的DDL語句和DML語句,但不包括數據查詢(SELECT、SHOW)語句。
? ? ? ? 主從同步復制分為以下三步:
? ? ? ? 第一,master主庫在事物提交時,將數據變更語句寫入到binlog中。
? ? ? ? 第二,從庫讀取binlog中的記錄,并寫入到中繼日志replay log中。
? ? ? ? 第三,從庫執行replay log中的語句,實現與主庫數據的同步。