1. 程式人生 > 其它 >【mysql】基於mysqldump備份資料庫

【mysql】基於mysqldump備份資料庫

技術標籤:MySql資料庫mysql

文章目錄

1.備份資料庫

1.1mysql備份型別

在操作之前,我們先來看一下mysql有哪些備份型別

1). 按照備份資料庫對資料庫的影響,我們可以分為

Hot backup(熱備):也叫線上備份。指在資料庫執行中直接備份,對正在執行的資料庫沒有任何影響。

Cold backup(冷備):也叫離線備份。指在資料庫停止的情況下備份。

Warm backup(溫備):在資料庫執行時備份,會加一個全域性鎖以保證資料的一致性,會對當前資料庫的操作有影響。

2). 按照備份後的檔案內容分為

邏輯備份:指備份後的檔案內容是可讀的,通常為文字檔案,內容一般是SQL語句或表內的實際資料(mysqldump和select * into outfile),一般適用於資料庫的升級和遷移,還原時間較長。

裸檔案備份:也叫物理備份。拷貝資料庫的物理檔案,資料庫既可以處於執行狀態(mysqlhotcopy、ibbackup、xtrabackup一類工具),也可以處於停止狀態,還原時間較短。

3). 按照備份資料庫的內容分為

完全備份:對資料庫進行完整的備份。

增量備份:在上一次完整備份的基礎上,對更新的資料進行備份(xtrabackup)

日誌備份:二進位制日誌備份,主從同步。

1.2mysqldump備份資料庫

mysqldump命令備份資料庫是將資料庫中的資料備份成一個檔案,也就是字尾名為.sql的檔案,將表的結構和資料儲存在檔案中。首先mysqldump會查詢指定資料庫中的所有表,然後執行create語句,然後將表中的資料轉變為一條insert語句,這樣一個sql檔案就好了。

mysqldump是邏輯備份工具,支援MyISAMInnoDB引擎。資料庫執行時,MyISAM

引擎只支援溫備,InnoDB支援熱備和溫備。

1.2.0mysqldump的基本操作

mysqldump -u username -p dbname table1 table2...>BackupName.sql;
其中:
-u username為使用者的使用者名稱,跟資料庫登入操作一樣
-p 為要登入的密碼,但是注意一點,不要將密碼直接寫在-p的後面,例如:-p123456,這樣會警告提示輸入的指令安全性差。
dbname 為資料庫名
table1,table2為資料庫表名
> BackupName.sql 為所要備份到哪個資料夾,也可以指定路徑,比如
> e:mysqlStore\BackupName.sql
可以備份到指定的資料夾內


;KL

1.2.1備份全部資料庫

mysqldump -u root -p -x  --all-databases > e:mysqlStore\allDB.sql

注意


這裡有一個 -x,如果不加,寫成以下命令

mysqldump -u root -p  --all-databases > e:allDB.sql

有可能會出現

mysqldump: Got error: 1449: The user specified as a definer ('root'@'%') does not exist when using LOCK TABLES

網上查很多都是說 root 使用者訪問許可權不夠的問題,於是為root使用者授權;

grant all privileges on *.* to [email protected]"192.168.0.0/255.255.0.0" identified by "2008";

然後進行檢視授權

mysql> SELECT DISTINCT CONCAT('User: ''',user,'''@''',host,''';') AS query FROM mysql.user;
+-------------------------------------------------+

| query                                           |

+-------------------------------------------------+

| User: 'root'@'%';                               |

| User: 'root'@'localhost';                       |

+-------------------------------------------------+

9 rows in set (0.00 sec)

在次執行,卻發現還是沒有用

mysqldump -u root -p  --all-databases > e:allDB.sql

執行結果:

The user specified as a definer (‘root’@’%’) does not exist when using LOCK TABLES


所以我又繼續查詢,發現是因為這個資料庫是在使用狀態,導致匯出資料時失敗,在mysqldump時使用 -x 選項解決此問題。

–lock-all-tables,-x

在開始匯出之前,提交請求鎖定所有資料庫中的所有表,以保證資料的一致性。這是一個全域性讀鎖,並且自動關閉 --single-transaction--lock-tables 選項。

執行帶有 -x 的選項

mysqldump -u root -p -x  --all-databases > e:allDB.sql

發現還有問題,報錯為

mysqldump: Couldn’t execute 'SHOW FIELDS FROM v_attendance': View ‘class_schedule.v_attendance’ references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them (1356)

這個原因是因為在class_schedule這個資料庫中有檢視的問題,所以解決辦法是優化檢視和刪除,本次檢視沒有用,所以我直接刪了,但還是看大家需求,畢竟刪庫跑路這方法挺危險的。

刪除檢視後,執行帶有 -x 的命令

mysqldump -u root -p -x  --all-databases > e:allDB.sql

發現可以執行,並且在e盤下面匯出一個allDB.sql檔案


1.1.2備份指定的資料庫

我們現在舉例來備份資料庫中已經存在的mysql資料庫,

mysqldump -u root -p  --databases mysql > e:mysqlStore\singelDB.sql

注意

  1. databases前面是兩個 - -,而且必須連在一起,如果沒連在一起,那麼有可能提示

Got error: 1049: Unknown database ‘xxx’ when selecting the database

原因:
該命令表示您要在提示符下輸入密碼並myDB從xxx資料庫中轉儲表。如果您刪除了“ xxx”部分並在提示符下輸入密碼,則它應該可以工作。

如果您實際上想在命令列上指定密碼,則必須這樣做-pWHATEVER(其中“ WHATEVER”是文字密碼,切換後沒有空格),或–password=WHATEVER:

在命令列上指定密碼應該被認為是不安全的。

也就是說如果我們- -和databases沒有連在一起,那麼有可能會誤認為 - -是一個密碼,從而使得失敗,可謂是細節決定成敗啊!

在我們執行完sql命令後,也會發現在指定資料夾中會有一個singleDB.sql檔案
在這裡插入圖片描述


1.1.3備份指定資料庫中指定表

比如說我們現在要備份資料庫 mysql 中的 db 表,執行以下命令

mysqldump -u root -p mysql db > e:mysqlStore\dbTable.sql

這裡我們發現 -p 後面就是 資料庫+對應的表

在這裡插入圖片描述

1.1.4備份指定資料庫的指定的表結構

有時候我們可能只想備份資料庫中表的結構,不想要資料,那麼只需要在前面加一個 -d就好,我們還是以mysql資料庫的db表為例

mysqldump -u root -p -d mysql db >e:mysqlStore\dbStruct.sql

在這裡插入圖片描述

1.1.5備份指定資料庫中的所有表結構

同理,如果我們想備份指定資料庫中所有的表結構,只需把資料庫後面的db刪除便可以了,還是以mysql資料庫為例,執行以下命令

mysqldump -u root -p -d mysql >e:mysqlStore\mysqlAllStruct.sql

在這裡插入圖片描述

1.1.6備份指定資料庫中的指定表的資料

如果我們只想要指定資料庫中指定表的資料,而不是結構,那麼只需將-d換成-t便可以了,我們還是以mysql中的db表為例

mysqldump -u root -p -t mysql db >e:mysqlStore\dbData.sql

在這裡插入圖片描述

1.1.7備份指定資料庫中的所有表的資料

還是一樣的道理,如果我們要備份指定資料庫中的所有表的資料,只需把後面對應的表名刪除便可以了,執行以下命令
在這裡插入圖片描述

mysqldump -u root -p -t mysql >e:mysqlStore\mysqlAllData.sql