现在的位置: 首页 > 数据库 > 正文

物理方式下建立oracle data guard

2019年10月12日 数据库 ⁄ 共 24341字 ⁄ 字号 评论关闭

物理方式下建立oracle data guard(一):前奏
前后折腾了一个星期左右时间,把物理方式下建立ORACLE data guard配好了,同事帮了不少忙,在此表示感谢。在这个过程中遇到了很多问题,有的问题很浅显,一下就解决了;有的问题是因为粗心引起的,比如说在服务器参数文件里面少写了一点,结果花很长时间来排错;有的问题第一次碰到,解决了之后很兴奋,因为又积累了经验,就像上次配置HP MC双机的时候碰到的那个问题,之前从未碰到过,这样折腾一下倒还认识了kcmodule这么样一个命令,附带一些不同的内核参数。
 
在这之前也尝试配置过data guard,参考过一些文档书籍,最后以失败告终,倒在主、备节点日志文件不能同步这个问题上再也回不得头来。经过这一次,我发现网上很多参考文档甚至业已出版的技术类书籍都是写得含含糊糊不太完整的,很多应该特别指出的地方被他们给忽略了;很多可以省略的地方又花了大量的篇幅来解释,这显得没有必要。在此要提到ITPUB出版的《大话ORACLE RAC》一书,涉及到RAC的部分都写得很不错,唯独data guard配置那一章有一些问题,比如第373页中间这一句:
“RAC的原有参数不变,添加下列参数:
*.service.name=wxxr_rac“这一句里面的“service.name”应该是“service.names”才对,少写了一个“s”,有时候就是这样的,失之毫厘谬以千里,涉及到参数的地方更应该严谨一些。这样的错误在实验过程中我也碰到过一次,把整个人搞得很崩溃,所幸后来找到问题所在。
除此之外,主备节点切换的过程也写得比较粗糙,有点一笔带过的感觉,其实这部分恰恰是比较重要的。
 
在我看来,配置data guard过程中涉及比较重要的文件分别是:服务器参数文件、密码文件、listener.ora文件以及tnsnames.ora文件,其中尤以服务器参数文件以及listener.ora最为重要,因为在这里要采取静态方式来配置listener.ora文件,以往那种动态方式是行不通的,因为要保证备节点在mount方式下也能注册到数据库,动态方式下做不到这一点。
 
ORACLE data guard和ORACLE RAC都是当红巨星,越发受人待见,在银行、企业、政府机构等等中扮演着重要的角色。在这里引用点《大话ORACLE RAC》里面的话,我对这本书里面data guard配置部分不是太满意,但其他地方还是很膜拜的:
“RAC的强项在于解决单点故障和负载均衡,因此RAC方案常见于24*7的核心系统。但RAC方案中数据只有一份,尽管通过RAID等机制可以避免存储故障,但是数据本身是没有冗余的,容易形成单点故障。而Data Guard是通过冗余数据来提供数据保护的。通过日志同步机制保证冗余数据和主数据库之间的同步,这种同步可以是实时、延时、同步、异步多种形式。常用于异地容灾和小企业的高可用性方案。"
 
ORACLE data guard有两种实现方式,一种是物理方式下的data guard,也就是我实验中用到的,通过在备节点上同步主节点上的redo日志来实现;还有一种是逻辑方式下的data guard,通过在备节点上应用主节点上redo日志转化而来的SQL语句实现日志同步。因为这种方法没有物理方式使用普遍,所以我暂时先做物理方式下的data guard实验,逻辑的以后再说。
 
下面进入正题。
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

物理方式下建立oracle data guard(二):环境

首先,操作系统,这里用到的HP rx8640服务器上的两个分区,并分别创建“/dev/vg00/lv_oracle”文件系统并挂载到“/home/db/oracle"目录下,接着创建“/dev/vg00/lv_arch”文件系统并挂载到“/arch”目录下,作为归档日志存放的地方。创建完毕之后记得给目录赋予正确的属主(oracle:dba)以及权限,否则会有很大问题。
 
ORACLE版本这里用到的是10.2.0.1,之前第一次做实验的时候没有注意,挑选的两个分区oracle版本不一致,一个节点的版本是10.2.0.1的,另一个节点的版本是10.2.0.3的。起初用RMAN进行备份还原到备节点的时候系统突然提醒数据需要升级,搞得我一愣一愣的,仔细检查了一下才发现是数据库版本不一致。虽说版本不一致也能做,情况好点就是这种情况,主节点oracle版本比备节点低,如果主节点oracle版本比备节点高就比较麻烦了。
 
