1、邏輯備份和恢復mysql
在MySQL中,邏輯備份的最大優勢是對於各類存儲引擎,均可以用一樣的方法來備份;而物理備份則不一樣,不一樣的存儲引擎有着不一樣的備份方法。所以,對於不一樣存儲引擎混合的數據庫,用邏輯備份會更簡單一些。sql
1. 邏輯備份:數據庫
MySQL中的邏輯備份是將數據庫中的數據備份爲一個文本文件,在MySQL 中,使用mysqldump工具來完成邏輯備份。工具
使用方法:this
(1)備份指定的數據庫,或者此數據庫中某些表:spa
mysqldump [options] db_name [tables]操作系統
(2)備份指定的一個或多個數據庫:日誌
mysqldump [options] --database DB1 [DB2 DB3...]server
(3)備份全部數據庫:接口
mysqldump [options] --all-database
(若是沒有指定數據庫中的任何表,默認導出全部數據庫中全部表。)
爲了保證數據備份的一致性,MyISAM存儲引擎在備份的時候須要加上-l參數,表示將全部表加上讀鎖,在備份期間,全部表將只能讀而不能進行數據更新。可是對於事務存儲引擎(InnoDB和BDB)來講,能夠採用更好的選項--single-transaction,此選項將使得InnoDB存儲引擎獲得一個快照(Snapshot),使備份的數據可以保證一致性。
使用示例:
mysqldump -u root -p test -l user_myi > user_myi.sql
2. 徹底恢復:
mysqldump的恢復很簡單,將備份做爲輸入執行便可,具體語法以下:
mysql -uroot -p dbname < bakfile(若是是恢復某個表的話,這個表若已存在是不會恢復成功的,須要先建立表)
注意,將備份恢復後數據並不完整,還須要將備份後執行的日誌進行重作,語法以下:
mysqlbinlog binlog-file | mysql -u root -p
徹底恢復示例:
(1)備份:
mysqldump -uroot -p -l -F test > test.sql
(-F表示生成一個新的日誌文件)
(2)恢復備份:
flush logs;
mysql -uroot -p test < test.sql
注意:
這裏建立新binlog日誌文件再進行備份恢復,這樣作是爲了防止備份恢復的操做也被記錄到徹底恢復須要使用的binlog日誌文件中。
(3)使用mysqlbinlog恢復自mysqldump備份以來的BINLOG:
mysqlbinlog localhost-bin.000015 | mysql -u root –p test
(這裏的localhost-bin.000015就是從備份到第二步執行fush logs期間的binlog日誌文件)
3. 不徹底恢復:
因爲誤操做,好比誤刪除了一張表,這時使用徹底恢復是沒有用的,由於日誌裏面還存在誤操做的語句,咱們須要的是恢復到誤操做以前的狀態,而後跳過誤操做語句,再恢復後面執行的語句,完成咱們的恢復。這種恢復叫不徹底恢復,在MySQL中,不徹底恢復分爲基於時間點的恢復和基於位置的恢復。
基於時間點的恢復主要使用mysqlbinlog中的兩個選項--stop-date和--start-date來跳過誤操做的時間點。而基於位置的恢復則是先在binlog日誌文件中找到誤操做語句先後的位置號,而後使用mysqlbinlog的選項--stop-position和--start-position跳過誤操做的位置。這兩種方法是相似的,但基於位置的恢復更精確,由於同一個時間點可能有不少條SQL語句同時執行。
2、物理備份和恢復
物理備份又分爲冷備份和熱備份兩種,和邏輯備份相比,它的最大優勢是備份和恢復的速度更快,由於物理備份的原理都是基於文件的cp。
1. 冷備份:
冷備份其實就是停掉數據庫服務,cp數據文件的方法。這種方法對MyISAM 和InnoDB存儲引擎都適合,可是通常不多使用,由於不少應用是不容許長時間停機的。
進行備份操做時,停掉MySQL服務,在操做系統級別備份MySQL的數據文件和日誌文件到備份目錄。進行恢復操做時,首先停掉MySQL服務,在操做系統級別恢復MySQL 的數據文件;而後重啓MySQL服務,使用mysqlbinlog工具恢復自備份以來的全部BINLOG。
2. 熱備份:
MySQL中,對於不一樣的存儲引擎熱備份方法也有所不一樣。
(1)MyISAM存儲引擎:
MyISAM存儲引擎的熱備份有不少方法,本質其實就是將要備份的表加讀鎖,而後再cp數據文件到備份目錄。
方法一:使用mysqlhotcopy工具。
mysqlhotcopy db_name [/path/to/new_directory]
方法2:手工鎖表copy。
首先數據庫中全部表加讀鎖:
flush tables for read ;
而後手工cp數據文件到備份目錄便可。
(2)InnoDB存儲引擎:
對於InnoDB存儲引擎數據庫,可使用Innobase公司的一個熱備份工具ibbackup進行物理熱備份。對於InnoDB和MyISAM混合的數據庫,可使用Innobase公司提供的開源Perl腳本innobackup進行備份。
3、表的導入導出
1. 導出:
在某些狀況下,爲了一些特定的目的,常常須要將表裏的數據導出爲某些符號分割的純數據文本,而不是SQL語句。
方法一:使用SELECT ...INTO OUTFILE ...命令來導出數據,具體語法以下。
SELECT * FROM tablename INTO OUTFILE 'target_file' [option];
其中option 參數能夠是如下選項:
FIELDS TERMINATED BY 'string' (字段分隔符,默認爲製表符’\t’);
FIELDS [OPTIONALLY] ENCLOSED BY 'char'(字段引用符,若是加OPTIONALLY 選項則只用在char、varchar 和text等字符型字段上。默認不使用引用符);
FIELDS ESCAPED BY 'char' (轉義字符,默認爲’\’);
LINES STARTING BY 'string' (每行前都加此字符串,默認'');
LINES TERMINATED BY 'string'(行結束符,默認爲’\n’);
注:其中char表示此符號只能是單個字符,string表示能夠是字符串。
使用示例:
select * from emp into outfile '/tmp/emp.txt' fields terminated by "," optionally enclosed by '"' ;
注意:
SELECT…INTO OUTFILE...產生的輸出文件若是在目標目錄下有重名文件,將不會建立成功,源文件不能被自動覆蓋。
另外,若語句執行過程當中遇到「The MySQL server is running with the --secure-file-priv option so it cannot execute this statement」錯誤提示,那是由於mysql配置文件中配置的「secure-file-priv」配置項限制了SELECT … INTO OUTFILE報表到指定的目錄,你能夠選擇使用配置中限定的這個目錄來存放導出的文件,或者不使用這個配置項。
方法二:用mysqldump導出數據爲文本。
mysqldump -u username -T target_dir dbname tablename [option]
其中option參數能夠是如下選項:
--fields-terminated-by=name(字段分隔符);
--fields-enclosed-by=name(字段引用符);
--fields-optionally-enclosed-by=name(字段引用符,只用在char、varchar 和text 等字符型字段上);
--fields-escaped-by=name(轉義字符);
--lines-terminated-by=name(記錄結束符)
使用示例:
mysqldump -uroot -T /tmp test emp --fields-terminated-by ',' --fields-optionally-enclosed-by '"'
語句執行成功後,除了生成數據文件emp.txt以外,還生成一個emp.sql文件,裏面記錄了emp表的建立腳本,能夠發現,除多了一個表的建立腳本文件外,mysqldump和SELEC…INTO OUTFILE…的選項和語法很是相似。其實,mysqldump實際調用的就是後者提供的接口,並在其上面添加了一些新的功能而已。
2. 導入:
這裏只討論用SELECT… INTO OUTFILE或者mysqldump導出的純數據文本的導入方法。和導出相似,導入也有兩種不一樣的方法,分別是LOAD DATA INFILE…和mysqlimport,它們的本質是同樣的,區別只是在於一個在mysql客戶端內部執行,另外一個在mysql客戶端外部執行。
方法一:使用「LOAD DATA INFILE…」命令。
LOAD DATA [LOCAL] INFILE 'filename' INTO TABLE tablename [option]
這裏的option除了有和select ...into outfile同樣的選項之外,還有一些不一樣的選項:
IGNORE number LINES(忽略輸入文件中的前n 行數據);
(col_name_or_user_var,...) (按照列出的字段順序和字段數量加載數據);
SET col_name = expr,... 將列作必定的數值轉換後再加載。
使用示例:
load data infile '/tmp/emp.txt' into table emp fields terminated by ',' enclosed by '"' ignore 2 lines (id,content,name);
方法二:用mysqlimport來實現,具體命令以下。
mysqlimport -u root -p*** [--LOCAL] dbname order_tab.txt [option]
這裏的option除了有和mysqldump同樣的選項之外,還有一些不一樣的選項:
-- ignore-lines=number(忽略前幾行)。
使用示例:
mysqlimport -uroot test /tmp/emp.txt --fields-terminated-by=',' --fields-enclosed-by='"'
注意:
使用select...into outfile方法導出的文件中記錄的順序和數據表中記錄的順序是同樣的,而使用mysqldump導出的文件中記錄的順序則是和數據表中記錄的順序相反。使用load data infile方法和mysqlimport導入的數據表中的記錄順序和文件中記錄的順序都是相反的。因此,若是要求數據表導入導出先後表中記錄順序不變的話,應該使用mysqldump來導出。