mysql數據主從同步原理
主服務器
- 主服務器開啓bin_log日誌 log-bin = mysql-bin
- 配置唯一的server-id
- 創建一個master與slave通信的用戶賬號
從服務器
- 從服務器配置唯一的server-id
- 使用master分配的用戶賬號讀取master的二進制日誌
- 啓動slave服務器
具體操作
1.修改主服務器的my.cnf
[mysqld]
log-bin = mysql-bin #開啓二進制日誌
server-id=1 #設置server-id
2.重啓mysql設置授權賬號
mysql> CREATE USER ‘賬號’@‘IP IDENTIFIED BY '密碼' #創建用戶
mysql>GRANT REPLICATION SLAVE ON *.* TO '賬號@IP' #分配權限
mysql>flush privileges; #刷新權限
3.查看master狀態
mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000003 | 73 | test | manual,mysql |
+------------------+----------+--------------+------------------+
4.修改從服務器的my.cnf
[mysqld]
server-id = 2 #設置唯一的id
5.重啓slave的mysql
mysql>CHANGE MASTER TO
->MASTER_HOST='主服務器的ip',
->MASTER_USER='賬號',
->MASTER_PASSWORD='密碼',
->MASTER_LOG_FILE='mysql-bin.000003',
->MASTER_LOG_POS=73;
6.啓動slave
mysql>start slave;
7.查看slave狀態
mysql>show slave status;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 182.92.172.80
Master_User: rep1
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000013
Read_Master_Log_Pos: 11662
Relay_Log_File: mysqld-relay-bin.000022
Relay_Log_Pos: 11765
Relay_Master_Log_File: mysql-bin.000013
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
...
註釋:Slave_IO_Running 和Slave_SQL_Running 都爲YES的時候表示主從同步設置成功.
只同步指定的庫和表
1.開啓二進制日誌後默認是記錄所有的庫和所有的表的.
2.可以設置不同某些庫和表也可以設置只同步某些庫和表的
# 不同步哪些數據庫
binlog-ignore-db = mysql
binlog-ignore-db = test
binlog-ignore-db = information_schema
# 只同步哪些數據庫,除此之外,其他不同步
binlog-do-db = game
解決主從不同步問題
1.網絡延遲
由於mysql主從複製是基於binlog的一種異步複製,通過網絡傳送binlog文件,理所當然網絡延遲是主從不同步的絕大多數的原因,特別是跨機房的數據同步出現這種機率非常的大,所以做讀寫分離,注意從業務層進行前期設計。
2.主從兩臺機器的負載不一致
由於mysql主從複製是主數據庫上面啓動1個io線程,而從上面啓動1個sql線程和1個io線程,當中任何一臺機器的負載很高,忙不過來,導致其中的任何一個線程出現資源不足,都將出現主從不一致的情況。
3.max_allowed_packet (mysql 接受數據包的大小) 主從設置不一致
主數據庫上面設置的max_allowed_packet比從數據庫大,當一個大的sql語句,能在主數據庫上面執行完畢,從數據庫上面設置過小,無法執行,導致的主從不一致。
4.主從自增開始的鍵值和自增開始的步長不一致(auto_increment_increment 自增的步長 auto_increment_offset 自增的值)
5.mysql異常宕機情況下,如果未設置sync_binlog=1(每次執行寫入後都與磁盤同步,缺點速度慢)innodb_flush_log_at_trx_commit=1(每次事務提交的時候都會把log_buffer數據寫入到log file中,並刷到磁盤中去,配置是系統默認)有可能出現binlog或者relaylog文件出現損壞,導致主從不一致.
6.mysql本身bug引起的主從不一致.
7.主從版本不一致,特別是主是高版本從是低版本,主服務器支持的功能從服務器不支持.
8.binlog_format 沒有設置成row格式的