再有一个是SID的问题,主、备节点我都把实例的SID设为ora,这样做是为了方便,也可以两边实例名设为不一致。设为一致的好处是修改服务器参数文件的时候没有那么麻烦,可修改之处变少,工作量变少,错误自然也变少了。
 
下面再次进入正题,首先在主、备节点的正确路径分别安装oracle10.2.0.1版本数据库软件(备节点不需要通过图形界面单独建立数据库,通过从主节点恢复过来即可),然后通过图形界面的dbca方式在主节点建库。为了图方便,满足实验效果,这里既不使用裸设备建库也不使用ASM方式建库,一切按照系统默认的方式往下走即可。
 
因为主节点需要设置为归档模式,这里我们可以在建库的时候就指定成归档模式,并指定归档路径为“/arch”,这样就不用在数据库建好之后再手工修改到归档模式下了,建好之后如下所示:
SQL> archive log list;
Database log mode              Archive Mode
Automatic archival             Enabled
Archive destination            /arch
Oldest online log sequence     1
Next log sequence to archive   2
Current log sequence           2

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

物理方式下建立oracle data guard(三):开工

下面设置主节点数据库为force logging模式:
SQL> alter database force logging;
Database altered.
force logging存在的意义:使得Oracle无论什么操作都进行redo的写入。
 
通过select语句可以查看:
SQL> select FORCE_LOGGING from v$database;
FOR
---
YES

因为刚建立数据库,还没有生成归档日志,我们可以手工进行日志切换来让数据库产生日志文件:
SQL> alter system switch logfile;
System altered.
SQL> alter system switch logfile;
System altered.
SQL> alter system switch logfile;
System altered.
SQL> select name from v$archived_log;
NAME
--------------------------------------------------------------------------------
/arch/1_2_697298091.dbf
/arch/1_3_697298091.dbf
/arch/1_4_697298091.dbf
 
查看已有的日志文件:
SQL> select * from v$logfile;
rows will be truncated

    GROUP# STATUS  TYPE    MEMBER
---------- ------- ------- --------------------------------------------------------
         3         ONLINE  /home/db/oracle/oradata/ora/redo03.log
         2         ONLINE  /home/db/oracle/oradata/ora/redo02.log
         1         ONLINE  /home/db/oracle/oradata/ora/redo01.log
 
为备节点创建同样大小的三组日志文件并检验:
SQL> alter database add standby logfile group 4 ('/home/db/oracle/oradata/ora/redo04.log') size 50m;
Database altered.
SQL> alter database add standby logfile group 5 ('/home/db/oracle/oradata/ora/redo05.log') size 50m;
Database altered.
SQL> alter database add standby logfile group 6 ('/home/db/oracle/oradata/ora/redo06.log') size 50m;
Database altered.
SQL> select * from v$logfile;
rows will be truncated

    GROUP# STATUS  TYPE    MEMBER
---------- ------- ------- --------------------------------------------------------
         3         ONLINE  /home/db/oracle/oradata/ora/redo03.log
         2         ONLINE  /home/db/oracle/oradata/ora/redo02.log
         1         ONLINE  /home/db/oracle/oradata/ora/redo01.log
         5         STANDBY /home/db/oracle/oradata/ora/redo05.log
         4         STANDBY /home/db/oracle/oradata/ora/redo04.log
         6         STANDBY /home/db/oracle/oradata/ora/redo06.log
6 rows selected.
 
关闭数据库,即将来到第一个重要步骤,修改服务器参数文件。
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

物理方式下建立oracle data guard(四):变化

新建立的数据库是以服务器参数文件的形式启动的,而我们要修改的是参数文件,这里简单说说服务器参数文件跟参数文件的区别和联系。服务器参数文件也就是spfileSID.ora,其内容是以二进制方式存在的,不能手工编辑;而参数文件即initSID.ora,其内容是以文本方式存在的,可以手工编辑,这里我就需要对参数文件进行修改。
 
通常说来,会有一个默认的参数文件init.ora,但这里我们需要的是initora.ora,如果没有的话可以通过命令创建,如下所示:
SQL>create pfile='/home/db/oracle/10g/dbs/initora.ora' from spfile;
 
