mysql之 mysqldump 備份恢復詳解


   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
  
  
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM