最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL使用mysqldump+binlog完整恢復(fù)被刪除的數(shù)據(jù)庫(kù)原理解析

 更新時(shí)間:2020年04月26日 09:38:52   作者:gegeman  
這篇文章主要介紹了MySQL使用mysqldump+binlog完整恢復(fù)被刪除的數(shù)據(jù)庫(kù),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

(一)概述

在日常MySQL數(shù)據(jù)庫(kù)運(yùn)維過(guò)程中,可能會(huì)遇到用戶(hù)誤刪除數(shù)據(jù),常見(jiàn)的誤刪除數(shù)據(jù)操作有:

  • 用戶(hù)執(zhí)行delete,因?yàn)闂l件不對(duì),刪除了不應(yīng)該刪除的數(shù)據(jù)(DML操作);
  • 用戶(hù)執(zhí)行update,因?yàn)闂l件不對(duì),更新數(shù)據(jù)出錯(cuò)(DML操作);
  • 用戶(hù)誤刪除表drop table(DDL操作);
  • 用戶(hù)誤清空表truncate(DDL操作);
  • 用戶(hù)刪除數(shù)據(jù)庫(kù)drop database,跑路(DDL操作)
  • …等

這些情況雖然不會(huì)經(jīng)常遇到,但是遇到了,我們需要有能力將其恢復(fù),下面講述如何恢復(fù)。

(二)恢復(fù)原理

如果要將數(shù)據(jù)庫(kù)恢復(fù)到故障點(diǎn)之前,那么需要有數(shù)據(jù)庫(kù)全備和全備之后產(chǎn)生的所有二進(jìn)制日志。

全備作用 :使用全備將數(shù)據(jù)庫(kù)恢復(fù)到上一次完整備份的位置;

二進(jìn)制日志作用:利用全備的備份集將數(shù)據(jù)庫(kù)恢復(fù)到上一次完整備份的位置之后,需要對(duì)上一次全備之后數(shù)據(jù)庫(kù)產(chǎn)生的所有動(dòng)作進(jìn)行重做,而重做的過(guò)程就是解析二進(jìn)制日志文件為SQL語(yǔ)句,然后放到數(shù)據(jù)庫(kù)里面再次執(zhí)行。

舉個(gè)例子:小明在4月1日晚上8:00使用了mysqldump對(duì)數(shù)據(jù)庫(kù)進(jìn)行了備份,在4月2日早上12:00的時(shí)候,小華不小心刪除了數(shù)據(jù)庫(kù),那么,在執(zhí)行數(shù)據(jù)庫(kù)恢復(fù)的時(shí)候,需要使用4月1日晚上的完整備份將數(shù)據(jù)庫(kù)恢復(fù)到“4月1日晚上8:00”,那4月1日晚上8:00以后到4月2日早上12:00之前的數(shù)據(jù)如何恢復(fù)呢?就得通過(guò)解析二進(jìn)制日志來(lái)對(duì)這段時(shí)間執(zhí)行過(guò)的SQL進(jìn)行重做。

(三)刪庫(kù)恢復(fù)測(cè)試

(3.1)實(shí)驗(yàn)?zāi)康?/p>

在本次實(shí)驗(yàn)中,我直接測(cè)試刪庫(kù),執(zhí)行drop database lijiamandb,確認(rèn)是否可以恢復(fù)。

(3.2)測(cè)試過(guò)程

在測(cè)試數(shù)據(jù)庫(kù)lijiamandb中創(chuàng)建測(cè)試表test01和test02,然后執(zhí)行mysqldump對(duì)數(shù)據(jù)庫(kù)進(jìn)行全備,之后執(zhí)行drop database,確認(rèn)database是否可以恢復(fù)。

STEP1:創(chuàng)建測(cè)試數(shù)據(jù),為了模擬日常繁忙的生產(chǎn)環(huán)境,頻繁的操作數(shù)據(jù)庫(kù)產(chǎn)生大量二進(jìn)制日志,我特地使用存儲(chǔ)過(guò)程和EVENT產(chǎn)生大量數(shù)據(jù)。

創(chuàng)建測(cè)試表:

use lijiamandb;create table test01
 (
 id1 int not null auto_increment,
 name varchar(30),
 primary key(id1)
 );

create table test02
 (
 id2 int not null auto_increment,
 name varchar(30),
 primary key(id2)
 );

