1. 程式人生 > 資料庫 >MySQL5.7 mysqldump備份與恢復的實現

MySQL5.7 mysqldump備份與恢復的實現

MySQL 備份

冷備份:
停止服務進行備份,即停止資料庫的寫入

熱備份:
不停止服務進行備份(線上)

mysql 的 MyIsam 引擎只支援冷備份,InnoDB 支援熱備份,原因:

InnoDB引擎是事務性儲存引擎,每一條語句都會寫日誌,並且每一條語句在日誌裡面都有時間點,那麼在備份的時候,mysql可以根據這個日誌來進行redo和undo,將備份的時候沒有提交的事務進行回滾,已經提交了的進行重做。但是MyIsam不行,MyIsam是沒有日誌的,為了保證一致性,只能停機或者鎖表進行備份。

InnoDB不支援直接複製整個資料庫目錄和使用mysqlhotcopy工具進行物理備份:

1、直接複製整個資料庫目錄

因為MYSQL表儲存為檔案方式,所以可以直接複製MYSQL資料庫的儲存目錄以及檔案進行備份。MYSQL的資料庫目錄位置不一定相同,在Windows平臺下,MYSQL5.6存放資料庫的目錄通常預設為~\MySQL\MYSQL Server 5.6\data,或其他使用者自定義的目錄。這種方法對INNODB儲存引擎的表不適用。使用這種方法備份的資料最好還原到相同版本的伺服器中,不同的版本可能不相容。在恢復的時候,可以直接複製備份檔案到MYSQL資料目錄下實現還原。通過這種方式還原時,必須保證備份資料的資料庫和待還原的資料庫伺服器的主版本號相同。而且這種方式只對MYISAM引擎有效,對於InnoDB引擎的表不可用。執行還原以前關閉mysql服務,將備份的檔案或目錄覆蓋mysql的data目錄,啟動mysql服務。

2、使用mysqlhotcopy工具快速備份
mysqlhotcopy是一個perl指令碼,最初由Tim Bunce編寫並提供。他使用LOCK TABLES 、FLUSH TABLES和cp或scp來快速備份資料庫。他是備份資料庫或單個表的最快途徑,但他只能執行在資料庫目錄所在機器上,並且只能備份myisam型別的表。

mysqldump 備份簡述

mysqldump可產生兩種型別的輸出檔案,取決於是否選用- -tab=dir_name選項。

不使用- -tab=dir_name選項,mysqldump產生的資料檔案是純文字的SQL檔案,又CREATE(資料庫、表、儲存路徑等)語句和INSERT(記錄)語句組成。輸出結果以一個檔案儲存,可以用mysql命令去恢復備份檔案。

使用- -tab=dir_name選項,mysqldump對於每一個需備份的資料表產生兩個輸出檔案:一個是帶分隔符的文字檔案,備份的資料表中的每行儲存為文字中的一行,以“表名.txt”儲存;另一個輸出檔案為資料表的CREATE TABLE語句,以“表名.sql”儲存。

mysqldump 語法和選項

【命令】shell> mysqldump -help

在這裡插入圖片描述

- -all-databases 表示備份系統中所有資料庫,使用- -databases引數之後,必須指定至少一個數據庫的名稱,多個數據庫名稱之間用空格隔開

常用的選項

- -add-drop-table
這個選項將會在每一個表的前面加上DROP TABLE IF EXISTS語句,這樣可以保證導回MySQL資料庫的時候不會出錯,因為每次導回的時候,都會首先檢查表是否存在,存在就刪除

- -add-locks
這個選項會在INSERT語句中捆上一個LOCK TABLE和UNLOCK TABLE語句。這就防止在這些記錄被再次匯入資料庫時其他使用者對錶進行的操作

- -tab
這個選項將會建立兩個檔案,一個是帶分隔符的文字檔案,備份的資料表中的每行儲存為文字中的一行,以“表名.txt”儲存;另一個輸出檔案為資料表的CREATE TABLE語句,以“表名.sql”儲存。

- -quick或者- -opt
如果你未使用- -quick或者- -opt選項,那麼mysqldump將在轉儲結果之前把全部內容載入到記憶體中。這在你轉儲大資料量的資料庫時將會有些問題。該選項預設是開啟的,但可以使用- -skip-opt來關閉它。

- -skip-comments
使用–skip-comments可以去掉匯出檔案中的註釋語句

