pos機日志結算,「刪庫跑路」使用Binlog日志恢復誤刪的MySQL數據

 新聞資訊2  |   2023-05-30 10:14  |  投稿人:pos機之家

網上有很多關于pos機日志結算,「刪庫跑路」使用Binlog日志恢復誤刪的MySQL數據的知識,也有很多人為大家解答關于pos機日志結算的問題,今天pos機之家(www.www690aa.com)為大家整理了關于這方面的知識,讓我們一起來看下吧!

本文目錄一覽:

1、pos機日志結算

pos機日志結算

前言

“刪庫跑路”是程序員經常談起的話題,今天,我就要教大家如何刪!庫!跑!路!

開個玩笑,今天文章的主題是如何使用mysql內置的Binlog日志對誤刪的數據進行恢復,讀完本文,你能夠了解到:

MySQL的binlog日志是什么?通常是用來干什么的?模擬一次誤刪數據的操作,并且使用binlog日志恢復誤刪的數據。

寫這篇文章的初衷,是有一次我真的險些把測試數據庫的一張表給刪除了,當時嚇出一身冷汗。原因是由于Spring JPA的配置中,有一個spring.jpa.properties.hibernate.hbm2ddl.auto=create-drop,其用途是每次加載hibernate時根據model類生成表,但是sessionFactory一關閉,表就自動刪除。,這個可不能隨便配置上去,直接就把你原來存在的表給drop了!

好了,回歸正題,這篇文章就是想讓大家放心,MySQL就算進行了誤刪操作,也基本都能夠搶救回來。尤其是大公司內,數據可不是你想刪就能刪掉的,有無數權限/備份阻攔著你。

正文Binlog介紹

binlog是記錄所有數據庫表結構變更(例如CREATE、ALTER TABLE…)以及表數據修改(INSERT、UPDATE、DELETE…)的二進制日志。binlog不會記錄SELECT和SHOW這類操作,因為這類操作對數據本身并沒有修改,但你可以通過查詢通用日志來查看MySQL執行過的所有語句。

看了上面binlog的定義,大家也應該能大致推理出binlog的三大用途:

恢復數據:今天要說的重點數據庫復制:主從數據庫是通過將binlog傳給從庫,從庫有兩個線程,一個I/O線程,一個SQL線程,I/O線程讀取主庫傳過來的binlog內容并寫入到relay log,SQL線程從relay log里面讀取內容,寫入從庫的數據庫。審計:用戶可以通過二進制日志中的信息來進行審計,判斷是否有對數據庫進行注入攻擊。

所以說,想要能夠恢復數據,首先,你得打開Mysql的binlog,在平常你自己安裝的單機Mysql中,默認情況下不會開啟。下面就一步步地實踐下如何開啟你服務器上的Binlog日志。

在MySQL中開啟Binlog

首先進入數據庫控制臺,運行指令:

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是關閉的,都是OFF。接下來我們需要修改Mysql配置文件,執行命令:

sudo\xa0vi\xa0/etc/mysql/mysql.conf.d/mysqld.cnf

在文件末尾添加:

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

保存文件,重啟mysql服務:

sudo\xa0service\xa0mysql\xa0restart

重啟完成后,查看下mysql的狀態:

systemctl\xa0status\xa0mysql.service

這時,如果你的mysql版本在5.7或更高版本,就會報錯:

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

之前我們的配置,對于5.7以下版本應該是可以的。但對于高版本,我們需要指定server-id。

如果你不是分布式的部署Mysql,這個server-id隨機給個數字就可以。

server-id=123454模擬刪除數據并恢復首先新建數據庫mytest,新建一張表table1,結構見下方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;插入兩條數據,分別是 (1,'A'),(2,'B')

INSERT\xa0INTO\xa0`table1`\xa0VALUES\xa0(1,'A'),(2,'B');我們看一下binlog日志的狀態,使用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日志特征:每當我們重啟MySQL一次,會自動生成一個binlog文件,當然,我們也可以手動的來刷新binlog文件,通過 flush logs,同樣會新創建一個binlog文件。實際上當服務器在重啟時,也會調用flush logs操作。

上圖代碼中可以看到,現在我們正在使用 mysql-bin.0000001 ,并且這個文件現在正在記錄到690行。

然后,使用flush logs來主動刷新一次binlog

mysql>\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

可以看到,現在日志文件在 mysql-bin.000002 文件中,位置為154。也就是我們主動刷新了一次binlog,生成了新的000002,而000001則已經歸檔了,不會再寫入新的日志進去了。

接下來我們在插入兩條數據

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|+----+----+這時候我們已經有了四條數據,我們再次flush logs,把mysql-bin.000002日志存檔,開啟新的mysql-bin.000003日志,這樣,每次我們插入的數據彼此獨立。實際情況下,binlog會比較復雜,這里也是做了簡化,為了理解更方便。

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的數據(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兩個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

雖然有很多看似復雜的指令,但是還是不難看出,在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|我們的目的是恢復誤刪的數據,其實就是將binlog.000002日志的兩條插入記錄重演一遍,而不需要取理會binlog.000003的操作(因為刪除是一個誤操作)

所以現在能理解為什么我們頻繁刷新binlog了吧,當然,在實際的線上環境中,我們肯定需要將binlog導出后,仔細篩選出誤操作,并將其排除,之后再運行binlog。

在本文中,我們只做一個恢復兩條插入語句的操作,執行語句:

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目錄,網上大部分文章只寫到mysql-bin.000002,如果你不在目錄里,mysqlbinlog命令并不會自動定位binlog所在路徑。

參數描述:

--start-datetime:從二進制日志中讀取指定等于時間戳或者晚于本地計算機的時間--stop-datetime:從二進制日志中讀取指定小于時間戳或者等于本地計算機的時間\xa0取值和上述一樣--start-position:從二進制日志中讀取指定position\xa0事件位置作為開始。--stop-position:從二進制日志中讀取指定position\xa0事件位置作為事件截至

執行成功后,再次查看表table1,可以看到兩條新的id=3和4的數據被插入了進來。恢復成功了。

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在什么情況下無法恢復數據?

結語

刪庫跑路不用怕,其他開發運維都等著恢復你的數據呢,多好的練手機會是不是。

當然,看完binlog日志恢復數據的原理,希望大家以后在定期備份數據庫的腳本里,也能夠加上刷新binlog日志的命令,這樣一旦某天丟失數據,可以將當天binlog數據單獨拿出來還原,做到清晰可辨,也加快恢復效率。

參考

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

關注我

我是一名后端開發工程師。

主要關注后端開發,數據安全,爬蟲,物聯網,邊緣計算等方向,歡迎交流。

各大平臺都可以找到我微信公眾號:后端技術漫談Github:@qqxx6661CSDN:@后端技術漫談知乎:@后端技術漫談簡書:@后端技術漫談掘金:@后端技術漫談原創博客主要內容后端開發相關技術文章Java面試知識點復習全手冊設計模式/數據結構Leetcode/劍指offer 算法題解析SpringBoot/SpringCloud 入門實戰系列爬蟲相關技術文章逸聞趣事/好書分享/個人興趣個人公眾號:后端技術漫談

公眾號:后端技術漫談.jpg

如果文章對你有幫助,不妨收藏,投幣,轉發,在看起來~

以上就是關于pos機日志結算,「刪庫跑路」使用Binlog日志恢復誤刪的MySQL數據的知識,后面我們會繼續為大家整理關于pos機日志結算的知識,希望能夠幫助到大家!

轉發請帶上網址:http://www.www690aa.com/newsone/60479.html

你可能會喜歡:

版權聲明:本文內容由互聯網用戶自發貢獻,該文觀點僅代表作者本人。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如發現本站有涉嫌抄襲侵權/違法違規的內容, 請發送郵件至 babsan@163.com 舉報,一經查實,本站將立刻刪除。