查看当前数据库是以服务器参数文件还是参数文件方式启动,可以通过命令进行查看,如下所示:
SQL> show parameter spfile;
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
spfile                               string      /home/db/oracle/10g/dbs/spfile
                                                 ora.ora
如果VALUE下对应有文件,那说明是以spfile,即服务器参数文件的方式启动。反之,则是以参数文件的方式启动。前一篇文章停掉了数据库,为的就是在修改参数文件之后,使用新修改的参数文件来启动数据库。
 
下面奉上修改之后的参数文件,修改之处以黑体字标明:
$ vi  initora.ora
ora.__db_cache_size=780140544
ora.__java_pool_size=4194304
ora.__large_pool_size=4194304
ora.__shared_pool_size=276824064
ora.__streams_pool_size=0
*.audit_file_dest='/home/db/oracle/admin/ora/adump'
*.background_dump_dest='/home/db/oracle/admin/ora/bdump'
*.compatible='10.2.0.1.0'
*.control_files='/home/db/oracle/oradata/ora/control01.ctl','/home/db/oracle/oradata/ora/control02.ctl','/home/db/oracle/oradata/ora/control03.ctl'
*.core_dump_dest='/home/db/oracle/admin/ora/cdump'
*.db_block_size=8192
*.db_domain=''
*.db_file_multiblock_read_count=16
*.db_name='ora'
*.db_recovery_file_dest='/home/db/oracle/flash_recovery_area'
*.db_recovery_file_dest_size=2147483648
*.db_unique_name='10gpri'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=oraXDB)'
*.fal_client='10gstandby'
*.fal_server='10gpri'
*.job_queue_processes=10
*.log_archive_config='DG_CONFIG=(10gpri,10gstandby)'
*.log_archive_dest_1='LOCATION=/arch VALID_FOR=(all_logfiles,all_roles) db_unique_name=10gpri'
*.log_archive_dest_2='service=10gstandby arch async valid_for=(online_logfiles,primary_role) db_unique_name=10gstandby'
*.log_archive_dest_state_1='enable'
*.log_archive_dest_state_2='enable'
*.log_archive_format='%t_%s_%r.dbf'
*.open_cursors=300
*.pga_aggregate_target=3418357760
*.processes=150
*.remote_login_passwordfile='EXCLUSIVE'
*.sga_target=1073741824
*.standby_file_management='auto'
*.undo_management='AUTO'
*.undo_tablespace='UNDOTBS1'
*.user_dump_dest='/home/db/oracle/admin/ora/udump'
 
至于为什么添加并修改这些参数,官方文档、别人的文档、技术类书籍都有说,google或者百度或者百古虎一大把,我就不详述了。总之,db_unique_name很重要,如果主、背节点的实例名都一样,就要靠这个来区分了。

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

物理方式下建立oracle data guard(五):蜕变

接下来要做的,是以修改过的参数文件启动数据库并生成服务器参数文件,再让数据库以服务器参数文件的方式启动数据库:
1,使用修改过的参数文件将数据库启动到nomount模式:
SQL> startup pfile='/home/db/oracle/10g/dbs/initora.ora' nomount;
ORACLE instance started.
Total System Global Area 1073741824 bytes
Fixed Size                  1999160 bytes
Variable Size             285216456 bytes
Database Buffers          780140544 bytes
Redo Buffers                6385664 bytes
 
2,创建服务器参数文件:
SQL> create spfile from pfile='/home/db/oracle/10g/dbs/initora.ora';
File created.
 
3,以系统默认的服务器参数文件方式启动数据库:
SQL> shutdown immediate;
ORA-01507: database not mounted

ORACLE instance shut down.
SQL> startup
ORACLE instance started.
Total System Global Area 1073741824 bytes
Fixed Size                  1999160 bytes
Variable Size             285216456 bytes
Database Buffers          780140544 bytes
Redo Buffers                6385664 bytes
Database mounted.
Database opened.
 
4,创建密码文件(如果数据库建好之后存在的话,就不用再单独建立密码文件了):
$ orapwd file=/home/db/oracle/10g/dbs/orapwora password=oracle entries=10
$ ls
alert_ora.log        init.ora             lk10GPRI             lkORA_SINGLE         snapcf_ora.f
hc_ora.dat           initdw.ora           lkORA                orapwora             spfileora.ora
在这个地方我犯了低级错误,浪费了很多时间,这个在最后总结的时候来说。
 
