优秀音乐网站设计欣赏,关于网站开发所需的知识,企业网站功能清单,购物网站 后台生产上误删数据、误改数据的现象也是时常发生的现象#xff0c;作为运维这时候就需要出来补锅了#xff0c;最开始的做法是恢复备份#xff0c;然后从中找到需要的数据再进行修复#xff0c;但是这个时间太长了#xff0c;对于大表少数数据的修复来讲#xff0c;动作太大… 生产上误删数据、误改数据的现象也是时常发生的现象作为运维这时候就需要出来补锅了最开始的做法是恢复备份然后从中找到需要的数据再进行修复但是这个时间太长了对于大表少数数据的修复来讲动作太大成本也大。 当然还有其他的一些操作方法我们今天有主角。 MySQL 闪回工具 -- binlog2sql 用途 数据回滚主从切换后数据不一致的修复从 binlog 生成标准 SQL带来的衍生功能 闪回原理简析 开始之前先说说闪回。我们都知道 MySQL binlog 以 event 为单位记录数据库的变更信息这些信息能够帮助我们重现这之间的所有变化也就是所谓的闪回。 binlog 有三种可选的格式 statement基于 SQL 语句的模式binlog 数据量小但是某些语句和函数在复制过程可能导致数据不一致甚至出错mixed混合模式根据语句来选用是 statement 还是 row 模式row基于行的模式记录的是行的完整变化。安全但 binlog 会比其他两种模式大很多利用 binlog 做闪回需要将 binlog 格式设置为 row因为我们需要最详尽的信息来确定操作之后数据不会出错。 既然 binlog 以 event 形式记录了所有的变更信息那么我们把需要回滚的 event从后往前回滚回去即可。 回滚操作对于 delete 操作我们从 binlog 提取出 delete 信息反向生成 insert 回滚语句
对于 insert 操作反向生成 delete 回滚语句
对于 update 操作根据信息生成反向的 update 语句 竟然这么厉害 来实例演习下 主要测试 DML也就是 delete、update、insert 等操作的闪回效果。 但是DDL 语句比如drop,truncate 在整个使用中都是无法被回滚的这种情况只能用最近的备份数据二进制日志恢复 本次实验更改一条数据并删除一条数据然后从解析 binlog 信息到使用 binlog2sql 工具来生成标准和回滚 SQL来剖析整个运行过程。 一、准备工作 1.确定版本信息和binlog格式 mysql版本5.7.12 查看binlog格式的命令 mysql show variables like binlog_format;
----------------------
| Variable_name | Value |
----------------------
| binlog_format | ROW |
---------------------- 2.安装binlog2sql工具 #随便安装在合适的服务器即可比如我在内网15安装了一个 安装参考链接http://note.youdao.com/noteshare?id85a90269a21d877962bfce0dfa40a90bsub71CD3E637F534AA1AFF129563F6A064E 3.在mysql的主服务器上创建闪回操作账号的权限 mysql GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO glon% identified by 123456;mysql show grants for glon%;
--------------------------------------------------------------------------
| Grants for glon% |
--------------------------------------------------------------------------
| GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO glon% |
--------------------------------------------------------------------------
1 row in set (0.00 sec) 4.初始化数据 CREATE TABLE edai_binlog2sql (id int(11) NOT NULL AUTO_INCREMENT,
name varchar(20) NOT NULL,
create_time datetime NOT NULL,
PRIMARY KEY (id)
) ENGINEInnoDB AUTO_INCREMENT4 DEFAULT CHARSETutf8insert into edai_binlog2sql (name,create_time) values (Glon Ho,2012-10-1),(Eason Chan, 2016-05-02),(Jacky Cheung, 2015-05-02);mysql select * from edai_binlog2sql;
---------------------------------------
| id | name | create_time |
---------------------------------------
| 4 | Glon Ho | 2012-10-01 00:00:00 |
| 5 | Eason Chan | 2016-05-02 00:00:00 |
| 6 | Jacky Cheung | 2015-05-02 00:00:00 |
---------------------------------------
3 rows in set (0.00 sec) 进行 update 和 delete 操作 mysql update edai_binlog2sql set create_time 2017-05-12 where name Glon Ho;
Query OK, 1 row affected (0.05 sec)
Rows matched: 1 Changed: 1 Warnings: 0mysql select * from edai_binlog2sql;
---------------------------------------
| id | name | create_time |
---------------------------------------
| 4 | Glon Ho | 2017-05-12 00:00:00 |
| 5 | Eason Chan | 2016-05-02 00:00:00 |
| 6 | Jacky Cheung | 2015-05-02 00:00:00 |
---------------------------------------
3 rows in set (0.00 sec)mysql delete from edai_binlog2sql where name Jacky Cheung;
Query OK, 1 row affected (0.09 sec)mysql select * from edai_binlog2sql;
-------------------------------------
| id | name | create_time |
-------------------------------------
| 4 | Glon Ho | 2017-05-12 00:00:00 |
| 5 | Eason Chan | 2016-05-02 00:00:00 |
-------------------------------------
2 rows in set (0.00 sec) 操作时候Glon Ho 的时间改变了而 Jacky Cheung 也被删除了。我们来看下mysql的binlog文件位置 mysql show master status; -------------------------------------------------------------------------------| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |-------------------------------------------------------------------------------| mysql-bin.000001 | 6159854 | | | |-------------------------------------------------------------------------------1 row in set (0.00 sec) 好的接下来使用binlog2sql工具 #这个工具我们安装在15服务器上的我们去15上操作 1解析出标准的SQL python binlog2sql.py -h192.168.1.21 -P30136 -uglon -p123456 -d xcrm -t edai_binlog2sql --start-filemysql-bin.000001 edai_binlog2sql.sql 参数解释-h数据库服务地址-u连接用户名
-p密码-P端口
-d数据库名
-t表名 --start-file 通俗的来讲就是要解析sql的所在的binglog文件--flashback 闪回逆向解析sql语句 cat edai_binlog2sql.sql 可以看到几乎完美重现了我们上面执行过的 SQL而且生成的每个 SQL 后面都带有该语句在 binlog 中的 position 信息和该语句的执行时间。 2)解析想要回滚的SQL 比如我想回滚刚刚操作的edai_binlog2sql 后面两个update和DELETE操作 找到的时间节点就是start 6159262 end 6159823 #分析最好用pos分析这个可以更准确的定位到想要的 python binlog2sql.py --flashback -h192.168.1.21 -P30136 -uglon -p123456 -dxcrm -tedai_binlog2sql --start-filemysql-bin.000001 --start-position6159262 --stop-pos6159823 edai_binlog2sql-new.sql [rootsoft binlog2sql]# cat edai_binlog2sql-new.sql
INSERT INTO xcrm.edai_binlog2sql(create_time, id, name) VALUES (2015-05-02 00:00:00, 6, Jacky Cheung); #start 6159565 end 6159823 time 2018-11-22 15:16:30
UPDATE xcrm.edai_binlog2sql SET create_time2012-10-01 00:00:00, id4, nameGlon Ho WHERE create_time2017-05-12 00:00:00 AND id4 AND nameGlon Ho LIMIT 1; #start 6159262 end 6159534 time 2018-11-22 15:15:46 可以看到我们刚刚的delete语句被反转为insert语句update 修改为原来的时间 拿到了具体的恢复语句 那我们拿去数据库执行吧 好了完美搞定 转载于:https://www.cnblogs.com/tianfen/p/10001807.html