1. 程式人生 > >MySQL主從庫配置和主庫宕機解決方案

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同時配置為masterslave

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端已同步過的日誌