天天看點

mysql 資料備份 還原_MySQL資料備份與還原

MySQL資料備份與還原

基礎概念:

備份,将目前已有的資料或記錄另存一份;

還原,将資料恢複到備份時的狀态。

為什麼要進行資料的備份與還原?這似乎是一個不用回答的問題:

防止資料丢失;

保護資料記錄。

資料備份與還原的方式有很多種,具體可以分為:資料表備份、單表資料備份、SQL備份和增量備份。

資料表備份

資料表備份,不需要通過 SQL 來備份,我們可以直接進入到資料庫檔案夾複制對應的表結構以及資料;在需要還原資料的時候,直接将備份(複制)的内容放回去即可。

不過想要進行資料表備份是有前提條件的,因為不同的存儲引擎之間是有差別的。

對于存儲引擎,MySQL 主要使用兩種,分别為: InnoDB 和 Myisam,兩者均免費。在這裡,咱們可以順便科普一下存儲引擎的知識,不同的存儲引擎有不同的特點。一般來說使用預設的就行,不過有特殊需求時,一定要對引擎有所了解。

特點

Myisam

InnoDB

BDB

Memory

Archive

批量插入的速度

非常高

事務安全

——

支援

支援

——

——

全文索引

支援

5.5版本支援

——

——

——

鎖機制

表鎖

行鎖

頁鎖

表鎖

行鎖

存儲限制

沒有

64TB

沒有

沒有

B樹索引

支援

支援

支援

支援

——

哈希索引

——

支援

——

支援

——

叢集索引

——

支援

——

——

——

資料緩存

——

支援

——

支援

——

索引緩存

支援

支援

——

支援

——

資料可壓縮

支援

——

——

——

支援

空間使用

N/A

非常低

記憶體使用

中等

外鍵支援

——

支援

——

——

——

其中,Myisam 和 InnoDB 的資料存儲方法也有所差別:

Myisam:表、資料和索引全部單獨分開存儲;

InnoDB:隻有表結構,資料全部存儲到ibd檔案中。

執行如下 SQL 語句,測試 Myisam 的資料存儲方式:

-- 建立 Myisam 表

create table my_myisam(

id int

)charset utf8 engine = myisam;

-- 顯示表結構

show create table my_myisam;

-- 插入資料

insert into my_myisam values(1),(2),(3);

-- 顯示資料

select * from my_myisam;

mysql 資料備份 還原_MySQL資料備份與還原

如上圖所示,我們建立了名為my_myisam,存儲引擎為 Myisam 的資料表。為了驗證 Myisam 的存儲特性,我們可以到data檔案夾檢視具體的資料存儲情況:

mysql 資料備份 還原_MySQL資料備份與還原

如上圖所示,我們僅僅建立了一個表my_myisam,但是 Myisam 對于會生成三個存儲檔案,分别為:

my_myisam.frm:存儲表的結構;

my_myisam.MYD:存儲表的資料;

my_myisam.MYI:存儲表的索引。

現在,我們将這三個檔案複制到testoo資料庫(至于如何找到 MySQL 資料檔案的存儲位置,可以參考詳述檢視 MySQL 資料檔案存儲位置的方法):

mysql 資料備份 還原_MySQL資料備份與還原

執行如下 SQL 語句,進行測試:

-- 切換資料庫

use testoo;

-- 檢視 testoo 資料庫中的表

show tables;

-- 檢視表 my_myisam

select * from my_myisam;

mysql 資料備份 還原_MySQL資料備份與還原

如上圖所示,顯然我們已經通過複制檔案的方式,完成了資料表的備份工作。

在這裡,有一點需要我們注意,那就是: 我們可以将通過 InnoDB 存儲引擎産生的.frm和.idb檔案複制到另一個資料庫,也可以通過show tables指令檢視複制過來的表名稱,但是卻無法獲得資料。

mysql 資料備份 還原_MySQL資料備份與還原

執行如下 SQL 語句,進行測試:

-- 檢視 testoo 資料庫中的表

show tables;

-- 檢視表 my_class

select * from my_class;

mysql 資料備份 還原_MySQL資料備份與還原

