mysql之 mysqldump 備份恢復詳解

張衝andy發表於2017-05-29

   mysqldump 程式的實現原理是透過我們給的引數資訊加上資料庫中的系統表資訊來一個表一個表獲取資料然後生成 INSERT 語句再寫入備份檔案中的。這樣就出現了一個問題,在系統正常執行過程中,很可能會不斷有資料變更的請求正在執行,這樣就可能造成在 mysqldump 備份出來的資料不一致。也就是說備份資料很可能不是同一個時間點的資料,而且甚至可能都沒辦法滿足完整性約束。這樣的備份集對於有些系統來說可能並沒有太大問題,但是對於有些對資料的一致性和完整性要求比較嚴格系統來說問題就大了,就是一個完全無效的備份集。
    對於如此場景,我們該如何做?我們知道,想資料庫中的資料一致,那麼只有兩種情況下可以做到。
    第一、同一時刻取出所有資料;
    第二、資料庫中的資料處於靜止狀態。
對於第一種情況,大家肯定會想,這可能嗎?不管如何,只要有兩個以上的表,就算我們如何寫程式,都不可能昨晚完全一致的取數時間點啊。是的,我們確實無法透過常規方法讓取數的時間點完全一致,但是大家不要忘記,在同一個事務中,資料庫是可以做到所讀取的資料是處於同一個時間點的。所以,對於事務支援的儲存引擎,如 Innodb 或者 BDB 等 ,我們就可以透過控制將整個備份過程控制在同一個事務中,來達到備份資料的一致性和完整性,而且 mysqldump 程式也給我們提供了相關的引數選項來支援該功能,就是透過“--single-transaction”選項,可以不影響資料庫的任何正常服務。原理是透過快照實現的。
補充:
   single-transaction可以讓mysqldump 的時候不鎖表。但是他有3個前提:
   a、innodb的引擎
   b、不能在執行的同時,有其他alter table ,drop table,rename table,truncate table的操作。
   c、隔離級別 必須是REPEATABLE READ ,很多公司都會修改這個隔離級別的,比如阿里雲的rds ,預設隔離級別是READ-COMMITTED 
--single-transaction 
                      Creates a consistent snapshot by dumping all tables in a
                      single transaction. Works ONLY for tables stored in
                      storage engines which support multiversioning (currently
                      only InnoDB does); the dump is NOT guaranteed to be
                      consistent for other storage engines. While a
                      --single-transaction dump is in process, to ensure a
                      valid dump file (correct table contents and binary log
                      position), no other connection should use the following
                      statements: ALTER TABLE, DROP TABLE, RENAME TABLE,
                      TRUNCATE TABLE, as consistent snapshot is not isolated
                      from them. Option automatically turns off --lock-tables.
   

對於第二種情況我想大家首先想到的肯定是將需要備份的表鎖定,只允許讀取而不允許寫入。是的,我們確實只能這麼做。我們只能透過一個折衷的處理方式,讓資料庫在備份過程中僅提供資料的查詢服務,鎖定寫入的服務,來使資料暫時處於一個一致的不會被修改的狀態,等mysqldump 完成備份後再取消寫入鎖定,重新開始提供完整的服務。mysqldump 程式自己也提供了相關選項如“--lock-tables”和“--lock-all-tables ” ,在執行之前會鎖定表,執行結束後自動釋放鎖定。這裡有一點需要注意的就是,“--lock-tables ” 一次性將需要 dump 的所有表鎖定,如果你需要 dump 的表分別在多個不同的資料庫中,一定要使用“--lock-all-tables”才能確保資料的一致完整性。   

 mysqldump是MySQL用於轉儲存資料庫的客戶端程式。轉儲包含建立表和/或裝載表的SQL語句 ,用來實現輕量級的快速遷移或恢復資料庫,是mysql資料庫實現邏輯備份的一種方式。 mysqldump不適用於大型資料庫備份與恢復,速度慢,不支援並行,其次SQL重放將耗用大量的I/O。

1、檢視詳細 mysqldump 幫助資訊
[root@mysql ~]# mysqldump --help
Dumping structure and contents of MySQL databases and tables.
Usage: mysqldump [OPTIONS] database [tables]
OR     mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...]
OR     mysqldump [OPTIONS] --all-databases [OPTIONS]
2、 mysqldump 中主要引數介紹
2.1
--opt               Same as --add-drop-table, --add-locks, --create-options,
                      --quick, --extended-insert, --lock-tables, --set-charset,
                      and --disable-keys. Enabled by default, disable with --skip-opt.
 -q, --quick         Don't buffer query, dump directly to stdout.
                      (Defaults to on; use --skip-quick to disable.)