下面就要提到监听文件以及TNS文件了,放下一篇文章里面列个专题,因为这一步很重要。如果不做好,后果很严重。

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

物理方式下建立oracle data guard(六):动静

下面说一下监听,这就是以前做实验的时候被卡门时间最长的地方,也是《大话ORACLE RAC》作者没有交代清楚的地方。很多文档都提到了实验做到一定程度要配置监听和TNS,以方便主、备节点互通有无。但却忽略提到一点那就是监听也有动态监听和静态监听之分,在oracle data guard实验中我们必须要用到静态监听,否则实验就没法进行下去。
 
先抄摘一点有关动态监听和静态监听的概念:
静态监听指实例启动时读取listener.ora配置文件,将实例和服务注册到监听程序。无论何时启动一个数据库,默认都有两条信息注册到监听器中:实例和服务
SID_LIST_LISTENER =
  ( SID_LIST =
      (SID_DESC =
         (GLOBAL_DBNAME = Ora8)
         (SID_NAME = test)
      )
  )

LISTENER =
  ( DESCRIPTION =
     (ADDRESS = (HOST = 192.168.0.88)(PROTOCOL = TCP)(PORT = 1522))
  )
这是一个最简单的静态监听配置文件,SID_LIST_LISTENER部分的GLOBAL_DBNAME表示向外提供的服务名,SID_NAME是提供注册的实例。在tnsnames.ora文件中的CONNECT_DATA部分,可分别选择SERVICE_NAME=Ora8或SID=test为客户端提供连接。

动态注册不需要显示的配置listener.ora文件,实例启动的时候,PMON进程根据instance_name,service_name参数将实例和服务动态注册到listerer中。如果没有设定instance_name,将使用db_name初始化参数值。如果没有设定service_names,将拼接db_name和db_domain参数值来注册监听。
 
如果对上述一番话还是不太明白,我再简单说一下一个最为关键的区别,在oracle data guard实验中,有时候我们需要将备节点启动到mount模式下,以此来接受主节点的redo日志文件完成自身的同步过程。而这个过程的前提就是两者在网络上要有一个互动,即你能凝望着我,我也能关切到你。如果是配置的动态监听,只要有实例没有启动到open状态,那就无法通过网络将服务注册到数据库,而只有静态监听可以完成这个任务。很多文档都指出需要修改listener.ora文件,但却不贯彻什么是静态监听什么是动态监听,所以具体操作起来就容易犯错误,继而去怀疑是不是参数文件配置有问题,这可真是无妄之灾。
 
下面显示的是我配置的静态监听内容以及TNS文件内容:
$ cat listener.ora
# listener.ora Network Configuration File: /u1/app/oracle/product/10.2.0/db_1/network/admin/listener.ora
# Generated by Oracle configuration tools.
LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS_LIST =
        (ADDRESS = (PROTOCOL = TCP)(HOST = 128.199.36.152)(PORT = 1521))
      )
    )
  )
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = PLSExtProc)
      (ORACLE_HOME = /home/db/oracle/10g)
      (PROGRAM = extproc)
    )
    (SID_DESC =
      (GLOBAL_DBNAME = ora)
      (ORACLE_HOME = /home/db/oracle/10g)
      (SID_NAME = ora)
    )
  )
和动态监听所不同的是,这里手工指定了ORACLE_HOME路径以及SID名称。
 
$ cat tnsnames.ora
# tnsnames.ora Network Configuration File: /home/db/oracle/10g/network/admin/tnsnames.ora
# Generated by Oracle configuration tools.
10GPRI =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 128.199.36.152)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = ora)
    )
  )
ORA =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 128.199.36.152)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = ora)
    )
  )
10GSTANDBY =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 128.199.36.53)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = ora)
    )
  )
两个服务分别是10GPRI以及10GSTANDBY。

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

物理方式下建立oracle data guard(七):测试

前面解释了动态监听和静态监听,下面要来实验一把,看数据库在mount状态下是否能够通过网络注册到数据库,下面就是具体实施过程:
1,在开始之前有一点要注意的就是,监听的开闭和数据库的开闭还有一点关系。正确的顺序是先启动监听,再讲数据库打开到mount的状态下,如果要重做一次,就要先关闭数据库,然后重启监听;
 
