oracle dataguard physical standby test(2)

 

不废话了,直接进入动手配置阶段
 
//primary主库配置部分
3.1.3 configure a standby redo log
online redo logfiles的数量=3个 ,(3+1)*1(thread数量),也就是standby redo log group设置为4组
 
alter database add standby logfile group 4 ('c:beijingstandbyredologstb_redo04.log') size 50M
alter database add standby logfile group 5 ('c:beijingstandbyredologstb_redo05.log') size 50M
alter database add standby logfile group 6 ('c:beijingstandbyredologstb_redo06.log') size 50M
alter database add standby logfile group 7 ('c:beijingstandbyredologstb_redo07.log') size 50M
 
配置主库的参数文件
alter system set log_archive_config='dg_config=(beijing,shanghai)' scope=spfile
alter system set log_archive_dest_1='location=c:arch1beijing valid_for=(all_logfiles,all_roles) db_unique_name=beijing' scope=spfile
alter system set log_archive_dest_2='service=shanghai LGWR ASYNC valid_for=(online_logfiles,primary_role) db_unique_name=shanghai' scope=spfile
//上面两个log_archive_dest_n的参数设置一定要注意空格的问题,否则会遇到启动报错。
 
alter system set log_archive_dest_state_1=enable scope=spfile
alter system set log_archive_dest_state_2=enable scope=spfile
 
//log_archive_dest_state_n在10g上缺省就是enable的
 
alter system set remote_login_passwordfile=exclusive scope=spfile
//remote_passwordlife在10g上缺省就是exclusive的
 
alter system set log_archive_max_processes=30 scope=spfile
 
//主库配置standby role部分的参数:当primary的库切换成为standby角色之后,需要配置这两个参数完成"log的生成源头"与"log的索取发起端"设置。
 
//primary与standby切换之后,原来的beijing就作为standby了,它是log的请求方,而shanghai则作为log的生成方、源头。
 
alter system set fal_server=shanghai scope=spfile
alter system set fal_client=beijing scope=spfile
 
db_file_name_convert和log_file_name_convert我觉得对于primary和standby在两台设备,而且目录结构一样的,不适用,不需要这两个参数。但是,我们这里的demo是会创建两个instance,主库叫beijing,standby库叫shanghai,对应的数据文件、redolog目录肯定有变化(oradata/beijing),所以还要按照如下配置。前面写shanghai是因为,这里指前换后的primary,后面的beijing是指"切换后"的standby,注意领会其中的意思。
 
alter system set db_file_name_convert='shanghai','beijing' scope=spfile
alter system set log_file_name_convert='shanghai','beijing' scope=spfile
 
alter system set standby_file_management=auto scope=spfile
//standby_file_manegement的作用主要是后续在primary创建tablespace、datafile时,能够在standby正常的在相应路径下生成文件(primary、standby路径不一样)
 
———–primary的部分配置完毕了,开始进行standby的配置————-
 
3.2
 
//先备份主库的数据文件
关闭主库,冷拷贝即可
 
//创建standby controlfile
启动主库到mount阶段,创建控制文件
 
alter database create standby controlfile as 'c:standby01.ctl'
 
//为standby数据库准备初始化的参数文件
需要对生成的init文件更改一些部分的设置(最主要的是将'beijing'部分变更为'shanghai',因为要确保路径的正确)
db_unique_name肯定需要修改为shanghai,而不是beijing(db_name不变),因为手工创建的instance name是shanghai。
control_file需要注意相关的目录,将beijing字段修改为shanghai,同时control01.ctl需要更改成在主库上创建的那个standby controlfile名称.
 
//db_file_name_convert需要注意,这里作为standby角色时,明确告诉其应用的redo,生成的文件路径,备库上这个配置一定遵循'primary','standby'的格式。log_file_name_convert与上面db_file_name_convert如出一辙。
db_file_name_convert主要告诉standby库,当primary端新建表空间、数据文件时,新建立的数据文件很可能是$oradata/beijing,而在standby端相应的路径很可能不同
 
例如是:$oradata/shanghai,所有要让新的datafile出现在应该出现的目录中,需要做db_file_name_convert,当然log_file_name_convert是一个道理。
 
