如何在Synology Docker上設定MariaDB的Master-Slave模式
本篇參考文章:
- Question – MariaDB 10 Error: 2006 MySQL server has gone away | SynoForum.com – The Unofficial Synology Forum
- MariaDB Replication 設定 – 記下來 (noter.tw)
- MariaDB安裝與設定Master Slave – HackMD
- Setup MariaDB Master/Slave Replication for Docker MariaDB – 前端、后台、机器学习 in 私有云 – SegmentFault 思否
Docker上的MariaDB安裝
- 到「倉庫伺服器」下載需要的MariaDB映像檔
- 在「映像檔」中點選剛才下載的映像檔,然後點選「部署」
- 接著依序依照自己的需求設定裡面的值即可
需要注意的是,在進行佈署(建立)時,記得新增以下參數
- MYSQL_ROOT_PASSWORD=root密碼
- MYSQL_ROOT_HOST=%(如果你有需要)
資料的複製
Master
mysqldump指令的參數,可以參考 Mysqldump參數大全
將指定資料庫的資料,dump至.sql檔
> mysqldump -u root -p --databases dbA dbB dbC --lock-all-tables --events > mysql_dump.sql
登入 mariadb 把 lock 狀態解除
> mysql -u root -p
MariaDB [(none)]> unlock tables;
MariaDB [(none)]> exit;
Slave
將剛才產生的.sql匯入Slave的資料庫中
> mysql -u root -p < /路徑/mysql_dump.sql
Master端的設定
設定my.cnf
修改my.cnf
- 如果是套件中的mariadb 10:usr/local/mariadb10/etc/mysql/
- 如果是docker中的mariadb:要透過docker進入該終端機,etc/mysql/
如果在docker中沒有vi等的文字編輯器,可以參考這篇「在docker內安裝vi/nano文字編輯器」。
[mariadb]
log-bin # enable binary logging
server_id=111
log-basename=master # 識別名稱
#binlog-format=MIXED # default,其他有statement、row
binlog-do-db=DB_A # 需要被同步的資料庫名稱,沒設定時就會同步所有資料庫
binlog-do-db=DB_B
binlog-do-db=DB_C
# 忽略的資料庫binlog
binlog-ignore-db=mysql,information_schema
# 跳過master-slave複製中遇到的所有錯誤或指定類型的錯誤,避免slave端複製中斷。
#slave_skip_errors=1062
確認master的狀態
- 重新啟動mariadb
- 透過終端機登入mariadb,並確認master的狀態
# 登入mariadb
> mysql -u root -p
> 輸入root的密碼
# 輸入指令確認master狀態
MariaDB [(none)]> show master status;

建立複製用的帳號
MariaDB [(none)]> GRANT REPLICATION SLAVE ON *.* TO 'repluser'@'%' IDENTIFIED BY '12345678';
MariaDB [(none)]> FLUSH PRIVILEGES;
Slave端的設定
設定my.cnf
skip_name_resolve = ON
server-id = 2
relay-log = slave-log
read_only = 1
report-port = 3306
report-host = 192.168.101.91 # slave端的位置
replicate-do-db = DB_A # 要同步的資料庫
replicate-do-db = DB_B # 要同步的資料庫
replicate_wild_do_table=MasterA.%
replicate_wild_do_table=MasterB.%
#replicate_ignore_db=MasterA # 忽略指定資料庫
#replicate_ignore_table=MasterA.table1 #忽略指定資料表
skip-slave-start = FALSE # Slave重啟時,會自動啟動slave的模式
資料的匯入
確認master、slave兩端的資料一致,將master的資料匯出為xxx.sql,然後在slave端匯入。
#登入mariadb
> mysql -u root -p
> create database DB_NAME;
> use DB_NAME;
> source /path/xxx/abc.sql
建立Slave連線
#登入mariadb
> mysql -u root -p
> CHANGE MASTER TO
-> MASTER_HOST='aaa.com.tw', # master端的位置
-> MASTER_USER='repluser',
-> MASTER_PORT=3306,
-> MASTER_PASSWORD='12345678',
-> MASTER_LOG_FILE='master-bin.000025', # 由之前master的show master status得知
-> MASTER_LOG_POS=761; # 由之前master的show master status得知
啟動Slave連線
> START SLAVE;