近日企業遭駭的災情頻傳,若平日資料庫沒有做好備份,那後果可想而知。對此,這裡將介紹開源碼MySQL資料庫伺服器所提供的複製功能,實地示範如何確實完成資料庫資料的備份工作。
對系統管理人員而言,確保資料庫內的資料安全是最重要的任務。為了達到這個目的,通常都會建置相關的資料庫備份措施,但事實上,有許多的資料庫其實都已內建相當完整的資料備份機制,只要善用此類機制,即可在不多加經費的情況下,完成一個有效率及安全的資料庫備份機制。
本文將介紹開源碼社群中最富盛名的MySQL資料庫伺服器。並說明如何使用MySQL(採用5.7.16版本)所提供的複製(Replication)功能來完成資料庫資料的備份功能。除了備份的功能外,MySQL資料複製還可帶來以下的優勢:
‧提高系統的高可用度:因為會同步有多個MySQL伺服器的資料(亦即會有多個具有相同資料的資料庫,以下稱為備援資料庫),如果有一天,實際上線服務的MySQL伺服器因為某種原因而崩潰(Crash),即可在最短的時間內,啟動另一個備援資料庫來繼續服務。簡而言之,即是提供了錯誤轉移(Fail-over)的可能性,而成為高可用度的資料庫系統。
‧提供系統的服務效能:由於建立了多個備援資料庫,在資料庫資料變動不大的情況下,可以利用某個備援資料庫來服務使用者查詢(Select)的要求,藉此分散主要服務的資料庫,而提高服務的效能。
‧用來離線資料處理:可在不影響主要服務之資料庫的效能下,使用備援資料庫進行統計分析或產生報表的工作。
什麼是MySQL複製
在說明MySQL的複製機制之前,先來定義在MySQL複製架構上的角色名詞:
‧主資料庫(Master):系統實際在使用的資料庫。
‧從資料庫(Slave): 欲複製主資料庫資料的備份資料庫。
為了避免主資料庫在繁忙的日常事務中還要分心處理複製的事情而可能影響服務的效能,因此MySQL複製架構中的複製功能並非由主資料庫(Master)所發起,將資料備份到從資料庫(Slave),而是由從資料庫所發起,定時地詢問主資料庫再將資料備份到從資料庫上,其複製流程如圖1所示。
|
▲圖1 MySQL資料庫複製流程。 |
首先,當主資料庫執行相關的SQL指令時,不論是資料定義語言(Data Definition Language,DDL)或資料操縱語言(Data Manipulation Language,DML),指令均會被記錄在格式為Bin Log的二進位日誌(Bin Log)檔案內。
而為了避免主資料庫多餘的負擔,複製動作通常由從資料庫發起要求,如圖1中的(1),主資料庫接收到要求後,即會將二進位日誌檔案傳遞到從資料庫的中繼日誌(Relay Log)檔案內,而後從資料庫再執行中繼日誌檔案內的SQL指令來完成與主資料庫同步的目的。
所以,基本上主資料庫內的二進位日誌與從資料庫內的中繼日誌檔案的內容是一致的,唯一的不同在於,從資料庫在執行中繼日誌檔案後,會清除相關的中繼日誌內的記錄,來避免從資料庫上的中繼日誌占用了過大的磁碟空間。
認識二進位日誌
二進位日誌是MySQL資料庫所提供的記錄(Log)格式之一,主要是利用來記錄MySQL伺服器在資料庫操作過程中所有會更動資料庫結構或資料的動作,例如CREATE TABLE、ALTER TABLE等資料庫結構操作指令,或是update、insert、delete等資料庫資料操作指令,但要特別要注意的是,此類型日誌所記錄的資訊並不包括執行SELECT(查詢)的動作(因為此類型的指令並不會更動資料庫的結構或資料)。而二進位日誌的記錄型式的格式,如下所述:
Statement
此種格式相對於其他的記錄型式較為節省儲存空間,在此種記錄型式下,日誌僅會記錄實際對資料庫中的資料造成修改的SQL語句。例如「update name set id=’abc’,」,假設name資料庫表格(Table)中有1萬筆記錄,而上述的SQL指令實際僅更改了其中的500筆記錄,在採用Statement型式下的日誌內容就僅會記錄實際被更動的500筆記錄。而不會記錄整個有被處理到的資料庫表格記錄。
Row
在此種記錄格式下,將會記錄每一筆記錄的變動,以上述SQL指令為例。由於「update name set id=’abc’」指令會更新整個的資料庫表格(雖然在條件的限制下,實際上僅會更動其中的500筆的記錄),但如果日誌採用此種記錄格式,就會將整個資料庫表格中1萬筆的SQL更新指令記錄下來。如此相對所記錄到的日誌量即會大幅地增加,此種格式的優點是可詳細地記錄所有的變動情況。但另一方面,也表示將會大大地增加所需的磁碟空間,也會增加頻繁寫入磁碟的動作,而因此對於系統的服務效能造成重大的影響。