MySQL4-備份與恢復

MySQL備份與恢復

沒有哪一種數據庫備份能夠完美的解決所有的應用場景,而每個數據庫環境所需要面對的數據庫備份應用場景又可能各不一樣,可能只是需要面對很多種場景中的某一種或幾種,那麼我們就非常有必要指定一個合適的備份方案和備份策略,通過最簡單的技術和最低廉的成本,來滿足我們的需求。

邏輯備份與恢復測試

什麼樣的備份是數據庫邏輯備份呢

數據庫邏輯備份就是備份軟件按照我們最初所設計的邏輯關係,以數據庫的邏輯結構對象爲單位,將數據庫中的數據按照預定義的邏輯關聯格式一條一條生成相關的文本文件,以達到備份的目的。

常用的邏輯備份

在MySQL中我們常用的邏輯備份主要就是兩種,①將數據生成可以完全重現當前數據庫中數據的INSERT 語句;②將數據通過邏輯備份軟件,將我們數據庫表數據以特定分隔符進行分隔後記錄在文本文件中。

生成INSERT語句的操作與缺點:簡介

通過MySQL數據庫軟件自帶工具程序中的mysqldump來生成INSERT語句的邏輯備份文件:

mysqldump [OPTIONS] database [tables]

mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...]

mysqldump [OPTIONS] --all-databases [OPTIONS]

mysqldump程序的實現原理是通過我們給的參數信息加上數據庫中的系統表信息來一個表一個表獲取數據然後生成INSERT 語句再寫入備份文件中的。這樣就出現了一個問題,在系統正常運行過程中,很可能會不斷有數據變更的請求正在執行,這樣就可能造成在mysqldump 備份出來的數據不一致。也就是說備份數據很可能不是同一個時間點的數據,而且甚至可能都沒辦法滿足完整性約束。這樣的備份集對於有些系統來說可能並沒有太大問題,但是對於有些對數據的一致性和完整性要求比較嚴格系統來說問題就大了,就是一個完全無效的備份集。

生成INSERT語句的操作與缺點:同一時刻取出所有數據

對於事務支持的存儲引擎,如Innodb或者BDB等可以通過控制將整個備份過程控制在同一個事務中,來達到備份數據的一致性和完整性,而且mysqldump 程序也給我們提供了相關的參數選項來支持該功能,就是通過“--single-transaction”選項,可以不影響數據庫的任何正常服務。

生成INSERT語句的操作與缺點:數據庫中的數據處於靜止狀態

將需要備份的表鎖定,只允許讀取而不允許寫入。讓數據庫在備份過程中僅提供數據的查詢服務,鎖定寫入的服務,來使數據暫時處於一個一致的不會被修改的狀態,等mysqldump 完成備份後再取消寫入鎖定,重新開始提供完整的服務。mysqldump 程序自己也提供了相關選項如“--lock-tables”和“--lock-all-tables”,在執行之前會鎖定表,執行結束後自動釋放鎖定。這裏有一點需要注意的就是,“--lock-tables”並不是一次性將需要dump 的所有表鎖定,而是每次僅僅鎖定一個數據庫的表,如果你需要dump 的表分別在多個不同的數據庫中,一定要使用“--lock-all-tables”才能確保數據的一致完整性。

當通過mysqldump 生成INSERT 語句的邏輯備份文件的時候,有一個非常有用的選項可以供我們使用,那就是“--master-data[=value]”。當添加了“--master-data=1”的時候,mysqldump 會將當前MySQL 使用到binlog 日誌的名稱和位置記錄到dump 文件中,並且是被以CHANGE_MASTER 語句的形式記錄,如果僅僅只是使用“--master-data”或者“--masterdata=2”,則CHANGE_MASTER 語句會以註釋的形式存在。這個選項在實施slave 的在線搭建的時候是非常有用的,即使不是進行在線搭建slave,也可以在某些情況下做恢復的過程中通過備份的binlog 做進一步恢復操作。

生成特定格式的純文本備份數據文件備份

這樣的備份數據與INSERT 命令文件相比,所需要使用的存儲空間更小,數據格式更加清晰明確,編輯方便。但是缺點是在同一個備份文件中不能存在多個表的備份數據,並且還沒有數據庫結構的重建命令。

執行SELECT ... TO OUTFILE FROM ...命令來實現。該命令有幾個需要注意的參數如下:

①實現字符轉義功能的“FIELDS ESCAPED BY ['分隔符']” 將SQL 語句中需要轉義的字符name進行轉義;

