公司這幾天數(shù)據(jù)庫有數(shù)據(jù)丟失,所以找到運(yùn)維部門要恢復(fù)數(shù)據(jù)庫,但是我們的工程師,在執(zhí)行完恢復(fù)命令后,提示語法錯(cuò)誤,并沒有恢復(fù)數(shù)據(jù)庫,坑爹啊~~~
創(chuàng)新互聯(lián)專注于企業(yè)網(wǎng)絡(luò)營銷推廣、網(wǎng)站重做改版、耀州網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、H5場(chǎng)景定制、商城網(wǎng)站建設(shè)、集團(tuán)公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站建設(shè)公司、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為耀州等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。
具體原因:由于備份時(shí)語法錯(cuò)誤或 指定的目錄不存在,但在備份的時(shí)候又沒報(bào)錯(cuò),所以工程師以為備份成功了,最終釀成大禍;(成為黑鍋俠)
公司最終開恩,每人扣除1000元的懲罰,下面來總結(jié)并模擬下正常過程。
博主新的博客地址: https://www.dgstack.cn/ 進(jìn)入有驚喜哦~~ 歡迎收藏
一、錯(cuò)誤備份演示
語法出錯(cuò),備份失效看似備份成功,但查看備份內(nèi)容時(shí),出現(xiàn)語法錯(cuò)誤的警告
[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,錯(cuò)誤點(diǎn)就是 -A 與 [-B 指定庫名] 不能同時(shí)使用,會(huì)產(chǎn)生語法錯(cuò)誤,看下面解釋就明白了,指定的范圍有沖突 #-A:--all databases 所有數(shù)據(jù)庫備份 #-B:指定多個(gè)數(shù)據(jù)庫備份 增加建庫語句及use語句 #mysql 不能使用kill -9 否則后果自負(fù);
補(bǔ)充強(qiáng)調(diào):我們平時(shí)發(fā)帖子,都是通過web服務(wù)器連接mysql,之后通過insert語句把數(shù)據(jù)存入數(shù)據(jù)庫
mysqldump的參數(shù)說明,總結(jié)常用的幾個(gè):
-A:--all databases 所有數(shù)據(jù)庫備份 -B:指定多個(gè)數(shù)據(jù)庫備份 增加建庫語句及use語句 --compact 減少無用輸出---去掉備份文件中注釋的SQL語句,適合調(diào)試,生產(chǎn)中不建議使用 -F 刷新binlog日志,生產(chǎn)新文件,將來增量從這個(gè)新文件開始(完整恢復(fù)=全備+臨界點(diǎn)binlog) --master-data 增加binlog日志文件名及對(duì)應(yīng)的位置點(diǎn)(有鎖表功能)(即CHANGE MASTER 語句) --master-data=1 不注釋可執(zhí)行 --master-data=2 注釋信息( -x 是鎖表,為什么要鎖表?主要是確保備份數(shù)據(jù)的完整性,不要出現(xiàn)“鋸齒狀”數(shù)據(jù),盡量在業(yè)務(wù)低谷時(shí)備份或內(nèi)部專門用于備份的從數(shù)據(jù)庫 在鎖表 -l 對(duì)所有表加讀鎖。(默認(rèn)是打開的,用--skip-lock-tables來關(guān)閉,上面的選項(xiàng)會(huì)把關(guān)閉-l選項(xiàng)) -d 只備份庫表結(jié)構(gòu)無數(shù)據(jù) -t 只備份數(shù)據(jù)無表結(jié)構(gòu) SQL語句形式 -T 庫表,數(shù)據(jù)分離不同文件,數(shù)據(jù)是文本形式、 --single-transaction 適合InnoDB數(shù)據(jù)數(shù)據(jù)庫備份,它有Acid 特性,隔離性:執(zhí)行dump后,只能看到之前的數(shù)據(jù),之后插入的被隔離 -q, --quick 直接導(dǎo)出不寫入內(nèi)存 Don't buffer query, dump directly to stdout. ##快速 (Defaults to on; use --skip-quick to disable.) --single-transaction 備份期間不鎖表,又能保證數(shù)據(jù)一致性(基于innodb引擎),例如給每個(gè)人照相,“快照” -S 多實(shí)例指定socket
出現(xiàn)events—warning,下面是 處理方法:
這是因?yàn)閙ysqldump默認(rèn)是不備份事件表的,只有加了--events 才會(huì),解決辦法: 加上--events 或 --ignore-table=mysql.events 參數(shù)即可; #導(dǎo)出事件 #忽略某個(gè)表的意思,可以mysqldump --help 查看 mysqldump -uroot -poldboy123 -S /data/3307/mysql.sock --events -A >all.sql
-B的“增加建庫語句”作用
如果沒有-B這個(gè)參數(shù) 備份文件中就不會(huì)有如下內(nèi)容,在恢復(fù)的時(shí)候不會(huì)有建庫的動(dòng)作
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mysql` /*!40100 DEFAULT CHARACTER SET utf8 */; USE `mysql`;
如何拒絕成為黑鍋俠:膽大心細(xì),善于總結(jié),吸取經(jīng)驗(yàn),脫離黑鍋;
二,正確備份演示
定期做備份恢復(fù)演練 或恢復(fù)測(cè)試
1,在test數(shù)據(jù)庫中創(chuàng)建student表
mysql> use test; ##進(jìn)入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 ); ##創(chuàng)建student表 里面是各個(gè)字段的設(shè)置
2,備份數(shù)據(jù)庫test
mysqldump -uroot -poldboy123 -S /data/3307/mysql.sock -B test >/opt/test.sql cat /opt/test.sql #檢測(cè)備份是否有效
3,刪除test庫(模擬真實(shí)環(huán)境)
mysql> drop database test; Query OK, 0 rows affected (0.00 sec) mysql> show databases; #沒有test數(shù)據(jù)了 +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | oldboy | | performance_schema | +--------------------
4,恢復(fù)test庫
[root@db02 ~]# mysql -uroot -poldboy123 -S /data/3307/mysql.sock show databases; #恢復(fù)test庫,因?yàn)橹笆褂?B備份的,所以現(xiàn)在不用指定庫,直接恢復(fù) 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)
到此,模擬數(shù)據(jù)恢復(fù)成功。