2,关闭主节点数据库,并启动到mount状态下(到此为止,对备节点的操作还没有开始):
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount;
ORACLE instance started.
Total System Global Area 1073741824 bytes
Fixed Size                  1999160 bytes
Variable Size             285216456 bytes
Database Buffers          780140544 bytes
Redo Buffers                6385664 bytes
Database mounted.
 
3,启动监听:
$ lsnrctl start
LSNRCTL for HPUX: Version 10.2.0.1.0 - Production on 11-SEP-2009 14:13:53
Copyright (c) 1991, 2005, Oracle.  All rights reserved.
Starting /home/db/oracle/10g/bin/tnslsnr: please wait...
TNSLSNR for HPUX: Version 10.2.0.1.0 - Production
System parameter file is /home/db/oracle/10g/network/admin/listener.ora
Log messages written to /home/db/oracle/10g/network/log/listener.log
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=128.199.36.152)(PORT=1521)))
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=128.199.36.152)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for HPUX: Version 10.2.0.1.0 - Production
Start Date                11-SEP-2009 14:13:53
Uptime                    0 days 0 hr. 0 min. 0 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /home/db/oracle/10g/network/admin/listener.ora
Listener Log File         /home/db/oracle/10g/network/log/listener.log
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=128.199.36.152)(PORT=1521)))
Services Summary...
Service "PLSExtProc" has 1 instance(s).
  Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service...
Service "ora" has 1 instance(s).
  Instance "ora", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully
到这里可以看到监听已经成功启动。值得一提的是,在静态监听开启的情况下,实例的状态显示为“UNKNOWN",而动态监听开启状态下,实例的状态应该显示为“READY”。根据这一点也可以判断监听是以什么方式启动。
 
4,测试以网络方式注册到数据库:
$ sqlplus sys/oracle@10gpri as sysdba
SQL*Plus: Release 10.2.0.1.0 - Production on Fri Sep 11 15:01:20 2009
Copyright (c) 1982, 2005, Oracle.  All rights reserved.

Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bit Production
With the Partitioning, OLAP and Data Mining options
SQL>
注意:如果输入“sqlplus system/oracle@10gpri as sysdba可能仍然注册不到数据库,这就需要通过赋予sysdba给system用户的命令来实现。
 
这一步成功了之后,后面的过程就比较好办了。

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

物理方式下建立oracle data guard(八):意外

前面那篇文章提到了在启动静态监听、将数据库启动到mount模式下以网络方式注册数据库,是比较顺利的一种情况,之前还遇到了一个比较困惑的问题,下面就来讨论一下这种情况。
 
之前在成功配置监听文件、TNS文件,也将数据库启动到了mount状态下,但死活就是无法通过网络方式注册到数据库,出现下面这个报错信息:
ORA-01031: insufficient privileges
提示没有足够的权限,有没有搞错?我是以sys用户登陆,sys不就具有最高权限么?而且密码并没有输入错误。仔细检查了listener.ora以及tnsnames.ora文件,确认没有任何问题。因为在另一个环境就是这样设置的。尝试查看一下拥有SYSDBA权限的用户:
SQL> select * from v$pwfile_users;
USERNAME                       SYSDB SYSOP
------------------------------ ----- -----

no rows selected.
 
看到这里,问题比较明朗了,密码文件没有起到作用。因为通过网络注册数据库,是要读取密码文件的,而SYS是默认具有SYSDBA权限的,这里显示不出来,说明密码文件没有被成功读取,自然也就无法注册到数据库了。打个简单的比喻,小明在一次语文期末考试之前想要作弊,作弊的方式是通过花点银子去买一份答案,结果买到一份假答案,那考试自然是过不了关的了。此情此景,殊途同归。
 
回忆一下系统建库之后,默认生成了一个正确的密码文件,但是我手贱,把这个文件给删除了,重新创建了一个,并且命名为orapw10gstandby.ora。这个命名犯下两个错误,这两个错误也让我重新审视对密码文件规范化的认知程度。首先,密码文件是没有.ora后缀的;其次,后缀之前应该以标准的“orapwSID”方式命名。这样一来,我删除了这个错误命名的密码文件,重新建立密码文件:
orapwd file=/home/db/oracle/10g/dbs/orapwora password=oracle entries=10
 
