技术开发 频道

优化Oracle停机时间及数据库恢复

    事件6:丢失全部的控制文件

    可以采用以下的步骤恢复:

    1、关闭数据库

    2、进行一次全数据库备份,包括全部的数据文件和redo log文件

    3、以NOMOUNT的状态启动数据库

    4、使用CREATE CONTROLFILE重新创建控制文件、你也可以备份控制文件到一个trace文件,然后执行该文件

    5、在数据库上进行媒体恢复

    6、打开数据库

    7、使用shutdown normal关闭数据库

    8、对数据库进行一次冷备份

    事件7:丢失一个索引

    最简单的方法就是重新创建丢失的索引

    事件8:丢失一个非活动的redo log

    如果丢失redo数据,恢复将是不完全的,必须重新创建涉及的表空间。要重新创建表空间,可以使用全的数据库导出,这样就可以很容易的导入数据并且重新创建该表空间的对象。可以使用以下的步骤来恢复:

    1、通过Alter system来切换redo log文件

    2、关闭数据库

    3、startup mount数据库

    4、离线删除涉及的数据文件

    5、打开数据库

    6、删除用户的表空间,包括其中的内容、

    7、通过全数据库备份重新创建表空间和其中的对象
     
    事件9:丢失活动的Redo log

    如事件8讨论的一样,如果丢失了redo数据,恢复将是不完全的,必须重新创建涉及的表空间、可以采用以下的步骤恢复:

    1、关闭数据库

    2、startup mount数据库

    3、离线删除涉及的数据文件

    4、打开数据库

    5、删除用户的表空间,包括其中的内容、

    6、通过全数据库备份重新创建表空间和其中的对象

    要注意的是活动的事务将会丢失

    事件10:丢失存档的Redo log文件

    如果存档的redo log文件丢失,应该马上进行一次冷备份、最好也进行一次全数据库导出、没有丢失的存档redo log文件的任何恢复都将是不完全的、

    事件11:丢失活动的回滚段

    这里指的是丢失一个回滚段的一个数据文件、这是一个危急的恢复过程,它主要是在于保存活动的事务。这里假定数据库已经起来,而你想保存当前运行的事务。要使用以下的恢复过程,数据库必须运行在archivelog模式下。

    可以使用以下步骤恢复:

    1、不要关闭数据库、对于这种事件,数据库启动比关闭更容易解决问题、

    2、令属于该数据文件中的全部回滚段离线

    3、删除全部离线的回滚段

    4、在上面的第2步中,如果回滚段中有活动的事务,你将不能令它离线、可运行以下的查询来查看哪些事物是活动的:

SELECT SEGMENT_NAME, XACTS ACTIVE_TX, V.STATUS FROM V$ROLLSTAT V, DBA_ROLLBACK_SEGS WHERE TABLESPACE_NAME = 'tablespace_name' AND SEGMENT_ID = USN;

    如果上面的查询没有结果,那么所有的回滚段都是离线的,但是,如果上面的查询返回一行或者多行,并且其状态为PENDING OFFLINE,那么可检查这些回滚段的ACTIVE_TX列、带有0值的回滚段将很快会离线;但是,非0的值表示上面有活动的事务,它们需要被提交或者回滚、

    5、处理活动的事务、执行以下的查询来查看哪些用户的事务被指派到该回滚段:

SELECT S.SID, S.SERIAL#, S.USERNAME, R.NAME "ROLLBACK" FROM V$SESSION S, V$TRANSACTION T, V$ROLLNAME R WHERE R.NAME IN ('pending_rollback1','pending_rollback2', .... 'pending_rollbackN') AND S.TADDR = T.ADDR AND T.XIDUSN = R.USN;

    在知道哪些用户在"pending offline"的回滚段上有活动的事务后,可以要求他们提交或者回滚他们的事务,或者可以使用以下的命令杀掉它们的进程:

    ALTER SYSTEM KILL SESSION 'sid, serial#';

    6、在你处理完所有活动的事务后,执行以下的步骤:

    丢弃表空间及其中的全部内容

    重新创建回滚表空间

    重新创建回滚段,并且令它们在线

0
相关文章