MySQL(InnoDB剖析):48---備份與恢復之(邏輯備份:mysqldump、select...into outfile、load data infile、mysqlimport)

一、mysqldump

  • mysqldump工具最初由Ifor Romanenko編寫完成,通常用來完成轉存數據庫的備份及不同數據庫之間的移植,如從MySQL低版本數據庫升級到MySQL高版本數據庫,又或者從MySQL數據庫移植到Oracle、SQL Server等

該工具使用的注意事項

  • mysqldump工具是MySQL外命令行使用的,不是在MySQL數據庫啓動使用的
  • ②該工具使用時需要提供用戶名與密碼,因此需要更改MySQL的配置文件在其中添加用戶名與密碼,然後重啓數據庫進行備份

演示案例

  • 語法格式如下:

  • 備份所有的數據庫,可以使用--all-databases選項:
mysqldump --all-databases >dump.sql
  • 備份指定的數據庫,可以使用--databases選項:
mysqldump --databases db1 db2 db3 >dump.sql
  • 被demo數據庫進行備份,可以使用,下面操作使用--single-transaction選項來保證備份的一致性:
mysqldump --single-transaction demo >demo_backup.sql

備份.sql文件查看

  • 備份出的.sql文件是一個文本文件,可以直接使用命令進行查看
  • 可以看出文件中就是表結構以及數據,這些都是SQL語句
  • 文件開始和結束的註釋部分是用來設置MySQL數據庫的各項參數,一般用來使還原工作更有效和準確的進行

參數

  • 該工具有很多參數,有些參數是縮寫形式,例如--lock-tables的縮寫爲-l
  • 可以使用下面的命令查看所有的參數
mysqldump --help

--single-transaction參數

  • 該參數在備份開始時,先執行START TRANSACTION命令,以此來獲得備份的一致性,當前該參數只對InnoDB存儲引擎有效
  • 當啓用該參數並進行備份時,確保沒有其他任何的DDL語句執行,因爲一致性讀並不能隔離DDL操作

--lock-tables(-l)參數

  • 在備份中,以此鎖住每個數據庫下的所有表
  • 該參數一般用於MyISAM存儲引擎,當備份時只能對數據庫進行讀取操作,不過備份依然可以保證一致性
  • 對於InnoDB存儲引擎,不需要使用該參數,用--single-transaction即可
  • 注意事項:
    • --lock-tables和--single-transaction是互斥的,不能同時使用如果用戶的MySQL數據庫中,既有MyIASM存儲引擎的表,又有InnoDB存儲引擎的表,那麼用戶的選擇只有--lock-tables
    • 此外,正如前面所說的那樣,--lock-tables是依次對每個數據庫中的表上鎖的,因此只能保證每個數據庫下表備份的一致性,而不能保證所有數據庫下表的一致性

--lock-all-tables(-x)參數

  • 在備份過程中,對所有數據庫中的所有表上鎖。這個可以避免之前說的--lock-tables參數不能同時鎖住所有表的問題

--add-drop-databases參數

  • 在create database全先運行drop database
  • 這個參數需要和--all-databases或者--databases選項一起使用
  • 在默認情況下,導出的文本文件中並不會有create database,除非指定了這個參數,因此可能會看到如下的內容:

--master-data [=value]參數

  • 通過該參數產生的備份轉存文件主要用來建立一個replication
  • 在默認情況下,value爲空
  • 當value=1時:轉存文件中記錄change master語句。在備份文件中可以看到:

  • 當value=2時:change master語句被註釋。在備份文件中可以看到:

--master-data參數

  • 該參數會自動忽略--lock-tables選項
  • 如果沒有使用--single-transaction選項,則會自動使用--lock-all-tables選項

--events(-E)參數

  • 備份時間調度器

--routines(-R)參數

  • 備份存儲過程和函數

--triggers參數

  • 備份觸發器

--hex-blob參數

  • 將binary、varbinary、blog、bit列類型備份爲十六進制格式
  • mysqldump導出的文件一般是文本文件,但是如果導出的數據中有上述類型,在文本文件模式下可能有些字符不可見,若添加該參數,結果會以十六進制顯示,如下所示:
    • 這裏可以看到用0x6100000000000000的十六進制格式來導出數據

--tab=path(-T path)參數

  • 該參數產生TAB分割的數據文件。對於每張表,mysqldump創建一個包含create table語句的table_name.sql文件,和包含數據的tbl_name.txt文件
  • 可以使用--fields-terminated-by=...,--fields-enclosed-by=...,-fields-optionally-enclosed-by=...,--fields-escaped-by=...,--lines-terminated-by=...來改變默認的分隔符、換行符等。例如:

  • 有些人喜歡使用select...into outfile的方式來導出一張表,但是通過mysqldump一樣可以完成工作,而且可以一次完成多張表的導出,並且實現導出數據的一致性

