MySQL主從複製–單庫複製搭建

  • 2020 年 7 月 15 日
  • 筆記

背景說明

負責公司MySQL數倉的搭建和維護,因為前端業務涉及到一次業務表的分庫,導致整個平台新增加一台MySQL服務器,需要將該庫數據通過主從複製同步至原有的數倉實例。

數據流向說明如下圖:

主從01.png

業務環境說明

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且記錄語句完整,在此基礎上就可以進行表級別,庫級別,實例級別的複製同步