天琢磨一个问题,在平时的工作中如果碰到一些不规范的操作,drop,truncate,delete,恢复起来还是很困难的,drop操作在Oracle中如果开启了recycle bin还是基本安全的,delete操作可以借助flashback delete操作,可能有些更细微的操作update,insert等等操作导致了问题,需要做数据修复的时候,这个时候可以使用flashback query来辅助,如果来一个truncate,那就没辙了,其实在truncate操作完成后,一般来说数据还都是在数据文件里的,这个时候可以借助第三方的数据恢复工具来尝试恢复,这个时候数据恢复就不是毫秒级了,容忍度在分钟甚至小时都是没有办法的事情。
不过在Oracle中,如果你之前开启了闪回数据库功能,那truncate的数据就能找回来了。但是话说过来,整个系统都让重启给弄停了,这个影响可能更大。如果不使用flashback database,直接通过dataguard来做时间点恢复或者其它的标准恢复到数据删除之前,也是一种方法。
所以说在Oracle中对于数据的恢复方法很多,使用场景也可以根据需要来选择。
在MySQL中数据恢复可供选择的方案相对就比较少了。不过有一个亮点就是MySQL中的redo日志是可读的,mysqlbinlog可以很轻松地解析出来里面的内容。不过truncate,drop,一些DML失误操作场景来说,对于MySQL来说就比较困难了。
一旦发生了问题,做数据的恢复就只能借助于最近的备份了,需要相应的备份,然后在最近的备份基础上通过解析相关的binlog,直到把数据变更时间点的数据恢复。
这个过程总体来说还是需要不少的时间的,首先就是判断备份和binlog的时间点,可以在其它测试环境中完成,需要花费的时间应该不短。
我想了下面这个方案,把Oracle和mysql结合起来,充分利用Oracle的强大的闪回功能,可能这种方案对于很多数据恢复都有不少的亮点。
还没有在本地测试,因为也需要一些额外的定制和数据类型映射,所以只是一个大概的思路。
首先还是保持MySQL原有的架构,一个主库,两个备库。因为主库中的binlog是做数据同步的关键,所以可以考虑设置一个路径做sql解析,sql解析还是使用binlog,然后再做适当的变更。这个过程可以是一个异步的过程,然后和Oracle结合起来部署到Oracle中的schema中。
MySQL中的数据量相对来说还不是很大,所以可以考虑多个MySQL database和一个Oracle中的多个schema映射起来,数据类型可以适当做一些类型映射,比如,MySQL中的big int,small int等和Oracle中的number直接映射。varchar和varchar2映射等等。道路清障车 http://www.qingzhangche.net
数据到位之后,就可以考虑通过各种闪回特性来做数据的恢复了。发生了truncate之类的操作可以使用flashback database来恢复,drop操作可以通过recycle bin,flashback database或者基于时间点等来恢复。delete可以通过闪回删除,闪回查询等来恢复。update可以通过闪回查询来恢复等等。得到了相应的技术局之后,可以直接导出csv文件,或者insert语句来。在MySQL中通过mysqlimport或者insert来完成数据的部署。
这个过程中可以使得MySQL端始终保持前行,可以打一个比方,比如一个部队在行军,结果突然某个军官发现自己的地图没带,落下半路上了,这个时候可以派一个士兵骑马去取地图。这个时候Oracle就是那个士兵,能够完成这个艰巨的任务,部队依旧行进,不会产生其他影响。