CentOS7mysql5.7使用mysqldump與binlog進(jìn)行數(shù)據(jù)備份與恢復(fù)

數(shù)據(jù)備份

1.mysqldump備份

語(yǔ)法:

mysqldump -uroot -p [database name] > [dump file]

列如:

mysqldump -uroot -p --all-databases? > test.sql? #備份所有數(shù)據(jù)庫(kù)結(jié)構(gòu)和數(shù)據(jù)

mysqldump -uroot -p --databases a b > test.sql?#備份a、b數(shù)據(jù)庫(kù)結(jié)構(gòu)和數(shù)據(jù)

mysqldump -uroot -p a > test.sql?? #備份a數(shù)據(jù)庫(kù)結(jié)構(gòu)和數(shù)據(jù),但是生成的sql文件沒(méi)有CREATE DATABASE 和USE語(yǔ)句(不推薦)

mysqldump -uroot -proot --no-data --databases a >test.sql? #備份a數(shù)據(jù)庫(kù)的結(jié)構(gòu)

mysqldump -uroot -p --databases a --tables a1 a2 > test.sql?#備份a數(shù)據(jù)庫(kù)下a1,a2表結(jié)構(gòu)和數(shù)據(jù)(創(chuàng)建的sql語(yǔ)句沒(méi)有use選庫(kù),恢復(fù)的時(shí)候得先登錄,在use dbname;source test.sql;)

mysqldump -hhost1 -uroot -proot --databases db1 |mysql -hhost2 -uroot -proot db2? #跨服務(wù)器導(dǎo)出導(dǎo)入數(shù)據(jù),將host1服務(wù)器中的db1數(shù)據(jù)庫(kù)的所有數(shù)據(jù)導(dǎo)入到host2中的db2數(shù)據(jù)庫(kù)中,db2的數(shù)據(jù)庫(kù)必須存在否則會(huì)報(bào)錯(cuò)(可以加上 -C參數(shù)可以啟用壓縮傳遞)

mysqldump -uroot -p -B -F -R -x --master-data=2 a|gzip >ops_$(date +%F).sql.gz ? ? #-B:指定數(shù)據(jù)庫(kù),-F:刷新日志,-R:備份存儲(chǔ)過(guò)程等,-x:鎖表,--master-data:在備份語(yǔ)句里添加CHANGE MASTER語(yǔ)句以及binlog文件及位置點(diǎn)信息,備份a數(shù)據(jù)庫(kù),輸出文件名年月日的gz格式

其余參數(shù):

-no-create-info, -t 只導(dǎo)出數(shù)據(jù),而不添加CREATE TABLE 語(yǔ)句

no-create-db, -n 只導(dǎo)出數(shù)據(jù),而不添加CREATE DATABASE 語(yǔ)句

--ignore-table 導(dǎo)出數(shù)據(jù)庫(kù)時(shí)忽略某個(gè)表

--force,-f 在導(dǎo)出過(guò)程中忽略出現(xiàn)的SQL錯(cuò)誤,當(dāng)出現(xiàn)錯(cuò)誤時(shí)仍然繼續(xù)后面的操作

--add-drop-database 每個(gè)數(shù)據(jù)庫(kù)創(chuàng)建之前添加drop數(shù)據(jù)庫(kù)語(yǔ)句

--add-drop-table 每個(gè)數(shù)據(jù)表創(chuàng)建之前添加drop數(shù)據(jù)表語(yǔ)句,默認(rèn)為打開(kāi)狀態(tài),使用–skip-add-drop-table取消選項(xiàng)

--add-locks在每個(gè)表導(dǎo)出之前增加LOCK TABLES并且之后UNLOCK TABLE,默認(rèn)為打開(kāi)狀態(tài),使用–skip-add-locks取消選項(xiàng)

--default-character-set 設(shè)置默認(rèn)字符集,默認(rèn)值為utf8

--comments 附加注釋信息,默認(rèn)為打開(kāi),可以--skip-comments取消

--compact導(dǎo)出更少的輸出信息(用于調(diào)試),去掉注釋和頭尾等結(jié)構(gòu),(可以使用選項(xiàng) –skip-add-drop-table –skip-add-locks –skip-comments –skip-disable-keys)

--events, -E 導(dǎo)出事件

--flush-privileges 在導(dǎo)出mysql數(shù)據(jù)庫(kù)之后,發(fā)出一條FLUSH PRIVILEGES 語(yǔ)句

--flush-logs 開(kāi)始導(dǎo)出之前刷新日志,請(qǐng)注意,假如一次導(dǎo)出多個(gè)數(shù)據(jù)庫(kù)(使用選項(xiàng)–databases或者–all-databases),將會(huì)逐個(gè)數(shù)據(jù)庫(kù)刷新日志

