mysql误操作binlog恢复步骤 记录具体步骤,方便日后回忆 一般正式环境使用数据库都会做全备份,但如果某个时刻数据库崩了,若利用全备份文件恢复,则在全备份到出现问题这段时间内的数据将会丢失,一般来说迫不得已也不会采取这种措施 include-gtids, respectively, instead. root@f5f55acbb59a:/home# ls 000048bin.sql binlog.000048 这里-d用来指定误操作的数据库 G1rvYQ8BAAAAeQAAAH0AAAABAAQAOC4wLjI3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAbWu9hEwANAAgAAAAABAAEAAAAYQAEGggAAAAICAgCAAAACgoKKioAEjQA */; # at 10565 #220125 3:02:35 server id 1 end_log_pos 10646 CRC32 0xe5bf9fe9 Query thread_id A1RvbRwAAAASdGVzdDNAYmFvbWlkb3UuY29tAAQAAAAAAAAABVNhbmR5FQAAABJ0ZXN0NEBiYW9t aWRvdS5jb20ABQAAAAAAAAAGQmlsbGllGAAAABJ0ZXN0NUBiYW9taWRvdS5jb20
1.简介 在oracle数据库中,当一个误操作被提交后,我们可以通过oracle提供的闪回功能将表闪回至误操作之前的状态。 mysql中没有原生的flushback功能,DBA误操作时,传统的恢复方式是利用全备+二进制日志前滚进行恢复。 france | paris | +------+-------+------+---------+----------+ 3 rows in set (0.00 sec) step2.模拟误操作 -rw-r--r-- 1 root root 12222 Apr 13 2017 mysql_rollback.py 根据关键词europe查找binlog中的误操作sql,并输出europe 查看rollback.sql中误操作的逆向语句 SZD-L0087668:gzz3306:Master > cat rollback.sql ## at 2482 ##180503 14:13:36
然后编写脚本,根据id一一对应的把state字段的数据修改过来,故障期间造成了一些数据的丢失,不过好在不多,只能根据他们的反馈然后把数据补上 最后,经过分析可以知道,开头提到的写法本身就是错误的,但是mysql
---- 操作数据库时,如果不慎执行了 DML 误操作,闪回工具可以回滚这类 DML 误操作。 闪回之前 在使用闪回工具之前,需要明确几个小问题: 哪些 SQL 类型可以使用闪回工具? 使用方式 show master status\G File: mysql-bin.000014 Executed_Gtid_Set: 52875cf3-e9d3-11ef-88ab-02000aba3d09 ='delete,insert,update' --include-gtids='52875cf3-e9d3-11ef-88ab-02000aba3d09:120765-120766' 应用回滚的 binlog show masterstatus\G File: mysql-bin.000006 Position: 255561 52875cf3-e9d3-11ef-88ab-02000aba3d09:1-34 使用闪回工具只是一种补救措施,安全运维应该在预防误操作上有哪些安排呢? 一个让运维人员睡的安心的数据保障系统(MySQL 版)。 预防,为了减少数据误删除发生的概率,通过交付基线避免。
误操作数据库的事情,估计不少开发人员都可能会遇到。毕竟常在河边走,哪有不湿鞋的呢? ? 今天,我给大家讲一下 MySQL 中的“误操作”回魂术。 用它来解决数据库的误操作问题,将大大缩短我们恢复数据的时间和难度。 网上关于 Flashback 的工具其实比较多。 当我们误操作插入了不想要的数据后,可以执行下面的命令,就可以把插入的数据给干掉了。 ? 其他的删除,更新操作都一样。 不要小看 binlog,它可是 MySQL 高可用和可靠性的基石。其实,MySQL 有很多功能都是落后的,这也正是 mariadb 等数据库崛起的原因。可以想象,AI 数据库绝对是未来的一个趋势!
AND `token_change_time`=1481602129 AND `expire_time`=0 AND `nickname`='阿超' AND `device_id`='cc0e154d9b5dd703eccc7d8a0dbc0f67d64b79e8 2105\":1}', 1490239125, 19, '', 1481610680, 0, 1490239125, 0, 'zf', 'da75b093-bd22-48f6-bbb1-d3296e29e9b5 = 1 log_bin = /data/mysql/mysql-bin.log max_binlog_size = 1G binlog_format = row binlog_row_image = 作为实时解析 MySQL binlog 来获取各个 EVENT。 python-mysql-replication 实现了 MySQL 复制协议,客户端伪装成 slave 来获取主的 binlog 和 EVENT。
1.简介 在Oracle数据库中,当一个误操作被提交后,我们可以通过Oracle提供的闪回功能将表闪回至误操作之前的状态。 mysql中没有原生的flushback功能,DBA误操作时,传统的恢复方式是利用全备+二进制日志前滚进行恢复。 france | paris | +------+-------+------+---------+----------+ 3 rows in set (0.00 sec) step2.模拟误操作 -rw-r--r-- 1 root root 12222 Apr 13 2017 mysql_rollback.py 根据关键词europe查找binlog中的误操作sql,并输出europe 查看rollback.sql中误操作的逆向语句 SZD-L0087668:gzz3306:Master > cat rollback.sql ## at 2482 ##180503 14:13:36
在线上或者测试环境误操作导致数据被删除或者更新后,想要恢复,一般有两种方法。 方法一、利用最近的全量备份+增量binlog备份,恢复到误操作之前的状态,但是随着数据量的增大,binlog的增多,恢复起来很费时。 /mysql_3306/log/mysql3306.000006 /*! /mysql_3306/log/mysql3306.000006 -o /tmp/rollback.sql -h 118.89.107.162 -u root -P 3306 -p qcloud@2018 `pytest1` WHERE id=1 AND c1=1 AND c2='wjq' AND c3=3; 9、执行回滚操作 [root@VM_54_118_centos ~]# mysql
要确保mysql 数据库的 datadir是清空的,否则会报错 [root@slave02 data]# cat restore.log nohup: ignoring input Warning: /usr/bin/innobackupex version 2.3.2 based on MySQL server 5.6.24 Linux (x86_64) (revision id: 306a2e0 ) Original data directory /var/lib/mysql is not empty! ) Original data directory /var/lib/mysql is not empty! 开头的文件 如: .bash_history .lesshst .mysql_history .viminfo 要指明删,如 rm -rf .bash_history .lesshst .mysql_history
要确保mysql 数据库的 datadir是清空的,否则会报错 [root@slave02 data]# cat restore.log nohup: ignoring input Warning: /usr/bin/innobackupex version 2.3.2 based on MySQL server 5.6.24 Linux (x86_64) (revision id: 306a2e0 ) Original data directory /var/lib/mysql is not empty! ) Original data directory /var/lib/mysql is not empty! 开头的文件 如: .bash_history .lesshst .mysql_history .viminfo 要指明删,如 rm -rf .bash_history .lesshst .mysql_history
写在前面 今天,一位哥们打电话来问我说误操作了他们公司数据库中的数据,如何恢复。他原本的想法是登录数据库update一个记录,结果忘了加where条件,于是悲剧发生了。 今天,我们不讲如何恢复误操作的数据(后面专门讲如何恢复误删除的数据),我们讲讲如何从源头上避免这样的问题,这才是避免类似问题的根本措施。 那么,我们基于MySQL提供的这项设置,就可以轻松实现如何最大程度防止人为误操作MySQL数据库了。什么?你不信? 不信我们就从MySQL的帮助说明说起,一起来看看如何基于MySQL的-u选项实现如何最大程度防止人为误操作MySQL数据库。 指定别名 我们可以将操作MySQL的命令做成别名,防止他人和DBA误操作数据库,将操作MySQL的命令做成别名也非常简单,这里,我们直接上示例了,如下所示。
二 常用的恢复方式 2.1 利用备份恢复 使用这种方式的前提必须有最近的备份集或者知道出现误操作起始的binlog 位点或者GTID,利用备份集恢复到中间的机器上,然后利用MySQL的slave 特性 default 1 ) engine=innodb default charset=utf8; insert into flashback(stat) values (2),(3),(4),(7),(9) ,(22),(42),(33),(66),(88) 误操作 update flashback set stat=15 恢复数据的步骤 1 获取误操作的dml所在的binlog,不过一般开发可不知道具体binlog ,他们只知道什么时间误操作了,binlog2sql支持按照时间范围恢复。 | | 4 | 7 | | 5 | 9 | | 6 | 22 | | 7 | 42 | | 8 | 33 | | 9 | 66 | | 10 | 88 | +----+------+ 10 rows
关于误操作删除数据和数据恢复,一定要有安全意识,MySQL数据的找回,一定要在配置bin-log,否则数据丢失将无法恢复: 在MySQL的my.ini(或my.cnf,视操作系统不同而不同)添加: [mysqld] log-bin=binlog(名字随便取) 然后需要重启MySQL服务才能生效 可以通过命令“show binlog events;”查看配置是否成功 通过mysqlbinlog 恢复MySQL数据的两种方法: (1)时间date 通过cmd运行到binlog所在的目录,再录入: mysqlbinlog –stop-date=”2011-02-27 12:12:59″ jbms_binlog .000001 | mysql -uroot -proot (回车) 恢复到2011-02-27 12:12:59之前的数据,如果是start-date,即从该时间点后的开始算起 (2)位置position 查看生成的txt文件,获取编辑位置和时间等数据,然后通过命令: mysqlbinlog –stop-position=”98″ jbms_binlog.000002 | mysql -uroot -proot
2.知识 性能优化是通过合理安排资源,调整MySQL参数,服务器环境等手段使得MySQL 运行更快,更节省资源。 常见的优化方法: 查询优化 数据库表结构设计优化 MySQL所在的服务器优化 可以从多个方面进行性能优化,原则是 尽量减少系统的瓶颈,减少资源的占用,加快系统的响应速度。 比如: 优化系统的文件系统,以提高磁盘I/O的读写速度; 优化操作系统调度策略,以提高MySQL在高负荷情况下的负载能力; 优化表结构,索引,查询语句使得查询的响应更快。 它虽然很灵活,但执行效率不高,MySQL 需要未内层查询语句的查询结果建立一个临时表,然后外层的查询语句从临时表里再次查询。查询完毕后,销毁这些临时表。 优化 MySQL 服务器 硬件优化 配置较大内存 配置高速磁盘 合理分布磁盘I/O 多处理器等 优化MySQL配置文件的参数 MySQL配置参数在my.cnf , my.ini 文件中,根据经验修改参数达到优化目的
mysql的事务默认是自动提交的,也就是说,当执行一条DML语句,Mysql会立即隐式的提交事务 二、事务操作 2.1 查看事务提交方式 select@@autocommit; 2.2 设置事务提交方式 | serializable}; 说明1:session :设置仅对当前对话起作用 说明2:global :设置对全局都有用 六、事务的演示 6.1 案例使用的accout表结构及数据 mysql 在进行异常展示之前,先把数据恢复成各自2000的余额 mysql> update account set money=2000; Query OK, 2 rows affected (0.02 sec) Rows matched: 2 Changed: 2 Warnings: 0 mysql> select * from account; +----+--------+-------+ | id 6.4 案例3 使用事务完成,首先同样也是先还原数据,每个人的余额都是2000元 mysql> select * from account; +----+--------+-------+ |
误操作闪回的工具包括my2sql、binlog2sql和MyFlash等工具,其中,个人感觉my2sql最好用。 Creating table 'sbtest9'... Creating a secondary index on 'sbtest9'... Creating a secondary index on 'sbtest4'... .000005 2021-02-26_12:33:44 2021-02-26_12:33:44 7970103 8488545 2716 0 [lhrdb.sbtest9( 12:33:44 2021-02-26_12:33:46 7970176 18035041 10000 0 0 lhrdb sbtest9
二、分类 MySQL中的锁、按照锁的粒度分,分为以下三类 全局锁:锁定数据量的所有表 表级锁:每次操作锁住整张表 行级锁:每次操作锁住对应的行数据 三、全局锁 3.1 简介 全局锁就是对整个数据库实例枷锁 执行查询语句正常的,但是执行DML语句中的更新操作却是处于阻塞状态 3.5 案例二 说明1:客户端1中设置了全局锁 说明2:客户端3中做了数据库备份的语句,其中mysqldump是和mysql 一样由MySQL服务器提供的数据库备份的命令 说明3:当数据库设置了全局锁的时候,不影响数据库的备份 说明4:MySQL备份实在终端命令行模式下,不是在数据库命令模式下,注意! MDL锁主要作用是维护表元数据的数据一致性,在表上有活动事务的时候,不可以对元数据进行写入操作,为了避免DML和DDL冲突,保证读写的正确性 6.2 元数据锁的类型 在MySQL5.5 中引入了 说明9:InnoDB的行锁是针对于索引加的锁,不通过索引检索数据,那么InnoDB将对表中的所有记录加锁,此时就会升级为表锁 说明10:根据业务需要,尽量使用索引当所查询条件,既快又减少阻塞
MySQL 提供的 sql_safe_updates(安全更新模式) 正是为了防止因误操作而引发的灾难性数据更改。 启用该模式后,如果执行的 UPDATE 或 DELETE 语句缺少 WHERE 条件或没有使用索引限制,MySQL 将拒绝执行操作,从而有效避免全表更新或删除的风险。 为了方便管理,不希望每次登录都手动设置,你可以利用 MySQL 的 init_connect 变量,让非超级用户在登录时自动执行安全设置。 这是因为 sql_safe_updates(安全更新模式)已开启,MySQL 会限制执行可能影响大量数据的 UPDATE 或 DELETE 语句,防止误操作导致全表数据被意外修改或删除。 注意:拥有 SUPER 权限的用户(如 root 或其他管理员账户)登录时将不会执行 init_connect 语句,因为 MySQL 默认认为超级用户具备足够的权限去控制会话。
之前做过一个很傻的事情,输入chmod -R 777 / 输入快了,后面没有跟目录直接回车了。所有目录的权限都凌乱了,这里写一份恢复sshd登录的教程以及恢复系统文件的教程。最好恢复sshd之后,把数据拿出来,重新部署应用环境吧,以防以后位置的bug和风险。
About Me toc 一、my2sql简介 可以用于MySQL误操作闪回的工具包括my2sql、binlog2sql和MyFlash等工具,其中,个人感觉my2sql最好用。 Creating table 'sbtest9'... Creating a secondary index on 'sbtest9'... Creating a secondary index on 'sbtest4'... .000005 2021-02-26_12:33:44 2021-02-26_12:33:44 7970103 8488545 2716 0 [lhrdb.sbtest9( 12:33:44 2021-02-26_12:33:46 7970176 18035041 10000 0 0 lhrdb sbtest9