mysql主從分兩個角色
1、主伺服器 master
2、從伺服器 slave
mysql主從複製就是兩個伺服器之間資料庫的同步,也可以理解成對主伺服器的一個備份,當主伺服器的資料進行了變更,那麼從伺服器也會自動更新,其實是通過bin-log日誌實現的,也就說他們中間是傳輸binlog日誌的。這樣我們就可以對資料進行多個節點進行冗餘從而保證可用性!
公司現在有三台伺服器,一台阿里雲,兩台VPS,現在需要把阿里雲上的資料庫同步到其他兩台VPS上。阿里雲做主伺服器其他兩台伺服器做從伺服器
操作如下:
1、在阿里雲伺服器中修改my.cnf檔案(一般在/etc/my.cnf)
| 代碼如下 |
複製代碼 |
[mysqld] log-bin=mysql-bin //[必須]啟用二進位日誌 server-id=1 //[必須]伺服器唯一ID,預設是1,一般取IP最後一段 binlog-do-db=wordpress //[可選] 設定需要同步的資料,如果不設定將同步所有資料庫 binlog_ignore_db=mysql //[可選] 忽略mysql資料,因為mysql資料庫是mysql的一些帳戶存放,這個沒有必要同步 |
2、來到從服務修改my.cnf
| 代碼如下 |
複製代碼 |
[mysqld] log-bin=mysql-bin //[必須]啟用二進位日誌 server-id=2 //[必須]伺服器唯一ID,預設是1,一般取IP最後一段
|
3、重啟這兩台伺服器的mysql(第二台從伺服器和第一台一樣,這裡就唯寫第一個的配置了)
4、登入主伺服器為從伺服器授權
| 代碼如下 |
複製代碼 |
GRANT REPLICATION SLAVE ON *.* to 'sync'@'%' identified by 'sync'; //不建議使用root
|
“%”表示所有用戶端都可能連,只要帳號,密碼正確,此處可用從伺服器IP代替,如192.168.145.226,加強安全。
5、查看主伺服器的狀態
| 代碼如下 |
複製代碼 |
show master status; mysql> show master status; +------------------+----------+-----------------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+-----------------------+------------------+ | mysql-bin.000004 | 106 | wordpress,wordpress | mysql,mysql | +------------------+----------+--------------+---------------------------+
|
查看完狀態就不要進行任何操作了,防止狀態產生變化
6、登入從伺服器配置
| 代碼如下 |
複製代碼 |
mysql> CHANGE MASTER TO -> MASTER_HOST = '主伺服器地址', -> MASTER_USER ='剛才建立的帳號', -> MASTER_PASSWORD='建立的使用者密碼', -> MASTER_PORT=3306, -> MASTER_LOG_FILE='mysql-bin.000003', -> MASTER_LOG_POS=106;
|
7、開啟從伺服器的複製功能
8、查看從伺服器的狀態
| 代碼如下 |
複製代碼 |
mysql> show slave statusG *************************** 1. row *************************** Slave_IO_State: Master_Host: 117.34.73.175 Master_User: mysqlsync Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000002 Read_Master_Log_Pos: 106 Relay_Log_File: AY140429124852508639Z-relay-bin.000001 Relay_Log_Pos: 4 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: 106 Relay_Log_Space: 106 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: NULL Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: 1 row in set (0.00 sec) 這裡需要注意的 Slave_IO_Running = Yes Slave_SQL_Running = Yes |
這兩個值必須為Yes,如果某一個為No就說說明主從是有問題的
如果會shell或python的話可以寫一個檢測指令碼,檢測這兩個值是否都為Yes,如果有一個為No那就說明主從出現問題發郵件警示吧!
如果其中一個為yes的話你就需要檢查一下了,我在操作的過程遇到了Slave_IO_Running為No了,這個時候你看一下 Last_IO_Error這裡提示:error connecting to master ‘sync@218.244.**.**:3306′ – retry-time: 60 retries: 86400 (PS:**為打碼),這裡提示又無法串連到伺服器,一般來說可能是帳號密碼設定錯誤,或者伺服器的防火牆給攔截了,經過檢查阿里雲開Apsara Stack Security開放了3306,但是沒有還是不能,這個時候在從伺服器直接登入,發現是空間商的問題,本地是可以的但是從伺服器是沒有辦法登入。
9、這個時候你就可以在主伺服器進行建表插入資料等等操作,看看從伺服器是否已經同步了
可能在敲命令的時候敲錯了一些東西,可以使用下邊的sql語句進行修改
| 代碼如下 |
複製代碼 |
CHANGE MASTER TO MASTER_HOST='218.244.136.92'; //從伺服器執行,意思是:修改主伺服器的地址,底下意思相同 CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000003'MASTER_LOG_POS=106; |
在執行的時候需要先停止從伺服器的同步,
停止同步
| 代碼如下 |
複製代碼 |
SLAVE STOP 修改完成之後記得開啟 SLAVE START |