mysqldump備份與恢復 之 黑鍋俠

    公司這幾天數據庫有數據丟失,所以找到運維部門要恢復數據庫,但是我們的工程師,在執行完恢復命令後,提示語法錯誤,並沒有恢復數據庫,坑爹啊~~~

    具體原因:由於備份時語法錯誤指定的目錄不存在,但在備份的時候又沒報錯,所以工程師以爲備份成功了,最終釀成大禍;(成爲黑鍋俠)

  公司最終開恩,每人扣除1000元的懲罰,下面來總結並模擬下正常過程。


一、錯誤備份演示

語法出錯,備份失效看似備份成功,但查看備份內容時,出現語法錯誤的警告

[root@db02 ~]# mysqldump -uroot -poldboy123 -A -B oldboy >/opt/oldboy_bak1.sql
[root@db02 ~]# cat /opt/oldboy_bak1.sql
Usage: mysqldump [OPTIONS] database [tables]
OR     mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...]
OR     mysqldump [OPTIONS] --all-databases [OPTIONS]
For more options, use mysqldump --help
#提示:
#1,錯誤點就是 -A 與 [-B 指定庫名] 不能同時使用,會產生語法錯誤,看下面解釋就明白了,指定的範圍有衝突
#-A:--all databases 所有數據庫備份
#-B:指定多個數據庫備份 增加建庫語句及use語句 
#mysql 不能使用kill -9 否則後果自負;

補充強調:我們平時發帖子,都是通過web服務器連接mysql,之後通過insert語句把數據存入數據庫

mysqldump的參數說明,總結常用的幾個:

-A:--all databases 所有數據庫備份
-B:指定多個數據庫備份 增加建庫語句及use語句
--compact 減少無用輸出---去掉備份文件中註釋的SQL語句,適合調試,生產中不建議使用
-F 刷新binlog日誌,生產新文件,將來增量從這個新文件開始(完整恢復=全備+臨界點binlog)
--master-data 增加binlog日誌文件名及對應的位置點(有鎖表功能)(即CHANGE MASTER 語句)
--master-data=1 不註釋可執行 
--master-data=2 註釋信息(
-x 是鎖表,爲什麼要鎖表?主要是確保備份數據的完整性,不要出現“鋸齒狀”數據,儘量在業務低谷時備份或內部專門用於備份的從數據庫 在鎖表
-l 對所有表加讀鎖。(默認是打開的,用--skip-lock-tables來關閉,上面的選項會把關閉-l選項)
-d 只備份庫表結構無數據
-t 只備份數據無表結構 SQL語句形式
-T 庫表,數據分離不同文件,數據是文本形式、
--single-transaction  適合InnoDB數據數據庫備份,它有Acid 特性,隔離性:執行dump後,只能看到之前的數據,之後插入的被隔離
-q, --quick 直接導出不寫入內存        Don't buffer query, dump directly to stdout.
##快速               (Defaults to on; use --skip-quick to disable.)
--single-transaction 備份期間不鎖表,又能保證數據一致性(基於innodb引擎),例如給每個人照相,“快照”
-S 多實例指定socket

出現events—warning,下面是 處理方法:

這是因爲mysqldump默認是不備份事件表的,只有加了--events 纔會,解決辦法: 
加上--events  或 --ignore-table=mysql.events 參數即可; 
    #導出事件      #忽略某個表的意思,可以mysqldump --help 查看
mysqldump -uroot -poldboy123 -S /data/3307/mysql.sock  --events  -A >all.sql

-B的“增加建庫語句”作用

如果沒有-B這個參數 備份文件中就不會有如下內容,在恢復的時候不會有建庫的動作

CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mysql` /*!40100 DEFAULT CHARACTER SET utf8 */;
USE `mysql`;

如何拒絕成爲黑鍋俠:膽大心細,善於總結,吸取經驗,脫離黑鍋;

二,正確備份演示

定期做備份恢復演練 或恢復測試

1,在test數據庫中創建student表

mysql> use test;  ##進入test庫
create table student(
id int(4) not null,
name char(20) not null,
age tinyint(2) NOT NULL default '0',
dept varchar(16) default NULL
);
##創建student表 裏面是各個字段的設置

2,備份數據庫test

mysqldump -uroot -poldboy123 -S /data/3307/mysql.sock  -B test >/opt/test.sql
cat /opt/test.sql  #檢測備份是否有效

3,刪除test庫(模擬真實環境)

mysql> drop database test;
Query OK, 0 rows affected (0.00 sec)
mysql> show databases; #沒有test數據了
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| oldboy             |
| performance_schema |
+--------------------

4,恢復test庫

[root@db02 ~]# mysql -uroot -poldboy123 -S /data/3307/mysql.sock  </opt/test.sql
mysql> show databases; #恢復test庫,因爲之前使用-B備份的,所以現在不用指定庫,直接恢復
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| oldboy             |
| performance_schema |
| test               |
+--------------------+
5 rows in set (0.00 sec)
mysql> desc student;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(4)      | NO   |     | NULL    |       |
| name  | char(20)    | NO   |     | NULL    |       |
| age   | tinyint(2)  | NO   |     | 0       |       |
| dept  | varchar(16) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

到此,模擬數據恢復成功。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章