基於docker的mysql主從同步搭建
阿新 • • 發佈:2022-12-02
環境
1、macbook
2、docker 20.10.17
3、docker desktop
開始搭建
* 第一步:準備容器檔案存放的物理檔案地址目錄(/Users/qeek/mydata 可以按需定義)
##### 主庫 mkdir -pv /Users/qeek/mydata/mysql-master/log mkdir -pv /Users/qeek/mydata/mysql-master/data mkdir -pv /Users/qeek/mydata/mysql-master/conf.d mkdir -pv /Users/qeek/mydata/mysql-master/conf ##### 從庫 mkdir -pv /Users/qeek/mydata/mysql-slave/log mkdir -pv /Users/qeek/mydata/mysql-slave/data mkdir -pv /Users/qeek/mydata/mysql-slave/conf.d mkdir -pv /Users/qeek/mydata/mysql-slave/conf
* 第二步:docker desktop(docker桌面管理工具)-> Preferences -> Resources -> File sharding
把上面新建立的目錄新增進去後重啟docker(繫結宿主機目錄到docker容器中),否則會報目錄許可權問題。
* 第三步:設定主從服務配置
##### 主庫 新增 /Users/qeek/mydata/mysql-master/conf/my.cnf [mysqld] ## 設定server_id,同一區域網中需要唯一 server_id=101 ## 指定不需要同步的資料庫名稱 binlog-ignore-db=mysql ## 開啟二進位制日誌功能 log-bin=mall-mysql-bin ## 設定二進位制日誌使用記憶體大小(事務) binlog_cache_size=1M ## 設定使用的二進位制日誌格式(mixed,statement,row) binlog_format=mixed ## 二進位制日誌過期清理時間。預設值為0,表示不自動清理。 expire_logs_days=7 ## 跳過主從複製中遇到的所有錯誤或指定型別的錯誤,避免slave端複製中斷。 ## 如:1062錯誤是指一些主鍵重複,1032錯誤是因為主從資料庫資料不一致 slave_skip_errors=1062 ##### 從庫 新增 /Users/qeek/mydata/mysql-slave/conf/my.cnf [mysqld] ## 設定server_id,同一區域網中需要唯一 server_id=102 ## 指定不需要同步的資料庫名稱 binlog-ignore-db=mysql ## 開啟二進位制日誌功能,以備Slave作為其它資料庫例項的Master時使用 log-bin=mall-mysql-slave1-bin ## 設定二進位制日誌使用記憶體大小(事務) binlog_cache_size=1M ## 設定使用的二進位制日誌格式(mixed,statement,row) binlog_format=mixed ## 二進位制日誌過期清理時間。預設值為0,表示不自動清理。 expire_logs_days=7 ## 跳過主從複製中遇到的所有錯誤或指定型別的錯誤,避免slave端複製中斷。 ## 如:1062錯誤是指一些主鍵重複,1032錯誤是因為主從資料庫資料不一致 slave_skip_errors=1062 ## relay_log配置中繼日誌 relay_log=mall-mysql-relay-bin ## log_slave_updates表示slave將複製事件寫進自己的二進位制日誌 log_slave_updates=1 ## slave設定為只讀(具有super許可權的使用者除外) read_only=1
* 第四步:啟動docker mysql服務
##### 主庫 * docker run --name mysql-master -p 3307:3306 -v /Users/qeek/mydata/mysql-master/log:/var/log/mysql -v /Users/qeek/mydata/mysql-master/data:/var/lib/mysql -v /Users/qeek/mydata/mysql-master/conf.d:/etc/mysql/conf.d/ -v /Users/qeek/mydata/mysql-master/conf:/etc/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0.31 ##### 從庫 * docker run --name mysql-slave -p 3308:3306 -v /Users/qeek/mydata/mysql-slave/log:/var/log/mysql -v /Users/qeek/mydata/mysql-slave/data:/var/lib/mysql -v /Users/qeek/mydata/mysql-slave/conf.d:/etc/mysql/conf.d/ -v /Users/qeek/mydata/mysql-slave/conf:/etc/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0.31 ##### 檢視docker映象清單
docker container ls -a
##### 進入docker 主庫映象內
docker exec -it mysql-master bash
##### 進入docker 主庫mysql內
mysql -u root -p
##### 主庫內設定從庫讀取資料賬號
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
##### 主庫內授權賬號複製許可權
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON . TO 'slave'@'%';
##### 主庫內設定密碼加密方法(mysql8.0.4之前使用的“ mysql_native_password”認證,之後用的“ caching_sha2_password”,修改成老的加密認證方式)
ALTER USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
##### 檢視mysql master主庫狀態,記住“File”和“Position”值
##### "exit;"退出主庫mysql,再"exit;"退出mysql主庫映象
##### 檢視mysql主庫docker映象內ip地址
docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mysql-master
##### 進入mysql從庫映象內
docker exec -it mysql-slave bash
##### 進入從庫mysql內
mysql -uroot -p
設定從庫的主庫地址及日誌檔案、當前資料位置“master_log_file = 上面 File ”、“master_log_pos = 上面 Position”
change master to master_host='172.17.0.2', master_user='slave', master_password='123456', master_port=3306, master_log_file='mall-mysql-bin.000005', master_log_pos=157, master_connect_retry=30;
##### 啟動從庫同步