創(chuàng)建存儲(chǔ)過(guò)程,往測(cè)試表里面插入數(shù)據(jù),每次執(zhí)行該存儲(chǔ)過(guò)程,往test01和test02各自插入10000條數(shù)據(jù):

CREATE DEFINER=`root`@`%` PROCEDURE `p_insert`()
BEGIN
#Routine body goes here...
DECLARE str1 varchar(30);
DECLARE str2 varchar(30);
DECLARE i int;
set i = 0;

while i < 10000 do
 set str1 = substring(md5(rand()),1,25);
 insert into test01(name) values(str1);
 set str2 = substring(md5(rand()),1,25);
 insert into test02(name) values(str1);
 set i = i + 1;
 end while;
 END

制定事件,每隔10秒鐘,執(zhí)行上面的存儲(chǔ)過(guò)程:

use lijiamandb;
 create event if not exists e_insert
 on schedule every 10 second
 on completion preserve
 do call p_insert();

啟動(dòng)EVENT,每個(gè)10s自動(dòng)向test01和test02各自插入10000條數(shù)據(jù)

mysql> show variables like '%event_scheduler%';
+----------------------------------------------------------+-------+
| Variable_name | Value |
+----------------------------------------------------------+-------+
| event_scheduler | OFF |
+----------------------------------------------------------+-------+

mysql> set global event_scheduler = on;
 Query OK, 0 rows affected (0.08 sec)

--過(guò)3分鐘。。。
STEP2:第一步生成大量測(cè)試數(shù)據(jù)后,使用mysqldump對(duì)lijiamandb數(shù)據(jù)庫(kù)執(zhí)行完全備份
mysqldump -h192.168.10.11 -uroot -p123456 -P3306 --single-transaction --master-data=2 --events --routines --databases lijiamandb > /mysql/backup/lijiamandb.sql

注意:必須要添加--master-data=2,這樣才會(huì)備份集里面mysqldump備份的終點(diǎn)位置。

--過(guò)3分鐘。。。

STEP3:為了便于數(shù)據(jù)庫(kù)刪除前與刪除后數(shù)據(jù)一致性校驗(yàn),先停止表的數(shù)據(jù)插入,此時(shí)test01和test02都有930000行數(shù)據(jù),我們后續(xù)恢復(fù)也要保證有930000行數(shù)據(jù)。

mysql> set global event_scheduler = off;
Query OK, 0 rows affected (0.00 sec)

mysql> select count(*) from test01;
 +----------+
 | count(*) |
 +----------+
 | 930000 |
 +----------+
row in set (0.14 sec)

mysql> select count(*) from test02;
 +----------+
 | count(*) |
 +----------+
 | 930000 |
 +----------+
row in set (0.13 sec)

STEP4:刪除數(shù)據(jù)庫(kù)

mysql> drop database lijiamandb;
Query OK, 2 rows affected (0.07 sec)

STEP5:使用mysqldump的全備導(dǎo)入

mysql> create database lijiamandb;
Query OK, 1 row affected (0.01 sec)

mysql> exit
 Bye
 [root@masterdb binlog]# mysql -uroot -p123456 lijiamandb < /mysql/backup/lijiamandb.sql 
 mysql: [Warning] Using a password on the command line interface can be insecure.

在執(zhí)行全量備份恢復(fù)之后,發(fā)現(xiàn)只有753238筆數(shù)據(jù):

[root@masterdb binlog]# mysql -uroot -p123456 lijiamandb 

mysql> select count(*) from test01;
 +----------+
 | count(*) |
 +----------+
 | 753238 |
 +----------+
row in set (0.12 sec)

mysql> select count(*) from test02;
 +----------+
 | count(*) |
 +----------+
 | 753238 |
 +----------+
row in set (0.11 sec)

很明顯,全量導(dǎo)入之后,數(shù)據(jù)不完整,接下來(lái)使用mysqlbinlog對(duì)二進(jìn)制日志執(zhí)行增量恢復(fù)。

使用mysqlbinlog進(jìn)行增量日志恢復(fù)最重要的就是確定待恢復(fù)的起始位置(start-position)和終止位置(stop-position),起始位置(start-position)是我們執(zhí)行全被之后的位置,而終止位置則是故障發(fā)生之前的位置。
STEP6:確認(rèn)mysqldump備份到的最終位置

