发表于: 2007.03.04 14:13
分类: ORACLE
出处: http://yangtingkun.itpub.net/post/468/267555
---------------------------------------------------------------
前两天记录了一下建立物理STANDBY的过程。这里打算记录一下将物理STANDBY和主库部署在同一台服务器上的过程。
物理STANDBY如果和主库部署在同一台服务器上,它的冗灾功能基本上就失去意义了。不过,仍然可以提供提高可用性,减少停机时间等功能。一般将物理STANDBY和主库部署在同一台机器上,主要是处于测试的目的。这种部署,将测试DATA GUARD的功能的硬件需求压缩到最小。
在同一台服务器上部署主库和物理STANDBY,不需要太多的准备工作,由于主库和ORACLE软件都是已经安装好的,所以只需要检查主库的归档状态就可以了。需要将主库置于FORCE LOGGING状态,并处于归档模式下:
SQL> SELECT DBID, NAME, LOG_MODE, FORCE_LOGGING FROM V$DATABASE;
DBID NAME LOG_MODE FOR
---------- --------- ------------ ---
1834427478 TEST ARCHIVELOG NO
SQL> ALTER DATABASE FORCE LOGGING;
数据库已更改。
SQL> SELECT DBID, NAME, LOG_MODE, FORCE_LOGGING FROM V$DATABASE;
DBID NAME LOG_MODE FOR
---------- --------- ------------ ---
1834427478 TEST ARCHIVELOG YES
由于主库已经是归档模式,这里不需要在进行设置,设置FORCE LOGGING就可以了。
下面进行STANDBY的建立,首先检查数据库中所有的数据文件和日志文件:
SQL> SELECT NAME FROM V$DATAFILE
2 UNION ALL
3 SELECT NAME FROM V$TEMPFILE
4 UNION ALL
5 SELECT MEMBER FROM V$LOGFILE;
NAME
------------------------------------------------
F:ORACLEORADATATESTSYSTEM01.DBF
F:ORACLEORADATATESTUNDOTBS01.DBF
F:ORACLEORADATATESTINDX01.DBF
F:ORACLEORADATATESTTOOLS01.DBF
F:ORACLEORADATATESTUSERS01.DBF
F:ORACLEORADATATESTYANGTK01.DBF
F:ORACLEORADATATESTTEMP01.DBF
F:ORACLEORADATATESTREDO02.LOG
F:ORACLEORADATATESTREDO01.LOG
F:ORACLEORADATATESTREDO03.LOG
已选择10行。
然后关闭数据库,将上面查询的所有数据文件和日志文件拷贝到STANDBY数据库所在目录下:
SQL> SHUTDOWN IMMEDIATE
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> HOST MD F:ORACLEORADATATEST_STANDBY
SQL> HOST COPY F:ORACLEORADATATEST*.* F:ORACLEORADATATEST_STANDBY
启动数据库后建立从库所需的PFILE和CONTROLFILE:
SQL> STARTUP
ORACLE 例程已经启动。
Total System Global Area 76619308 bytes
Fixed Size 454188 bytes
Variable Size 50331648 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
数据库装载完毕。
数据库已经打开。
SQL> ALTER DATABASE CREATE STANDBY CONTROLFILE AS 'F:ORACLEORADATATEST_STANDBYCONTROL01.CTL' REUSE;
数据库已更改。
SQL> HOST COPY F:ORACLEORADATATEST_STANDBYCONTROL01.CTL F:ORACLEORADATATEST_STANDBYCONTROL02.CTL
SQL> HOST COPY F:ORACLEORADATATEST_STANDBYCONTROL01.CTL F:ORACLEORADATATEST_STANDBYCONTROL03.CTL
SQL> HOST MD F:ORACLEADMINTEST_STANDBY
SQL> HOST MD F:ORACLEADMINTEST_STANDBYBDUMP
SQL> HOST MD F:ORACLEADMINTEST_STANDBYCDUMP
SQL> HOST MD F:ORACLEADMINTEST_STANDBYUDUMP
SQL> HOST MD F:ORACLEADMINTEST_STANDBYPFILE
SQL> CREATE PFILE = 'F:ORACLEADMINTEST_STANDBYPFILEINITTESTST.ORA' FROM SPFILE;
文件已创建。
建立主库归档日志的目的地:
SQL> HOST MD F:ORACLEORADATATEST_STANDBYSTANDBYARCHIVE
SQL> HOST MD F:ORACLEORADATATEST_STANDBYARCHIVE
修改从库的初始化参数,需要修改或添加下面的记录:
*.background_dump_dest='F:ORACLEADMINTEST_STANDBYBDUMP'
*.control_files='F:ORACLEORADATATEST_STANDBYCONTROL01.CTL','F:ORACLEORADATATEST_STANDBYCONTROL02.CTL','F:ORACLEORADATATEST_STANDBYCONTROL03.CTL'
*.core_dump_dest='F:ORACLEADMINTEST_STANDBYCDUMP'
*.db_name='test'
*.instance_name='testst'
*.log_archive_dest_1='LOCATION=F:ORACLEORADATATEST_STANDBYARCHIVE'
*.log_archive_start=TRUE
*.user_dump_dest='F:ORACLEADMINTEST_STANDBYUDUMP'
standby_archive_dest='F:ORACLEORADATATEST_STANDBYSTANDBYARCHIVE’
db_file_name_convert=('F:ORACLEORADATATEST', 'F:ORACLEORADATATEST_STANDBY')
log_file_name_convert=('F:ORACLEORADATATEST', 'F:ORACLEORADATATEST_STANDBY')
standby_file_management=AUTO
remote_archive_enable=TRUE
lock_name_space=testst
如果STANDBY数据库的数据文件、日志文件所在目录和主库不同,那么就需要在从库的初始化参数中设置DB_FILE_NAME_CONVERT和LOG_FILE_NAME_CONVERT参数。这个例子由于主库和STANDBY在同一个服务器上,所以必须设置这两个参数。
当主库和STANDBY在一个服务器上,LOCK_NAME_SPACE参数是必须要设置的。这个参数的值和INSTANCE_NAME保持一致,但是要和主库的INSTANCE_NAME有所区别。
由于是Windows环境,还需要新建立一个服务:
SQL> HOST ORADIM -NEW -SID TESTST -STARTMODE MANUAL
修改$ORACLE_HOME/network/admin目录下的listener.ora文件,在SID_LIST中添加下列信息,并重启监听:
(SID_DESC =
(ORACLE_HOME = F:oracleoracle920)
(SID_NAME = testst)
)
SQL> HOST LSNRCTL STOP
SQL> HOST LSNRCTL START
修改从库中的$ORACLE_HOME/network/admin目录下的sqlnet.ora文件,添加下列参数,用以检测死连接:
SQLNET.EXPIRE_TIME=2
修改主库和从库中的$ORACLE_HOME/network/admin目录下的tnsnames.ora文件,添加下面的配置:
TEST_STANDBY =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = yangtingkun)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SID = testst)
)
)
在从库中建立SPFILE,然后启动从库:
SQL> CONN SYS@TEST_STANDBY AS SYSDBA
请输入口令:
已连接到空闲例程。
SQL> CREATE SPFILE FROM PFILE = 'F:ORACLEADMINTEST_STANDBYPFILEINITTESTST.ORA';
文件已创建。
SQL> STARTUP NOMOUNT
ORACLE 例程已经启动。
Total System Global Area 76619308 bytes
Fixed Size 454188 bytes
Variable Size 50331648 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
SQL> ALTER DATABASE MOUNT STANDBY DATABASE;
数据库已更改。
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;
数据库已更改。
从库现在已经启动为应用归档模式,下面还需要设置一下主库参数:
SQL> CONN YANGTK/YANGTK@TEST
已连接。
SQL> ALTER SYSTEM SET LOG_ARCHIVE_DEST_2 = 'SERVICE=TEST_STANDBY';
系统已更改。
SQL> ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_2 = ENABLE;
系统已更改。
参数修改完毕,尝试归档当前的日志:
SQL> ALTER SYSTEM ARCHIVE LOG CURRENT;
系统已更改。
最后,验证一下物理STANDBY是否已经成功建立:
SQL> ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';
会话已更改。
SQL> SELECT SEQUENCE#, DEST_ID, FIRST_TIME, NEXT_TIME
2 FROM V$ARCHIVED_LOG
3 WHERE FIRST_TIME > SYSDATE - 1
4 ORDER BY SEQUENCE#;
SEQUENCE# DEST_ID FIRST_TIME NEXT_TIME
---------- ---------- ------------------- -------------------
430 1 2007-03-04 10:37:59 2007-03-04 14:00:38
430 2 2007-03-04 10:37:59 2007-03-04 14:00:38
SQL> ALTER SYSTEM ARCHIVE LOG CURRENT;
系统已更改。
SQL> SELECT SEQUENCE#, DEST_ID, FIRST_TIME, NEXT_TIME
2 FROM V$ARCHIVED_LOG
3 WHERE FIRST_TIME > SYSDATE - 1
4 ORDER BY SEQUENCE#;
SEQUENCE# DEST_ID FIRST_TIME NEXT_TIME
---------- ---------- ------------------- -------------------
430 1 2007-03-04 10:37:59 2007-03-04 14:00:38
430 2 2007-03-04 10:37:59 2007-03-04 14:00:38
431 1 2007-03-04 14:00:38 2007-03-04 14:02:19
431 2 2007-03-04 14:00:38 2007-03-04 14:02:19
登陆从库检查:
SQL> CONN /@TEST_STANDBY AS SYSDBA
已连接。
SQL> SELECT SEQUENCE#, APPLIED FROM V$ARCHIVED_LOG ORDER BY SEQUENCE#;
SEQUENCE# APP
---------- ---
430 YES
431 YES
至此物理STANDBY已经成功建立。