②可以將字段的內容“包裝”起來的“FIELDS [OPTIONALLY] ENCLOSED BY 'name'”,如果不使用“OPTIONALLY”則包括數字類型的所有類型數據都會被“包裝”,使用“OPTIONALLY”之後,則數字類型的數據不會被指定字符“包裝”。

③通過"FIELDS TERMINATED BY 分隔符"可以設定每兩個字段之間的分隔符;

④通過“LINES TERMINATED BY 分隔符”則會告訴MySQL 輸出文件在每條記錄結束的時候需要添加什麼字符。

SELECT * INTO OUTFILE '/tmp/dump.text'

FIELDS TERMINATED BY ','

OPTIONALLY ENCLOSED BY '"'

LINES TERMINATED BY '\n'

FROM test_outfile limit 100;

把表test_outfile中前100條記錄導出到/tmp/dump.text文件中。①每條記錄結束後回車;②列中的內容被雙引號包裹,除去數字;③列與列之間的內容用逗號分隔。

mysqldump 還同樣能實現上面“SELECT ... TO OUTFILE FROM ...”所實現的功能,而且同時還會生成一個相關數據庫結構對應的創建腳本。

邏輯備份恢復方法:INSERT語句文件的恢復

如果需要做完全恢復,那麼我們可以通過使用“mysql < backup.sql”直接調用備份文件執行其中的所有命令,將數據完全恢復到備份時候的狀態。如果已經使用mysql 連接上了MySQL,那麼也可以通過在mysql中執行“source /path/backup.sql”或者“\. /path/backup.sql”來進行恢復。

邏輯備份恢復方法:純數據文本備份的恢復

需要一個表一個表通過相關命令來進行恢復,當然如果通過腳本來實現自動多表恢復也是比較方便的。恢復方法也有兩個,一是通過MySQL的“LOAD DATA INFILE”命令來實現,另一種方法就是通過MySQL提供的使用工具mysqlimport 來進行恢復。

物理備份與恢復測試

什麼樣的備份是數據庫物理備份

數據庫的物理備份就是對數據庫的物理對象所做的備份。數據庫的物理對象主要由數據庫的物理數據文件、日誌文件以及配置文件等組成。在MySQL 數據庫中,除了MySQL 系統共有的一些日誌文件和系統表的數據文件之外,每一種存儲引擎自己還會有不太一樣的物理對象。

MySQL物理備份所需文件:MyISAM存儲引擎

MyISAM存儲引擎的所有數據都存放在MySQL配置中所設定的“datadir”目錄下。每一個MyISAM 存儲引擎表都會有三個文件存在,分別爲記錄表結構元數據的“.frm”文件,存儲表數據的“.MYD”文件,以及存儲索引數據的“.MYI”文件。所以MyISAM 存儲引擎的物理備份,除了備份MySQL 系統的共有物理文件之外,就只需要備份上面的三種文件即可。

MySQL物理備份所需文件:Innodb存儲引擎

決定Innodb 存放數據位置的配置爲“innodb_data_home_dir” 、“innodb_data_file_path” 和“innodb_log_group_home_dir”這三個目錄位置指定參數,以及另外一個決定Innodb 的表空間存儲方式的參數“innodb_file_per_table”。前面三個參數指定了數據和日誌文件的存放位置,最後一個參數決定Innodb 是以共享表空間存放數據還是以獨享表空間方式存儲數據。

如果是共享表空間, 那麼Innodb 需要備份備份“innodb_data_home_dir”和“innodb_data_file_path”參數所設定的所有數據文件,“datadir”中相應數據庫目錄下的所有Innodb 存儲引擎表的“.frm”文件。

如果是獨享表空間,那麼我們除了備份上面共享表空間方式所需要備份的所有文件之外,我們還需要備份“datadir”中相應數據庫目錄下的所有“.idb”文件,該文件中存放的纔是獨享表空間方式下Innodb 存儲引擎表的數據。

Innodb 是事務性存儲引擎是需要undo和redo信息的,不管Innodb 使用的是共享還是獨享表空間的方式來存儲數據,與事務相關的undo信息以及其他的一些元數據信息,都是存放在“innodb_data_home_dir”和“innodb_data_file_path”這兩個參數所設定的數據文件中的。所以要想Innodb 的物理備份有效,“innodb_data_home_dir”和“innodb_data_file_path”參數所設定的數據文件不管在什麼情況下我們都必須備份。

除了上面所說的數據文件之外,Innodb 還有自己存放redo信息和相關事務信息的日誌文件在“innodb_log_group_home_dir”參數所設定的位置。所以要想Innodb 物理備份能夠有效使用,我們還要備份“innodb_log_group_home_dir”參數所設定的位置的所有日誌文件。

各存儲引擎常用物理備份方法

由於不同存儲引擎所需要備份的物理對象(文件)並不一樣,且每個存儲引擎對數據文件的一致性要求也不一樣所以各個存儲引擎在進行物理備份的時候所使用的備份方法也有區別。如果我們是要做冷備份(停掉數據庫之後的備份),我們所需要做的事情都很簡單,那就是直接copy 所有數據文件和日誌文件到備份集需要存放的位置即可,不管是何種存儲引擎都可以這樣做。冷備份方法簡單,實現容易。

但現實是只能在數據庫提供服務的情況下來完成數據庫備份。這也就是我們俗稱的熱物理備份了。下面是針對各個存儲引擎單獨說明各自最常用的在線(熱)物理備份方法:

各存儲引擎常用物理備份方法:MyISAM存儲引擎

雖然MyISAM 存儲引擎沒有事務,對數據文件的一致性要求沒有那麼嚴格,但是MyISAM存儲引擎的同一個表的數據文件和索引文件之間是有一致性要求的。當MyISAM 存儲引擎發現某個表的數據文件和索引文件不一致的時候,會標記該表處於不可用狀態,並要求你進行修復動作。

這就要求我們必須做到在備份MyISAM數據庫的物理文件的時候讓MyISAM存儲引擎停止寫操作,僅僅提供讀服務,其根本實質就是給數據庫表加鎖來阻止寫操作。

MySQL自己提供了一個使用程序mysqlhotcopy,這個程序就是專門用來備份MyISAM存儲引擎的。不過如果你有除了MyISAM之外的其他非事務性存儲引擎,也可以通過合適的參數設置,或者微調該備份腳本,也都能通過mysqlhotcopy程序來完成相應的備份任務:

mysqlhotcopy db_name[./table_regex/]
[new_db_name | directory]

mysqlhotcopy 是一個用perl 編寫的使用程序,其主要實現原理實際上就是通過先LOCK住表,然後執行FLUSH TABLES 動作,該正常關閉的表正常關閉,將該fsync 的數據都fsync,然後通過執行OS 級別的複製(cp 等)命令,將需要備份的表或者數據庫的所有物理文件都複製到指定的備份集位置。此外,我們也可以通過登錄數據庫中手工加鎖,然後再通過操作系統的命令來複制相關文件執行熱物理備份,且在完成文件copy 之前,不能退出加鎖的session(因爲退出會自動解鎖)。加鎖命令是FLUSH TABLES WITH READ LOCK;解鎖命令是unlock tables;

各存儲引擎常用物理備份方法:Innodb存儲引擎

Innodb 存儲引擎由於是事務性存儲引擎,有redo 日誌和相關的undo 信息,而且對數據的一致性和完整性的要求也比MyISAM 要嚴格很多,所以Innodb 的在線(熱)物理備份要比MyISAM 複雜很多,一般很難簡單的通過幾個手工命令來完成,大都是通過專門的Innodb在線物理備份軟件來完成。Innodb 存儲引擎的開發者(Innobase 公司)開發了一款名爲ibbackup 的商業備份軟件,專門實現Innodb 存儲引擎數據的在線物理備份功能。該軟件可以在MySQL 在線運行的狀態下,對數據庫中使用Innodb 存儲引擎的表進行備份,不過僅限於使用Innodb 存儲引擎的表。

這款軟件需要花錢。

各存儲引擎常用物理備份恢復方法:MyISAM存儲引擎

如果是通過停機冷備份或者是在運行狀態通過鎖定寫入操作後的備份集來恢復,僅僅只需要將該備份集直接通過操作系統的拷貝命令將相應的數據文件複製到對應位置來覆蓋現有文件即可。

如果是通過mysqlhotcopy 軟件來進行的在線熱備份,而且相關的備份信息也記錄進入了數據庫中相應的表,其恢復操作可能會需要結合備份表信息來進行恢復。

各存儲引擎常用物理備份恢復方法:Innodb存儲引擎

對於冷備份,Innodb 存儲引擎進行恢復所需要的操作和其他存儲引擎沒有什麼差別,同樣是備份集文件(包括數據文件和日誌文件)複製到相應的目錄即可。但是對於通過其他備份軟件所進行的備份,就需要根據備份軟件本身的要求來進行了。比如通過ibbackup 來進行的備份,同樣也需要通過他來進行恢復纔可以,具體的恢復方法請通過該軟件的使用手冊來進行。

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