1.為什么要主從同步?
在Web應用系統中,數據庫性能是導致系統性能瓶頸最主要的原因之一。尤其是在大規模系統中,數據庫集群已經成為必備的配置之一。集群的好處主要有:查詢負載、數據庫復制備份等。其中Master負責寫操作的負載,也就是說一切寫的操作都在Master上進行,而讀的操作則分攤到Slave上進行。這樣一來的可以大大提高讀取的效率。寫操作涉及到鎖的問題,不管是行鎖還是表鎖還是塊鎖,都是比較降低系統執行效率的事情。我們這樣的分離是把寫操作集中在一個節點上,而讀操作其其他的N個節點上進行,從另一個方面有效的提高了讀的效率,保證了系統的高可用性。
2.mysql主從同步
我的要同步的兩臺mysql數據庫版本都是mysql5.7,兩臺電腦都在同一個網段之中。
①修改主數據庫my.ini/my.cnf配置:
Server-id = 1? //這是數據庫ID,此ID是唯一的,ID值不能重復,否則會同步出錯;
log-bin = mysql-bin //開啟binglog日志,二進制日志文件,此項為必填項,否則不能同步數據
binlog_format=mixed //二進制日志的格式,有三種:statement/row/mixed
binlog-do-db = testcreate? //需要同步的數據庫,如果還需要同步另外的數據庫,那么繼續逐條添加,如果 不寫,那么默認同步所有的數據庫;
binlog-ignore-db = mysql //不需要同步的數據庫;
修改完成之后重啟mysql服務。
MySQL 服務重啟
service mysqld restart
② 添加主數據庫用于同步的賬號:
給主數據庫授權一個可以進行復制的用戶,執行如下命令:
grant replication slave on *.* to?'slave'@'%'?identified by '123456';
③顯示主數據庫的同步信息:
可以看出已經產生了二進制的日志文件信息,mysql的同步就是通過這個二進制日志文件進行同步,主數據庫把對數據庫的操作的指令都記錄到該日志文件下,從數據庫通過讀取該文件,來對從數據庫中的數據進行修改,從而達到主從同步的效果。
④配置從數據庫的my.ini
從數據庫的話只需要配置server-id,binlog-do-db,binlog-ignore-db即可。
⑤設置從數據庫鏈接到主數據庫
在mysql下執行stop slave;命令,停止slave服務;
mysql> change master to
-> master_host='192.168.1.189',
-> master_user='slave',
-> master_password='123456',
-> master_log_file='mysql-bin000014.000001',
-> master_port=3306,
-> master_log_pos=107;
注意:這里的master_log_file,master_log_pos的值要和master的值一致。否則會無法同步。
執行start slave;命令,啟動服務。
注意:在這里可能會無法鏈接到主數據庫,需要看主數據庫中my.ini中bind 127.0.0.1是否沒有被注釋,如果沒有,那么只能在本機登錄,而不能使用遠程登錄方式。
⑥驗證是否同步:
show slave status\G;
得到如下結果則說明同步成功。
Slave_IO_Running :從主服務器成功的bin-log日志同步并拿到數據
Slave_SQL_Running: 從服務器成功地執行SQL語句
上面兩項均為yes,說明配置成功。
從服務器相關命令
start slave; //啟動從服務器
stop slave; //停止從服務器
show slave status; //查看從服務器狀態
show master logs; //查看主服務器 bin-log 日志
change master to …… //動態改變到主服務配置
show processlist; //查看從服務器運行進程
主從數據不一致
第一種方法
stop slave;set global sql_slave_skip_counter=1; //跳過一步錯誤
start slave;
第二種方法:
stop slave;
show master status;//查看主服務器bin-log日志
change master to…… //手動同步 ,指定日志文件和文件位置 master-log-file="mysql-bin.00001" master-log-pos=20
重啟從服務器,查看?show slave status\G,Slave_IO_Running、Slave_SQL_Running 都為 YES,同步成功。
注意:第一次同步時需要主從庫數據一樣