關(guān)于刪庫(kù)跑路的事故現(xiàn)在已經(jīng)屢見(jiàn)不鮮了,,數(shù)據(jù)備份的必要性是企業(yè)數(shù)據(jù)管理極其重要的一項(xiàng)工作,。關(guān)于數(shù)據(jù)備份,、恢復(fù)也有很多場(chǎng)景及方法,,本系列也會(huì)將主要的幾種工具通過(guò)案例進(jìn)行演示,。 本系列將從邏輯備份及恢復(fù)開(kāi)始講起,,邏輯備份的工具主要有mysqldump/mydumper等其中mydumper可以指定多線程工作,,本文介紹的是mysqldump,。 1. mysqldump 備份mysqldump是MySQL數(shù)據(jù)庫(kù)自帶的邏輯備份工具,屬于熱備工具,。它的備份結(jié)果是根據(jù)設(shè)置的參數(shù)將數(shù)據(jù)庫(kù)中的信息通過(guò)生成創(chuàng)建庫(kù),、表等對(duì)象以及對(duì)應(yīng)表的insert語(yǔ)句組成。 mysqldump 參數(shù)選項(xiàng)特別多,,可以通過(guò)mysqldump --help 查看對(duì)應(yīng)的參數(shù)及說(shuō)明() [root@testdb ~]# mysqldump --help
mysqldump常用的選項(xiàng)如下 1.1 備份指定表mysqldump可以備份指定的單個(gè)表或指定庫(kù)的多個(gè)表,,例如備份testdb庫(kù)的test1表的表結(jié)構(gòu)和數(shù)據(jù) /* 備份testdb庫(kù)的test1表 */ /usr/local/mysql5.7/bin/mysqldump -uroot -p --socket=/tmp/mysql.sock --master-data=2 --default-character-set=utf8 --single-transaction testdb test1 > test1.sql 備份后的文件主體部分如下: 主要參數(shù)說(shuō)明: --master-data=2 記錄當(dāng)前binlog信息,有1和2兩個(gè)值,如果值等于1,,就會(huì)添加一個(gè)CHANGE MASTER語(yǔ)句;如果值等于2,,也會(huì)生成一個(gè)CHANGE MASTER,但是語(yǔ)句前添加注釋,,
1.2. 備份單個(gè)數(shù)據(jù)庫(kù)mysqldump可以備份指定的數(shù)據(jù)庫(kù),,可以是單個(gè)庫(kù)也可以是多個(gè)庫(kù),先備份單個(gè)庫(kù),,如下 /* 備份整個(gè)testdb庫(kù) */ /usr/local/mysql5.7/bin/mysqldump -uroot -p --socket=/tmp/mysql.sock --master-data=2 --default-character-set=utf8 --single-transaction testdb > testdb.sql 結(jié)果如下,,會(huì)將testdb庫(kù)下的所有表的結(jié)構(gòu)和數(shù)據(jù)都備份出來(lái) 1.3 備份多個(gè)庫(kù)備份多個(gè)數(shù)據(jù)庫(kù)可以用如下命令 /* 備份monitor庫(kù)及testdb庫(kù) */ /usr/local/mysql5.7/bin/mysqldump -uroot -p --socket=/tmp/mysql.sock --master-data=2 --default-character-set=utf8 --single-transaction --databases monitor testdb > mul_db.sql 結(jié)果中主要信息如下,包含了創(chuàng)建庫(kù)及切換庫(kù)的內(nèi)容 參數(shù)說(shuō)明(其他參數(shù)之前也說(shuō)明,,此處不再贅述): --databases 后面填寫(xiě)需要備份的數(shù)據(jù)庫(kù)名即可指定備份對(duì)應(yīng)的庫(kù) 1.4 備份所有的數(shù)據(jù)庫(kù)如果想備份所有的數(shù)據(jù)庫(kù),,可以使用如下命令: /* 備份所有數(shù)據(jù)庫(kù) */ /usr/local/mysql5.7/bin/mysqldump -uroot -p --socket=/tmp/mysql.sock --master-data=2 --default-character-set=utf8 --single-transaction --all-databases > all_db.sql 注: 備份中沒(méi)有information_schema、performance_schema,、sys庫(kù)的信息(MySQL5.7及以上版本) 1.5 其他情況實(shí)際使用中可能還會(huì)遇到只備份表結(jié)構(gòu),、只備份數(shù)據(jù),需要備份存儲(chǔ)過(guò)程及事件等需求,,相應(yīng)參數(shù)如下: --no-data 只備份表結(jié)構(gòu),,不包含數(shù)據(jù),可以簡(jiǎn)寫(xiě)為 -d --no-create-info 只備份數(shù)據(jù),,不備份建表信息,,也可以簡(jiǎn)寫(xiě)為-t --routines 備份存儲(chǔ)過(guò)程及函數(shù),可以簡(jiǎn)寫(xiě)為 -R --events 備份事件,可以簡(jiǎn)寫(xiě)為 -E --triggers 備份觸發(fā)器 --flush-logs 備份完成后切換日志 --flush-privileges 備份完成后刷新權(quán)限 --set-gtid-purged 開(kāi)啟了GTID的庫(kù)需要設(shè)置該參數(shù),,值可以是ON, OFF 或 AUTO --where 指定條件,,例如每張表導(dǎo)出1000行的記錄或者 導(dǎo)出每張表id<=10的記錄等,可以參考?xì)v史文章查看示例 1.6 示例腳本備份全部數(shù)據(jù)庫(kù),,包含觸發(fā)器,、事件、存儲(chǔ)過(guò)程,,同時(shí)刷新日志及權(quán)限的實(shí)例 /usr/local/mysql5.7/bin/mysqldump -uroot -p --socket=/tmp/mysql.sock --master-data=2 --default-character-set=utf8 --routines --triggers --events --flush-logs --flush-privileges --single-transaction --all-databases >backup.sql 注意:備份中存在drop表的情況,如果確定需要重建表則保持默認(rèn),,否則保險(xiǎn)起見(jiàn),,添加--skip-add-drop-table 參數(shù) 1.7 說(shuō)點(diǎn)特別的mysqldump也可以生成平面文件,同時(shí)指定分隔符等,,此情況比較簡(jiǎn)單,,可以自行測(cè)試 1.8 使用場(chǎng)景mysqldump屬于邏輯備份,使用的主要場(chǎng)景如下:
2 模擬誤刪數(shù)據(jù)操作模擬誤刪除testdb庫(kù)的test1表中的一條記錄 mysql> delete from test1 where name='孫權(quán)'; Query OK, 1 row affected (0.00 sec)
3. 恢復(fù)數(shù)據(jù)通過(guò)mysqldump備份的數(shù)據(jù)還原比較簡(jiǎn)單,,將備份的文件導(dǎo)入數(shù)據(jù)庫(kù)中即可,。 3.1 恢復(fù)test1表可以使用如下三種方式恢復(fù): a) 登錄進(jìn)數(shù)據(jù)庫(kù)里用source 命令恢復(fù) /* 將備份數(shù)據(jù)恢復(fù)至 rec 庫(kù)中 */ mysql> use rec; Database changed /* 恢復(fù)數(shù)據(jù) */ mysql> source test1.sql; b) 使用 mysql -e 的方式恢復(fù) /* 此方式等同于第一種 */ [root@testdb ~]# /usr/local/mysql5.7/bin/mysql --socket=/tmp/mysql.sock --port=3306 -uroot -p -e "use rec ; source test1.sql;" Enter password: c) 直接 MySQL 導(dǎo)入備份文件的方式 [root@testdb ~]# /usr/local/mysql5.7/bin/mysql --socket=/tmp/mysql.sock --port=3306 -uroot -p rec < test1.sql Enter password: 注: a) 還原命令使用起來(lái)比較方便,,但是實(shí)際生產(chǎn)環(huán)境中還原數(shù)據(jù)時(shí)不建議直接還原至目標(biāo)表里(尤其處理誤刪除恢復(fù)數(shù)據(jù)時(shí)),而是建議先還原至其他實(shí)例或其他庫(kù)里,,確認(rèn)無(wú)誤后再將需要還原的記錄導(dǎo)入至目標(biāo)表里; b) 要警惕備份文件中是否有刪除庫(kù)或刪表的指令,,否則如果選擇在同一實(shí)例中還原即使選擇了臨時(shí)恢復(fù)的庫(kù),而備份文件里有use db,;及drop table的語(yǔ)句,,則會(huì)將目標(biāo)表全部刪掉。 3.2 恢復(fù)誤刪除的記錄至目標(biāo)表mysql> insert into testdb.test1 select * from rec.test1 where name='孫權(quán)'; Query OK, 1 row affected (0.01 sec) Records: 1 Duplicates: 0 Warnings: 0 此時(shí)記錄恢復(fù)至數(shù)據(jù)庫(kù)中了,。 4. mysqldump的原理通過(guò)查看備份文件可以看到大致的流程,,也可以通過(guò)開(kāi)啟general log的方式看具體都執(zhí)行哪些SQL。 4.1 查看general log先查看配置 然后開(kāi)啟genera-log 4.2 開(kāi)始備份我們就用之前的推薦備份腳本進(jìn)行備份 /usr/local/mysql5.7/bin/mysqldump -uroot -p --socket=/tmp/mysql.sock --master-data=2 --default-character-set=utf8 --routines --triggers --events --flush-logs --flush-privileges --single-transaction --all-databases > all_db.sql 4.3 關(guān)閉general-log因開(kāi)啟general-log對(duì)數(shù)據(jù)庫(kù)性能影響大(表現(xiàn)特別明顯),,因此測(cè)試完畢后關(guān)閉general log,。勿忘,切記,。 4.4 查看general-log內(nèi)容后面開(kāi)始備份具體庫(kù)的內(nèi)容 備份其他庫(kù)的內(nèi)容與此相同,,省略。 以上內(nèi)容,,如需轉(zhuǎn)載,,請(qǐng)注明出處,謝謝)
使用mysqldump工具備份及恢復(fù)數(shù)據(jù)至此就基本介紹完畢了,,如果補(bǔ)充或想獲取原圖的請(qǐng)聯(lián)系我(關(guān)注公眾號(hào): 數(shù)據(jù)庫(kù)干貨鋪),。
|
|