总结一个大原则:初始的standby上面不要配置切换后的角色参数,也就是没有主库上的"standby role configuration"
参考配置片段
———————————————————————————————————
*.db_name='beijing'
*.db_recovery_file_dest='C:oracleproduct10.2.0flash_recovery_area'
*.db_recovery_file_dest_size=2147483648
*.dispatchers='(PROTOCOL=TCP) (SERVICE=shanghaiXDB)'
*.fal_client='SHANGHAI'
*.fal_server='BEIJING'
*.job_queue_processes=10
*.log_archive_config='dg_config=(beijing,shanghai)'
*.log_archive_dest_1='location=c:arch1shanghai valid_for=(all_logfiles,all_roles) db_unique_name=shanghai'
*.log_archive_dest_2='service=beijing LGWR ASYNC valid_for=(online_logfiles,primary_role) db_unique_name=beijing'
*.log_archive_max_processes=30
*.log_file_name_convert='beijing','shanghai'
———————————————————————————————————–
 
 
//拷贝主库的数据文件至备库
需要结合standby库上实例名称是shanghai,需要准备一些必要的目录结构,例如:oradata/shanghai,bdump,cdump等等。
 
//在standby上创建instance的服务,在win平台及时设置了auto参数,可能仍然需要手工去service.msc中更改成"自动"
oradim -new -sid shanghai -startmode auto
 
//创建pwdfile,密码和primary的最好一样
orapwd file=C:oracleproduct10.2.0db_1dbsPWDshanghai.ora password=password entries=5
 
//listener.ora与tnsnames.ora
primary与standby的listener和tnsnames.ora都应该是一样的,如果有不一样,也应该仅是port和hostname不一样。
 
//使用构造的initfile构造一个spfile,然后启动standby的库
C:Documents and SettingsAdministrator>sqlplus / as sysdba
 
SQL*Plus: Release 10.2.0.4.0 – Production on 星期六 11月 10 22:18:47 2012
 
Copyright (c) 1982, 2007, Oracle.  All Rights Reserved.
 
已连接到空闲例程。
 
SQL> create spfile from pfile='c:initSHANGHAI.ora';
 
//starup moun  启动到mount阶段
 
————————————————————–
C:Documents and SettingsAdministrator>set ORACLE_SID=shanghai
 
C:Documents and SettingsAdministrator>sqlplus / as sysdba
 
SQL*Plus: Release 10.2.0.4.0 – Production on 星期六 11月 10 22:18:47 2012
 
Copyright (c) 1982, 2007, Oracle.  All Rights Reserved.
 
已连接到空闲例程。
 
SQL> create spfile from pfile='c:initSHANGHAI.ora';
 
文件已创建。
 
SQL> startup mount
ORA-02778: Name given for the log directory is invalid
SQL> create spfile from pfile='c:initSHANGHAI.ora';
 
文件已创建。
 
SQL> startup mount
 
SQL> startup  mount from pfile='c:initSHANGHAI.ora'
ORA-02778: Name given for the log directory is invalid
———————————————————-
 
上面这堆报错是因为有些目录没有创建正确,例如bdump应该在shanghai这个目录下!!!
 
//创建完应有的目录后,再启动到mount阶段就没有报错了
 
SQL> startup mount
ORACLE 例程已经启动。
 
Total System Global Area  209715200 bytes
Fixed Size                  1295872 bytes
Variable Size             113248768 bytes
Database Buffers           92274688 bytes
Redo Buffers                2895872 bytes
数据库装载完毕。
 
 
//和primary一样,添加一些standby redo log group,个数、大小都参照前面primary的操作
//控制文件中含有primary上创建的standby redo log信息,路径不一样,这里需要注意。
//建议drop掉,重建。
 
alter database add standby logfile group 4 ('c:shanghaistandbyredologstb_redo04.log') size 50M
alter database add standby logfile group 5 ('c:shanghaistandbyredologstb_redo05.log') size 50M
alter database add standby logfile group 6 ('c:shanghaistandbyredologstb_redo06.log') size 50M
alter database add standby logfile group 7 ('c:shanghaistandbyredologstb_redo07.log') size 50M
 
———————————————————–
 
//本身从standby拷贝过来的standby.ctl文件中留存了standby redo logfile的信息,需要先drop掉,才能添加。
SQL> select group#,thread#,sequence# from v$standby_log;
 
    GROUP#    THREAD#  SEQUENCE#
———- ———- ———-
         4          0          0
         5          0          0
         6          0          0
         7          0          0
 
SQL> alter database drop standby logfile group 4;
 
数据库已更改。
 
SQL> alter database drop standby logfile group 5;
 
数据库已更改。
 