除使用--lock-all-tables或者--master-data外,在這種情況下,日志將會(huì)被刷新一次,相應(yīng)的表同時(shí)被鎖定,因此,如果打算同時(shí)導(dǎo)出和刷新日志應(yīng)該使用–lock-all-tables 或者–master-data 和–flush-logs

--delayed-insert 采用延時(shí)插入方式(INSERT DELAYED)

--comments 添加注釋信息

--compact 壓縮模式,產(chǎn)生更少的輸出

--complete-insert 輸出完成的插入語(yǔ)句

--default-character-set 指定默認(rèn)字符集

--lock-tables 備份前,鎖定所有數(shù)據(jù)庫(kù)表

--obt 建表語(yǔ)句包含drop table if exists tableName,insert之前包含一個(gè)鎖表語(yǔ)句lock tables tableName write,insert之后包含unlock tables

--lock-all-tables, -x提交請(qǐng)求鎖定所有數(shù)據(jù)庫(kù)中的所有表,以保證數(shù)據(jù)的一致性,這是一個(gè)全局讀鎖,并且自動(dòng)關(guān)閉–single-transaction 和–lock-tables 選項(xiàng)

--debug 輸出debug信息,用于調(diào)試(默認(rèn)值為d:t:o,/tmp/mysqldump.trace)例 mysqldump -uroot -p –all-databases –debug=” d:t:o,/tmp/debug.trace”

在導(dǎo)入sql語(yǔ)句的時(shí)候,mysql會(huì)使用LOCK?TABLESUNLOCK?TABLES來(lái)鎖表,是表級(jí)鎖,分為可讀,可寫。

語(yǔ)法: LOCK?TABLES tablename READ | WRITE;

如果一個(gè)線程獲得在一個(gè)表上的一個(gè)READ鎖,該線程和所有其他線程只能從表中讀。

如果一個(gè)線程獲得一個(gè)表上的一個(gè)WRITE鎖,那么只有持鎖的線程READ或WRITE表,其他線程被阻塞。

UNLOCK?TABLES釋放被當(dāng)前線程持有的任何鎖。

當(dāng)線程發(fā)出另外一個(gè)LOCK?TABLES時(shí),或當(dāng)服務(wù)器的連接被關(guān)閉時(shí),當(dāng)前線程鎖定的所有表會(huì)自動(dòng)被解鎖。

2.從備份文件恢復(fù)數(shù)據(jù)庫(kù)

語(yǔ)法

mysql -uroot -p? < [backup file name]

列如:

1.在Shell命令下:

mysql –uroot –p? < test.sql

2,在mysql命令下,用source命令導(dǎo)入備份文件:

mysql>? source test.sql;????????? //已登錄mysql,用source命令

如果備份文件中不包含CREATE DATABASEUSE語(yǔ)句,那么在恢復(fù)的時(shí)候必須先創(chuàng)建數(shù)據(jù)庫(kù)。

3.mysqlbinlog二進(jìn)制日志增量備份

從mysqldump備份文件恢復(fù)數(shù)據(jù)會(huì)丟失掉從備份點(diǎn)開(kāi)始的更新數(shù)據(jù),所以還需要結(jié)合mysqlbinlog二進(jìn)制日志增量備份。

binlog簡(jiǎn)介

binlog日志由配置文件的 log-bin 選項(xiàng)負(fù)責(zé)啟用,MySQL服務(wù)器將在數(shù)據(jù)根目錄創(chuàng)建兩個(gè)新文 件XXX-bin.001和xxx-bin.index,若配置選項(xiàng)沒(méi)有給出文件名,Mysql將使用主機(jī)名稱命名這兩個(gè)文件,其中.index文件包含一份全體日志文件的清單。

Mysql會(huì)把用戶對(duì)所有數(shù)據(jù)庫(kù)的內(nèi)容和結(jié)構(gòu)的修改情況記入XXX-bin.n文件,而不會(huì)記錄 SELECT和沒(méi)有實(shí)際更新的UPDATE語(yǔ)句。

當(dāng)MySQL數(shù)據(jù)庫(kù)停止或重啟時(shí),服務(wù)器會(huì)把日志文件記入下一個(gè)日志文件,Mysql會(huì)在重啟時(shí)生成一個(gè)新的binlog日志文件,文件序號(hào)遞增,此外,如果日志文件超過(guò)max_binlog_size系統(tǒng)變量配置的上限時(shí),也會(huì)生成新的日志文件。

3.1開(kāi)啟binlog日志

修改 MySQL 的配置文件my.cnf 如下:

[mysqld]?

log-bin = ON

binlog_format = row?