重新在数据库中查询拥有SYSDBA的用户:
SQL> select * from v$pwfile_users;
USERNAME                       SYSDB SYSOP
------------------------------ ----- -----
SYS                            TRUE  TRUE
这不,又重新回来了,再检验通过网络注册数据库,一切正常,于是这个问题也算告一段落了。
之所以写这么长一篇,还是为了强调密码文件的重要性,往往我们忽视掉的地方恰恰是最值得重视的。

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

物理方式下建立oracle data guard(九):宠幸

到现在为止我已经分不清我是在写技术博客还是在写生活日志了,或多或少掺入了个人感情,毕竟学习data guard时间不算短了,到现在才总算是有些柳暗花明。应该是才疏学浅,抑或是实在太笨,学东西慢,但看到有进展的时候还是抑制不住内心的激动的。闲话莫提,下面开始宠幸备节点,毕竟data guard这个军功章有主节点的一半,也有备节点的一半。
 
主节点需要我们完成的步骤大致就是前面那些文章所提到的了,只剩下最终的切换测试过程。而备节点需要关注的体现在以下几个方面:
目录、参数文件、密码文件、监听文件、TNS文件、SID(这里继续使用ora)
到这里,除了参数文件和监听文件需要稍作改动,其他诸如密码文件、TNS文件只需从主节点拷贝即可,目录可以按照主节点相同的路径进行手工创建,在unix下面也就是mkdir而已,更快一些,你可以用mkdir -p实现,下面是具体过程:
 
1,创建/home/db/oracle/oradata/ora主目录以及主目录下udump、adump、cdump、bdump等次目录;
 
2,通过ftp方式拷贝主节点下密码文件、TNS文件;
 
3,在主节点进行几次日志切换,产生一定量的归档日志文件:
SQL> alter system switch logfile;
System altered.
SQL> alter system switch logfile;
System altered.
SQL> alter system switch logfile;
System altered.

SQL> select name from v$archived_log;
NAME
--------------------------------------------------------------------------------
/arch/1_2_697298091.dbf
/arch/1_3_697298091.dbf
/arch/1_4_697298091.dbf
/arch/1_5_697298091.dbf
/arch/1_6_697298091.dbf
/arch/1_7_697298091.dbf
6 rows selected.
 
4,停掉主节点数据库,拷贝归档日志文件以及所有数据文件
NOTE:拷贝到备节点之后注意查看属主是否正确,否则修改如下:
root@hpvm3:/home/db/oracle/oradata/ora#chown oracle:dba *
 
5,将主节点数据库启动到mount模式下,创建standby控制文件:
SQL> startup mount;
ORACLE instance started.
Total System Global Area 1073741824 bytes
Fixed Size                  1999160 bytes
Variable Size             289410760 bytes
Database Buffers          775946240 bytes
Redo Buffers                6385664 bytes
Database mounted.
SQL> alter database create standby controlfile as '/arch/standby.ctl';
Database altered.
 
6,拷贝standby控制文件到备节点,并赋予正确属主:
root@hpvm3:/home/db/oracle/oradata/ora#chown oracle:dba standby.ctl
 
7,修改备节点参数文件如下:
root@hpvm3:/arch#vi initstandby.ora
"initstandby.ora" 35 lines, 1328 characters
ora.__db_cache_size=805306368
ora.__java_pool_size=4194304
ora.__large_pool_size=4194304
ora.__shared_pool_size=251658240
ora.__streams_pool_size=0
*.audit_file_dest='/home/db/oracle/admin/ora/adump'
*.background_dump_dest='/home/db/oracle/admin/ora/bdump'
*.compatible='10.2.0.1.0'
*.control_files='/home/db/oracle/oradata/ora/standby.ctl'
*.core_dump_dest='/home/db/oracle/admin/ora/cdump'
*.db_block_size=8192
*.db_domain=''
*.db_file_multiblock_read_count=16
*.db_name='ora'
*.DB_UNIQUE_NAME='10gstandby'
*.log_archive_config='DG_CONFIG=(10gpri,10gstandby)'
*.db_recovery_file_dest='/home/db/oracle/flash_recovery_area'
*.db_recovery_file_dest_size=2147483648
*.dispatchers='(PROTOCOL=TCP) (SERVICE=oraXDB)'
*.job_queue_processes=10
*.log_archive_dest_1='LOCATION=/arch VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=10gstandby'
*.log_archive_dest_2='service=10gpri arch ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=10gpri'
*.LOG_ARCHIVE_DEST_STATE_1=ENABLE
*.LOG_ARCHIVE_DEST_STATE_2=ENABLE
*.FAL_SERVER=10gstandby
*.FAL_CLIENT=10gpri
*.open_cursors=300
*.pga_aggregate_target=3418357760
*.processes=150
*.remote_login_passwordfile='EXCLUSIVE'
*.sga_target=1073741824
*.undo_management='AUTO'
*.undo_tablespace='UNDOTBS1'
*.STANDBY_FILE_MANAGEMENT=AUTO
*.user_dump_dest='/home/db/oracle/admin/ora/udump'
 