- -compact
使用- -compact選項可以只輸出最重要的語句,而不輸出註釋及刪除表語句等等

以SQL格式備份資料

如果備份檔名.sql沒有指定所放置的路徑,則預設放在~\MySQL\MySQL Server 5.6\bin目錄下。

指定資料備份路徑:
mysqldump –h 主機名 –u 使用者名稱 –p - -all-databases > C:\備份檔名.sql

呼叫mysqldump帶有- -all-databases選項備份所有的資料庫
mysqldump –h 主機名 –u 使用者名稱 –p - -all-databases > C:\備份檔名.sql

呼叫mysqldump帶有- -databases選項備份指定的資料庫
mysqldump –u 使用者名稱 –p - -databases db1 db2 db3 … > C:\備份檔名.sql

呼叫mysqldump備份一個指定的資料庫:
mysqldump –u 使用者名稱 –p - -databases db > 備份檔名.sql

用mysqldump不帶有- -databases選項備份指定的一個數據庫,生成的備份檔案中是沒有CREATE DATABASE和USE語句的:
mysqldump –u 使用者名稱 –p db > 備份檔名.sql

注意: 當對一個數據庫進行備份時- -databases允許省略,但是省略後導致的是備份檔名.sql中沒有CREATE DATABASE 和USE語句,那麼恢復備份檔案時,必須指定一個預設的資料庫名,由此伺服器才知道備份檔案恢復到哪個資料庫中;由此可以導致你可以使用一個和原始資料庫名稱不同的資料庫名。

呼叫mysqldump備份某個資料庫中的某幾張表:
mysqldump –u使用者名稱 –p 資料庫名 表名1 表名2 表名3… > 備份檔名.sql

恢復SQL格式的備份檔案

通過mysqldump備份的檔案,如果用了- -all-databases或- -databases選項,則在備份檔案中包含CREATE DATABASE和USE語句,故並不需要指定一個數據庫名去恢復備份檔案。

在Shell命令下:

shell> mysql –u 使用者名稱 –p < 備份檔案.sql

在mysql命令下,用source命令匯入備份檔案:

mysql> source備份檔案.sql; //已登入mysql,用source命令

如果通過mysqldump備份的是單個數據庫,且沒有使用- -databases選項,則備份檔案中不包含CREATE DATABASE和USE語句,那麼在恢復的時候必須先建立資料庫。

在shell命令下:

shell> mysqladmin –u 使用者名稱 –p create 資料庫名 //建立資料庫
shell> mysql –u 使用者名稱 –p資料庫名 < 備份檔案.sql

在mysql命令下:

mysql> CREATE DATABASE IF NOT EXIST 資料庫名;
mysql> USE 資料庫名;
mysql> source備份檔案.sql;

注意: 只能在cmd介面下執行source命令,不能在mysql工具裡面執行source命令,會報錯,因為cmd是直接呼叫mysql.exe來執行命令的。

以帶分隔符的文字檔案格式備份資料

呼叫mysqldump帶有- -tab=dir_name選項去備份資料庫,則dir_name表示輸出檔案的目錄,在這個目錄中,需備份的每個表將會產生兩個檔案。如對於一個名為t1的表,包含兩個檔案:t1.sql和t1.txt。.sql檔案中包含CREATE TABLE語句,.txt檔案中一行為資料表中的一條記錄,列值與列值之間以‘tab'分隔。

注意: 使用帶- -tab=dir_name選項的mysqldump最好只被用於本地伺服器上。因為如果用在遠端伺服器上,- -tab產生的目錄將會既存在本地主機也會存在於遠端主機上,.txt檔案將會被伺服器寫在遠端主機的目錄中,而.sql檔案將會被寫在本地主機目錄中。

呼叫mysqldump帶有- -tab=dir_name選項備份資料庫
mysqldump –u 使用者名稱 –p - -tab=dir_name 資料庫名

【例子】用mysqldump帶有- -tab=dir_name選項備份資料庫test,放在D盤下:

資料庫test中的表:

在這裡插入圖片描述

執行備份命令:

在這裡插入圖片描述

所輸出的結果:

在這裡插入圖片描述

恢復帶分隔符的文字檔案格式的備份檔案 用mysql命令處理.sql檔案去還原表結構,然後處理.txt檔案去載入記錄。