log-bin-index =/var/lib/mysql/data/mysql-bin.index

#指定的是binlog文件的索引文件,這個(gè)文件管理了所有的binlog文件的目錄

log-bin-basename =/var/lib/mysql/data/mysql-bin

#binlog日志的基本文件名,后面會(huì)追加標(biāo)識(shí)來(lái)表示每一個(gè)文件

server-id?= 1

#需要記錄binlog數(shù)據(jù)庫(kù)

binlog_do_db = mall

binlog_format的幾種格式:(STATEMENT,ROW和MIXED)

?STATEMENT:基于SQL語(yǔ)句的復(fù)制(statement-based replication, SBR) ,日志文件小,節(jié)約IO,提高性能。準(zhǔn)確性差,對(duì)一些系統(tǒng)函數(shù)不能準(zhǔn)確復(fù)制或不能復(fù)制,如now()、uuid()等 ?

ROW:基于行的復(fù)制(row-based replication, RBR)? ,準(zhǔn)確性強(qiáng),能準(zhǔn)確復(fù)制數(shù)據(jù)的變更。日志文件大,較大的網(wǎng)絡(luò)IO和磁盤IO。?

MIXED:混合模式復(fù)制(mixed-based replication, MBR)。準(zhǔn)確性強(qiáng),文件大小適中,有可能發(fā)生主從不一致問(wèn)題。

5.7.3以后版本必須配置server-id,隨機(jī)指定一個(gè)不能和其他集群中機(jī)器重名的字符串,如果只有一臺(tái)機(jī)器,那就可以隨便指定了。

可以省略log-bin-index 和log-bin-basename參數(shù),把log-bin = ON 換成log-bin = /var/lib/mysql/data/mysql-bin即可。

查看binlog開(kāi)啟情況

登錄mysql;show variables like '%log_bin%';查看

查看binlog日志

mysqlbinlog /var/lib/mysql/data/mysql-bin.000001? #一般的statement格式的二進(jìn)制文件

mysqlbinlog -v /var/lib/mysql/data/mysql-bin.000001? #如果是row格式,加上-v或者-vv參數(shù)就行

如下:

server id 13453 : 數(shù)據(jù)庫(kù)主機(jī)的服務(wù)號(hào);

end_log_pos 535: sql結(jié)束時(shí)的pos節(jié)點(diǎn);

查看binlog日志列表

使用

mysql> show master logs;

刪binlog日志

(1)使用reset master,該命令將會(huì)刪除所有日志,并讓日志文件重新從000001開(kāi)始。

mysql > reset master;

(2)使用命令:PURGE{BINARY|MASTER}LOGS{TO'log_name'|BEFOREdatetime_expr }

mysql> purge master logs to "binlog_name.00000X"? #將會(huì)清空00000X之前的所有日志文件

binlog日志恢復(fù)

這個(gè)binlog二進(jìn)制binlog日志包括兩類文件:

* 索引文件(文件名后綴為.index)用于記錄哪些日志文件正在被使用

* 日志文件(文件名后綴為.00000*)記錄數(shù)據(jù)庫(kù)所有的DDL和DML(除了數(shù)據(jù)查詢語(yǔ)句)語(yǔ)句事件。

在恢復(fù)前了解一下基本知識(shí),使用mysqlbinlog 可以查看操作,但是不直觀,下面介紹一種mysql中經(jīng)常使用的。

語(yǔ)法:mysql>show binlog events [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count];

參數(shù)解釋:

IN 'log_name' :指定要查詢的binlog文件名(不指定就是第一個(gè)binlog文件)

FROM pos? ?? :指定從哪個(gè)pos起始點(diǎn)開(kāi)始查起(不指定就是從整個(gè)文件首個(gè)pos點(diǎn)開(kāi)始算)

LIMIT [offset,] :偏移量(不指定就是0)

row_count? ? ? :查詢總條數(shù)(不指定就是所有行)

列如:

mysql> show binlog events in 'mysql-bin.000001'\G;? #指定查詢 mysql-bin.000001這個(gè)文件。

mysql> show binlog events in 'mysql-bin.000001' from 294\G; #指定查詢 mysql-bin.000001這個(gè)文件,從pos點(diǎn):294開(kāi)始查起。

mysql> show binlog events in 'mysql-bin.000001' from 294 limit 10\G; #指定查詢 mysql-bin.000001這個(gè)文件,從pos點(diǎn):294開(kāi)始查起,查詢10條(即10條語(yǔ)句)。

mysql> show binlog events in 'mysql-bin.000001' from 294 limit 2,10\G; #指定查詢 mysql-bin.000001這個(gè)文件,從pos點(diǎn):294 開(kāi)始查起,偏移2行(即中間跳過(guò)2個(gè)),查詢10條