这一切工作做完之后,ok,轮到咱备节点登上历史舞台了。

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

物理方式下建立oracle data guard(十):革命

闲话不提,下面直入正题,看备节点建功立业:
1,以修改之后的参数文件为优秀代表,启动备节点数据库到nomount模式下:
SQL> startup nomount pfile='/arch/initstandby.ora';
ORACLE instance started.
Total System Global Area 1073741824 bytes
Fixed Size                  1999192 bytes
Variable Size             264244904 bytes
Database Buffers          805306368 bytes
Redo Buffers                2191360 bytes
 
2,创建服务器参数文件并关闭数据库:
SQL> create spfile from pfile='/arch/initstandby.ora';
File created.
SQL> shutdown immediate;
ORA-01507: database not mounted

ORACLE instance shut down.

3,启动修改后的监听(只需要修改其中的IP地址即可):
$ lsnrctl start
LSNRCTL for HPUX: Version 10.2.0.1.0 - Production on 11-SEP-2009 15:54:36
Copyright (c) 1991, 2005, Oracle.  All rights reserved.
Starting /home/db/oracle/10g/bin/tnslsnr: please wait...
TNSLSNR for HPUX: Version 10.2.0.1.0 - Production
System parameter file is /home/db/oracle/10g/network/admin/listener.ora
Log messages written to /home/db/oracle/10g/network/log/listener.log
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=128.199.36.53)(PORT=1521)))
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=128.199.36.53)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for HPUX: Version 10.2.0.1.0 - Production
Start Date                11-SEP-2009 15:54:36
Uptime                    0 days 0 hr. 0 min. 0 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /home/db/oracle/10g/network/admin/listener.ora
Listener Log File         /home/db/oracle/10g/network/log/listener.log
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=128.199.36.53)(PORT=1521)))
Services Summary...
Service "PLSExtProc" has 1 instance(s).
  Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service...
Service "ora" has 1 instance(s).
  Instance "ora", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully
 
4,启动数据库到mount下:
$ sqlplus "/ as sysdba"
SQL*Plus: Release 10.2.0.1.0 - Production on Fri Sep 11 15:54:55 2009
Copyright (c) 1982, 2005, Oracle.  All rights reserved.
Connected to an idle instance.
SQL> startup mount;
ORACLE instance started.
Total System Global Area 1073741824 bytes
Fixed Size                  1999192 bytes
Variable Size             264244904 bytes
Database Buffers          805306368 bytes
Redo Buffers                2191360 bytes
Database mounted.
 
5,测试以网络方式注册数据库没有问题:
$ sqlplus sys/oracle@10gstandby as sysdba
SQL*Plus: Release 10.2.0.1.0 - Production on Fri Sep 11 15:01:20 2009
Copyright (c) 1982, 2005, Oracle.  All rights reserved.

Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bit Production
With the Partitioning, OLAP and Data Mining options
SQL>
 
6,启动主节点数据库:
$ sqlplus "/ as sysdba"
SQL*Plus: Release 10.2.0.1.0 - Production on Fri Sep 11 15:59:29 2009
Copyright (c) 1982, 2005, Oracle.  All rights reserved.

Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bit Production
With the Partitioning, OLAP and Data Mining options
SQL> alter database open;
Database altered.
 
7,重新关闭备节点数据库并以standby方式启动到mount状态下:
SQL> startup nomount
ORACLE instance started.
Total System Global Area 1073741824 bytes
Fixed Size                  1999192 bytes
Variable Size             264244904 bytes
Database Buffers          805306368 bytes
Redo Buffers                2191360 bytes
SQL> alter database mount standby database;
Database altered.
 
