什么情况算是很麻烦的没有System的恢复?

    最近国内的数据库不太平安, 首先是磁盘损坏, 刚好坏到了System表空间所在的盘, 当然这是没有System的恢复. 另外还有好多次误删操作引起的问题, 误删单个或几个表, 误删除一个用户, 误删除一整个表空间(数据文件还在), 这些也算是没有System的恢复. 为什么算?

    在System表空间中, 我们可以找出以下信息: 表编号, 数据编号, 表名, 列名, 列类型. 丢了System文件, 当然是没有了这些信息了, 那么误删表, 用户和表空间时, 当然也将表的这些信息删除了, 虽然你的数据库是有一个System的表空间, 但没有这些方便恢复的信息, 也就是没有System的恢复了. 如果还保留有删除操作时的归档日志或联机日志, 则可以从这儿分解出表名和数据编号的对应关系, 则恢复要简单得多.

    在数据文件中, 我们能找到什么呢? 我们只能找到: 数据编号和记录. 由于没有了System信息, 对于这种恢复, 只能扫描所有相应的数据文件, 将记录找出来. 有两个问题, 第一列的类型要猜测, 不准时要人工分析二进制数据回以确定, 因此恢复相当耗时; 第二恢复的结果只有数据文件, 没有办法告诉你, 这些记录是那个表的, 这一步需要懂应用的人来分析一个个生成的数据文件, 来进行人工匹配. 没有System的恢复, 确切地说, 不是指没有System表空间的恢复, 而是指没有相应System字典信息的恢复

    希望这样的解释能让你清楚一些. 为什么说这个问题呢? 有一个人Drop了一个表空间后, 来找我恢复, 由于他不太懂Oracle, 不知道其中的复杂性, 当我告诉他这是没有System的恢复时, 他说他们有System啊, 包括他们的领导怎么都不想信我说的什么没有System的恢复. 在数据文件中有可能扫出比表的数目多得多的数据段, 因为有很多操作, 都会留下一个数据段, 例如建一个临时表, 再删除它, 这时在数据文件上还是留下了一段数据; 或者你移动表后, Oracle会在重组数据到新的地方, 但是旧的数据段还是存在的. 由于没有了System信息, 根本就不知道那个段上的数据是你想要的. 去年在一次国外的数据库恢复中, 原先以为有400个表的, 但实际扫描数据文件后, 发现了1500个数据段, 客户投入了3个人花了整整两个星期, 才只搞定主要的表的恢复.

    因此当你的数据库大到不好备份时(这当然是不负责任的想法), 至少你得想办法定期拷贝备份System表空间的文件, 否则问题很严重, 比你想象的要严重, 因为很多老的系统都不容易找到对应用熟的人, 数据恢复出来了, 也不容易让应用重新跑起来. Good Luck.

发表留言: