如何在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/
- 如果是windows下的mariadb:C:/Program Files/MariaDB XXX/data/
- 如果是windows下docker desktop的mariadb:/etc/mysql/
- 如果是windows下docker desktop的bitnami/mariadb:/opt/bitnami/mariadb/conf/
如果在docker中沒有vi等的文字編輯器,可以參考這篇「在docker內安裝vi/nano文字編輯器」。
[mariadb]
log-bin # enable binary logging
server_id=111 # 唯一識別Mariadb伺服器的數字
# binlog名稱前綴的配置參數(非必要)
#log-basename=master
#binlog-format=MIXED # default,其他有statement、row
# 需要被同步的資料庫名稱,沒設定時就會同步所有資料庫
# binlog-do-db用於指定主伺服器應記錄哪些資料表的更新
binlog-do-db=DB_A,DB_B,DB_C
# 不需要被同步的資料庫名稱
# binlog-do-db 參數將覆蓋 binlog-ignore-db 參數
binlog-ignore-db=mysql,information_schema
# 跳過master-slave複製中遇到的所有錯誤或指定類型的錯誤,避免slave端複製中斷。
#slave_skip_errors=1062
Master的必要參數
參數 | 說明 | 預設值 | 可能的值 |
---|---|---|---|
server-id | 主伺服器的唯一識別號。 | 無 | 1 到 2^32-1 之間的整數 |
log-bin | 是否啟用二進位日誌。 | OFF | ON 或 OFF |
Master的非必要參數
參數 | 說明 | 預設值 | 可能的值 |
---|---|---|---|
binlog-format | 二進位日誌格式。 | STATEMENT | ROW、STATEMENT 或 MIXED |
binlog-do-db | 應記錄在二進位日誌中的資料庫。 | 無 | 資料庫名稱的逗號分隔列表 |
binlog-ignore-db | 不應記錄在二進位日誌中的資料庫。 | 無 | 資料庫名稱的逗號分隔列表 |
expire_logs_days | 二進位日誌檔案的保留天數。 | 0 | 0 到 65535 之間的整數 |
max_binlog_size | 二進位日誌檔案的最大大小。 | 1GB | 1GB 到 2TB 之間的大小 |
log-basename | 二進位日誌檔案的名稱前綴。 | binlog |
確認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
[mariadb]
skip_name_resolve = ON
server-id = 2
# 要同步的資料庫
replicate-do-db = DB_A,DB_B
# 要同步的表格
replicate_wild_do_table=DB_A.%
replicate_wild_do_table=DB_B.%
# 忽略指定資料庫
#replicate_ignore_db=MasterC
#忽略指定資料表
#replicate_ignore_table=MasterB.table1
skip-slave-start = FALSE # Slave重啟時,會自動啟動slave的模式
# 中繼日誌檔名稱
relay-log = slave-log
read_only = 1
# 從伺服器是否應跳過錯誤(非必要)
slave-skip-errors = off
# 回報slave端的位置資訊(非必要)
report-host = 192.168.101.91
report-port = 3306
Slave參數
參數 | 說明 | 預設值 | 可能的值 |
---|---|---|---|
relay-log | 中繼日誌檔案的名稱。 | mariadb-relay-bin | 有效的文件名 |
relay-log-index | 中繼日誌索引檔案的名稱。 | mariadb-relay-bin.index | 有效的文件名 |
relay-log-pos | 從伺服器在中繼日誌中的位置。 | 0 | 0 到 232-1 之間的整數 |
slave-skip-errors | 從伺服器是否應跳過錯誤。 | 無 | off、all、error_code、ddl_exist_errors |
slave-net-timeout | 從伺服器等待主伺服器響應的超時時間。 | 60 | 1 到 65535 之間的整數 |
slave-exec-mode | 從伺服器如何執行更新。 | STRICT | STRICT、IDEMPOTENT、NO_FK_CHECKS |
report-host | 從伺服器應向其報告其狀態的主機名或 IP 位址。 | localhost | 有效的 IP 位址或主機名 |
report-port | 從伺服器應向其報告其狀態的埠號。 | 3306 | 1 到 65535 之間的整數 |
說明:
ddl_exist_errors:Slave伺服器將跳過以下錯誤號:
- 1007:資料庫已存在,創建資料庫失敗。
- 1008:資料庫不存在,刪除資料庫失敗。
- 1050:資料表已存在,創建資料表失敗。
- 1051:資料表不存在,刪除資料表失敗。
- 1054:欄位不存在,或程式檔案跟資料庫有衝突。
- 1060:欄位重複,導致無法插入。
- 1061:重複鍵名。
- 1068:定義了多個主鍵。
- 1094:位置執行緒 ID。
- 1146:資料表缺失,請恢復資料庫。
資料的匯入
確認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 -P 3306
> 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;
確認Slave是否啟動執行?
> show slave status \G
確認以下的兩個狀態是否為Yes
- Slave_IO_Running:Yes
- Slave_SQL_Running:Yes
其他操作與錯誤排除
- 透過命令提示字元執行「mysql」時,找不到這個指令
- 到「檢視進階系統設定」(直接按windows鍵後,尋找「檢視進階系統設定」字串即可),到「環境變數」中新增變數「Path」裡的值。在Path中新增MariaDB的bin路徑,例如「C:\Program Files\MariaDB 版本\bin」。
- 如果要停止Slave端的運作,可以使用以下指令
> STOP SLAVE;
- 如果Slave端在設定時發生「Could not initialize master info structure for ”; more error messages can be found in the MariaDB error log」的錯誤訊息,可以透過以下指令來排除。
> reset slave;