[root@masterdb backup]# cat lijiamandb.sql |grep "CHANGE MASTER"
-- CHANGE MASTER TO MASTER_LOG_FILE='master-bin.000044', MASTER_LOG_POS=8526828

備份到了44號(hào)日志的8526828位置,那么恢復(fù)的起點(diǎn)可以設(shè)置為:44號(hào)日志的8526828。

--接下來(lái)確認(rèn)要恢復(fù)的終點(diǎn)位置,即執(zhí)行"DROP DATABASE LIJIAMAN"之前的位置,需要到binlog里面確認(rèn)。

[root@masterdb binlog]# ls
 master-bin.000001 master-bin.000010 master-bin.000019 master-bin.000028 master-bin.000037 master-bin.000046 master-bin.000055
 master-bin.000002 master-bin.000011 master-bin.000020 master-bin.000029 master-bin.000038 master-bin.000047 master-bin.000056
 master-bin.000003 master-bin.000012 master-bin.000021 master-bin.000030 master-bin.000039 master-bin.000048 master-bin.000057
 master-bin.000004 master-bin.000013 master-bin.000022 master-bin.000031 master-bin.000040 master-bin.000049 master-bin.000058
 master-bin.000005 master-bin.000014 master-bin.000023 master-bin.000032 master-bin.000041 master-bin.000050 master-bin.000059
 master-bin.000006 master-bin.000015 master-bin.000024 master-bin.000033 master-bin.000042 master-bin.000051 master-bin.index
 master-bin.000007 master-bin.000016 master-bin.000025 master-bin.000034 master-bin.000043 master-bin.000052
 master-bin.000008 master-bin.000017 master-bin.000026 master-bin.000035 master-bin.000044 master-bin.000053
 master-bin.000009 master-bin.000018 master-bin.000027 master-bin.000036 master-bin.000045 master-bin.000054

# 多次查找,發(fā)現(xiàn)drop database在54號(hào)日志文件
[root@masterdb binlog]# mysqlbinlog -v master-bin.000056 | grep -i "drop database lijiamandb"
 [root@masterdb binlog]# mysqlbinlog -v master-bin.000055 | grep -i "drop database lijiamandb"
 [root@masterdb binlog]# mysqlbinlog -v master-bin.000055 | grep -i "drop database lijiamandb"
 [root@masterdb binlog]# mysqlbinlog -v master-bin.000054 | grep -i "drop database lijiamandb"
drop database lijiamandb

# 保存到文本,便于搜索
[root@masterdb binlog]# mysqlbinlog -v master-bin.000054 > master-bin.txt


# 確認(rèn)drop database之前的位置為:54號(hào)文件的9019487
 # at 9019422
 #200423 16:07:46 server id 11 end_log_pos 9019487 CRC32 0x86f13148 Anonymous_GTID last_committed=30266 sequence_number=30267 rbr_only=no
 SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
 # at 9019487
 #200423 16:07:46 server id 11 end_log_pos 9019597 CRC32 0xbd6ea5dd Query thread_id=100 exec_time=0 error_code=0
 SET TIMESTAMP=1587629266/*!*/;
 SET @@session.sql_auto_is_null=0/*!*/;
 /*!\C utf8 *//*!*/;
 SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=33/*!*/;
 drop database lijiamandb
 /*!*/;
 # at 9019597
 #200423 16:09:25 server id 11 end_log_pos 9019662 CRC32 0x8f7b11dc Anonymous_GTID last_committed=30267 sequence_number=30268 rbr_only=no
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
 # at 9019662
 #200423 16:09:25 server id 11 end_log_pos 9019774 CRC32 0x9b42423d Query thread_id=100 exec_time=0 error_code=0
 SET TIMESTAMP=1587629365/*!*/;
 create database lijiamandb

STEP7:確定了開(kāi)始結(jié)束點(diǎn),執(zhí)行增量恢復(fù)
開(kāi)始:44號(hào)日志的8526828
結(jié)束:54號(hào)文件的9019487

這里分為3條命令執(zhí)行,起始日志文件涉及到參數(shù)start-position參數(shù),單獨(dú)執(zhí)行;中止文件涉及到stop-position參數(shù),單獨(dú)執(zhí)行;中間的日志文件不涉及到特殊參數(shù),全部一起執(zhí)行。

# 起始日志文件

