Mysql主從複製
★優點:
(1)如果主服務器出現問題,可以快速切換到從服務器提供服務
(2)可以在從服務器上執行查詢操作來降低主服務器的訪問壓力
(3)可以在從服務器上執行備份來避免備份期間影響主服務器的服務
一般只有更新不頻繁的數據或者實時性要求不高的數據可以通過從服務器查詢,實時性要求高的數據仍然需要從主數據庫獲得
★主服務器配置
登錄mysql數據庫
mysql>mysql -uroot -p123456
給從服務器設置授權用戶
mysql>grant all slave on *.* to [email protected] identified by "123"
或者
mysql>grant replication slave on *.* user@192,168,16,105 identified by "123"
修改主數據庫服務器的配置文件my.cnf,開啓binlog,並設置server-id的值
log-bin=mysql-bin
server-id=1 <==主從server-id不能相同
在主服務器上設置讀鎖定,確保沒有數據庫操作,以便獲得一個一致性的快照
mysql>flush tables with read lock
查看主服務器上當前二進制日誌名和偏移量值
mysql>show master status
目前主數據庫服務器已經停止了更新操作,生成主數據庫的備份
備份方式1:cp全部的數據
備份方式2:mysqldump備份數據庫
如果主數據庫的服務可以停止,那麼直接cp數據文件應該是最快生成快照的方式
主數據庫備份完畢後,主數據庫可以恢復讀寫操作,剩下的操作只需在從服務器上執行即可
mysql>unlock tables;
把主服務器的一致性備份恢復到從數據庫上,可以把以上文件的壓縮包解壓後放到相應的目錄中
★從服務器配置
修改從服務器的server-id,server-id的值必須是唯一的,不能和主服務器設置的相同,如果有多個從服務器,那麼每個從服務器必須有自己唯一的server-id值
server-id=2
master-host=192.168.16.100
master-user=user1
master-password=123456
master-port=3306
log-bin=mysql-bin
重啓mysqld服務
rpm包安裝:service mysqld restart
源碼安裝:/usr/local/mysql/bin/mysql_safe --user=mysql &
關掉服務pkill mysqld;kill -9端口號;kill -2進程關閉
查看相應的主從複製進程列表
(1)processlist
mysql>show processlist \G
如果出現
state:waiting for master to send event說明連接主數據庫成功,併成功獲取bin-log
state:has read all ready log;waiting for the slave i/o thread to update it
成功執行bin-log日誌,正在等待着去再次連接主數據庫並重新獲取bin-log日誌
(2)status
mysql>show slave status\G
如果出現
Slave_IO_Running:Yes說明此進程負責從主服務器上讀取binlog日誌,並寫入從服務器的中繼日誌
Slave_SQL_Running:Yes說明此進程負責讀取並且執行中繼日誌中的binlog日誌
以上兩個都是Yes則表示成功,只要有一個是no,則表示複製進程停止,錯誤原因可以在“last_error”字段的值中看到
從數據庫常用命令
start slave 啓動複製線程(自動執行)
stop slave 停止複製線程
show slave status 查看從數據庫狀態(查看主從是否連接成功)
show master logs 查看主數據庫bin-log日誌
change master to 動態改變到主服務器的配置
show processlist 查看從數據庫運行進程
★常見錯誤:
從服務器無法同步
Show slave status
顯示Slave_SQL_Running爲no
Seconds_Behind_Master爲null
原因可能爲:
(1)程序可能在slave上進行了讀寫操作
(2)可能由slave機器重啓後,事務回滾造成的
解決方法:
(1)Mysql>slave stop;
Mysql>set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
Mysql>slave start;
(2)Slave庫,Mysql>slave stop;
Master庫,Mysql>show master status;
查看狀態,然後到slave服務器上執行手動同步
mysql>change master to
master_host="192.168.16.100",
master_user="user1",
master_password="123456",
master_port=3306,
master_log_file="mysql-bin.000003",
master_log_pos=98;
啓動slave服務mysql>slave start
通過show slave status查看Slave_SQL_Running爲Yes,Seconds_Behind_Master爲0 即正常