您好,登錄后才能下訂單哦!
公司這幾天數據庫有數據丟失,所以找到運維部門要恢復數據庫,但是我們的工程師,在執行完恢復命令后,提示語法錯誤,并沒有恢復數據庫,坑爹啊~~~
具體原因:由于備份時語法錯誤 或 指定的目錄不存在,但在備份的時候又沒報錯,所以工程師以為備份成功了,最終釀成大禍;(成為黑鍋俠)
公司最終開恩,每人扣除1000元的懲罰,下面來總結并模擬下正常過程。
博主新的博客地址: https://www.dgstack.cn/ 進入有驚喜哦~~ 歡迎收藏
一、錯誤備份演示
語法出錯,備份失效看似備份成功,但查看備份內容時,出現語法錯誤的警告
[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)
到此,模擬數據恢復成功。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。