查詢數(shù)據(jù)含義:

Log_name:查詢的binlog日志文件名

Pos:pos起始點(diǎn)

Event_type:事件類型(

我這數(shù)據(jù)庫(kù)的Binlog模式是row 數(shù)據(jù)引擎innodb,類型說(shuō)明如下:

1) QUERY:與STATEMENT模式處理相同,存儲(chǔ)的是SQL,主要是一些與數(shù)據(jù)無(wú)關(guān)的操作,eg: begin、drop table、truncate table 等;

2)? ? ? TABLE_MAP:記錄了下一條事件所對(duì)應(yīng)的表信息,在其中存儲(chǔ)了數(shù)據(jù)庫(kù)名和表名;(test.a_view)

3)? ? ? WRITE_ROWS:操作類型為insert;(insert)

4)? ? ? UPDATE_ROWS:操作類型為update;(update)

5)? ? ? DELETE_ROWS:操作類型為delete;(delete)

6)? ? ? XID, 用于標(biāo)識(shí)事務(wù)提交。

以一條insert語(yǔ)句為例,包含4個(gè)事件:

QUERY? (begin),TABLE_MAP,WRITE_ROWS,XID

Server_id:標(biāo)識(shí)是由哪臺(tái)服務(wù)器執(zhí)行的

End_log_pos:pos結(jié)束點(diǎn)(即:下行的pos起始點(diǎn))

Info:說(shuō)明


進(jìn)入正題。

恢復(fù)語(yǔ)法格式:

mysqlbinlog mysql-bin.0000xx | mysql -u用戶名 -p密碼 數(shù)據(jù)庫(kù)名

常用參數(shù)選項(xiàng)解釋:
????????? --start-position #起始pos點(diǎn)

? ? ? ? ? --stop-position? #結(jié)束pos點(diǎn)

? ? ? ? ? --start-datetime="xxxx-xx-xx xx:xx:xx"? #起始時(shí)間點(diǎn)

? ? ? ? ? --stop-datetime="xxxx-xx-xx xx:xx:xx"? #結(jié)束時(shí)間點(diǎn)

? ? ? ? ? --database=zyyshop? ? ? ? ? ? ? ? ? ? 指定只恢復(fù)zyyshop數(shù)據(jù)庫(kù)(一臺(tái)主機(jī)上往往有多個(gè)數(shù)據(jù)庫(kù),只限本地log日志)

?????????? -u --user=name? ? ? ? ? ? ? 連接到遠(yuǎn)程主機(jī)的用戶名

??????? ?? -p --password[=name]? ? ? ? 連接到遠(yuǎn)程主機(jī)的密碼

????? ?? ? -h --host=name? ? ? ? ? ? ? 從遠(yuǎn)程主機(jī)上獲取binlog日志

?????? ? ? --read-from-remote-server? 從某個(gè)MySQL服務(wù)器上讀取binlog日志


實(shí)踐

接下來(lái)我對(duì)takeout數(shù)據(jù)庫(kù)users表修改一條數(shù)據(jù),在把表刪除。

name字段,從as1改成test。連接mysql。

查看現(xiàn)在寫入的是哪個(gè)日志

mysql> show master status;

現(xiàn)在是mysql-bin.000009,把mysql-bin.000009備份,刷新日志寫入,保證接下來(lái)的日志不會(huì)寫入000009。

查看000009日志情況。

mysql> show binlog events in 'mysql-bin.000009'\G;

update_rows修改事件,pos起始位置3787,結(jié)束pos4339,因?yàn)槭且粋€(gè)事務(wù),會(huì)有其他什么開(kāi)啟事務(wù)啊,提交事務(wù)什么的;我們要恢復(fù)修改之前數(shù)據(jù),所以結(jié)束pos點(diǎn)為3787。

[root@UsaOfficeLuke data]# mysqlbinlog --stop-position=3787 mysql-bin.000009 | mysql -uroot -p -v takeout

然后看數(shù)據(jù)庫(kù)

修改成功!(也可以根據(jù)日志中開(kāi)始執(zhí)行的時(shí)間來(lái)進(jìn)行恢復(fù))

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,197評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,415評(píng)論 3 415
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 176,104評(píng)論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 62,884評(píng)論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,647評(píng)論 6 408
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 55,130評(píng)論 1 323
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,208評(píng)論 3 441
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 42,366評(píng)論 0 288
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,887評(píng)論 1 334
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,737評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,939評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,478評(píng)論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,174評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 34,586評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 35,827評(píng)論 1 283
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,608評(píng)論 3 390
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,914評(píng)論 2 372

推薦閱讀更多精彩內(nèi)容