MySQL主從庫配置和主庫宕機解決方案
原理:MySQL從庫上有一個IO執行緒負責從主庫取binlog寫到本地,另外有一個SQL執行緒負責執行這些本地值日,實現命令重做
一、準備工作
系統:CentOS
軟體包:mysql-5.6.22.tar.gz
master伺服器:192.168.1.112
slave伺服器1:192.168.1.102
slave伺服器2:192.168.1.104
二、修改master伺服器配置
vi /etc/my.cnf
[mysqld]
log-bin=mysql-bin #必選項,啟用二進位制日誌,值為日誌檔名字首,該日誌檔案儲存位置為mysql資料庫目錄
server-id=112 #必選項,伺服器唯一ID,預設是1,一般取IP最後一段
binlog-do-db=mydb #可選項,需要同步的資料庫,如果沒有本行,即表示同步所有的資料庫
binlog-ignore-db=mysql #可選項,被忽略的資料庫
三、修改slave伺服器1配置
vi /etc/my.cnf
[mysqld]
log-bin=mysql-bin #可選項,啟用二進位制日誌,可是主庫宕機後升級從庫為主庫時仍然需要設定,所以現在一起啟用也可以
server-id=102 #必選項,伺服器唯一ID
replicate-do-db=mydb #可選項,需要同步的資料庫名,不寫本行表示同步所有的資料庫
四、重啟所有伺服器上的mysql服務
建議先手動同步一下主從伺服器中要備份的資料庫
service mysqld restart #如果mysql沒有配置為系統服務,命令為/etc/init.d/mysql restart
五、在master伺服器上建立用於同步的賬戶並授權slave
mysql -u root -p
Enter password:root
mysql>create user 'mymaster'@'%' identified by 'mymaster';
mysql>grant replication slave on *.* to 'mymaster'@'%' identified by 'mymaster';#一般不用root賬號,%表示所有從庫都可以連,也可以指定從庫IP增強安全性
六、登入master伺服器的mysql,檢視master狀態
mysql>show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 | 120 | | |
+------------------+----------+--------------+------------------+
七、配置兩臺slave伺服器
mysql>change master to master_host='192.168.1.112',master_user='mymaster',master_password='mymaster',master_log_file='mysql-bin.000001',master_log_pos=120;#連線master
mysql>start slave; #啟動slave的複製功能
八、登入slave的mysql,檢視從庫狀態
mysql>show slave status\G; #以下是部分結果
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event#從庫狀態,已連上主庫
Master_Host: 192.168.1.112#master地址
Master_User: mymaster#master使用者
Master_Port: 3306#master埠
Connect_Retry: 60#重試時間,預設是60秒
Master_Log_File: mysql-bin.000001#master的binlog檔名
Read_Master_Log_Pos: 1556#同步讀取二進位制日誌的位置,大於等於Exec_Master_Log_Pos
Slave_IO_Running: Yes#必須為Yes,此執行緒把master段的日誌寫到本地
Slave_SQL_Running: Yes#必須為Yes,此執行緒把寫到本地的日誌應用於資料庫
Replicate_Do_DB:#同步資料庫名(如果有)
Replicate_Ignore_DB: #忽略資料庫名(如果有)
Exec_Master_Log_Pos: 1556#執行同步命令的位置
Last_IO_Errno: 0#最近IO出錯位置
Last_IO_Error: #最近IO出錯資訊
Last_SQL_Errno: 0#最近SQL出錯位置
Last_SQL_Error: #最近SQL出錯資訊
Master_Server_Id: 112#master伺服器ID
Master_Info_File: /data/mysqldb/master.info#master.info檔案位置,位於該slave中
1 row in set (0.00 sec)
如果Slave_IO_Running和Slave_SQL_Running均為Yes,則slave配置完成
九、主從伺服器測試
在master中建立資料庫,建立表,進行增刪改操作都會被同步到所有slave中
十、主庫宕機解決方案
假設發生了突發事件,master宕機,現在的需求是要將192.168.1.102提升為主庫,另外一個為從庫
步驟:
1.確保所有的relay log全部更新完畢,在每個從庫上執行stop slave io_thread; show processlist;直到看到Has read all relay log,則表
示從庫更新都執行完畢了
2.登陸所有從庫,檢視master.info檔案,對比選擇pos最大的作為新的主庫,這裡我們選擇192.168.1.102為新的主庫
3.登陸192.168.1.102,執行stop slave; 並進入資料庫目錄,刪除master.info和relay-log.info檔案, 配置my.cnf檔案,開啟log-bin,如果有
log-slaves-updates和read-only則要註釋掉,執行reset master
4.建立用於同步的使用者並授權slave,同第五大步驟
5.登入另外一臺從庫,執行stop slave停止同步
6.根據第七大步驟連線到新的主庫
7.執行start slave;
8.修改新的master資料,測試slave是否同步更新
十一、其他
1.如果修改了主伺服器的配置,記得刪除從伺服器上的master.info檔案。否則從伺服器使用的還是老配置,可能會導致錯誤。
2.如果你想使用複製資料檔案的方式來備份資料庫,只要在從伺服器上的mysql命令列先鍵入stop slave;然後複製資料庫檔案,複製
好了,再在mysql命令列鍵入start slave;啟動從伺服器,這樣就即備份了資料有保證了資料完整性,而且整個過程中主伺服器的
mysql無需停止。並且如果在此期間master的資料有改動,在下次start slave時資料也會同步更新過來
3.Slave_IO_State的取值
空 //複製沒有啟動
Connecting to master//沒有連線上master
Waiting for master to send event//已經連上
4.雙機互備則是兩個mysql同時配置為master及slave
5.主伺服器上的相關命令:
show master status
show slave hosts
show {master|binary} logs
show binlog events
purge {master|binary} logs to 'log_name'
purge {master|binary} logs before 'date'
reset master(老版本flush master)
set sql_log_bin={0|1}
6.從伺服器上的相關命令
start slave
stop slave
stop slave io_thread
start slave is_thread
stop slave sql_thread
start slave sql_thread
reset slave
SET GLOBAL SQL_SLAVE_SKIP_COUNTER
load data from master
show slave status(SUPER,REPLICATION CLIENT)
CHANGE MASTER TO MASTER_HOST=, MASTER_PORT=,MASTER_USER=, MASTER_PASSWORD= #動態改變master資訊
PURGE MASTER [before 'date'] #刪除master端已同步過的日誌