shell> mysql –u 使用者名稱 –p 資料庫名 < 表名.sql //還原表結構
shell> mysqlimport –u 使用者名稱 –p 資料庫名 表名.txt //還原記錄

或者:可用LOAD DATA INFILE 去代替mysqlimport命令,不過此時得在mysql命令下:

mysql> use 資料庫名; //選中資料庫
mysql> LOAD DATA INFILE ‘表名.txt' INTO TABLE表名; //還原記錄

【例子】 恢復資料庫test裡面的資料表stucou表: 檢視test資料庫裡面的表,沒有stucou表:

在這裡插入圖片描述

用stucou.sql檔案恢復stucou表結構:

在這裡插入圖片描述

stucou資料表恢復成功:

在這裡插入圖片描述

stucou資料表中沒有任何記錄:

在這裡插入圖片描述

用stucou.txt檔案恢復stucou表記錄:

在這裡插入圖片描述

在這裡插入圖片描述

用mysql命令將查詢的中間結果匯出

將查詢結果匯入到文字檔案中

mysql是一個功能豐富的工具命令,使用mysql還可以在命令列模式下執行SQL指令,將查詢結果匯入到文字檔案中。相比mysqldump,mysql工具匯出的結果可讀性更強。如果mysql伺服器是單獨的機器,使用者是在一個client上進行操作,使用者要把資料結果匯入到client機器上,可以使用mysql -e語句。

【命令】:
shell> mysql -u root -p --execute="SELECT 語句" dbname > filename.txt

該命令使用–execute 選項,表示執行該選項後面的語句並退出,後面的語句必須用雙引號括起來

dbname為要匯出的資料庫名稱,匯出的檔案中不同列之間使用製表符分隔,第一行包含了欄位名稱

【例子】使用mysql命令,匯出test庫的person表記錄到文字檔案:
shell> mysql -u root -p --execute="SELECT * FROM person;" test > C:\person3.txt

person3.txt的內容如下

ID Name Age job

1 green 29 lawer

2 suse 26 dancer

3 evans 27 sports man

4 mary 26 singer

可以看到,person3.txt檔案中包含了每個欄位的名稱和各條記錄,如果某行記錄欄位很多,可能一行不能完全顯示,可以使用 - -vertical引數,將每條記錄分為多行顯示

【例子】使用mysql命令匯出test庫的person表使用–vertical引數顯示:
shell> mysql -u root -p --vertical --execute="SELECT * FROM person;" test > C:\person4.txt

*************************** 1. row ***************************

ID: 1

Name: green

Age: 29

job: lawer

*************************** 2. row ***************************

ID: 2

Name: suse

Age: 26

job: dancer

*************************** 3. row ***************************

ID: 3

Name: evans

Age: 27

job: sports man

*************************** 4. row ***************************

ID: 4

Name: mary

Age: 26

job: singer

如果person表中記錄內容太長,這樣顯示將會更加容易閱讀

將查詢結果匯入到html檔案中

使用mysql命令匯出test庫的person表記錄到html檔案,輸入語句如下

shell> mysql -u root -p --html --execute="SELECT * FROM PERSON;" test > C:\person5.html

在這裡插入圖片描述

將查詢結果匯入到xml檔案中

如果要匯出為xml檔案,那麼使用–xml選項
使用mysql命令匯出test庫的person表的中記錄到xml檔案

shell> mysql -u root -p --xml --execute="SELECT * FROM PERSON;" test > C:\person6.xml
<?xml version="1.0"?>

<resultset statement="SELECT * FROM PERSON" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

 <row>

  <field name="ID">1</field>

  <field name="Name">green</field>

  <field name="Age">29</field>

  <field name="job">lawer</field>

 </row>

 <row>

  <field name="ID">2</field>

  <field name="Name">suse</field>

  <field name="Age">26</field>

  <field name="job">dancer</field>

 </row>

 <row>

  <field name="ID">3</field>

  <field name="Name">evans</field>

  <field name="Age">27</field>

  <field name="job">sports man</field>

 </row>

 <row>

  <field name="ID">4</field>

  <field name="Name">mary</field>

  <field name="Age">26</field>

  <field name="job">singer</field>

 </row>

</resultset>

到此這篇關於MySQL5.7 mysqldump備份與恢復的實現的文章就介紹到這了,更多相關MySQL mysqldump備份恢復內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!