# 起始日志文件
mysqlbinlog --start-position=8526828 /mysql/binlog/master-bin.000044 | mysql -uroot -p123456

 
# 中間日志文件
mysqlbinlog /mysql/binlog/master-bin.000045 /mysql/binlog/master-bin.000046 /mysql/binlog/master-bin.000047 /mysql/binlog/master-bin.000048 /mysql/binlog/master-bin.000049 /mysql/binlog/master-bin.000050 /mysql/binlog/master-bin.000051 /mysql/binlog/master-bin.000052 /mysql/binlog/master-bin.000053 | mysql -uroot -p123456

 
# 終止日志文件

mysqlbinlog --stop-position=9019487 /mysql/binlog/master-bin.000054 | mysql -uroot -p123456

STEP8:恢復(fù)結(jié)束,確認(rèn)全部數(shù)據(jù)已經(jīng)還原

[root@masterdb binlog]# mysql -uroot -p123456 lijiamandb
mysql> select count(*) from test01;
+----------+
| count(*) |
+----------+
| 930000 |
+----------+
row in set (0.15 sec)

mysql> select count(*) from test02;
+----------+
 | count(*) |
+----------+
 | 930000 |
+----------+
row in set (0.13 sec)

(四)總結(jié)

1.對(duì)于DML操作,binlog記錄了所有的DML數(shù)據(jù)變化:
--對(duì)于insert,binlog記錄了insert的行數(shù)據(jù)
--對(duì)于update,binlog記錄了改變前的行數(shù)據(jù)和改變后的行數(shù)據(jù)
--對(duì)于delete,binlog記錄了刪除前的數(shù)據(jù)
假如用戶(hù)不小心誤執(zhí)行了DML操作,可以使用mysqlbinlog將數(shù)據(jù)庫(kù)恢復(fù)到故障點(diǎn)之前。

2.對(duì)于DDL操作,binlog只記錄用戶(hù)行為,而不記錄行變化,但是并不影響我們將數(shù)據(jù)庫(kù)恢復(fù)到故障點(diǎn)之前。

總之,使用mysqldump全備加binlog日志,可以將數(shù)據(jù)恢復(fù)到故障前的任意時(shí)刻。

