日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

MySQL復制(一) --- 二進制日志干什么的

系統 3187 0

與小站點相比,大型站點的數據庫管理員,需要提前做好以下的事情:

  • 提供災難發生時核心業務數據的恢復計劃。理論上這個過程至少需要執行一次。
  • 通過采集大量用戶數據并監控網站各節點的負載,提供優化計劃
  • 當用戶數量急劇增長時的快速橫向擴展計劃
對于所有這些事情,提前計劃并準備好必要時的快速應對是很重要的。

?

為了保證站點可響應和可用性,需要做兩件事:系統的數據備份和冗余。備份可以將節點恢復到它崩潰之前的狀態,備份根據需求有幾種比如及時恢復(PITR:point-in-time-recovery),在線備份等等;而冗余則保證即使在一個或更多節點停止服務的情況下,站點仍能繼續運行,備份一般通過硬件副本來實現,讓幾個實例并行運行,并通過復制在幾個機器上保存相同數據的多個可用副本。復制的主要應用場景:1)針對高讀寫比的,scale out;2)添加冗余保證高可用性,比如雙主配置(dual-master setup)。

?

二進制日志(binlog)

復制過程需要二進制日志。二進制日志的目的是記錄數據庫中表的更改,然后用于復制和PITR,另外少數審計情況下也會用到。

傳統意義上說,MySQL復制記錄了產生變化的SQL語句,稱為基于語句的復制(statement-based replication)。基于語句的復制的缺點是無法保證所有語句都正確復制。所以在5.1版本中,MySQL還提供了基于行的復制(row-based replication)。

查看二進制日志:

      
        #
      
      
         強制把緩存的東西刷到LOGS中,并產生一個Rotate事件寫入binlog中,后面的寫入會寫到新的binlog中
      
      
        
FLUSH LOGS;

# 正常使用很久的DB不建議使用這個命令,需要加參數,指定具體的binlog文件名 【IN 'xxxx'】
SHOW BINLOG EVENTS\G

二進制日志中事件所包含的字段:

      Event_type: 比如Format_desc, Query, Rotate
      
Server_id : 創建事件的服務器id
Log_name : 存儲事件的文件名,一個事件只能存儲在一個文件中
Pos : 事件在文件中的開始位置,及事件的第一個字節
End_log_pos:事件在文件中的結束位置,也就是下一個事件的開始位置
Info : 具體事件的信息,Query的時候就是SQL語句

二進制日志的結構和內容:

二進制日志不是一個的單獨的文件,它包括一組存儲實際內容的二進制日志文件和一個二進制日志索引文件。每個二進制日志文件都以format description event開始,以rotate event結束。rotate event包含下一個二進制日志文件的名稱,以告知二進制日志繼續寫入哪個文件。因此FLUSH LOGS的時候會新建一個新binlog文件。?

獲取當前正在寫入的是哪一個二進制日志文件:

      SHOW MASTER STATUS\G
    

RESET MASTER 命令刪除了所有的二進制日志文件并清空了二進制日志索引文件。 RESET SLAVE 命令刪除了Slave復制所用的所有文件,重新開始。

CHANGE MASTER TO 命令用于改變slave連接master的一些參數,其中就包括slave讀取master二進制日志文件的參數。比如使用MASTER_LOG_FILE和MASTER_LOG_POS來指定master開始發送事件的binlog位置。

如何建立新Slave

      
        1
      
      :配置新的Slave
      
2 :備份Master(或者備份已經復制了Master的Slave)
3 :接下該備份相應的binlog位置
4 :在新Slave上恢復備份
5 :配置Slave從這個binlog位置開始復制

區別就在于第二步,一種是直接從Master進行備份,一種是通過現有Slave備份,下面分別介紹兩種。

1:克隆Master:

      
        #
      
      
         刷新所有的表并鎖定數據庫,防止在檢查binlog位置之前數據庫發生改變
      
      
        
FLUSH TABLES WITH READ LOCK

# 獲取當前的binlog文件和pos
SHOW MASTER STATUS\G

# 備份master
mysqldump --all-databases --host=master- 1 >backup.sql

# 解鎖
UNLOCK TABLES;

# 在slave上恢復備份
mysql --host=slave- 1 <backup.sql

# 配置slave
CHANGE MASTER TO
MASTER_HOST = ' master-1 ' ,
MASTER_PORT = 3306 ,
MASTER_USER = ' slave-1 ' ,
MASTER_PASSWORD = ' xxxx ' ,
MASTER_LOG_FILE = ' master-bin.000042 ' ,
MASTER_LOG_POS = 546552 ;

# 啟動slave
START SLAVE;

其實mysqldump命令提供了 master_data 選項,自動把MASTER_LOG_FILE和MASTER_LOG_POS信息dump到backup.sql中

另外:FLUSH TABLES WITH READ LOCK對于InnoDB是不安全的,因為雖然會鎖表,不會產生新事務,但是后臺仍然有一些活動在繼續進行。

所以安全的創建InnoDB數據表的備份可以使用下面的方法。

      
        1
      
      :關閉服務器,然后復制文件。如果數據庫很大 ,最好采取這種方法,因為這時使用mysqldump進行數據恢復會很慢
      

2 :執行FLUSH TABLES WITH READ LOCK之后,使用mysqldump

3 :執行FLUSH TABLES WITH READ LOCK之后,使用快照的方法,比如LVM(Linux),ZFS(Solaris)快照

?

2:克隆Slave:

      
        #
      
      
         防止出現不一致的備份映像,備份Slave之前需要先停止replication
      
      
        
STOP SLAVE;

# 確定從哪里開始復制,注意Relay_Master_Log_File和Exec_Master_Log_Pos
SHOW SLAVE STATUS\G

# 配置新的slave,指向master
CHANGE MASTER TO
MASTER_HOST = ' master-1 ' ,
MASTER_PORT = 3306 ,
MASTER_USER = ' slave-1 ' ,
MASTER_PASSWORD = ' xxxx ' ,
MASTER_LOG_FILE = ' master-bin.000042 ' ,
MASTER_LOG_POS = 546632 ;

# 啟動新的slave
START SLAVE

?

---待續

MySQL復制(一) --- 二進制日志干什么的


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 贵阳市| 闵行区| 西峡县| 翁牛特旗| 买车| 清远市| 磐石市| 商丘市| 如皋市| 永登县| 洛浦县| 东乌| 岑巩县| 沾益县| 嘉禾县| 习水县| 滦南县| 博白县| 闵行区| 洛宁县| 藁城市| 金川县| 鄂尔多斯市| 焉耆| 怀集县| 若羌县| 菏泽市| 日土县| 莲花县| 尉氏县| 罗山县| 海林市| 清丰县| 北宁市| 扬中市| 张北县| 油尖旺区| 福海县| 紫金县| 五峰| 武隆县|