注:本文档给出的是datagaurd创建物理standby的过程,默认最大性能模式。
安装文档参考《oracle相关基础知识》
安装过程中需要注意的: 主库要建立数据库实例,备库不需要建立
主库listener.ora:
SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (SID_NAME = PLSExtProc) (ORACLE_HOME = D:\oracle\product\10.2.0\db_1) (PROGRAM = extproc) ) (SID_DESC = (GLOBAL_DBNAME = ORAC) (ORACLE_HOME = d:\oracle\product\10.2.0\db_1) (SID_NAME = ORAC) ) ) LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1)) (ADDRESS = (PROTOCOL = TCP)(HOST = USER-20151216PL)(PORT = 1521)) ) )主库tnsnames.ora:
ORAC = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 10.73.198.140)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orac) ) ) primary = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 10.73.198.140)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orac) ) ) standby = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 10.73.198.134)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orac) ) ) EXTPROC_CONNECTION_DATA = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1)) ) (CONNECT_DATA = (SID = PLSExtProc) (PRESENTATION = RO) ) )备库listener.ora:
SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (SID_NAME = PLSExtProc) (ORACLE_HOME = D:\oracle\product\10.2.0\db_1) (PROGRAM = extproc) ) (SID_DESC = (GLOBAL_DBNAME = ORAC) (ORACLE_HOME = d:\oracle\product\10.2.0\db_1) (SID_NAME = ORAC) ) ) LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = USER-20151216PL)(PORT = 1521)) (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0)) ) )备库tnsnames.ora:
PRIMARY = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 10.73.198.140)(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = ORAC) ) ) STANDBY = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 10.73.198.134)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = ORAC) ) ) EXTPROC_CONNECTION_DATA = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0)) ) (CONNECT_DATA = (SID = PLSExtProc) (PRESENTATION = RO) ) )Oracle安装完成之后,环境为: primary(主库):
操作系统 :win7 32位旗舰版 IP:10.73.198.140 数据库:oracle 10.2 企业版 sid:oracstandby (备库):
操作系统:win7 32位旗舰版 IP:10.73.198.14 数据库:oracle 10.2 企业版 SID:无(只安装软件,不安装实例数据库)要求:数据库的版本最好一致,最好安装路径一致;
数据文件的拷贝可以分为两种模式:rman 和文件的直接拷贝。本文采用的是远程文件拷贝。
拷贝主库的数据文件到备库中
在主库上进行如下两条命令获取数据文件的路径
SQL> select name from v$datafile; SQL> select * from v$tempfile;把主库的以上数据文件(D:\oracle\product\10.2.0\oradata\orac)拷贝到备库上同样目录,如果备库上没
有这个路径,就创建一模一样的路径,然后复制数据文件。
注: pfile文件和spfile文件其实记录的信息可以等价的,pfile是文本文件,spfile是二进制文件 在主库上为从库创建控制文件,然后拷贝到从库D:\oracle\product\10.2.0\db_1\database目录下。 (记住这个目录,在下面备库的spfile 配置中要用到)。
SQL>alter database create standby controlfile as ‘d:\backup\standby.ctl’;(将控制文件暂时存储在d:\backup\路径下,可以自己定,该文件需要复制到备库上) SQL>create pfile from spfile;
在D:\oracle\product\10.2.0\db_1\database目录下找到pfile(initorac.ora);
修改其参数(红色部分,对于归档路径log_archive_dest_1可以自定义)
orac.__db_cache_size=411041792 orac.__java_pool_size=4194304 orac.__large_pool_size=4194304 orac.__shared_pool_size=155189248 orac.__streams_pool_size=0 *.audit_file_dest=’D:\oracle\product\10.2.0\db_1/admin/orac/adump’ *.background_dump_dest=’D:\oracle\product\10.2.0\db_1/admin/orac/bdump’ *.compatible=’10.2.0.1.0’ *.control_files=’D:\oracle\product\10.2.0\oradata\orac\control01.ctl’,’D:\oracle\product\10.2.0\oradata\orac\control02.ctl’,’D:\oracle\product\10.2.0\oradata\orac\control03.ctl’ *.core_dump_dest=’D:\oracle\product\10.2.0\db_1/admin/orac/cdump’ *.db_block_size=8192 *.db_domain=” *.db_file_multiblock_read_count=16 *.db_name=’orac’ *.db_recovery_file_dest=’D:\oracle\product\10.2.0\db_1/flash_recovery_area’ *.db_recovery_file_dest_size=2147483648 *.dispatchers=’(PROTOCOL=TCP) (SERVICE=oracXDB)’ *.job_queue_processes=10 *.open_cursors=300 *.pga_aggregate_target=192937984 *.processes=150 *.remote_login_passwordfile=’EXCLUSIVE’ *.sga_target=580911104 *.undo_management=’AUTO’ *.undo_tablespace=’UNDOTBS1’ *.user_dump_dest=’D:\oracle\product\10.2.0\db_1/admin/orac/udump’ *.DB_UNIQUE_NAME=’primary’ *.FAL_CLIENT=’primary’ *.FAL_SERVER=’standby’ *.log_archive_config=’DG_CONFIG=(primary,standby)’ *.log_archive_dest_1=’location=D:\oracle\product\10.2.0\archive\ VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=primary’ *.log_archive_dest_2=’SERVICE=standby LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=standby’ *.LOG_ARCHIVE_DEST_STATE_1=’ENABLE’ *.LOG_ARCHIVE_DEST_STATE_2=’ENABLE’ .log_archive_format=’%T%S%r.ARC’*
然后保存,在主库上执行
SQL> shutdown immediate;
将主库上的控制文件和初始化文件复制到备库上相应目录,具体目录路径,参考主库的路径。
注:控制文件的复制,需要先关掉数据库
其中主库的控制文件的路径为: D:\oracle\product\10.2.0\oradata\orac\
主库的pfile文件路径为: D:\oracle\product\10.2.0\db_1\database\
继续(在主库上进行以下两条命令):
SQL>startup pfile=’D:\oracle\product\10.2.0\db_1\database\initorac.ora’ SQL> create spfile from pfile; //创建spfile文件
创建服务
C:\Documents and Settings\Administrator>oradim -new -sid orac -startmode auto
复制密码文件,将主库上的密码文件复制到备库上,密码文件的路径为D:\oracle\product\10.2.0\db_1\database\PWDorac.ora
注:主备库的密码文件需要相同,所以如果是利用命令创建的密码文件,需要密码一样。
将主库的d:\oracle\product\10.2.0\admin\orac 目录及文件夹(adump,bdump,cdump,dpdump,pfile,udump)拷贝到备库的相同目录。
修改备库的D:\oracle\product\10.2.0\db_1\database\initorac.ora文件如下
orac.__db_cache_size=411041792 orac.__java_pool_size=4194304 orac.__large_pool_size=4194304 orac.__shared_pool_size=155189248 orac.__streams_pool_size=0 *.audit_file_dest=’D:\oracle\product\10.2.0\db_1/admin/orac/adump’ *.background_dump_dest=’D:\oracle\product\10.2.0\db_1/admin/orac/bdump’ *.compatible=’10.2.0.1.0’ *.control_files=’D:\oracle\product\10.2.0\oradata\orac\STANDBY.CTL’ *.core_dump_dest=’D:\oracle\product\10.2.0\db_1/admin/orac/cdump’ *.db_block_size=8192 *.db_domain=” *.db_file_multiblock_read_count=16 *.db_name=’orac’ *.db_recovery_file_dest=’D:\oracle\product\10.2.0\db_1/flash_recovery_area’ *.db_recovery_file_dest_size=2147483648 *.dispatchers=’(PROTOCOL=TCP) (SERVICE=oracXDB)’ *.job_queue_processes=10 *.open_cursors=300 *.pga_aggregate_target=192937984 *.processes=150 *.remote_login_passwordfile=’EXCLUSIVE’ *.sga_target=580911104 *.undo_management=’AUTO’ *.undo_tablespace=’UNDOTBS1’ *.user_dump_dest=’D:\oracle\product\10.2.0\db_1/admin/orac/udump’ *.DB_UNIQUE_NAME=’standby’ *.FAL_CLIENT=’standby’ *.FAL_SERVER=’primary’ *.log_archive_config=’DG_CONFIG=(primary,standby)’ *.log_archive_dest_1=’location=D:\oracle\product\10.2.0\archive\ VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=standby’ *.log_archive_dest_2=’SERVICE=primary LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=primary’ *.LOG_ARCHIVE_DEST_STATE_1=’ENABLE’ *.LOG_ARCHIVE_DEST_STATE_2=’ENABLE’ *.log_archive_format=’%T%S%r.ARC’
在备库上执行以下命令:
C:\Documents and Settings\Administrator>set oracle_sid=orac;注:上面创建的数据库实例名称需要与主库相同,具体DB_NAME、DBID、DB_UNIQUE_NAME、SERVICE_NAME、SID、INSTANCE_NAME、GLOBAL_DATABASE_NAME之间的区别,可参考相关的文档。一般情况下,对于单实例数据库,db_name=service_name=sid=instance_name。但是db_unique_name可以不一致。
C:\Documents and Settings\Administrator>sqlplus / as sysdba; SQL> startup pfile='D:\oracle\product\10.2.0\db_1\database\initorac.ora'; SQL> create spfile from pfile='d:\oracle\product\10.2.0\db_1\database\ initorac.ora';在上面配置完成之后,需要在主、备机上重启监听服务
CMD> Lsnrctl stop CMD> lsnrctl start
可以使用lsnrctl status 命令查看监听器状态
CMD> sqlplus /nolog SQL> conn / as sysdba; SQL> startup mount; SQL> alter database archivelog; SQL> alter database open;
SQL> startup mount; SQL> alter database recover managed standby database disconnect from session;
主库上操作:
SQL>Alter system switch logfile; SQL> select max(sequence#) from v$archived_log;//查看最大日志最大序列号
备库上操作:
SQL>alter database recover managed standby database cancel; SQL>alter database recover managed standby database disconnect from session; SQL> select max(sequence#) from v$archived_log;//查看最大日志最大序列号
看两者日志最大序列号是否相同,相同说明,主库产生的归档日志传输到了备库上,其实也可以直接在归档路径下查看备库归档日志是否都已接收。如果没有接收日志,需要查看rfs进程是否开启。
查看rfs进程是否开启的sql命令如下:
SQL>select process,status from v$managed_standby;
注:如datagaurd出现异常现象,则可以通过altert.log来查看哪里出了问题。 Altert.log的路径:D:\oracle\product\10.2.0\db_1\admin\orac\bdump。还可以根据alter.log中所说的trace文件中查找问题。
主库上:
SQL>conn / as sysdba; SQL>create user user_name identified by password; SQL>grant create session,recource to user_name; SQL>conn user_name/password; SQL>create table t1 as select * from dual; SQL>commit; SQL>alter system switch logfile;
备库上:
SQL>conn / as sysdba; SQL>alter database recover managed standby database cancel; SQL>alter database recover managed standby database disconnect from session; SQL>alter database open; SQL>select * from all_users; SQL>conn user_name/password; SQL>select * from t1;
在备库上查看是否创建了同样的用户和新表
注:在备库上进行查询的时候,需要将数据库open
(1) 查看switchover_status
select database_role, switchover_status from v$database;
如果switchover_status为:to standby 则:
alter database commit to switchover to physical standby
否则用:
alter database commit to switchover to physical standby with session shutdown;
(2)重启数据库
shutdown immediate; startup nomount;
(3)以备库mount
alter database mount standby database;
(4)查看数据库的角色
select database_role from v$database;
(1) 应用redo
alter database recover managed standby database disconnect from session;
(2)查看switchover_status
select database_role, switchover_status from v$database;
如果switchover_status为:to primary 则:
alter database commit to switchover to primary
否则用:
alter database commit to switchover to primary with session shutdown;
(3)重启数据库
shutdown immediate; startup;
(4)查看数据库的角色
select database_role from v$database;
注:需要尝试的技能 1, 利用rman进行备份数据文件,控制文件,初始化文件 2, 本文档是在windows平台下进行,网上大多数教程是在linux下操作,学会linux操作 3, 对于数据库异常处理的解决办法,例如日志不同步,日志未应用,日志出现gap现象等一系列异常处理