與小站點相比,大型站點的數據庫管理員,需要提前做好以下的事情:
提供災難發生時核心業務數據的恢復計劃。理論上這個過程至少需要執行一次。
通過采集大量用戶數據並監控網站各節點的負載,提供優化計劃
當用戶數量急劇增長時的快速橫向擴展計劃
對於所有這些事情,提前計劃並准備好必要時的快速應對是很重要的。
為了保證站點可響應和可用性,需要做兩件事:系統的數據備份和冗余。備份可以將節點恢復到它崩潰之前的狀態,備份根據需求有幾種比如及時恢復(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中FLUSH LOGS;# 正常使用很久的DB不建議使用這個命令,需要加參數,指定具體的binlog文件名 【IN 'xxxx'】SHOW BINLOG EVENTS\G
二進制日志中事件所包含的字段:
Event_type: 比如Format_desc, Query, RotateServer_id : 創建事件的服務器idLog_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:配置新的Slave2:備份Master(或者備份已經復制了Master的Slave)3:接下該備份相應的binlog位置4:在新Slave上恢復備份5:配置Slave從這個binlog位置開始復制
區別就在於第二步,一種是直接從Master進行備份,一種是通過現有Slave備份,下面分別介紹兩種。
1:克隆Master:
# 刷新所有的表並鎖定數據庫,防止在檢查binlog位置之前數據庫發生改變FLUSH TABLES WITH READ LOCK;# 獲取當前的binlog文件和posSHOW MASTER STATUS\G# 備份mastermysqldump --all-databases --host=master-1 >backup.sql# 解鎖UNLOCK TABLES;# 在slave上恢復備份mysql --host=slave-1 <backup.sql# 配置slaveCHANGE MASTER TOMASTER_HOST = 'master-1',MASTER_PORT = 3306,MASTER_USER = 'slave-1',MASTER_PASSWORD = 'xxxx',MASTER_LOG_FILE = 'master-bin.000042',MASTER_LOG_POS = 546552;# 啟動slaveSTART 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之後,使用mysqldump3:執行FLUSH TABLES WITH READ LOCK之後,使用快照的方法,比如LVM(Linux),ZFS(Solaris)快照
2:克隆Slave:
# 防止出現不一致的備份映像,備份Slave之前需要先停止replicationSTOP SLAVE;# 確定從哪裡開始復制,注意Relay_Master_Log_File和Exec_Master_Log_PosSHOW SLAVE STATUS\G# 配置新的slave,指向masterCHANGE MASTER TOMASTER_HOST = 'master-1',MASTER_PORT = 3306,MASTER_USER = 'slave-1',MASTER_PASSWORD = 'xxxx',MASTER_LOG_FILE = 'master-bin.000042',MASTER_LOG_POS = 546632;# 啟動新的slaveSTART SLAVE
摘自 foxracle