一次数据库误update之后的数据恢复

工作需要,要对数据库(mysql)数据进行对比,写完测试脚本。想在表中修改一条数据,然后运行程序看看效果。正确的sqlupdate table1 set amount = 100 where id=123;。可是实际情况是没有写where条件,就按下了回车,shell很快返回“**条数据已经被修改”,晕了。还好,我不是DBA,我只有权限动测试库,可是测试库也是十几个人公用的。看了下时间21:30,其他都下班了,不着急自己慢慢搞。

没有备份

数据库误操作,数据恢复首先想到备份,测试库一般都是线上数据的copy,很少有备份,方法不通。

binlog全量恢复太困难

大致知道mysql的binlog日志,记录下所有的操作。关于binlog有几条命令很有用,记录下:

  • show variables like ‘log_%‘; 查看binlog是否打开

    mysql> show variables like ‘log_%‘;
    +----------------------------------------+----------------------------------------+
    | Variable_name                          | Value                                  |
    +----------------------------------------+----------------------------------------+
    | log_bin                                | ON                                     |
    | log_bin_basename                       | /home/somename/mysql-bin       |
    | log_bin_index                          | /home/somename/test/mysql-bin.index |
    | log_bin_trust_function_creators        | OFF                                    |
    | log_bin_use_v1_row_events              | OFF                                    |
    | log_error                              | /home/somename/test/err.log         |
    | log_output                             | FILE                                   |
    | log_queries_not_using_indexes          | ON                                     |
    | log_slave_updates                      | ON                                     |
    | log_slow_admin_statements              | OFF                                    |
    | log_slow_slave_statements              | OFF                                    |
    | log_throttle_queries_not_using_indexes | 0                                      |
    | log_warnings                           | 1                                      |
    +----------------------------------------+----------------------------------------+
    13 rows in set (0.00 sec)
  • show binary logs; 查看mysql数据库中binlog文件列表(这些log基本上都很大)
    mysql> show binary logs;
    +------------------+------------+
    | Log_name         | File_size  |
    +------------------+------------+
    | mysql-bin.000067 | 1074104507 |
    | mysql-bin.000068 | 1073900275 |
    | mysql-bin.000069 | 1073742040 |
    | mysql-bin.000070 | 1073742234 |
    | mysql-bin.000071 | 1074693303 |
    | mysql-bin.000072 | 1074476163 |
    | mysql-bin.000073 | 1073743892 |
    | mysql-bin.000074 | 1073742728 |
    | mysql-bin.000075 |   76346728 |
    +------------------+------------+
    9 rows in set (0.01 sec)
  • `show master status \G;‘ 查看当前使用的binlog文件
    mysql> show master status \G;
    *************************** 1. row ***************************
               File: mysql-bin.000075
            Position: 76352042
        Binlog_Do_DB:
    Binlog_Ignore_DB:
    Executed_Gtid_Set:
    1 row in set (0.00 sec)
  • `show binlog events;‘ mysql控制台查看当前使用的binlong
    这条命令输入后,基本上都是满屏滚动的日志,将近1G的日志输出在mysql控制台中,慎重。这些日志记录了对数据库有增删改所有操作的sql、时间、行数等信息。
  • show binlog events in ‘mysql-bin.000002‘; 查看指定的binlog。
  • mysqlbinlog --stop-date="2005-04-20 9:59:59" /var/log/mysql/bin.123456 从binlog恢复日志,mysqlbinlog不是mysql控制台命令,是mysql提供的恢复工具,需要在shell或者cmd下执行

由于没有权限登录到mysql这台机器,只能通过mysql连接执行命令。无法从数据库服务器直接拿到binlog日志。mysql提供-e参数(之前竟不知道),mysql -u root -p root -e "show binlog events" > bin.log将日志重定向到文件。

