備份與恢復

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數,表示將全部表加上讀鎖,在備份期間,全部表將只能讀而不能進行數據更新。可是對於事務存儲引擎(InnoDBBDB)來講,能夠採用更好的選項--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中,對於不一樣的存儲引擎熱備份方法也有所不一樣。

1MyISAM存儲引擎:

  MyISAM存儲引擎的熱備份有不少方法,本質其實就是將要備份的表加讀鎖,而後再cp數據文件到備份目錄。

方法一:使用mysqlhotcopy工具。

mysqlhotcopy db_name [/path/to/new_directory]

方法2:手工鎖表copy

首先數據庫中全部表加讀鎖:

flush tables for read ;

而後手工cp數據文件到備份目錄便可。

2InnoDB存儲引擎:

  對於InnoDB存儲引擎數據庫,可使用Innobase公司的一個熱備份工具ibbackup進行物理熱備份。對於InnoDBMyISAM混合的數據庫,可使用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 選項則只用在charvarchar 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 '"' ;

注意:

  SELECTINTO 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(字段引用符,只用在charvarchar 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表的建立腳本,能夠發現,除多了一個表的建立腳本文件外,mysqldumpSELECINTO OUTFILE…的選項和語法很是相似。其實,mysqldump實際調用的就是後者提供的接口,並在其上面添加了一些新的功能而已。

2. 導入:

  這裏只討論用SELECTINTO 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來導出。

相關文章
相關標籤/搜索