mysql資料庫實現主從複製
預備工作
使用docker-desktop建立兩臺mysql容器命名為mysql-master,mysql-slave。記得填寫環境變數 MYSQL_ROOT_PASSWORD root,否則容器無法啟動。
-
檢視兩臺機器的ip 使用inspect:
master "IPAddress": "172.17.0.2", slave "IPAddress": "172.17.0.3",
-
使用navicat連線主、從庫,並建立資料庫test.
主機配置
-
更改主機使用者密碼策略
這一步非常重要,如果是mysql 8.0 版本需要更改建立使用者的預設密碼策略,否則會連線不上,即使中途更改策略也會出現需要莫名其妙的問題,實際上就是因為這個問題這兩個容器已經建立刪除不下3次。 -
在 /etc/my.cnf 將註釋放開
default_authentication_plugin=mysql_native_password
-
重啟mysql
-
建立從庫連線時候的使用者名稱和密碼並賦予複製許可權:
# mysql -u root -p 進入mysql客戶端 CREATE USER 'slave'@'172.17.0.3' IDENTIFIED BY 'slave'; GRANT REPLICATION SLAVE ON *.* TO 'slave'@'172.17.0.3'; FLUSH PRIVILEGES;
-
檢視使用者名稱密碼
mysql> SELECT User, Host FROM mysql.user; +------------------+------------+ | User | Host | +------------------+------------+ | root | % | | slave | 172.17.0.3 | | mysql.infoschema | localhost | | mysql.session | localhost | | mysql.sys | localhost | | root | localhost | +------------------+------------+
主庫配置
- 在配置檔案 /etc/my.cnf 新增如下幾行
log-bin=mysql-bin server-id=104 binlog-do-db=test
- 重啟mysql
- 檢視狀態,這裡的資料很重要建議先複製儲存
mysql> show master status \G *************************** 1. row *************************** File: mysql-bin.000001 Position: 158 Binlog_Do_DB: test Binlog_Ignore_DB: Executed_Gtid_Set: 1 row in set, 1 warning (0.00 sec)
從庫配置
- 在配置檔案 /etc/my.cnf 新增
server-id=106
- 重啟mysql
- 登陸終端複製並執行
CHANGE MASTER TO MASTER_HOST='172.17.0.2', MASTER_USER='slave', MASTER_PASSWORD='slave', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=4, master_port=3306; # MASTER_HOST 是主機的地址,因為容器連線到預設網橋,可以直接通訊 # MASTER_USER 是在主機中建立的使用者名稱 # MASTER_PASSWORD 密碼 # MASTER_LOG_FILE 是上述的 File: mysql-bin.000001 的內容 # MASTER_LOG_POS 偏移量4 表示預設從頭開始讀取 # master_port 資料庫埠,預設可以通訊
- 生效
start slave;
- 檢視
show slave status\G; *************************** 1. row *************************** Slave_IO_State: Connecting to source Master_Host: 172.17.0.2 Master_User: slave Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000007 Read_Master_Log_Pos: 4 Relay_Log_File: 04a0f7d261a6-relay-bin.000001 Relay_Log_Pos: 4 Relay_Master_Log_File: mysql-bin.000007 Slave_IO_Running: Connecting Slave_SQL_Running: Yes
如果報錯:
Replica I/O for channel '': Error connecting to source 'slave@172.17.0.2:3306'. This was attempt 5/10, with a delay of 60 seconds between attempts. Message: Authentication plugin 'caching_sha2_password' reported error: Authentication requires secure connection. Error_code: MY-002061
大機率是沒有放開 default_authentication_plugin=mysql_native_password 解決方法只能將容器刪了重新建,網上和GPT給出的方法都是沒有用的。