網(wǎng)上有很多關(guān)于pos機(jī)日志結(jié)算,「刪庫跑路」使用Binlog日志恢復(fù)誤刪的MySQL數(shù)據(jù)的知識(shí),也有很多人為大家解答關(guān)于pos機(jī)日志結(jié)算的問題,今天pos機(jī)之家(www.afbey.com)為大家整理了關(guān)于這方面的知識(shí),讓我們一起來看下吧!
本文目錄一覽:
pos機(jī)日志結(jié)算
前言“刪庫跑路”是程序員經(jīng)常談起的話題,今天,我就要教大家如何刪!庫!跑!路!
開個(gè)玩笑,今天文章的主題是如何使用mysql內(nèi)置的Binlog日志對(duì)誤刪的數(shù)據(jù)進(jìn)行恢復(fù),讀完本文,你能夠了解到:
MySQL的binlog日志是什么?通常是用來干什么的?模擬一次誤刪數(shù)據(jù)的操作,并且使用binlog日志恢復(fù)誤刪的數(shù)據(jù)。寫這篇文章的初衷,是有一次我真的險(xiǎn)些把測試數(shù)據(jù)庫的一張表給刪除了,當(dāng)時(shí)嚇出一身冷汗。原因是由于Spring JPA的配置中,有一個(gè)spring.jpa.properties.hibernate.hbm2ddl.auto=create-drop,其用途是每次加載hibernate時(shí)根據(jù)model類生成表,但是sessionFactory一關(guān)閉,表就自動(dòng)刪除。,這個(gè)可不能隨便配置上去,直接就把你原來存在的表給drop了!
好了,回歸正題,這篇文章就是想讓大家放心,MySQL就算進(jìn)行了誤刪操作,也基本都能夠搶救回來。尤其是大公司內(nèi),數(shù)據(jù)可不是你想刪就能刪掉的,有無數(shù)權(quán)限/備份阻攔著你。
正文Binlog介紹binlog是記錄所有數(shù)據(jù)庫表結(jié)構(gòu)變更(例如CREATE、ALTER TABLE…)以及表數(shù)據(jù)修改(INSERT、UPDATE、DELETE…)的二進(jìn)制日志。binlog不會(huì)記錄SELECT和SHOW這類操作,因?yàn)檫@類操作對(duì)數(shù)據(jù)本身并沒有修改,但你可以通過查詢通用日志來查看MySQL執(zhí)行過的所有語句。
看了上面binlog的定義,大家也應(yīng)該能大致推理出binlog的三大用途:
恢復(fù)數(shù)據(jù):今天要說的重點(diǎn)數(shù)據(jù)庫復(fù)制:主從數(shù)據(jù)庫是通過將binlog傳給從庫,從庫有兩個(gè)線程,一個(gè)I/O線程,一個(gè)SQL線程,I/O線程讀取主庫傳過來的binlog內(nèi)容并寫入到relay log,SQL線程從relay log里面讀取內(nèi)容,寫入從庫的數(shù)據(jù)庫。審計(jì):用戶可以通過二進(jìn)制日志中的信息來進(jìn)行審計(jì),判斷是否有對(duì)數(shù)據(jù)庫進(jìn)行注入攻擊。所以說,想要能夠恢復(fù)數(shù)據(jù),首先,你得打開Mysql的binlog,在平常你自己安裝的單機(jī)Mysql中,默認(rèn)情況下不會(huì)開啟。下面就一步步地實(shí)踐下如何開啟你服務(wù)器上的Binlog日志。
在MySQL中開啟Binlog首先進(jìn)入數(shù)據(jù)庫控制臺(tái),運(yùn)行指令:
mysql>\xa0show\xa0variables\xa0like'log_bin%';+---------------------------------+-------+|\xa0Variable_name\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0|\xa0Value\xa0|+---------------------------------+-------+|\xa0log_bin\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0|\xa0OFF\xa0\xa0\xa0||\xa0log_bin_basename\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0|\xa0\xa0\xa0\xa0\xa0\xa0\xa0||\xa0log_bin_index\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0|\xa0\xa0\xa0\xa0\xa0\xa0\xa0||\xa0log_bin_trust_function_creators\xa0|\xa0OFF\xa0\xa0\xa0||\xa0log_bin_use_v1_row_events\xa0\xa0\xa0\xa0\xa0\xa0\xa0|\xa0OFF\xa0\xa0\xa0|+---------------------------------+-------+5\xa0rows\xa0in\xa0set\xa0(0.00\xa0sec)
可以看到我們的binlog是關(guān)閉的,都是OFF。接下來我們需要修改Mysql配置文件,執(zhí)行命令:
sudo\xa0vi\xa0/etc/mysql/mysql.conf.d/mysqld.cnf
在文件末尾添加:
log-bin=/var/lib/mysql/mysql-bin
保存文件,重啟mysql服務(wù):
sudo\xa0service\xa0mysql\xa0restart
重啟完成后,查看下mysql的狀態(tài):
systemctl\xa0status\xa0mysql.service
這時(shí),如果你的mysql版本在5.7或更高版本,就會(huì)報(bào)錯(cuò):
Jan\xa006\xa015:49:58\xa0VM-0-11-ubuntu\xa0mysqld[5930]:\xa02020-01-06T07:49:58.190791Z\xa00\xa0[Warning]\xa0Changed\xa0limits:\xa0max_open_Files:\xa01024\xa0(requested\xa05000)Jan\xa006\xa015:49:58\xa0VM-0-11-ubuntu\xa0mysqld[5930]:\xa02020-01-06T07:49:58.190839Z\xa00\xa0[Warning]\xa0Changed\xa0limits:\xa0table_open_cache:\xa0431\xa0(requested\xa02000)Jan\xa006\xa015:49:58\xa0VM-0-11-ubuntu\xa0mysqld[5930]:\xa02020-01-06T07:49:58.359713Z\xa00\xa0[Warning]\xa0TIMESTAMP\xa0with\xa0implicit\xa0DEFAULT\xa0value\xa0is\xa0deprecated.\xa0Please\xa0use\xa0--explicit_defaults_for_timestamp\xa0server\xa0option\xa0(seJan\xa006\xa015:49:58\xa0VM-0-11-ubuntu\xa0mysqld[5930]:\xa02020-01-06T07:49:58.361395Z\xa00\xa0[Note]\xa0/usr/sbin/mysqld\xa0(mysqld\xa05.7.28-0ubuntu0.16.04.2-log)\xa0starting\xa0as\xa0process\xa05930\xa0...Jan\xa006\xa015:49:58\xa0VM-0-11-ubuntu\xa0mysqld[5930]:\xa02020-01-06T07:49:58.363017Z\xa00\xa0[ERROR]\xa0You\xa0have\xa0enabled\xa0the\xa0binary\xa0log,\xa0but\xa0you\xa0haven't\xa0provided\xa0the\xa0mandatory\xa0server-id.\xa0Please\xa0refer\xa0to\xa0the\xa0proper\xa0serverJan\xa006\xa015:49:58\xa0VM-0-11-ubuntu\xa0mysqld[5930]:\xa02020-01-06T07:49:58.363747Z\xa00\xa0[ERROR]\xa0AbortingJan\xa006\xa015:49:58\xa0VM-0-11-ubuntu\xa0mysqld[5930]:\xa02020-01-06T07:49:58.363922Z\xa00\xa0[Note]\xa0Binlog\xa0endJan\xa006\xa015:49:58\xa0VM-0-11-ubuntu\xa0mysqld[5930]:\xa02020-01-06T07:49:58.364108Z\xa00\xa0[Note]\xa0/usr/sbin/mysqld:\xa0Shutdown\xa0completeJan\xa006\xa015:49:58\xa0VM-0-11-ubuntu\xa0systemd[1]:\xa0mysql.service:\xa0Main\xa0process\xa0exited,\xa0code=exited,\xa0status=1/FAILURE
You have enabled the binary log, but you haven't provided the mandatory server-id. Please refer to the proper server
之前我們的配置,對(duì)于5.7以下版本應(yīng)該是可以的。但對(duì)于高版本,我們需要指定server-id。
如果你不是分布式的部署Mysql,這個(gè)server-id隨機(jī)給個(gè)數(shù)字就可以。
server-id=123454模擬刪除數(shù)據(jù)并恢復(fù)首先新建數(shù)據(jù)庫mytest,新建一張表table1,結(jié)構(gòu)見下方SQL代碼
CREATE\xa0DATABASE\xa0`test`\xa0;USE\xa0`test`;DROP\xa0TABLE\xa0IF\xa0EXISTS\xa0`table1`;CREATE\xa0TABLE\xa0`table2`\xa0(\xa0\xa0`id`\xa0int(11)\xa0DEFAULT\xa0NULL,\xa0\xa0`name`\xa0varchar(20)\xa0DEFAULT\xa0NULL)\xa0ENGINE=InnoDB\xa0DEFAULT\xa0CHARSET=utf8mb4;插入兩條數(shù)據(jù),分別是 (1,'A'),(2,'B')
INSERT\xa0INTO\xa0`table1`\xa0VALUES\xa0(1,'A'),(2,'B');我們看一下binlog日志的狀態(tài),使用show master status
mysql>\xa0show\xa0master\xa0status\xa0\xa0\xa0\xa0->\xa0;+------------------+----------+--------------+------------------+-------------------+|\xa0File\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0|\xa0Position\xa0|\xa0Binlog_Do_DB\xa0|\xa0Binlog_Ignore_DB\xa0|\xa0Executed_Gtid_Set\xa0|+------------------+----------+--------------+------------------+-------------------+|\xa0mysql-bin.000001\xa0|\xa0\xa0\xa0\xa0\xa0\xa0690\xa0|\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0|\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0|\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0|+------------------+----------+--------------+------------------+-------------------+1\xa0row\xa0in\xa0set
binlog日志特征:每當(dāng)我們重啟MySQL一次,會(huì)自動(dòng)生成一個(gè)binlog文件,當(dāng)然,我們也可以手動(dòng)的來刷新binlog文件,通過 flush logs,同樣會(huì)新創(chuàng)建一個(gè)binlog文件。實(shí)際上當(dāng)服務(wù)器在重啟時(shí),也會(huì)調(diào)用flush logs操作。
上圖代碼中可以看到,現(xiàn)在我們正在使用 mysql-bin.0000001 ,并且這個(gè)文件現(xiàn)在正在記錄到690行。
然后,使用flush logs來主動(dòng)刷新一次binlogmysql>\xa0flush\xa0logs;Query\xa0OK,\xa00\xa0rows\xa0affectedmysql>\xa0show\xa0master\xa0status\xa0\xa0\xa0\xa0->\xa0;+------------------+----------+--------------+------------------+-------------------+|\xa0File\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0|\xa0Position\xa0|\xa0Binlog_Do_DB\xa0|\xa0Binlog_Ignore_DB\xa0|\xa0Executed_Gtid_Set\xa0|+------------------+----------+--------------+------------------+-------------------+|\xa0mysql-bin.000002\xa0|\xa0\xa0\xa0\xa0\xa0\xa0154\xa0|\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0|\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0|\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0|+------------------+----------+--------------+------------------+-------------------+1\xa0row\xa0in\xa0set
可以看到,現(xiàn)在日志文件在 mysql-bin.000002 文件中,位置為154。也就是我們主動(dòng)刷新了一次binlog,生成了新的000002,而000001則已經(jīng)歸檔了,不會(huì)再寫入新的日志進(jìn)去了。
接下來我們?cè)诓迦雰蓷l數(shù)據(jù)insert\xa0into\xa0table1\xa0values\xa0(3,'C');insert\xa0into\xa0table1\xa0values\xa0(4,'D');
mysql>\xa0select\xa0*\xa0from\xa0table1;+----+----+|\xa0id\xa0|name|+----+----+|\xa0\xa01\xa0|\xa0A\xa0\xa0||\xa0\xa02\xa0|\xa0B\xa0\xa0||\xa0\xa03\xa0|\xa0C\xa0\xa0||\xa0\xa04\xa0|\xa0D\xa0\xa0|+----+----+這時(shí)候我們已經(jīng)有了四條數(shù)據(jù),我們?cè)俅蝔lush logs,把mysql-bin.000002日志存檔,開啟新的mysql-bin.000003日志,這樣,每次我們插入的數(shù)據(jù)彼此獨(dú)立。實(shí)際情況下,binlog會(huì)比較復(fù)雜,這里也是做了簡化,為了理解更方便。
mysql>\xa0flush\xa0logs;Query\xa0OK,\xa00\xa0rows\xa0affectedmysql>\xa0show\xa0master\xa0status;+------------------+----------+--------------+------------------+-------------------+|\xa0File\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0|\xa0Position\xa0|\xa0Binlog_Do_DB\xa0|\xa0Binlog_Ignore_DB\xa0|\xa0Executed_Gtid_Set\xa0|+------------------+----------+--------------+------------------+-------------------+|\xa0mysql-bin.000003\xa0|\xa0\xa0\xa0\xa0\xa0\xa0154\xa0|\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0|\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0|\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0|+------------------+----------+--------------+------------------+-------------------+1\xa0row\xa0in\xa0set然后我們刪除id為4的數(shù)據(jù)(4,D),并且再次刷新binlog,如此一來,binlog.000003里面只有一條刪除操作。
mysql>\xa0delete\xa0from\xa0table1\xa0where\xa0id\xa0=\xa04;Query\xa0OK,\xa01\xa0row\xa0affectedmysql>\xa0show\xa0master\xa0status;+------------------+----------+--------------+------------------+-------------------+|\xa0File\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0|\xa0Position\xa0|\xa0Binlog_Do_DB\xa0|\xa0Binlog_Ignore_DB\xa0|\xa0Executed_Gtid_Set\xa0|+------------------+----------+--------------+------------------+-------------------+|\xa0mysql-bin.000003\xa0|\xa0\xa0\xa0\xa0\xa0\xa0423\xa0|\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0|\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0|\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0|+------------------+----------+--------------+------------------+-------------------+1\xa0row\xa0in\xa0setmysql>\xa0flush\xa0logs;Query\xa0OK,\xa00\xa0rows\xa0affectedmysql>\xa0show\xa0master\xa0status;+------------------+----------+--------------+------------------+-------------------+|\xa0File\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0|\xa0Position\xa0|\xa0Binlog_Do_DB\xa0|\xa0Binlog_Ignore_DB\xa0|\xa0Executed_Gtid_Set\xa0|+------------------+----------+--------------+------------------+-------------------+|\xa0mysql-bin.000004\xa0|\xa0\xa0\xa0\xa0\xa0\xa0154\xa0|\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0|\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0|\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0|+------------------+----------+--------------+------------------+-------------------+1\xa0row\xa0in\xa0set讓我們來好好觀察下mysql-bin.00002和mysql-bin00003兩個(gè)binlog,使用命令:show binlog events in 'mysql-bin.000003'
mysql>\xa0show\xa0binlog\xa0events\xa0in\xa0'mysql-bin.000003';+------------------+-----+----------------+-----------+-------------+--------------------------------------------------------+|\xa0Log_name\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0|\xa0Pos\xa0|\xa0Event_type\xa0\xa0\xa0\xa0\xa0|\xa0Server_id\xa0|\xa0End_log_pos\xa0|\xa0Info\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0|+------------------+-----+----------------+-----------+-------------+--------------------------------------------------------+|\xa0mysql-bin.000003\xa0|\xa0\xa0\xa04\xa0|\xa0Format_desc\xa0\xa0\xa0\xa0|\xa0\xa0\xa0\xa0123456\xa0|\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0123\xa0|\xa0Server\xa0ver:\xa05.7.28-0ubuntu0.16.04.2-log,\xa0Binlog\xa0ver:\xa04\xa0||\xa0mysql-bin.000003\xa0|\xa0123\xa0|\xa0Previous_gtids\xa0|\xa0\xa0\xa0\xa0123456\xa0|\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0154\xa0|\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0||\xa0mysql-bin.000003\xa0|\xa0154\xa0|\xa0Anonymous_Gtid\xa0|\xa0\xa0\xa0\xa0123456\xa0|\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0219\xa0|\xa0SET\xa0@@SESSION.GTID_NEXT=\xa0'ANONYMOUS'\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0||\xa0mysql-bin.000003\xa0|\xa0219\xa0|\xa0Query\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0|\xa0\xa0\xa0\xa0123456\xa0|\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0293\xa0|\xa0BEGIN\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0||\xa0mysql-bin.000003\xa0|\xa0293\xa0|\xa0Table_map\xa0\xa0\xa0\xa0\xa0\xa0|\xa0\xa0\xa0\xa0123456\xa0|\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0343\xa0|\xa0table_id:\xa0108\xa0(test.table1)\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0||\xa0mysql-bin.000003\xa0|\xa0343\xa0|\xa0Delete_rows\xa0\xa0\xa0\xa0|\xa0\xa0\xa0\xa0123456\xa0|\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0392\xa0|\xa0table_id:\xa0108\xa0flags:\xa0STMT_END_F\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0||\xa0mysql-bin.000003\xa0|\xa0392\xa0|\xa0Xid\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0|\xa0\xa0\xa0\xa0123456\xa0|\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0423\xa0|\xa0COMMIT\xa0/*\xa0xid=39\xa0*/\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0|+------------------+-----+----------------+-----------+-------------+--------------------------------------------------------+7\xa0rows\xa0in\xa0setmysql>\xa0show\xa0binlog\xa0events\xa0in\xa0'mysql-bin.000002';+------------------+-----+----------------+-----------+-------------+--------------------------------------------------------+|\xa0Log_name\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0|\xa0Pos\xa0|\xa0Event_type\xa0\xa0\xa0\xa0\xa0|\xa0Server_id\xa0|\xa0End_log_pos\xa0|\xa0Info\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0|+------------------+-----+----------------+-----------+-------------+--------------------------------------------------------+|\xa0mysql-bin.000002\xa0|\xa0\xa0\xa04\xa0|\xa0Format_desc\xa0\xa0\xa0\xa0|\xa0\xa0\xa0\xa0123456\xa0|\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0123\xa0|\xa0Server\xa0ver:\xa05.7.28-0ubuntu0.16.04.2-log,\xa0Binlog\xa0ver:\xa04\xa0||\xa0mysql-bin.000002\xa0|\xa0123\xa0|\xa0Previous_gtids\xa0|\xa0\xa0\xa0\xa0123456\xa0|\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0154\xa0|\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0||\xa0mysql-bin.000002\xa0|\xa0154\xa0|\xa0Anonymous_Gtid\xa0|\xa0\xa0\xa0\xa0123456\xa0|\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0219\xa0|\xa0SET\xa0@@SESSION.GTID_NEXT=\xa0'ANONYMOUS'\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0||\xa0mysql-bin.000002\xa0|\xa0219\xa0|\xa0Query\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0|\xa0\xa0\xa0\xa0123456\xa0|\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0293\xa0|\xa0BEGIN\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0||\xa0mysql-bin.000002\xa0|\xa0293\xa0|\xa0Table_map\xa0\xa0\xa0\xa0\xa0\xa0|\xa0\xa0\xa0\xa0123456\xa0|\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0343\xa0|\xa0table_id:\xa0108\xa0(test.table1)\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0||\xa0mysql-bin.000002\xa0|\xa0343\xa0|\xa0Write_rows\xa0\xa0\xa0\xa0\xa0|\xa0\xa0\xa0\xa0123456\xa0|\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0390\xa0|\xa0table_id:\xa0108\xa0flags:\xa0STMT_END_F\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0||\xa0mysql-bin.000002\xa0|\xa0390\xa0|\xa0Xid\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0|\xa0\xa0\xa0\xa0123456\xa0|\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0421\xa0|\xa0COMMIT\xa0/*\xa0xid=34\xa0*/\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0||\xa0mysql-bin.000002\xa0|\xa0421\xa0|\xa0Anonymous_Gtid\xa0|\xa0\xa0\xa0\xa0123456\xa0|\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0486\xa0|\xa0SET\xa0@@SESSION.GTID_NEXT=\xa0'ANONYMOUS'\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0||\xa0mysql-bin.000002\xa0|\xa0486\xa0|\xa0Query\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0|\xa0\xa0\xa0\xa0123456\xa0|\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0560\xa0|\xa0BEGIN\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0||\xa0mysql-bin.000002\xa0|\xa0560\xa0|\xa0Table_map\xa0\xa0\xa0\xa0\xa0\xa0|\xa0\xa0\xa0\xa0123456\xa0|\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0610\xa0|\xa0table_id:\xa0108\xa0(test.table1)\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0||\xa0mysql-bin.000002\xa0|\xa0610\xa0|\xa0Write_rows\xa0\xa0\xa0\xa0\xa0|\xa0\xa0\xa0\xa0123456\xa0|\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0659\xa0|\xa0table_id:\xa0108\xa0flags:\xa0STMT_END_F\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0||\xa0mysql-bin.000002\xa0|\xa0659\xa0|\xa0Xid\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0|\xa0\xa0\xa0\xa0123456\xa0|\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0690\xa0|\xa0COMMIT\xa0/*\xa0xid=35\xa0*/\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0||\xa0mysql-bin.000002\xa0|\xa0690\xa0|\xa0Rotate\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0|\xa0\xa0\xa0\xa0123456\xa0|\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0737\xa0|\xa0mysql-bin.000003;pos=4\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0|+------------------+-----+----------------+-----------+-------------+--------------------------------------------------------+13\xa0rows\xa0in\xa0set
雖然有很多看似復(fù)雜的指令,但是還是不難看出,在02里,有兩條寫操作,03里有一條刪除操作。
一條插入操作的完整日志是這樣:
|\xa0mysql-bin.000002\xa0|\xa0154\xa0|\xa0Anonymous_Gtid\xa0|\xa0\xa0\xa0\xa0123456\xa0|\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0219\xa0|\xa0SET\xa0@@SESSION.GTID_NEXT=\xa0'ANONYMOUS'\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0||\xa0mysql-bin.000002\xa0|\xa0219\xa0|\xa0Query\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0|\xa0\xa0\xa0\xa0123456\xa0|\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0293\xa0|\xa0BEGIN\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0||\xa0mysql-bin.000002\xa0|\xa0293\xa0|\xa0Table_map\xa0\xa0\xa0\xa0\xa0\xa0|\xa0\xa0\xa0\xa0123456\xa0|\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0343\xa0|\xa0table_id:\xa0108\xa0(test.table1)\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0||\xa0mysql-bin.000002\xa0|\xa0343\xa0|\xa0Write_rows\xa0\xa0\xa0\xa0\xa0|\xa0\xa0\xa0\xa0123456\xa0|\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0390\xa0|\xa0table_id:\xa0108\xa0flags:\xa0STMT_END_F\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0||\xa0mysql-bin.000002\xa0|\xa0390\xa0|\xa0Xid\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0|\xa0\xa0\xa0\xa0123456\xa0|\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0421\xa0|\xa0COMMIT\xa0/*\xa0xid=34\xa0*/\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0|我們的目的是恢復(fù)誤刪的數(shù)據(jù),其實(shí)就是將binlog.000002日志的兩條插入記錄重演一遍,而不需要取理會(huì)binlog.000003的操作(因?yàn)閯h除是一個(gè)誤操作)
所以現(xiàn)在能理解為什么我們頻繁刷新binlog了吧,當(dāng)然,在實(shí)際的線上環(huán)境中,我們肯定需要將binlog導(dǎo)出后,仔細(xì)篩選出誤操作,并將其排除,之后再運(yùn)行binlog。
在本文中,我們只做一個(gè)恢復(fù)兩條插入語句的操作,執(zhí)行語句:
sudo\xa0mysqlbinlog\xa0/var/lib/mysql/mysql-bin.000002\xa0--start-position\xa0154\xa0--stop-position\xa0690\xa0|\xa0mysql\xa0-uroot\xa0-p\xa0mytest
注意:這里填寫的路徑/var/lib/mysql/mysql-bin.000002需要具體到你的binlog目錄,網(wǎng)上大部分文章只寫到mysql-bin.000002,如果你不在目錄里,mysqlbinlog命令并不會(huì)自動(dòng)定位binlog所在路徑。
參數(shù)描述:
--start-datetime:從二進(jìn)制日志中讀取指定等于時(shí)間戳或者晚于本地計(jì)算機(jī)的時(shí)間--stop-datetime:從二進(jìn)制日志中讀取指定小于時(shí)間戳或者等于本地計(jì)算機(jī)的時(shí)間\xa0取值和上述一樣--start-position:從二進(jìn)制日志中讀取指定position\xa0事件位置作為開始。--stop-position:從二進(jìn)制日志中讀取指定position\xa0事件位置作為事件截至
執(zhí)行成功后,再次查看表table1,可以看到兩條新的id=3和4的數(shù)據(jù)被插入了進(jìn)來?;謴?fù)成功了。
mysql>\xa0select\xa0*\xa0from\xa0table1;+----+----+|\xa0id\xa0|name|+----+----+|\xa0\xa01\xa0|\xa0A\xa0\xa0||\xa0\xa02\xa0|\xa0B\xa0\xa0||\xa0\xa03\xa0|\xa0C\xa0\xa0|\xa0|\xa0\xa03\xa0|\xa0C\xa0\xa0||\xa0\xa04\xa0|\xa0D\xa0\xa0|+----+----+6\xa0rows\xa0in\xa0set延伸思考
Binlog在什么情況下無法恢復(fù)數(shù)據(jù)?
結(jié)語刪庫跑路不用怕,其他開發(fā)運(yùn)維都等著恢復(fù)你的數(shù)據(jù)呢,多好的練手機(jī)會(huì)是不是。
當(dāng)然,看完binlog日志恢復(fù)數(shù)據(jù)的原理,希望大家以后在定期備份數(shù)據(jù)庫的腳本里,也能夠加上刷新binlog日志的命令,這樣一旦某天丟失數(shù)據(jù),可以將當(dāng)天binlog數(shù)據(jù)單獨(dú)拿出來還原,做到清晰可辨,也加快恢復(fù)效率。
參考https://www.cnblogs.com/rjzheng/p/9721765.html
https://blog.csdn.net/king_kgh/article/details/74890381
https://www.jianshu.com/p/564fcc2b5e31
https://blog.csdn.net/king_kgh/article/details/74833539
關(guān)注我我是一名后端開發(fā)工程師。
主要關(guān)注后端開發(fā),數(shù)據(jù)安全,爬蟲,物聯(lián)網(wǎng),邊緣計(jì)算等方向,歡迎交流。
各大平臺(tái)都可以找到我微信公眾號(hào):后端技術(shù)漫談Github:@qqxx6661CSDN:@后端技術(shù)漫談知乎:@后端技術(shù)漫談簡書:@后端技術(shù)漫談掘金:@后端技術(shù)漫談原創(chuàng)博客主要內(nèi)容后端開發(fā)相關(guān)技術(shù)文章Java面試知識(shí)點(diǎn)復(fù)習(xí)全手冊(cè)設(shè)計(jì)模式/數(shù)據(jù)結(jié)構(gòu)Leetcode/劍指offer 算法題解析SpringBoot/SpringCloud 入門實(shí)戰(zhàn)系列爬蟲相關(guān)技術(shù)文章逸聞趣事/好書分享/個(gè)人興趣個(gè)人公眾號(hào):后端技術(shù)漫談公眾號(hào):后端技術(shù)漫談.jpg
如果文章對(duì)你有幫助,不妨收藏,投幣,轉(zhuǎn)發(fā),在看起來~
以上就是關(guān)于pos機(jī)日志結(jié)算,「刪庫跑路」使用Binlog日志恢復(fù)誤刪的MySQL數(shù)據(jù)的知識(shí),后面我們會(huì)繼續(xù)為大家整理關(guān)于pos機(jī)日志結(jié)算的知識(shí),希望能夠幫助到大家!