說明:預設情況下以上2個引數為開啟狀態,如果2個引數未使用的情況下,在轉儲結果之前會把全部內容載入到記憶體中,對於較大的資料庫轉儲將嚴重影響效能。
2.2
--default-character-set=name       Set the default character set.
說明:設定匯出指令碼的字符集,未指定的情況下為UTF8。
2.3
-d, --no-data       No row information.
說明:不輸出資料行,僅匯出結構
 -t, --no-create-info      Don't write table creation info.
說明:只匯出表資料,不匯出表結構
2.4
--triggers          Dump triggers for each dumped table.(Defaults to on; use --skip-triggers to disable.)
說明:觸發器預設匯出
-R, --routines      Dump stored routines (functions and procedures).
說明:儲存過程與函式預設不匯出
2.5
--single-transaction 
說明:建立一致性快照,僅僅針對innodb引擎
-f, --force         Continue even if we get an SQL error.                                            
說明:有錯誤時,依舊強制dump
2.6
--add-drop-table    Add a DROP TABLE before each create.
                      (Defaults to on; use --skip-add-drop-table to disable.)
說明:在匯入恢復的時候,建立表之前,先執行刪除表操作。

3、範例

注意(特別注意這兩點,防止誤操作,丟失資料):
--database會生成建庫語句 預設是關閉的,如:CREATE DATABASE /*!32312 IF NOT EXISTS*/ `test` /*!40100 DEFAULT CHARACTER SET utf8 */; 意思是如果 mysqldump 的資料庫不存在就匯入恢復時自行建立,存在就不建立。
--add-drop-table 預設是開啟的,在匯入恢復時,如果該表存在,會先刪除再建立 如:DROP TABLE IF EXISTS `test`; 
禁用是引數 --skip-add-drop-table 。
                     
3.1
  備份伺服器上的所有資料庫
  shell> mysqldump -uXX -pXX --all-databases --opt --compact --flush-privileges --routines >alldb_$(date +%F).sql
  恢復所有資料庫
  shell>mysql -uXX -pXX <alldb_$(date +%F).sql

  同時備份多個資料庫
  shell> mysqldump -uXX -pXX --database db_1 db_2  --routines  >multidb_$(date +%F).sql
  同時恢復多個資料庫 
  shell> mysql -uroot -poracle < multidb_$(date +%F).sql

  備份單個資料庫
  shell>mysqldump -uXX -pXX db_name --opt --routines > db_name_$(date +%F).sql
  恢復單個資料庫
  shell>mysql -uXX -pXX db_name < db_name_$(date +%F).sql

3.2
 備份資料庫的結構,不備份資料
  shell> mysqldump -uXX -pXX db_name --no-data  --routines  >db_name_onlystructure_$(date +%F).sql

  備份資料庫的資料,不備份結構
  shell> mysqldump -uXX -pXX --opt db_name --no-create-info >db_name_onlydata_$(date +%F).sql
3.3  
  備份資料庫上的特定表
  shell> mysqldump  -uXX -pXX --opt db_name t_name > db.t_name_$(date +%F).sql
  恢復資料庫上的特定表 
  shell> mysql -uXX -pXX dbname < db_name_$(date +%F)_$(date +%F).sql

  備份指定資料庫上的多個指定表
  shell> mysqldump -uroot -poracle --database test test02  --routines  >multi_t_$(date +%F).sql
  恢復指定資料庫上的多個指定表
   mysql -uroot -poracle < /tmp/multi_t_$(date +%F).sql

  備份表上特定的記錄
  shell> mysqldump -uXX -pXX db_name t_name -w "first_name='NICK'" >db.t_name_row_$(date +%F).sql  
3.4
  只匯出資料庫中的儲存過程,函式,觸發器
  shell> mysqldump -uXX -pXX db_name --no-create-db --no-data --no-tablespaces --no-create-info --routines >db_name_$(date +%F).sql
  
  
 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31383567/viewspace-2140041/,如需轉載,請註明出處,否則將追究法律責任。

相關文章