實現目標 搭建兩台MySQL伺服器(一主一從),一臺作為主伺服器,一臺作為從伺服器,主伺服器進行寫操作,從伺服器進行讀操作。 工作流程概述 主伺服器: 開啟二進位日誌 配置唯一的server id 獲得master二進位日誌文件名及位置 創建一個用於slave和master通信的用戶賬號 從伺服器: ...
實現目標
搭建兩台MySQL伺服器(一主一從),一臺作為主伺服器,一臺作為從伺服器,主伺服器進行寫操作,從伺服器進行讀操作。
工作流程概述
- 主伺服器:
- 開啟二進位日誌
- 配置唯一的server-id
- 獲得master二進位日誌文件名及位置
- 創建一個用於slave和master通信的用戶賬號
- 從伺服器:
- 配置唯一的server-id
- 使用master分配的用戶賬號讀取master二進位日誌
- 啟用slave服務
準備工作
- 主從資料庫版本最好一樣
- 主從資料庫內數據保持一致
- 主資料庫:192.168.244.201 : 3306
- 從資料庫:192.168.244.202 : 3306
開始配置
- 配置 Master 主伺服器
- 找到主資料庫的配置文件my.cnf(Windows中是my.ini),我的在/etc/my.cnf
在[mysqld]部分插入如下兩行:
[mysqld]
log-bin=mysql-bin #開啟二進位日誌
server-id=201 #設置server-id,唯一值,標識主機
- 重啟mysql服務
systemctl restart mysqld
- 創建用於主從同步的賬號/密碼
進入MySQL :mysql -u root -p
回車輸入密碼。
我創建的用戶名叫“master_root”密碼是“MySql@6688”
【註意:由於之前把密碼改成支持簡單密碼123456的了,導致這裡新建用戶出現一些問題,說密碼不符合策略等,後來乾脆我重裝mysql,使用預設複雜密碼了,就沒有這麼多問題了。習慣就好其實。】
下麵我都用的%,沒有寫具體ip,你可以自行決定。
#創建用戶(IP為可訪問該master的IP,任意IP就寫'%')
mysql> CREATE USER 'master_root'@'192.168.244.202' IDENTIFIED BY 'MySql@6688';
#分配許可權(IP為可訪問該 master的IP,任意IP就寫'%')
mysql> GRANT REPLICATION SLAVE ON *.* TO 'master_root'@'192.168.244.202';
#刷新許可權
mysql>flush privileges;
- 查看master狀態,記錄二進位文件名(mysql-bin.000001)和位置(154).後面配從庫要用。
show master status;
- 配置 Slave 主伺服器
- 修改my.cnf 文件。
vim /etc/my.cnf
[mysqld]
server-id=202 #設置server-id,唯一值,唯一標識從庫
- 重啟mysql服務
systemctl restart mysqld
- 登錄進入mysql,執行同步sql語句(主伺服器名,用於主從的用戶名,密碼,二進位文件名,位置)
mysql> CHANGE MASTER TO
-> MASTER_HOST='192.168.244.201',
-> MASTER_USER='master_root',
-> MASTER_PASSWORD='MySql@6688',
-> MASTER_LOG_FILE='mysql-bin.000001',
-> MASTER_LOG_POS=154;
- 啟動slave同步進程
mysql>start slave;
- 查看slave狀態
show slave status\G
註意後面不要分號;否則最後一行顯示報錯如下:
ERROR: No query specified
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.244.201
Master_User: master_root
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000002
Read_Master_Log_Pos: 154
Relay_Log_File: localhost-relay-bin.000007
Relay_Log_Pos: 320
Relay_Master_Log_File: mysql-bin.000002
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 154
Relay_Log_Space: 531
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 201
Master_UUID: 7dd766bb-f005-11e9-81ba-000c29a69f1b
Master_Info_File: /var/lib/mysql/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
1 row in set (0.01 sec)
我也不知道為啥我這裡這麼長一段,網上的教程都是好短一段。管他呢,反正到這也對了。
當Slave_IO_Running和Slave_SQL_Running都為YES的時候就表示主從同步設置成功了。
特別註意:
- 可能遇坑:Slave_IO_Running :no ,並不是yes,為什麼呢??
打開mysql的錯誤日誌,不出意外在最後幾行(看時間最新的記錄),最後有這麼一行:
2019-10-16T12:59:09.987976Z 1 [ERROR] Slave I/O for channel '': Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work. Error_code: 1593
意思master和slave的UUID相同了,應該不同才對的【如果你也是克隆的主機生成從機,就會出現這個問題】
解決辦法:去mysql的data目錄中,找到auto.cnf文件(不知道data目錄的去my.cnf文件中看‘datadir=/var/lib/mysql’),然後刪除該文件,接著重啟mysql服務,就會自動重新生成一個新的auto.cnf文件(註意,此時操作的都是slaver,不是master。)
接下來就可以進行一些驗證了,比如在主master資料庫的test資料庫的一張表中插入一條數據,在slave的test庫的相同數據表中查看是否有新增的數據即可驗證主從複製功能是否有效,還可以關閉slave(mysql>stop slave;),然後再修改master,看slave是否也相應修改(停止slave後,master的修改不會同步到slave),就可以完成主從複製功能的驗證了。
還可以用到的其他相關參數:
master開啟二進位日誌後預設記錄所有庫所有表的操作,可以通過配置來指定只記錄指定的資料庫甚至指定的表的操作,具體在mysql配置文件的[mysqld]可添加修改如下選項:
不同步哪些資料庫
binlog-ignore-db = mysql
binlog-ignore-db = test
binlog-ignore-db = information_schema
只同步哪些資料庫,除此之外,其他不同步
binlog-do-db = game
如之前查看master狀態時就可以看到只記錄了test庫,忽略了manual和mysql庫。