通過以上測試,顯然 資料表備份這種備份方式更适用于 Myisam 存儲引擎,而且備份的方式也很簡單,直接複制 Myisam 存儲引擎産生的.frm、.MYD和.MYI三個存儲檔案到新的資料庫即可。

單表資料備份

單表資料備份,每次隻能備份一張表,而且隻能備份資料,不能備份表結構。

通常的使用場景為:将表中的資料導出到檔案。

備份方法:從表中選出一部分資料儲存到外部的檔案中,

select */字段清單 + into outfile + '檔案存儲路徑' + from 資料源;

在這裡,使用單表資料備份有一個前提,那就是: 導出的外部檔案不存在,即檔案存儲路徑下的檔案不存在。

執行如下 SQL 語句,進行測試:

-- 單表資料備份

select * into outfile 'D:/CoderLife/testMySQL/class.txt' from class;

mysql 資料備份 還原_MySQL資料備份與還原

如上圖所示,SQL 語句已經執行成功。在這裡,如果我們遇到:

ERROR 1290 (HY000): The MySQL server is running with the –secure-file-priv option so it cannot execute this statement.

為了驗證是否真的将class表中的資料導出到指定位置,我們可以到該路徑下進行确認:

mysql 資料備份 還原_MySQL資料備份與還原

如上圖所示,顯然我們已經将class表中的資料導出到本地啦!不過在這裡,有一點需要我們特别注意,那就是: 對于從資料庫導出的檔案,我們最好用EditPlus等編輯工具打開,防止亂碼。

此外,對于上述用于導出表中資料的 SQL 文法,其實我們可以颠倒書寫順序,也沒有問題,例如:

select */字段清單 + from 資料源 + into outfile + '檔案存儲路徑';

執行如下 SQL 語句,進行測試:

-- 單表資料備份

select * from class into outfile 'D:/CoderLife/testMySQL/class2.txt';

mysql 資料備份 還原_MySQL資料備份與還原

接下來,我們學習一些用于單表資料備份的進階操作,即 自己指定字段和行的處理方式。

基本文法:select */字段清單 + into outfile + '檔案存儲路徑' + fields + 字段處理 + lines + 行處理 + from 資料源;

字段處理:

enclosed by:指定字段用什麼内容包裹,預設是` `,空字元串;

terminated by:指定字段以什麼結束,預設是\t,Tab鍵;

escaped by:指定特殊符号用什麼方式處理,預設是\\,反斜線轉義。

行處理:

starting by:指定每行以什麼開始,預設是` `,空字元串;

terminated by:指定每行以什麼結束,預設是\r\n,換行符。

執行如下 SQL 語句,進行測試:

-- 指定單表資料備份處理方式

select * into outfile 'D:/CoderLife/testMySQL/class3.txt'

-- 字段處理

fields

enclosed by '"'

terminated by '|'

lines

starting by 'START:'

from class ;

mysql 資料備份 還原_MySQL資料備份與還原

如上圖所示,顯然導出檔案class3.txt按照我們指定的格式進行輸出啦!在前面,我們已經測試了各種單表資料備份的方式,現在我們删除資料,并嘗試還原資料,即 将保持在外部的資料重新恢複到資料表中。But,由于單表資料備份僅能備份資料,是以如果表結構不存在,則不能進行還原。

基本文法:load data infile + '檔案存儲路徑' + into table + 表名 + [字段清單] + fields + 字段處理 + lines + 行處理;

執行如下 SQL 語句,進行測試:

-- 删除表 class 中的資料

delete from class;

-- 檢視表 class 中的資料

select * from class;

-- 還原表 class 中的資料

load data infile 'D:/CoderLife/testMySQL/class3.txt'

into table class

-- 字段處理

fields

enclosed by '"'

terminated by '|'

lines

starting by 'START:';

-- 檢視表 class 中的資料

select * from class;

mysql 資料備份 還原_MySQL資料備份與還原

如上圖所示,顯然在我們删除表class中的資料之後,還原資料成功。

SQL 備份

SQL 備份,備份的是 SQL 語句。在進行 SQL 備份的時候,系統會對表結構以及資料進行處理,變成相應的 SQL 語句,然後執行備份。在還原的時候,隻要執行備份的 SQL 語句即可,此種備份方式主要是針對表結構。

