转载地址:http://www.cnblogs.com/edwardlost/archive/2011/07/13/2105598.html
如果误操作把数据库中一张极重要数据表 player 给“做掉了”,还算幸运的是该数据库每3个月会完整备份一次,最近一次的备份点为6月30日,再加上 bin-log 保留了30天的数据,可以根据这两份数据还原数据表的内容。方法看上去非常简单清晰,但是具体执行起来还是遇到了很多问题,下面整理了一些关键问题,以备以后灾难再发生时可供参考。
在处理 bin-log 前首先要把二进制的文件转换成文本文件,方法:
由于一开始我们想当然认为针对 player 表的更新 SQL 都是单行语句,所以就直接使用 grep 进行行级的提取,这种简单做法也为我们后面的恢复失败埋下了“地雷”。
先看一下文本格式 bin-log 的记录格式:
#110630 11:56:05 server id 1 end_log_pos 7612 Query thread_id=6 exec_time=0 error_code=0
SET TIMESTAMP=1309406165/*!*/;
UPDATE ssmatch.young_league_match_7 SET status='playing' WHERE mid=699617
/*!*/;
显而易见,正确的提取方法应该是:
1. 读取一行数据,如果行首字符为'#'则跳过,否则执行第2步;
2. 检测行尾字符是否为';',如果不是则继续读下一行直到行尾字符为';',所有读取的行构成一条 SQL 语句,执行第3步;
3. 清空读取的行缓存,如果已到文件尾则结束,否则跳到第1步循环处理;
下面接着说使用 grep 过滤行数据,不能够使用 insert、update、delete、replace 关键词去做严格的匹配,这样很容易漏掉SQL,因为不同人写的 SQL语句格式差异很大。正确的做法是采用“排除法”,即:先使用表名作为关键词进行grep,然后再通过一些关键词滤掉可能误选的SQL。比如:出错的数据表名为 player,而 bin-log 记录的数据库中还有 player_position、young_player 等表,那么我们就需要过滤包含这些数据表名的SQL。只根据数据表名进行过滤还不行,还要根据数据表的字段名,比如:staff表中包含 judge_player_ability 字段,那么对staff表执行的更新操作也会被提取出来,所以需要检查数据库中所有数据表的字段,将包含 player 关键词的字段名全部过滤点。
下面是实际提取player表更新SQL语句的命令:
最后说一下上面提到的“地雷”问题,我们在数据重跑进度达到80%的时候遇到 bin-log 中下面格式的update语句:
WHERE nid = 1111
“它换行了!!!WHERE语句在第2行!!!”,悲催啊,上面的行级提取方法将完整的UPDATE语句截断了,重跑执行的是“不带 WHERE 的 UPDATE”!!!一下回到解放前,这下只能重头开始再执行一遍!在重跑前还需要将这种“病毒”语句清理掉。
所以,除非你非常肯定确定一定不会出现多行SQL语句,否则都一定要使用上面的正确做法提取SQL。
一条宝贵的经验:在恢复数据的过程中一定要做阶段备份,比如在重跑 SQL 时发生错误导致中断,那么可以先把该时间点的数据表复制一份,然后再从中断点往后继续执行;更好的做法是一开始就按阶段进行数据恢复,比如有30个 bin-log 文件需要重跑,那么可以每跑5~10个 bin-log 后做一次备份;这样的好处是一旦发生“意外”就可以从上一个备份点开始执行,而不是重头执行。请记住在恢复数据的过程中你永远无法预知接下会发生什么事故!
相关推荐
MySQL bin-log 日志是一种重要的数据库日志机制,它可以记录数据库的所有操作,以便在出现问题时进行数据恢复和主从服务器之间的同步数据。然而,随着时间的推移,bin-log 文件会不断增长,占用大量的磁盘空间,影响...
MySQL的二进制日志(bin-log)是数据库系统用来记录所有更改数据的非查询操作的重要工具,主要用于数据恢复、主从复制等场景。当需要将bin-log日志文件转换为可读的SQL文件时,可以使用`mysqlbinlog`命令来实现这一...
在MySQL中,bin-log(二进制日志)是一个关键特性,用于记录所有改变数据库状态的语句,以便于数据恢复、主从复制等场景。然而,在开启bin-log时,可能会遇到一些问题,比如在创建存储过程时出现的错误:`ERROR 1418...
要实际恢复数据,你需要根据需要回放到某个特定时间点的 bin-log。这通常涉及到创建一个备份,然后使用 `mysqlbinlog` 生成 SQL 脚本,再在新的数据库实例上执行这些脚本来应用更改。如果需要精确恢复,可能还需要...
总的来说,datarecover.sh脚本是一个强大的数据恢复工具,它利用MySQL的bin-log特性,帮助我们在数据出现问题时快速回溯到某一状态。理解并掌握其使用,对于数据库管理员来说,是提高故障处理效率和数据安全的重要...
- **配置目标Oracle**:在Oracle服务器上准备接收数据的表结构,确保与MySQL的表结构一致。 - **启动canal**:运行canal实例,开始监听MySQL的bin-log流。 - **解析和同步**:canal解析接收到的bin-log事件,根据...
### MySQL5.0常用命令与数据恢复知识点解析 #### 一、启动MySQL服务器 - **Windows环境下启动MySQL:** - 使用图形化工具WinMySQLAdmin启动MySQL服务。 - 在命令提示符窗口(CMD)中执行`d:\mysql\bin\mysqld`...
如果只有一台MySQL服务器,且不需要进行数据恢复或主从同步,可以在配置文件`my.cnf`中取消`log-bin`选项的注释,然后重启MySQL服务来停止生成二进制日志。 对于有主从服务器环境的情况,清理二进制日志需要更谨慎...
MySQL Connector/J支持JDBC的事务管理特性,如自动提交、显式事务开始和提交、回滚等,确保数据的一致性和完整性。 8. **错误处理与调试**: 当遇到数据库操作失败时,通过捕获和处理`SQLException`,可以获取...
MySQL Connector/J 8.0.24 是MySQL数据库与Java应用程序之间的重要桥梁,它是一个用于连接Java应用程序到MySQL服务器的JDBC驱动程序。这个版本的发布旨在提供更高效、更稳定以及更安全的数据访问功能。以下是对这个...
1. **启用二进制日志并指定前缀**:在`[mysqld]`段落下加入`log-bin=mysql-bin`。这表示日志文件的前缀被设为`mysql-bin`。 ```ini [mysqld] log-bin=mysql-bin ``` 2. **设置服务器ID**:对于集群环境或...
binlog的开启和配置是实现增量数据收集的前提,通常在MySQL配置文件(如my.cnf)中设置`log-bin`选项来启用。 `mysql-binlog-connector-java` 库提供了一个简单的方式来连接到MySQL服务器并订阅binlog事件。这个库...
总的来说,`mysql-connector-java-5.0.0-beta-bin`是Java开发者与MySQL数据库交互的重要工具,它使得Java应用程序能够利用JDBC API轻松地连接、查询和管理MySQL数据库。在实际开发中,我们需要根据项目需求选择合适...
log-bin=mysql-bin ``` - **其他配置**: - `expire_logs_days`:设置日志的过期天数,超过该天数的日志会被自动删除。 ```ini expire_logs_days=3 ``` - 这意味着系统只会保留最近3天的日志文件。 #### 三...
MySQL是世界上最受欢迎的开源关系型数据库管理系统之一,其与Java的连接主要依赖于MySQL Connector/J,也就是我们所说的JDBC驱动程序。"mysql-connector-java-8.0.23.rar"是一个包含MySQL Java连接器的压缩包,适用...
开启mysql-binlog操作 binlog日志用于记录所有更新了数据或者已经潜在更新了数据的所有语句。语句以“事件”的形式保存,它描述数据更改。当我们因为某种原因导致数据库出现故障时,就可以利用binlog日志来挽回...
`,然后在my.cnf配置文件中开启`log-bin=mysql-bin`以启用bin-log。 在从服务器上,配置包括设置唯一的`server-id`,并指定主服务器的IP、端口、用户名和密码,以及主服务器的bin-log文件和位置,例如使用`change ...