【mysql】基於mysqldump備份資料庫
文章目錄
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是邏輯備份工具,支援MyISAM和InnoDB引擎。資料庫執行時,MyISAM
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
注意:
- 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