不過,MySQL 并沒有提供 SQL 備份的指令,如果我們想要進行 SQL 備份,則需要利用 MySQL 提供的軟體mysqldump.exe,而且mysqldump.exe也是一種用戶端,是以在操作伺服器的時候,必須進行認證。

基本文法:mysqldump.exe -hPup + 資料庫名字 + [表名1 + [表名2]] > 備份檔案目錄

其中,-hPup分别表示

h:IP 或者localhost;

P:端口号;

u:使用者名;

p:密碼。

由于mysqldump.exe也是用戶端,是以想執行上述指令,我們需要先退出 MySQL 用戶端,然後在指令行視窗執行如下指令:

mysqldump.exe -uroot -pbin.guo test class > D:/CoderLife/testMySQL/classSQL.sql

mysql 資料備份 還原_MySQL資料備份與還原

如上圖所示,雖然mysqldump給出了警告(在指令行中輸入密碼是不安全的),但是我們輸入的指令已經成功執行啦!在這裡,如果執行上述指令不成功的話,很有可能是我們沒有配置環境變量的問題。

mysql 資料備份 還原_MySQL資料備份與還原

如上圖所示,在testMySQL目錄下,已經生産了對表class的 SQL 備份,至于 SQL 備份的内容到底是什麼,我們可以打開classSQL.sql檔案進行檢視:

mysql 資料備份 還原_MySQL資料備份與還原

如上圖所示,通過 SQL 備份的檔案,包含了各種 SQL 語句,如建立表的語句以及插入資料的語句等等。

此外,在上面給出的執行 SQL 備份的 基本文法中,我們可以看到表名都用[]括了起來,這表示可選項,如果不輸入表名,則預設備份整個資料庫。執行過程和上面一樣,是以我們就不予示範啦!

接下來,我們示範通過 SQL 備份的檔案還原資料,有兩種方式:

方式 1:使用mysql.exe用戶端還原資料

基本文法mysql.exe/mysql -hPup 資料庫名稱 + 資料庫名字 + [表名1 + [表名2]] < 備份檔案目錄

在指令行視窗執行如下指令,進行測試:

-- 登入 MySQL 用戶端

mysql -uroot -p

-- 輸入密碼,切換資料庫

use test;

-- 删除表 class 中的資料

delete from class;

-- 退出資料庫

\q

-- 通過 SQL 備份的檔案還原資料

mysql -uroot -pbin.guo test < D:/CoderLife/testMySQL/classSQL.sql

mysql 資料備份 還原_MySQL資料備份與還原

如上圖所示,上述指令全部執行成功。下面,我們檢查還原結果,

mysql 資料備份 還原_MySQL資料備份與還原

如上圖所示,顯然表class的資料在删除之後,我們通過 SQL 備份的檔案還原了資料。

方式 2:使用 SQL 指令還原資料

基本文法source + 備份檔案目錄;

執行如上 SQL 語句,進行測試:

-- 檢視表 class 資料

select * from class;

-- 删除表 class 資料

delete from class;

-- 檢視表 class 資料

select * from class;

-- 通過 SQL 備份的檔案還原資料

source D:/CoderLife/testMySQL/classSQL.sql;

-- 檢視表 class 資料

select * from class;

mysql 資料備份 還原_MySQL資料備份與還原
mysql 資料備份 還原_MySQL資料備份與還原

如上圖所示,顯然表class的資料在删除之後,我們通過 SQL 備份的檔案利用第二種方式還原了資料。

通過上面的學習及測試,我們可以知道 SQL 備份的優缺點:

優點:可以備份表結構;

缺點:增加額外的 SQL 指令,會浪費磁盤空間。

增量備份

增量備份,不是針對資料或者 SQL 進行備份,而是針對 MySQL 伺服器的日志進行備份,其日志内容包括了我們對資料庫的各種操作的曆史記錄,如增删改查等。此外,增量備份是指定時間段進行備份,是以備份的資料一般不會出現重複的情況,常用于大型項目的資料備份。在此,我們就不詳細的進行介紹了,至于這部分的内容,以後會單獨寫一篇關于如何進行增量備份的博文。

溫馨提示:符号[]括起來的内容,表示可選項,就是可以寫,也可以不寫;符号+,則表示連接配接的意思,實際寫sql的時候,不要寫+。