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
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31383567/viewspace-2140041/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- mysql備份恢復mysqldump面面觀MySql
- 【mysqldump】mysqldump及備份恢復示例MySql
- mysqldump常用備份恢復方法MySql
- 使用Mysqldump備份和恢復MySQL資料庫MySql資料庫
- 使用mysqldump對mysql進行備份和恢復MySql
- 詳解MySQL資料備份之mysqldump使用方法MySql
- Xtrabackup之innobackupex備份恢復詳解薦
- mysqldump 備份單張表和恢復MySql
- Effective MySQL之備份與恢復MySql
- 詳解叢集級備份恢復:物理細粒度備份恢復
- mysql之 Innobackupex(全備+增量)備份恢復MySql
- Mysql備份恢復MySql
- mysql 備份恢復MySql
- mysqldump使用方法(MySQL資料庫的備份與恢復)MySql資料庫
- 【MySQL】MySQL備份和恢復MySql
- Oracle備份恢復之熱備份恢復及異機恢復Oracle
- MySQL備份與恢復——基於Xtrabackup物理備份恢復MySql
- MySQL備份與恢復MySql
- Mysql備份和恢復MySql
- MySQL 備份與恢復MySql
- Mysql備份與恢復(1)---物理備份MySql
- RMAN例項備份與恢復詳解
- Mysql增量備份之Mysqldump& MylvmbackupMySqlLVM
- mysql innobackupex增量備份恢復MySql
- MySql邏輯備份恢復MySql
- Mysql的備份與恢復MySql
- mysql備份恢復測試MySql
- MySQL 備份和恢復 一MySql
- Mysql 備份與恢復 二MySql
- RMAN備份與恢復之加密備份加密
- MySQL 非常規恢復與物理備份恢復MySql
- mysql學習筆記之備份與恢復MySql筆記
- Mysql備份與恢復(2)---邏輯備份MySql
- 利用MySQL全備份(mysqldump),如何只恢復一個庫或者一個表?MySql
- MySQL備份與恢復——基於MyDumper/MyLoader 邏輯備份恢復MySql
- mysql 邏輯備份 (mysqldump)MySql
- Oracle 備份恢復之 FlashbackOracle
- MongoDB之備份與恢復MongoDB