网上有很多关于pos机日志结算,「删库跑路」使用Binlog日志恢复误删的MySQL数据的知识,也有很多人为大家解答关于pos机日志结算的问题,今天pos机之家(www.poszjia.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来主动刷新一次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
可以看到,现在日志文件在 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机日志结算的知识,希望能够帮助到大家!
