昨天,遇到一件让自己胆战心惊的事情,就是数据库导出的DMP文件由原来的800多M变为了现在的300多M,整整少了500M!
仔细回想,自己平时操作数据库还是很小心的,就算有失误,也不可能造成那么大的损失啊!
在这里记录一下解决过程:
1,首先当然想到了Oracle的重做日志功能,也学习了Oracle自带的日志分析工具LogMiner的使用方法,等会在另外一篇文章里记录一下这个工具的使用方法。
2,在使用LogMiner之前,突然想到,能不能把800M的数据库和300M的数据库的每张表都单独导出为DMP文件,进行一下大小的对比
3,在用exp导出时,有一个log选项设定导出日志的文件路径,此文件记录了所有导出的数据库表名和记录数,用UltraEdit32的正则表达式功能去除了除开表名的其他不相关数据。
4,用Java编写了一个小程序,读入所有表名,对每个表名单独进行exp操作。
5,果然不出所料,其中有一个表被某个管理员清理过,那个表本来就很大,占到了500多M!
至此,问题解决,总结一下,不管碰到什么意外的问题,不要慌张,冷静分析才是王道!
PS:被删除数据的那张表竟然占到了500多M,而整个数据库才800M,很不解,然后看了一下这张表的模式,发现设计的很有问题,这张表里面表达了多对多的关系,所以数据冗余太大,而且这些冗余根本就不是必须的,反而影响了性能!找常理来说,针对多对多的关系应该转化为两个多对一的关系。
文章来源:
http://localhost/wp2/?p=48