NoteOfMySQL-12-備份與還原
一、備份概述
備份不是單純的複製資料,因為這樣無法留下歷史記錄和系統的DNS或Registry等資訊。完整的備份應包括自動化的資料管理與系統的全面恢復,即備份=複製+管理。
1. 備份需要考慮的問題
- 可以容忍丟失多長時間的資料恢復資料
- 要在多長時間內完成
- 恢復的時候是否需要持續提供服務
- 恢復的物件是什麼
2. 分類
2.1 根據是否需要資料庫離線劃分
分類 | 說明 |
---|---|
冷備(cold backup) | 需要關閉MySQL服務 |
溫備(warm backup) | 可不關閉服務,但僅支援讀請求,不支援寫請求 |
熱備(hot backup) | 不需要關閉MySQL服務 |
2.2 根據要備份的資料集合的範圍劃分
分類 | 說明 |
---|---|
完全備份(full backup) | 備份全部字符集 |
增量備份(incremental backup) | 藉助完全備份,備份上次完全備份或增量備份以來改變了的資料 |
差異備份(differential backup) | 備份上次完全備份以來改變了的資料 |
2.3 根據備份的物件劃分
分類 | 說明 |
---|---|
物理備份 | 直接備份資料檔案。可以跨MySQL版本,恢復速度快。 |
邏輯備份 | 備份表中的資料和程式碼。備份與儲存引擎無關,備份結構為ASCII檔案,但恢復時需要MySQL服務參與,且浮點數可能會丟失。 |
二、檔案方式的優缺點
檔案備份是將資料庫中的資料備份為一個文字檔案,該文字檔案可以移植到其他機器上。
在MySQL中,可以直接複製磁碟中對應的資料檔案,這種方式需要先執行flush tables
語句將所有資料寫入到資料檔案,之後停止MySQL伺服器才能複製資料檔案。不夠這種方式只適合MyISAM引擎,並且需要保證資料還原時MySQL資料庫與備份時的資料庫的主版本號一致。
命令 | 型別 | 物件 | 使用檔案 |
---|---|---|---|
mysqldump命令 | 匯出 | 結構、資料 | .sql 檔案 |
select語句 | 匯出 | 資料 | .txt 檔案 |
mysql命令 | 匯入 | 結構、資料 | .sql 檔案 |
mysqlimport命令 | 匯入 | 資料 | .txt 檔案 |
load語句 | 匯入 | 資料 | .txt 檔案 |
source語句 | 匯入 | 結構、資料 | .sql 檔案 |
三、備份(匯出)
1. mysqldump命令匯出
mysqldump命令可以匯出資料表、資料庫的結構和資料。
1.1 語法
-- 備份db_name資料庫中的tb_name資料表
mysqldump [options] db_name [tb_name ...] > sql_file
-- 備份多個數據庫
mysqldump [options] -B db_name1 [db_name2 ...] > sql_file
-- 備份所有資料庫
mysqldump [options] -A > sql_file
- 第一個是備份單個數據庫的資料表,當tb_name未指定時備份db_name這個資料庫的所有資料表。
- 第二個是備份多個數據庫,在這裡不能指定某個資料表,其中引數
-B
可換為--databases
。 - 第三個是備份所有的資料庫,其中引數
-A
可換為--all-databases
。 - sql_file為備份檔案的路徑。
options引數 | 說明 |
---|---|
-h host_name | 指定伺服器地址,host_name為localhost時可以省略 |
-u user_name | 指定登入的使用者名稱 |
-p [pwd] | 指定登入密碼,密碼與-p間沒有空格,當然也可以採用不顯式輸入,見例子 |
-t, --no-create-info | 備份時不備份表結構 |
-d, --no-data | 備份時不備份表資料 |
-tab=path | 備份時把資料和sql語句分開儲存(.txt 檔案和.sql 檔案),此選項不能和-A 、-B 同時使用,且mysqldump命令必須執行在伺服器主機上 |
1.2 例子
(1)備份一個表
mysqldump -h localhost -u root -p123456 webnews news > E:\news_backup.sql
這裡是備份webnews資料庫中的一個表news。
注意-p和密碼間無空格,若存在空格,123456
會作為一個數據庫來看待。這裡-h localhost
可省略,-p
可使用安全模式輸入,如下方Warning所說。
(2)備份多個數據庫
mysqldump -u root -p -B webnews book > E:\dbOf2_backup.sql
這裡是備份webnews和book兩個資料庫,其中-B
可以換成--databases
。
(3)備份所有資料庫
mysqldump -u root -p -A > E:\allDB_backup.sql
這裡-A
為--all-databases
表示所有資料庫。
(4)使用-tab分別備份表資料和表結構
注意:使用-tab進行分開儲存之前需要先看一下設定,如下:
show variables like '%secure%';
正常情況下,secure_file_priv
的預設值為null
,表示限制mysqld不允許匯入匯出,可通過修改配置檔案安裝路徑下的my.ini檔案,新增如下內容即可:
# 在安裝路徑下的my.ini檔案內新增
secure_file_priv=''
# 注意等號左右沒有空格
修改完成之後重啟mysql伺服器,以管理員身份執行cmd,執行如下命令:
net stop mysql
net start mysql
重啟之後,可以重新登入mysql伺服器,檢視secure_file_priv
的值是否我上圖所示。
好了,配置到此,正文開始。
mysqldump -u root -p webnews news user roles --tab=E:\testtab
這裡是備份webnews資料庫中news、user、roles三個表。
2. select語句匯出
select語句只能匯出資料表的資料,並存為txt檔案。
2.1 語法
select [col_name...] from [db_name.]table_name [where語句]
into outfile txt_file [options];
db_name
省略時,選擇當前資料庫的table_name資料表的資料。txt_file
需要加上引號,路徑分割使用/
。- options中,
fields
語句需寫在lines
語句前面。
options引數 | 說明 |
---|---|
fields terminated by 'str' | 設定str 為欄位間的分隔符,預設為\t |
fields optionally enclosed by 'str' | 設定str 來括住char、varchar、text型別欄位的資料,預設為空 |
fields escaped by 'str' | 設定str 為轉義字元,預設為\ |
lines starting by 'str' | 設定每行資料開頭字元 |
lines terminated by 'str' | 設定每行資料結尾字元,預設為\n |
2.2 例子
select * from book.t_user
into outfile 'E:/user_backup.txt'
fields
terminated by '\、'
optionally enclosed by '\"'
lines
starting by '\>'
terminated by '\r\n';
四、恢復(匯入)
1. mysql命令匯入
mysql命令可以匯入資料表、資料庫的結構和資料。
1.1 語法
mysql [-h host_name] -u user_name -p[pwd] [db_name] < sql_file
- 若sql_file備份的是資料庫,那麼db_name不用加,它會按照sql_file內的程式碼建立和使用選定的資料庫。
- 若sql_file只備份資料表,那麼db_name必須要有,它會把sql_file備份的表還原在db_name資料庫中。
1.2 備份資料庫例子
(1)備份book資料庫
(2)刪除book資料庫
(3)還原資料庫
(4)檢視資料庫
1.3 備份資料表例子
(1)備份book資料庫內的t_user資料表
(2)建立新資料庫newbook
(3)還原資料到新資料庫
(4)檢視新資料內容
2. mysqlimport命令匯入資料
mysqlimport命令只能匯入儲存在txt檔案中的資料表資料。
2.1 語法
mysqlimport [-h host_name] -u user_name -p[pwd] [options] db_name txt_file
這裡只能恢復db_name資料庫中與txt_file同名的表的資料,即txt_file中儲存的是db_name資料庫中txt_file資料表的資料。
options引數 | 說明 |
---|---|
-d, --delete | 刪除表中的所有記錄 |
-r, --replace | 替換掉存在重複的唯一鍵的舊行 |
2.2 例子
t_user表的表結構:
(1)匯出book資料庫中的t_user表的資料
(2)清空t_user表的資料
(3)匯入資料
(4)再匯入資料
現在t_user表中不是空的,而且資料表有設定主鍵和唯一鍵,如果直接匯入會報錯,這時候就需要使用options中的引數了。--replace
和--delete
這兩個引數在目前情況下都可使用。
3. load語句匯入
load語句只能匯入儲存在txt檔案中的資料表資料,事實上,mysqlimport命令使用的就是load語句來實現的。
3.1 語法
load data [low_priority | concurrent] [local] infile txt_file
[replace | ignore] into table [db_name.]tb_name
[fields語句] [lines語句]
[ignore number lines]
[(col_name, col_name...)]
[set col_name=expr, ...]
引數 | 說明 |
---|---|
low_priority | 本引數適用於表鎖儲存引擎,當寫入過程中有其他客戶端程式讀取表內容時,load語句會延後至其他程式寫入完成 |
concurrent | 允許寫入過程中其他客戶端程式讀取表內容 |
local | 表示txt_file檔案在伺服器上讀取 |
txt_file | 匯入檔案的路徑,用使用引號 |
replace | 當有重複的唯一鍵時,替換掉原來的行 |
ignore | 當有重複的唯一鍵時,跳過原來的行 |
3.2 例子
load data local infile 'E:/testload/user.txt'
into table book.t_user;
4. source命令匯入
4.1 語法
source sql_file
sql_file
不用使用引號,路徑分隔符使用/
- 當
sql_file
備份資料庫時,使用source
語句之前可以不用use
選擇資料庫,若備份的是表,則需要。
4.2 例子
(1)備份資料庫
(2)刪除資料庫、還原資料庫
這裡相當於是一句句執行sql檔案,所以會有很多個返回語句(Query OK...
)。