--while='where_condition'(-w 'where_condition')參數

  • 導出給定條件的數據
  • 例如導出b數據庫下的表a,並且表a的數據大於2:

二、select...into outfile

  • 該語句也是一種邏輯備份的方法,更準確地說是導出一張表中的數據

語法格式

  • FIELDS [TERMINATED BY 'string']:表示每個列的分隔符
  • [[OPTIONALLY] ENCLOSED BY 'char']:表示對於字符串的包含符
  • [ESCAPED BY 'char']:表示轉義符
  • [STARTING BY 'string']:表示每行的開始符號
  • TERMINATED BY 'string':表示每行的結束符號
  • 如果沒有指定任何FIELDS和LINES選項,默認使用下面的設置:

  • file_name:表示導出的文件,但是文件所在的路徑的權限必須是mysql:mysql的,否則MySQL會報出下面的錯誤:

  • 若導出文件已存在,也會報出錯誤:

演示案例

  • 查看通過select into導出的表a文件

  • 可以發現默認導出的文件是以TAB進行列分割的,如果想要使用其他分隔符,若“,”們可以使用FIELDS TERMINATED BY 'string'選項,如下:

  • 在Windows下,由於換行符時“\r\n”,因此在導出時可能需要指定LINES TERMINATED BY選項,如:

三、邏輯備份的恢復

  • mysqldump的恢復操作比較簡單,因爲備份的文件就是導出的SQL語句,一般只需要執行這個文件就可以了,方法如下:

  • 如果在導出時包含了創建和刪除數據庫的SQL語句,那必須確保刪除數據庫時,數據庫下沒有其他與數據庫相關的文件,否則會報錯:

  • 因爲邏輯備份的文件是由SQL語句組成的,也可以通過SOURCE命令來執行導出的邏輯備份文件,如下:

視圖的備份與恢復

  • 通過mysqldump可以恢復數據庫,但是經常發生一個問題,mysqldump可以導出存儲過程、觸發器、事件、數據,但是不能導出視圖
  • 因此,如果用戶的數據庫中還是用了視圖,那麼在用mysqldump備份完數據庫後還需要導出視圖的定義,或者備份視圖定義的frm文件,並在恢復時進行導入,這樣才能保證mysqldump數據庫的完全恢復

三、load data infile

  • 若通過mysqldump -tab,或者通過select into outfile導出的數據需要恢復,這時可以通過load data infile命令來進行導入
  • 命令的格式如下:

 

  • 要對服務器文件使用該命令,必須擁有FILE權
  • 其中對於導入格式的選項和之前介紹的select into outfile一樣
  • IGNORE number LINES選項可以忽略導入的前幾行

演示案例

  • 下面顯示一個用命令導入文件的示例,並忽略第一行的導入:
load data infile '/home/mysql/a.txt' into table a;
  • 爲了加快InnoDB的導入,可能希望導入過程忽略對外建的檢查,因此可以使用下面的格式:
set @@foreign_key_checks=0;

load data infile '/home/mysql/a.txt' into table a;

set @@foreign_key_checks=1;
  • 另外可以針對指定的列進行導入,如將數據導入列a、b,而c列等於a、b列之和:
create table b(
    a int,
    b int,
    c int,
    primary key(a)
)engine=innodb;

load data infile '/home/mysql/a.txt' into table b fields terminated by ',' (a,b) set c=a+b;

select * from b;

四、mysqlimport

  • mysqlimport是一個命令行工具,從本質上說,是LOAD DATA INFILE的命令接口,而且大對數的選項都和LOAD DATA INFILE語法相同
  • 語法格式如下:

  • 和LOAD DATA INFILE不同的是:
    • mysqlimport命令可以用來導入多張表
    • 並且通過--user-thread參數併發地導入不同的文件。這裏的併發是指併發導入多個文件,而不是指mysqlimport可以併發地導入一個文件
    • 此外,通常來說併發地對同一張表進行導入,其效果一般都不會比串行的方式好

演示案例

  • 通過下面的命令併發地導入2張表:

  • 如果上述命令的運行過程中,查看MySQL數據庫線程列表,可以看到類似下面的內容:

  • 可以看到mysqlimport實際上是同時執行了兩句load data infile併發地導入數據
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章