1、轉載:https://blog.csdn.net/zfl589778/article/details/51441719/
2、效果:親測有效,數據寫入成功。
3、主機宕機后,如果不是長時間宕機,且可手動重啟,直接重啟即可,【從】數據庫數據會進行寫入,無需重新配置my.cnf。【這里的主機宕機方案指的是:主機很長時間無法啟動】
4、原理:MySQL從庫上有一個IO線程負責從主庫取binlog寫到本地,另外有一個SQL線程負責執行這些本地值日,實現命令重做
4.1)如果發生宕機,則主和從都需要重復配置mysql-bin-0000X,change master ,。。。語句,然后start slave; show slave status ;
5、步驟:
一、准備工作 系統: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端已同步過的日志