到此這篇關(guān)于MySQL使用mysqldump+binlog完整恢復(fù)被刪除的數(shù)據(jù)庫(kù)的文章就介紹到這了,更多相關(guān)MySQL恢復(fù)被刪除的數(shù)據(jù)庫(kù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • mybatis-plus分頁(yè)傳入?yún)?shù)后sql where條件沒(méi)有l(wèi)imit分頁(yè)信息操作

    mybatis-plus分頁(yè)傳入?yún)?shù)后sql where條件沒(méi)有l(wèi)imit分頁(yè)信息操作

    這篇文章主要介紹了mybatis-plus分頁(yè)傳入?yún)?shù)后sql where條件沒(méi)有l(wèi)imit分頁(yè)信息操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-11-11
  • Mysql支持的數(shù)據(jù)類(lèi)型(列類(lèi)型總結(jié))

    Mysql支持的數(shù)據(jù)類(lèi)型(列類(lèi)型總結(jié))

    MySQL支持大量的列類(lèi)型,它可以被分為3類(lèi):數(shù)字類(lèi)型、日期和時(shí)間類(lèi)型以及字符串(字符)類(lèi)型。本節(jié)首先給出可用類(lèi)型的一個(gè)概述,并且總結(jié)每個(gè)列類(lèi)型的存儲(chǔ)需求,然后提供每個(gè)類(lèi)中的類(lèi)型性質(zhì)的更詳細(xì)的描述
    2016-12-12
  • mysql高效查詢(xún)left join和group by(加索引)

    mysql高效查詢(xún)left join和group by(加索引)

    這篇文章主要給大家介紹了關(guān)于mysql高效查詢(xún)left join和group by,這個(gè)的前提是加了索引,以及如何在MySQL高效的join3個(gè)表 的相關(guān)資料,需要的朋友可以參考下
    2021-06-06
  • mysql?dblink跨庫(kù)關(guān)聯(lián)查詢(xún)的實(shí)現(xiàn)

    mysql?dblink跨庫(kù)關(guān)聯(lián)查詢(xún)的實(shí)現(xiàn)

    本文主要介紹了mysql?dblink跨庫(kù)關(guān)聯(lián)查詢(xún)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • Mysql數(shù)據(jù)庫(kù)鎖定機(jī)制詳細(xì)介紹

    Mysql數(shù)據(jù)庫(kù)鎖定機(jī)制詳細(xì)介紹

    這篇文章主要介紹了Mysql數(shù)據(jù)庫(kù)鎖定機(jī)制詳細(xì)介紹,本文用大量?jī)?nèi)容講解了Mysql中的鎖定機(jī)制,例如MySQL鎖定機(jī)制簡(jiǎn)介、合理利用鎖機(jī)制優(yōu)化MySQL等內(nèi)容,需要的朋友可以參考下
    2014-12-12
  • Windows 10系統(tǒng)下徹底刪除卸載MySQL的方法教程

    Windows 10系統(tǒng)下徹底刪除卸載MySQL的方法教程

    mysql數(shù)據(jù)庫(kù)的重新安裝是一個(gè)麻煩的問(wèn)題,很難卸除干凈,下面這篇文章主要給大家介紹了關(guān)于在Windows 10系統(tǒng)下徹底刪除卸載MySQL的方法教程,對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。
    2017-07-07
  • MySQL優(yōu)化之表結(jié)構(gòu)優(yōu)化的5大建議(數(shù)據(jù)類(lèi)型選擇講的很好)

    MySQL優(yōu)化之表結(jié)構(gòu)優(yōu)化的5大建議(數(shù)據(jù)類(lèi)型選擇講的很好)

    很多人都將 數(shù)據(jù)庫(kù)設(shè)計(jì)范式 作為數(shù)據(jù)庫(kù)表結(jié)構(gòu)設(shè)計(jì)“圣經(jīng)”,認(rèn)為只要按照這個(gè)范式需求設(shè)計(jì),就能讓設(shè)計(jì)出來(lái)的表結(jié)構(gòu)足夠優(yōu)化,既能保證性能優(yōu)異同時(shí)還能滿足擴(kuò)展性要求
    2014-03-03
  • Mysql賬號(hào)管理與引擎相關(guān)功能實(shí)現(xiàn)流程

    Mysql賬號(hào)管理與引擎相關(guān)功能實(shí)現(xiàn)流程

    Mysql中的每一種技術(shù)都使用不同的存儲(chǔ)機(jī)制、索引技巧、鎖定水平、并且最終提供廣泛的不同功能和能力。通過(guò)選擇不同的技術(shù),你能夠獲得額外的速度或者功能,從而改善應(yīng)用的整體功能。這些不同的技術(shù)以及配套的相關(guān)功能在MySQL中被稱(chēng)作存儲(chǔ)引擎
    2022-10-10
  • MySQL該如何判斷不為空詳析

    MySQL該如何判斷不為空詳析

    在MySQL數(shù)據(jù)庫(kù)中,在不同的情形下,空值往往代表不同的含義,這是MySQL數(shù)據(jù)庫(kù)的一種特性,下面這篇文章主要給大家介紹了關(guān)于MySQL該如何判斷不為空的相關(guān)資料,需要的朋友可以參考下
    2023-02-02
  • MySQL實(shí)現(xiàn)批量插入測(cè)試數(shù)據(jù)的方式總結(jié)

    MySQL實(shí)現(xiàn)批量插入測(cè)試數(shù)據(jù)的方式總結(jié)

    在開(kāi)發(fā)過(guò)程中經(jīng)常需要一些測(cè)試數(shù)據(jù),?這個(gè)時(shí)候如果手敲的話,?十行二十行還好,?多了就很死亡了,?接下來(lái)介紹兩種常用的MySQL測(cè)試數(shù)據(jù)批量生成方式,希望對(duì)大家有所幫助
    2023-05-05

最新評(píng)論

巴楚县| 南开区| 文安县| 汪清县| 商城县| 江华| 福建省| 馆陶县| 苍山县| 措美县| 乃东县| 镇安县| 大姚县| 晴隆县| 贵州省| 襄城县| 洮南市| 文化| 依兰县| 外汇| 广汉市| 即墨市| 鄂伦春自治旗| 邯郸县| 孟州市| 涿鹿县| 清原| 伊宁市| 云南省| 襄汾县| 孝感市| 宽城| 循化| 满城县| 龙川县| 汉川市| 前郭尔| 余姚市| 九龙县| 陈巴尔虎旗| 屏山县|