MySQL主從複製–單庫複製搭建
- 2020 年 7 月 15 日
- 筆記
背景說明
負責公司MySQL數倉的搭建和維護,因為前端業務涉及到一次業務表的分庫,導致整個平台新增加一台MySQL服務器,需要將該庫數據通過主從複製同步至原有的數倉實例。
數據流向說明如下圖:
業務環境說明
MySQL: percona 8.0.16-7 且都開啟記錄binlog
操作系統:Centos 7
步驟
1: 從源庫獲取數據庫備份
-
備份源庫的方式一般就兩種,物理備份和邏輯備份,物理備份使用xtrabackup,邏輯備份直接使用mysqldump
(因為是在現有的數倉C上新加一個庫級別複製B,且B庫剛剛新建數據量較少,最好選擇邏輯備份的方式) -
mysqldump使用語句:
mysqldump -uroot -p --master-data=2 --single-transaction -S /data/mysql/3306/mysql_3306.sock -E -R --comments --triggers --databases data1 > /data/data1.sql
ps: 參數–master-data=2 和–single-transaction 一定要加上,一個是獲取該服務器的binlog 位點信息,一個是防止對庫加鎖
-
獲取備份文件中的binlog位點信息 很重要,主從複製必須知道源實例的binlog起始位點
-
使用shell指令查看備份文件中的位點信息
grep -i "change master" /data/data1.sql -- 查找對應主從位點
2: 還原備份至目標實例
這步簡單,將1中的備份sql文件移動到目標服務器中,直接source就好
3: 設置主從複製參數,啟動主從複製
- 新建複製通道指向關係
CHANGE MASTER TO MASTER_HOST='XXXX', MASTER_USER='repl', MASTER_PORT=3306, MASTER_PASSWORD='repl',MASTER_LOG_FILE='mysql-bin.005461', MASTER_LOG_POS=918111162 FOR CHANNEL 'XXXXXX';
複製賬戶提前建好,通道名自己設置好,一般和庫名一致,位點信息就是2中的返回結果,複製過來就好
- 設置通道的庫級別過濾 實例級別主從同步可忽略此步
CHANGE REPLICATION FILTER REPLICATE_DO_DB = (B) FOR channel 'XXXXXX';
通道名上面的保持一致,庫名設定好
- 啟動複製通道觀察
start slave for channel 'XXXXXX';
-- STOP SLAVE FOR CHANNEL 'XXXXXX'; -- 單獨停止該複製通道
4: 檢查
-
show slave info — 查看重點欄位的值,sql進程,io進程是不是yes,有沒有延遲
-
查看數倉中新建的B庫表數據有沒有變化
總結
主從複製是MySQL中保證高可用的基礎,重點是要獲取源數據庫的binlog起始位點,因為binlog是服務器層log且記錄語句完整,在此基礎上就可以進行表級別,庫級別,實例級別的複製同步