8,将备节点更改到接受主节点redo日志模式下:
SQL> alter database recover managed standby database disconnect from session;
Database altered.
 
9,查看切换状态:
SQL> select switchover_status from v$database;
SWITCHOVER_STATUS
--------------------
TO PRIMARY
如果显示为TO PRIMARY,表示一切正常。
 
到此为止,备节点革命过程完毕,和主节点遥相呼应,要想完全接收主节点redo日志,就需要主节点做出一些动作了,连同主备切换放到下篇再说。

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

物理方式下建立oracle data guard(十一):会师

备节点需要完成的工作已经完成,现在应该让主、备节点相互之间通通气了。判断data guard是否搭建成功有两个标准,一个是看主备节点的日志是否能够同步,一个是看主备之间是否能够顺利切换,完成角色转换。下面就要开始主备日志同步的过程:
 
1,在主节点进行日志切换:
SQL> alter system switch logfile;
System altered.
 
2,查看当前归档日志数量:
SQL> select name from v$archived_log;
NAME
--------------------------------------------------------------------------------
/arch/1_2_697298091.dbf
/arch/1_3_697298091.dbf
/arch/1_4_697298091.dbf
/arch/1_5_697298091.dbf
/arch/1_6_697298091.dbf
/arch/1_7_697298091.dbf
/arch/1_8_697298091.dbf
10gstandby
10gstandby
10gstandby
10gstandby
10gstandby
10gstandby
10gstandby
14 rows selected.
这个时候出现了七行10gstandby,对应备节点下同步过去的日志,数量和主节点下归档日志相同,说明主备日志同步成功。如果还不放心,可以到备节点查看归档日志的同步情况:
 
SQL> select name from v$archived_log;
NAME
--------------------------------------------------------------------------------
/arch/1_2_697298091.dbf
/arch/1_3_697298091.dbf
/arch/1_4_697298091.dbf
/arch/1_5_697298091.dbf
/arch/1_6_697298091.dbf
/arch/1_7_697298091.dbf
/arch/1_8_697298091.dbf
 
ok,这样主、备节点就日志同步了。
 
这是在比较顺利的情况下,如果主备节点无法同步日志,首先要看两个节点之间通讯是不是有问题,这可以通过tnsping来实现,例如:
$ tnsping 10gpri
TNS Ping Utility for HPUX: Version 10.2.0.1.0 - Production on 15-SEP-2009 09:58:22
Copyright (c) 1997, 2005, Oracle.  All rights reserved.
Used parameter files:

Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 128.199.36.152)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = ora)))
OK (0 msec)
 
再有,可以通过执行命令:
alter system set log_archive_dest_state_2='defer' scope=memory;
alter system set log_archive_dest_state_2='enable' scope=memory;
来尝试是否有好转。
 
如果这两个步骤执行了都没有办法,那就要仔细查看alert日志文件,看里面都有些什么报错信息,再具体问题具体分析了。
 
下面是本次data guard实验的最后一篇,内容涉及主备节点切换。

all from here : http://blog.chinaunix.net/u/6589/article_121196.html

///////////////////////////////////////////////////      finished , over   ///////////////////////////////////////////////////////////

 

 

refer :

 

[oracle@standby admin]$ cat listener.ora
# LISTENER.ORA Network Configuration File: /opt/oracle/product/9.2.0/network/admin/listener.ora
# Generated by Oracle configuration tools.

LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))
)
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = standby)(PORT = 1521))
)
)
)

SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = /opt/oracle/product/9.2.0)
(PROGRAM = extproc)
)
(SID_DESC =
(GLOBAL_DBNAME = primary)
(ORACLE_HOME = /opt/oracle/product/9.2.0)
(SID_NAME = primary)
)
)

 

[oracle@eygle admin]$ cat listener.ora
# LISTENER.ORA Network Configuration File: /opt/oracle/product/9.2.0/network/admin/listener.ora
# Generated by Oracle configuration tools.

LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = eygle)(PORT = 1521))
)
)
)

SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = primary)
(ORACLE_HOME = /opt/oracle/product/9.2.0)
(SID_NAME = primary)
)
)

 

from:http://www.eygle.com/archives/2004/10/dataguard-step-by-step.html

抱歉!评论已关闭.