<P></P><P>在Oracle9i中创建一个逻辑standby最大的障碍就是你可以选择使用冷备对primary数据库进行备份,或者在你使用热备之前,如果没有事物处于in-flight状态,要停顿一段时间,后者是因为它需要运行资源管理器至少需要primary数据库的一个bounce,所以依然可以STALL DML。由于冷备需要停顿太长的时间,那么就需要一个比较好的解决方案来帮助客户创建它们的逻辑standby。 以下列出的步骤就是在9i中通过primary数据库的热备而不必停顿保证primary数据库最小的宕机时间来进行逻辑standby数据库的创建,但是当在primary数据库中的字典创建的时候,还是需要一点宕机时间来确保不会有in-flight的事物此时正在运行。在这种情况下宕机时间实际上就是来自于用户关闭数据库的时间——shutdown 生产库,创建逻辑standby数据库的LogMiner的字典以及重新打开生产数据库。因此可以说宕机时间完全依赖于执行以上三个关键操作所使用的时间。 当primary数据库是单实例或者处于RAC时,可以使用下面的命令: The Procedural Steps ----------------------- 1、 对primary数据库进行热备 根据你当前的配置情况以及逻辑数据库将要被放在哪个位置,可以有几种方法进行热备 >如果逻辑数据库将和primary数据库驻留在同一个服务器上,那么就备份到磁盘上 >如果逻辑数据库将要被放置在一个远程的系统上,此时: * 如果你已经有了一个物理standby数据库,那么接下来你可以执行两种方法中的一种进行备份操作。 ^使用RMAN 对物理standby数据库进行热备至磁盘上 ^如果在物理standby数据库中使用镜像,那么需要停止应用程序,并中断物理standby数据库中的镜像备份。 >如果在远程站点上没有standby数据库,就需要在primary数据库上执行备份并将数据文件拷贝到standby数据库的服务器上。 2、将primary上的备份转成物理standby根据 Chapter 3 of the 9.2.0.2 Data Guard Concepts 和Administration Manual.例如: A、如果有必要,将备份恢复到目标位置 B、创建standby的控制文件和standby初始化参数文件 C、确定是否定义了standby参数 i. FAL_SERVER and FAL_CLIENT ii. STANDBY_ARCHIVE_DEST D、启用从primary数据库到新的物理standby的redo shipping E、启用Managed Recover Process是数据库达到最新 一旦物理standby被更新,可以执行以下的步骤: 从这点开始,你将要承担primary数据库的宕机时间 3.停止将日志传输到standby的redo传输服务并且shutdown primary数据库 A、进一步延迟物理standby的redo传输 ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_3=DEFER; 或者使用任何数字指定延迟的程度 B、停掉primary数据库 SHUTDOWN IMMEDIATE 如果这个primary数据库处于RAC-enabled,那么所有的节点都将会被shutdown C、在shutdown后确保 物理standby已经应用了所有的被传送过来的redo日志 4、在限制模式下startup 生产库,并创建字典 如果primary处于RAC-enabled,那么将只有一个节点被mount STARTUP MOUNT B、创建控制文件的备份 ALTER DATABASE BACKUP CONTROLFILE to ''; C、限制对primary数据库的访问 ALTER SYSTEM ENABLE RESTRICTED SESSION; D、打开数据库 ALTER DATABASE OPEN; E、确保Supplemental logging已经启用(如果已经做了 这一步可以省略)。例如:你可能已经在尝试创建一个逻辑standby或者已经有一个正在运行了。如果已经有其他的物理standby已经被创建,你需要在这些物理standby上执行第一步操作为以后的switchover做准备 ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY, UNIQUE INDEX) COLUMNS; 此时将切换日志文件 ALTER SYSTEM ARCHIVE LOG CURRENT; F、从v$database视图中获取checkpoint_change# 值 SELECT checkpoint_change# FROM V$DATABASE; 根据返回的数据来确认primary'的archived redo存在哪里 SELECT name, first_change#, next_change# FROM V$ARCHIVED_LOG where BETWEEN FIRST_CHANGE# AND NEXT_CHANGE# AND STANDBY_DEST='NO'; 以上将会列出primary中的活动的线程。这些处于*starting*的日志将会在接下来被传送到standby服务器上进行恢复之用。 G、执行字典创建过程 EXECUTE DBMS_LOGSTDBY.BUILD; H、再一次的进行日志切换 ALTER SYSTEM ARCHIVE LOG CURRENT; I、 获得在后续启用逻辑standby所用到的归档日志的名字 针对单个实例的使用: SELECT NAME FROM V$ARCHIVED_LOG WHERE (SEQUENCE#=(SELECT MAX(SEQUENCE#) FROM V$ARCHIVED_LOG WHERE DICTIONARY_BEGIN = ’YES’ AND STANDBY_DEST= ’NO’)); 针对RAC-enabled primary使用: SELECT name FROM V$ARCHIVED_LOG WHERE FIRST_CHANGE# FROM V$ARCHIVED_LOG WHERE DICTIONARY_END = 'YES' AND STANDBY_DEST = 'NO') AND NEXT_CHANGE# > (SELECT MAX(first_change#) FROM V$ARCHIVED_LOG WHERE DICTIONARY_BEGIN = 'YES' AND STANDBY_DEST = 'NO'); 5、在此时,将可以打开数据库进行一些常用操作 a. ALTER SYSTEM DISABLE RESTRICTED SESSION; 针对RAC-enabled primary,其他的节点也会在此时重启 一旦primary的备份操作执行完成,运行已经被停掉相当于执行前3个步骤的时间的的primary数据库。从这个步骤以后,当生产库起来了,在逻辑standby上进行操作 6、shutdown物理standby a. SHUTDOWN IMMEDIATE 7、从primary上拷贝接下来的逻辑standby需要使用的所有的文件 A、拷贝在之前在primary上从重启数据库的时间到字典被创建命令执行完毕这个时间段上被创建的归档日志。拷贝的日志中应该是仅在字典被创建产生的日志并在归档日志进行之前。将那些日志存放到之前的归档日志被差传入的目录中。也就是在standby 初始化参数文件中指定的STANDBY_ARCHIVE_DEST的位置。 For example: “/oracle/standby/arch/” 实质上,这一步,必须拷贝从(4f)中的seq#开始到步骤(4i)中所列出的最高的seq#的所有的日志 B、拷贝控制文件的备份 如果使用的是和备份中的控制文件不同的名字,那么就需要修改初始化参数中的CONTROL_FILES 8、在逻辑standby上很快就会完成处理过程 A、使用新创建的控制文件的备份,mount数据库: STARTUP MOUNT; B、重命名所有的数据文件和联机重做日志文件,使其匹配当前的文件名 例如:针对每一个数据文件和日志文件 ALTER DATABASE RENAME FILE ‘/primary/arch/system.dbf’ TO ‘/standby/arch/system.dbf’; C、将数据库恢复到在步骤4中查到的SCN这一点上 ALTER DATABASE RECOVER AUTOMATIC FROM ‘/oracle/standby/arch/’ UNTIL CHANGE USING BACKUP CONTROLFILE; D、打开逻辑standby的guard ALTER DATABASE OPEN RESETLOGS; F、关掉数据库,使用nid 工具改变数据库的名字和id号 SHUTDOWN IMMEDIATE; STARTUP MOUNT; 根据shell提示将ORACLE_SID 设置为 standby instance % nid TARGET=sys/password DBNAME= 一旦上面的完成了,一个新的密码文件需要被创建,并且DB_NAME参数被修正为standby 然后shutdown在以resetlogs 打开数据库 SHUTDOWN IMMEDIATE STARTUP MOUNT; ALTER DATABASE OPEN RESETLOGS; G、向临时表空间中添加临时文件 ALTER TABLESPACE ADD TEMPFILE SIZE nn; H、注册在第7步中拷贝的归档日志,每一个日志文件都要执行以下的操作: ALTER DATABASE REGISTER LOGICAL LOGFILE ''; 对于这一步,之前拷贝过来的每一个归档进程产生的所有的日志都将会被注册 I、 应用INITIAL语句开启逻辑standby ALTER DATABASE START LOGICAL STANDBY APPLY INITIAL ; once the engine instantiates the logminer dictionary brought over in the redo steam from step 4g,在这之后的后续的启动过程中将不再需要带有INITIAL的语句 9、重新启动从primary到此逻辑standby上的redo传输服务 ALTER SYSTEM SET log_archive_dest_state_3=enable; 在此时,就可以在逻辑standby上执行操作了。</P><P></P>
|