MySQL備份與恢復
上篇博客講了MySQL的日志系統,這篇博客將系統的講解MySQL備份與恢復。按照常理說這些內容都是屬於DBA的職責,那么作為后端開發人員為什么要學習這些內容呢?是否與專業深度的思想相違背呢?其實作為WEB開發人員,一定要系統的了解從服務發起到服務終結之間所有的內容,這樣才算是專精,提升自己的職業深度。MySQL就如同技術人員的糧倉,怎么儲存糧食,失火的時候怎么確保糧食顆粒歸倉,這是一個必須引起充分重視的問題。下面我們來系統的了解下MySQL的備份與恢復。
MySQL服務實例運行期間,意外的停電,硬盤損壞,還有一些誤操作、服務器宕機等情況。這個時候如何確保數據庫能夠最大程度地恢復到'正確'的狀態呢?
對於數據庫管理人員來說,防止數據丟失最簡單的方法就是:對原始數據定期進行備份,創建數據副本。但數據與預期發生不一致情況,然后使用備份的數據恢復數據。對於MySQL來說,創建數據副本的常用方法有三種
創建數據副本的方法
1、數據備份:
由MySQL日志系統前一篇博客我們知道數據庫的全部數據都以文件的形式,存儲在硬盤上,那我們就可以直接備份MySQL的所有數據目錄下的文件就能夠達到目的。因此在開啟MySQL服務的時候要設計好各種數據文件以及日志文件的存放位置,以方便能夠快速備份。另外備份的時候最好能夠備份到其他的機器上。
2、使用二進制日志:
上面的【數據備份方法】屬於物理備份,粒度較粗,不能實現更細粒度的數據恢復,特別是對於更新較為頻繁的系統。二進制日志記錄了數據庫所有的更新操作,數據丟失時,可以通過完全備份進行二進制日志的重做,可以完成基於時間點或者操作點的恢復,繼而實現數據庫更細粒度的恢復。
3、數據庫復制:
數據庫的復制實際上是通過二進制日志預防數據丟失的,數據復制可以實現數據庫的異地備份和恢復。
邏輯備份與物理備份
按照備份后產生的副本文件是否可以編輯,可以將MySQL的備份方法分為邏輯備份
和物理備份
1、邏輯備份:
使用邏輯備份是,數據庫管理員通常可以直接查看和編輯副本文件中的內容。邏輯備份中產生的副本通常喲兩種情況。情形一:副本是SQL文件,該SQL文件中有crete table 和大量的inert 語句。情形二、副本是指定分隔符的文件,導入數據庫的時候再以指定分隔符切割數據導入即可。
2、物理備份:
物理備份產生的數據副本都是二進制文件,常常不可編輯,例如數據庫的二進制日志。
冷備份、溫備份、熱備份
數據備份期間,按照是否需要停止MySQL服務實例,可以將MySQL的數據恢復分為:冷備份、溫備份、熱備份。
1、冷備份:
冷備份是指停止MySQL服務的運行后在進行數據備份,這種備份方法非常簡單,但是在服務繁忙的系統中,並不允許這樣做。
2、溫備份: 溫備份介於熱備份與冷備份之間,溫備份允許MySQL服務實例繼續運行,備份數據期間,溫備份借助讀鎖機制
保證備份期間,沒有新的數據寫入。例如常常會執行如下命令來進行溫備份:
flush tables with read lock;
3、熱備份:
熱備份是指不需要停止MySQL服務實例運行,備份數據的方法。如果數據庫的更新操作較為頻繁,在數據備份期間,備份過的數據可能早已發生變化,因此熱備份的實現方式較為復雜。通常熱備份需要借助第三方工具實現,例如:
MySQL提供了自帶工具mysqlhotcopy 實現了MyISAM引擎的熱備份。
percona公司的Xtrabackup工具實現了對InnoDB表的熱備份。
完全備份、增量備份
按照副本文件的缺失程度可以將數據備份分為完全備份以及增量備份。
1、完全備份:
完全備份是一個完整的數據備份,僅僅依靠該副本文件就可以將數據庫恢復到某個正確的狀態。如果不借助熱備份工具,完全備份可能需要停止MySQL服務。此時MySQL將無法提供服務,在真實的業務場景中,很少真正使用完全備份。
2、增量備份:
增量備份是指在完全備份的基礎上,對更新的數據進行備份,恢復時需要借助完全備份產生的副本文件,目前,MySQL還沒有提供真正的增量備份工具
。數據庫管理人員可以使用熱備份工具模擬實現增量備份,也可以通過重新執行二進制日志中的更新語句模擬實現增量備份。
一、邏輯備份與邏輯恢復
邏輯備份與邏輯恢復的最大優點在於,對於不同存儲引擎的表,都可以采用同樣的邏輯備份方法
產生副本文件。采用同樣的恢復方法
將數據恢復到某個正確的狀態中。如果數據庫中有多個存儲引擎,選用邏輯備份恢復數據會簡單一點。邏輯備份常用的有select ... into outfile
,以及mysqldump工具。前者產生的副本文件為指定格式的文本文件,后者產生的副本文件既可以是指定格式的文本文件也可以是SQL腳本文件。邏輯恢復常用的工具有load data in file
以及 mysqlimport
。
使用select ...into outfile
備份數據
語法格式如下: select 語句
into outfile 文本文件
文本文件選項和參數如下:
fields terminated by '字符串' : 字符串分割符,默認是制表符'\t'
fileds escaped by ’字符‘ : 轉義字符,默認是’\‘
fileds [optionally] enclose by 字符’‘: 字段引用符,負責向字段值兩端加上字段引用符。如果使用optionally 選項,則表示字符串類型上添加字段分隔符。
lines starting by '字符串',每條記錄前添加該字段。
lines terminated by ’字符串‘,每條記錄后添加該字符串,默認是換行符 ‘\n’
例如:
mysql> select * from classes into outfile 'data_back' fields terminated by '|';
結果會生成在data目錄下,對應的數據庫目錄下面。可以直接使用cat命令查看。
恢復表數據:
1、使用load data infile...快速地從一個指定格式的文本文件中讀取數據到一個數據庫表中。
更復雜的配置就不寫了,沒什么必要,還增加大腦的負擔。等用到的時候,去網上查找具體的參數即可,我們並不擅長記憶這些並不常用的選項。 一句話概括這種邏輯備份的精要:怎么吃我的,怎么給我吐出來。怎么吐出來來,怎么給我裝進去。選用了什么樣的分割選項,導入數據的時候就需要使用對應的分割選項去導入數據。 結合我自己平時的工作內容與實踐,基本上不使用這種方式導出。反而使用mysqldump 更多一點。
使用mysqldump 備份數據庫
mysqldump也是MySQL轉儲數據庫常用的自帶工具,mysqldump產生副本文件有兩種情形:
1、文件是指定格式的文本文件 2、是可以執行的SQL腳本文件
使用方法有以下3種:
1、備份指定的多個數據庫。
mysqldump -u root -p --databases choose test > roverliang.sql
2、備份所有的數據庫
mysqldump -u root -p --all-databases choose test > roverliang.sql
3、備份指定數據庫中的某些表
mysqldump -u root -p choose test > roverliang.sql
mysqldump 完整的參數是:
mysqldump -u USER_NAME -p PASSWORD [其他選項] DB [其他數據庫庫表]
--default-character-set
: 設置字符集
--single-transaction
: 將導出設置成事務
--no-data
: 導出的SQL腳本中,將只包含創建表的create 語句。
--add-drop-table
:導出的腳本中,包含 drop table if exists
--routines
導出存儲過程及函數
--events
導出事件
--triggers
導出觸發器
導入mysqldump 的數據文件
一句命令就能搞定,在mysql終端下執行:
命令格式:
source FILE_PATH
source ~/demo.sql
二、MySQL物理備份與熱備份
這一部分介紹兩款熱備份工具:mysqlhotcopy
與 Xtrabackup
;
其中mysqlhotcopy 是mysql自帶的熱備份工具,但僅能夠備份MyISAM引擎的數據,而Xtrabackup 則可以備份InnoDB引擎和MyISAM引擎的數據,操作復雜。
Xtrabackup 的下載地址
MySQL數據庫中,表的存儲引擎不同,與之對應的文件類型也不相同。以MyISAM存儲引擎為例,每張表有都會有3個文件,分別是表結構定義文件(frm),表索引文件(MYI),表數據文件(MYD)。那么備份的時候只需要物理的復制這三個文件就能完成備份。而InnoDB引擎為了維護事務安全,則要復雜的多。如果你看過前文的日志的話,就明白每個InnoDB都會存在frm表定義文件,InnoDB的數據和索引是在一個文件里面,稱作表空間文件(共享表空間文件,獨享表空間)。重做日志(redo)記錄在iblogfile0 和iblogfile1中。回滾日志(undo)則記錄在表空間文件中,共享表空間文件(ibdata1)或者獨享表空間文件(ibd)中。關於InnoDB事務日志詳情可查看MySQL系統日志。因此備份InnoDB表引擎的表時,上面提到的幾個文件都要備份到。
有前文提到,冷、熱、溫備份的本質在於是否能夠繼續提供服務,根據提供服務的級別,才有了冷、熱、溫之分。
MyISAM 表物理備份、熱備份工具 使用非常簡單,但是我還是折騰了挺長的時間。先是mac mysql 5.7 版本去掉了mysqlhotbin腳本。然后登陸自己的阿里雲服務器,安裝一些mysqlhotcopy依賴的時候,報錯無法解決。然后切換到自己的內網虛擬機,才最終解決了這個問題。 如安裝遇到問題:可參考mysqlhotbin
mysqlhotcopy -u USER_NAME -p USER_PASSWORD -addtodest DB1 DB2 DB3.table1 > PATH/TOSAVE.sql
另外可以在在my.cnf中配置密碼:
[mysqlhotcopy]
interactive-timeout
user=root
password=123456
port=3306
Xtrabackup 由於內容較多,也比較難以操作。因此需要單獨一篇博客去介紹。
接下來,會陸續的將MySQL的主從復制,以及MySQL安全優化方面的博客寫出來。