mysql數據庫主從同步原理及問題解決

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格式的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章