本机拿到了当前库的binlog,但是完全没有备份的情况下,使用binlog恢复数据,只能将该数据库从创建到现在产生的binlog全部执行一遍,这就纠结了,binlog太大;然后就是即使我们有耐心和时间执行binlog中的全部sql,我们也不能保证binlog从创建到现在没有人删除过,毕竟备份的日志,一般不会放太久 :(

继续阅读->

时间: 2024-08-08 09:25:15

一次数据库误update之后的数据恢复的相关文章

用友金蝶SQL数据库误格式化恢复 SQL数据库修复 SQL数据库恢复 工具 方法

用友金蝶SQL数据库误格式化恢复 SQL数据库修复 SQL数据库恢复 硬盘误格式化.重分区.重装操作系统覆盖 SQL数据解决方法 [客户名称]:贵州铜仁市开天驾驶人培训中心 [软件名称]:用友T3普及版 [数据库版本]:MS SQL server 2000  [数据库大小]:1GB X 6  (3个账套 总共6个年度). [问题描述]:由于服务器中毒或卡顿,客户将服务器电脑送到 装机店 重做操作系统.未详细告知电脑用途,导致整个硬盘被维修店技术员 全盘格式化重新分区,并且重新做好了新的操作系统,

数据库的update、delete、insert和select用法

String sql=null; 1.sql="update 表名 set <列名>=<表达式> [where=<表达式>]" 2.sql="delete from 表名 [where=<表达式>]" 3.sql="insert into 表名 [column_list] values(date_values)  [where=<表达式>]" 4.sql="select * f

SQL2008R2数据库中勒索病毒解密数据恢复

辽宁省某医药集团公司SQL2008R2数据库中勒索病毒解密数据恢复成功 [单位名称] 辽宁省某医药集团公司 [数据恢复故障描述]服务器为IBM服务器.做的RAID5操作系统为:WINDOWS SERVER 2008R2生产数据库为:SQL SERVER 2008R2 ,一共有45G大小.2017年5月16日下午服务器突然无法访问,经单位网络管理人员查看所有文件扩展名被加上了 .id-462C3004.[[email protected]] 字样.数据库文件也未能幸免.每个目录里,都有一个READ

MySQL模拟:线上误update的恢复

作为DBA,细心.沉稳是首要的基本素质.不过总有那么一会心烦意乱或者开发同学出现误操作之类的...这里模拟一个误update操作,然后恢复. 如果开发同学有误操作之后最好先别乱动生产环境,需要记录几个信息给DBA同学来恢复数据. 1:binlog_format.autocommit.binlog位置.误操作的时间点 mysql> SHOW VARIABLES LIKE '%binlog_format%'; +---------------+-------+ | Variable_name | V

使用数据库的Update锁机制处理并发 多线程

之前在公司做一个定时任务,任务本身的逻辑难度一般,但是我们生产环境是4台服务器集群的,测试环境也是2台服务器集成,那么对于JOB来说就会面临一个问题, 假如你的JOB是每天凌晨2.30跑,那么同一时间4台服务器都会去执行这个JOB,如果对同一个数据进行update操作就会发生脏读了. 处理这个问题可以用数据库的update 锁来解决, 因为我们知道update之后 会返回更新的条数  ,所以我们用一个标示状态来表示目前有台服务器在执行JOB了 如 标示用 flag表示 默认 为N 没有JOB执行

SQL SERVER数据库误删除误格式化误重装软件覆盖数据恢复修复

数据库在现今的信息时代来说,已经起到了越来越重要的作用.是数据的真正核心部分,没有数据库,那么软件只是一个漂亮的界面. 数据库恢复.数据库修复是比较常见的一种数据恢复业务. MicrosoftSQL Server数据库修复: ·  如完全丢失数据库mdf文件,用一般数据恢复方式不能恢复 ·  数据库中表被删除,甚至被重写数据,或记录删除又无log日志文件 ·  索引错误,或者IAM断裂,以及各种错误提示如823错误.系统表出错 ·  数据库大面损坏,可以指定任意表提取其数据. ·  格式化或删除

关于MySql数据库误操作数据找回的办法

先讲个事,前段时间,系统长时间不用的一个功能被开放出来了,想当然的我没有在测试平台上测试,直接操作了正式系统(的确是我不严谨),导致好多数据异常,页面展示错乱了.于是我想到的第一个就是进行备份还原.项目进行了7天的备份,每天凌晨自动备份,但是凌晨到现在的数据就会丢失了,这可是重大问题啊.我顿时慌了,于是只能寻求DBA的帮助.这边省略五百字... 最后问题解决了,让我对数据恢复产生了兴趣,听DBA讲用的方法是Flashback闪回工具,也简单,于是我也自学了一下,这边做个介绍. flashback

MS SQL Server数据库修复/MDF数据文件数据恢复/MDF质疑/mdf无法附加

微软的SQL Server 数据库最常用的有两种类型的文件: 1.主要数据文件,文件后缀一般是.MDF: 2.事务日志文件,文件后缀一般是.LDF. 用户数据表.视图.存储过程等等数据,都是存放在MDF文件里,LDF文件是存放MS SQL Server操作过程中的日志记录. MDF文件必读附加到MS SQL Server数据库环境后,才能正常读取其中的数据.当由于某种原因数据库附加不上,MDF数据库文件的内容就没办法读取,修复的方法有两种: 1. 使用MS SQL Server环境进行修复,先以

C++类库:OTL连接MySQL ODBC数据库(insert, update, select)

一. 简介 OTL是一个纯C++的通用数据库连接模板库,可以支持各种当下流行的数据库,如Oracle,Sybase, MySQL, PostgreSQL, EnterpriseDB, SQLite,  MS ACCESS, Firebird等等.它是一个跨平台类库,在MS Windows, Linux/Unix/Mac OS X 都可以使用. OTL使用简单, 只要头文件中包含有: #include "otlv4.h" 就可,实际上整个OTL就一个.H的文件,使用起来极为的方便. 我的