1. 程式人生 > 資料庫 >NoteOfMySQL-12-備份與還原

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選項

正常情況下,secure_file_priv的預設值為null,表示限制mysqld不允許匯入匯出,可通過修改配置檔案安裝路徑下的my.ini檔案,新增如下內容即可:

# 在安裝路徑下的my.ini檔案內新增
secure_file_priv=''
# 注意等號左右沒有空格

修改完成之後重啟mysql伺服器,以管理員身份執行cmd,執行如下命令:

net stop mysql
net start mysql

重啟mysql伺服器

重啟之後,可以重新登入mysql伺服器,檢視secure_file_priv的值是否我上圖所示。

好了,配置到此,正文開始。


mysqldump -u root -p webnews news user roles --tab=E:\testtab

  這裡是備份webnews資料庫中news、user、roles三個表。

使用-tab分別備份表資料和表結構

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資料庫

備份book資料庫

(2)刪除book資料庫

刪除book資料庫

(3)還原資料庫

還原資料庫

(4)檢視資料庫

使用資料庫

1.3 備份資料表例子

(1)備份book資料庫內的t_user資料表

備份資料表

(2)建立新資料庫newbook

建立新資料庫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...)。

刪除、還原資料庫
選擇資料庫

參考資料