SQL> alter database drop standby logfile group 6;
 
数据库已更改。
 
SQL> alter database drop standby logfile group 7;
 
数据库已更改。
 
SQL> alter database add standby logfile group 4 ('c:shanghaistandbyredologstb_redo04.log') size 50M;
 
数据库已更改。
 
SQL> alter database add standby logfile group 5 ('c:shanghaistandbyredologstb_redo05.log') size 50M;
 
数据库已更改。
 
SQL> alter database add standby logfile group 6 ('c:shanghaistandbyredologstb_redo06.log') size 50M;
 
数据库已更改。
 
SQL> alter database add standby logfile group 7 ('c:shanghaistandbyredologstb_redo07.log') size 50M;
 
数据库已更改。
 
 
———————————————————–
 
———配置完毕后,开始最重要的redo apply———————-
 
alter database recover managed standby database disconnect from session
 
//standby监听的问题
 
standby的参数文件中少了,db_unique_name一项,可能会造成如下的问题。
——————————-
*.db_name='beijing'
*.db_unique_name='shanghai'
——————————-
 
没有更改之前,standby上的lsnrctl status中的信息是这样的。
 
监听端点概要…
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=standby)(PORT=1521)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(PIPENAME=.pipeEXTPROC0ipc)))
服务摘要..
服务 "PLSExtProc" 包含 1 个例程。
  例程 "PLSExtProc", 状态 UNKNOWN, 包含此服务的 1 个处理程序…
服务 "beijing.world" 包含 1 个例程。
  例程 "shanghai", 状态 READY, 包含此服务的 1 个处理程序…
服务 "shanghai_XPT.world" 包含 1 个例程。
  例程 "shanghai", 状态 READY, 包含此服务的 1 个处理程序…
命令执行成功
 
 
注意:beijing.world…
查询service名称,发现是beijing.world(standby上应该是shanghai.world),肯定是db_unique_name在闹鬼,估计没有设置正确。
 
SQL> show parameter service
 
NAME                                 TYPE        VALUE
———————————— ———– —————–
service_names                        string      beijing.world
 
查询一下primary的v$archive_dest上是否有未生效的参数
 
SQL> select dest_name,status,error from v$archive_dest where error is not null;
 
DEST_NAME                      STATUS    ERROR
—————————— ——— —————————————
LOG_ARCHIVE_DEST_2             ERROR     ORA-12154: TNS:could not resolve the connect identifier specified
 
 
而在primary的trace文件、alert中可能有如下的错误信息:
 
————————————————
Error 12541 connecting to destination LOG_ARCHIVE_DEST_2 standby host 'shanghai'
Error 12541 attaching to destination LOG_ARCHIVE_DEST_2 standby host 'shanghai'
ORA-12541: TNS: 无监听程序
*** 2012-11-10 19:56:32.294 62692 kcrr.c
PING[ARCm]: Heartbeat failed to connect to standby 'shanghai'. Error is 12541.
————————————————-
 
果不其然!在重新给standby生成参数文件,将db_unique_name='shanghai'加进去。(缺省是没有这个参数的)
 
重启standby到mount状态,再查看lsnrctl status状态
—————————————————————————–
监听端点概要…
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=standby)(PORT=1521)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(PIPENAME=.pipeEXTPROC0ipc)))
服务摘要..
服务 "PLSExtProc" 包含 1 个例程。
  例程 "PLSExtProc", 状态 UNKNOWN, 包含此服务的 1 个处理程序…
服务 "shanghai.world" 包含 1 个例程。
  例程 "shanghai", 状态 READY, 包含此服务的 1 个处理程序…
服务 "shanghai_XPT.world" 包含 1 个例程。
  例程 "shanghai", 状态 READY, 包含此服务的 1 个处理程序…
命令执行成功
 
———————————————————————
 
SQL> show parameter service
 
NAME                                 TYPE        VALUE
———————————— ———– ——————
service_names                        string      shanghai.world
 
//重新apply redo
alter database recover managed standby database disconnect from session
 
不断的切换日志,查看主备两边v$archived_log的情况.(sequence#)
 
 
//在primary添加一个数据文件试试
在primary添加了一个数据文件,但是standby并没有自动的生成,我怀疑db_file_name_convert和log_file_name_convert设置不正确。
 
//的确,db_file_name_convert=('path1','path2'),应当参照这个设置,更改之后就能够同步两边的tablespace add和datafile add操作了。
 
 
–EOF–