oracle rac +standby

Oracle dataguard

1           Dataguard架构

Dataguard架构按照功能分为3部分:

日志发送

日志接收

日志应用

1.1      日志发送

日志发送由primary database的LGWR和ARCH进程完成,两者对数据保护能力和系统可用性有很大的区别

1.1.1  使用ARCH进程

(1)       primary database不断产生redo log,这些日志被LGWR进程写到联机日志;

(2)       当一组联机日志写满时,就会发生日志切换,并触发本地归档;

(3)       完成本地归档之后,联机日志就可以被覆盖复用

(4)       归档日志发送到standby,在standby上应用

ARCH进程最大的问题就是:primary database只有在发生归档时才会发送日志到standby database,如果primary database发送宕机,联机日志中的redo内容就会丢失,因此,ARCH进程无法避免数据丢失的问题。

         缺省情况下,primary用的就是ARCH进程。

1.1.2  使用LGWR进程的SYNC方式

Primary database产生的redo日志要同时写到日志文件和网络,必须都成功,primary database上的事务才能提交

         使用LGWR进程必须明确指定,例如:

         LOG_ARCHIVE_DEST_2=’SERVICE=STANDBY LGWR SYNC NET_TIMEOUT=30’

NET_TIMEOUT代表多次时间网络发送没有响应,LGWR进程会抛出错误。

1.1.3  使用LGWR进程的ASYNC方式

Primary database产生redo日志后,LGWR把日志同时提交给日志文件和本地LNS进程,但是LGWR进程只需成功写入日志文件就可以,不必等待LNSn进程的网络进程传送成功

例如:

         LOG_ARCHIVE_DEST_2=’SERVICE=STANDBY LGWR ASYNC’

1.2      日志接受

Standby的归档日志目录:

归档日志目录优先使用参数:STANDBY_ARCHIVE_DEST

如果某个LOG_ARCHIVE_DEST_N参数明确定义了VALID_FOR=(standby_logfile,*)选项,则使用这个参数指定的目录。

如果STANDBY_ARCHIVE_DEST和LOG_ARCHIVE_DEST_N都没有配置,则使用STANDBY_ARCHIVE_DEST的默认值:$ORACLE_HOME/dbs/arch

1.3      日志应用

根据redo apply发生的时间又可以分成两种,一种是实时应用,这种方式必须使用standby redo log。另一种是归档时应用。

(1)如果是physical standby,可以使用下面的命令启用real-time

         Alter database recover managed standby database using current logfile;

(2)如果是logic standby 可以使用下面命令启用real-time

Alter database start logical standby apply immediate

(3)查看是否使用real-time apply

Select recovery_mode from v$archive_dest_status;

1.4      数据保护模式

(1)最大可用

(2)最大保护

(3)最大性能

(4)查看保护模式

SQL> select protection_mode,protection_level from v$database;

PROTECTION_MODE      PROTECTION_LEVEL

-------------------- --------------------

MAXIMUM PERFORMANCE  MAXIMUM PERFORMANCE

1.5      自动裂隙检测和解决

当primary database的某些日志没有成功发到standby database,这就发生了归档裂隙,缺失的这些日志就是裂隙。Dataguard能够自动检测解决,不需要dba的介入,这就需要配置两个参数:FAL_CLIENT、FAL_SERVER(FAL是fetch archive log的缩写)

除了自动日志缺失解决,也可以dba手工解决:

拷贝缺失的归档日志,进行注册:

alter database register logfile ‘logfilename’;

2           rac和standby配置实例

2.1      rac primary和single standby

2.1.1  实施环境:

主库:oracle 10g rac+asm

备库:oracle 10g单实例+asm

                                              

主库节点1

主库节点2

备库

主机名

rac1

主机名

rac2

主机名

std

Ip

192.168.204.8

Ip

192.168.204.9

Ip

192.168.204.20

数据库名

rac

数据库名

rac

数据库名

std

数据库实例

rac1

数据库实例

rac2

数据库实例

std

该过程主要将修改主库和备库的初始化启动文件等配置信息,通过RMAN工具从主库备份数据库,再通过RMAN工具从备库恢复数据,最后等待归档日志的正常传输,实现数据库的同步。

要点:

如果Standby是rac,则接受日志和恢复日志可以不是一个实例,single instance 的日志只发送到rac的一个实例。

2.1.2  修改主库,将主库改为归档模式及force logging状态

1、  关闭所有节点的实例服务

SQL> shutdown immediate

Database closed.

Database dismounted.

ORACLE instance shut down.

2.1.3  在其中一个节点

SQL> sqlplus / as sysdba

SQL> startup mount

SQL> alter database archivelog;

SQL> alter database open;

SQL> select log_mode from v$database;

LOG_MODE

------------

ARCHIVELOG

2.1.4  将rac数据库修改为force logging

SQL> alter database force logging;

Database altered.

SQL> select inst_id,force_logging from gv$database;

   INST_ID FOR

---------- ---

         1 YES

         2 YES

                    

2.1.5  配置文件及备份文件

1、  在 RAC1 上创建备份目录/u01/oracle/rman_bak

2、  在std上创建相同的备份目录,以便rman能够顺利恢复

3、  下面通过 sqlplus 创建 pfile  initstandby.ora

SQL> show parameter spfile

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

spfile                               string      +DATA/rac/spfilerac.ora

两个节点用一个spfile

SQL> show parameter db_unique_name

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

db_unique_name                       string      rac

SQL> CREATE PFILE='/u01/oracle/rman_bak/initstandby.ora' FROM SPFILE;

File created.

2.1.6  在主库和备库上修改oracle网络服务

1、修改RAC1和RAC2的oracle的tnsnames.ora

[oracle@rac1 admin]$ vi /u01/oracle/product/10.2.0/db_1/network/admin/tnsnames.ora

增加:

standby =

  (DESCRIPTION =

    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.204.20)(PORT = 3173))

    (CONNECT_DATA =

      (SERVER = DEDICATED)

      (SERVICE_NAME = standby)

    )

  )

2.1.7  修改Standby的tnsnames.ora和listner.ora配置

从primary拷贝过来,增加:

standby =

  (DESCRIPTION =

    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.204.20)(PORT = 3173))

    (CONNECT_DATA =

      (SERVER = DEDICATED)

      (SERVICE_NAME = standby)

    )

  )

4、  修改Standby的oracle的.bash_profile文件

export ORACLE_SID=standby

export ORACLE_BASE=/u01/oracle

export ORACLE_HOME=$ORACLE_BASE/product/10.2.0/db_1

export LD_LIBRARY_PATH=$ORACLE_HOME/lib

export PATH=$ORACLE_HOME/bin:$PATH

umask 022

2.1.8  新建恢复需要的目录

mkdir -p /u01/oracle/admin/standby/adump

mkdir -p /u01/oracle/admin/standby/bdump

mkdir -p /u01/oracle/admin/standby/cdump

mkdir -p /u01/oracle/admin/standby/dpdump

mkdir -p /u01/oracle/admin/standby/hdump

mkdir -p /u01/oracle/admin/standby/udump

mkdir -p /u01/oracle/admin/standby/pfile

2.1.9  创建监听

tnsping

2.1.10             配置参数文件和密码文件

cd /u01/oracle/rman_bak/

将standby上从RAC1上拷贝过来的文件initstandby.ora拷贝至$ORACLE_HOME/dbs下。

通过指令创建orapwstandby.ora,该文件包含的是sys的用户密码,注意密码一定要保证与主库一致。

[oracle@std rman_bak]$ cd /u01/oracle/product/10.2.0/db_1/dbs/

[oracle@std dbs]$ orapwd file=orapwstandby password=sys

主库:

SQL> show parameter db_unique_name

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

db_unique_name                       string      rac

SQL> select file_name from dba_data_files;

FILE_NAME

--------------------------------------------------------------------------------

+DATA/rac/datafile/users.259.868180115

+DATA/rac/datafile/sysaux.257.868180115

+DATA/rac/datafile/undotbs1.258.868180115

+DATA/rac/datafile/system.256.868180113

+DATA/rac/datafile/undotbs2.264.868180247

2.1.10.1      修改主库参数文件

Rac原有参数不变,增加以下参数

SQL> ALTER SYSTEM SET service_names=rac scope=both;

SQL> ALTER SYSTEM SET LOG_ARCHIVE_DEST_1='LOCATION=+RECV/rac/archivelog valid_for=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=rac' scope=both;

SQL> ALTER SYSTEM SET LOG_ARCHIVE_CONFIG='DG_CONFIG=(rac,standby)' scope=both; 

SQL> ALTER SYSTEM SET LOG_ARCHIVE_DEST_3='service=standby valid_for=(online_logfiles,primary_role) db_unique_name=standby' scope=both; 

SQL> ALTER SYSTEM SET db_file_name_convert='+DATA/rac/datafile/','+DATA/standby/datafile/','+DATA/rac/tempfile/','+DATA/standby/tempfile/' scope=spfile; 

SQL> ALTER SYSTEM SET log_file_name_convert='+RECV/rac/onlinelog','+RECV/standby/onlinelog' scope=both; 

SQL> ALTER SYSTEM SET standby_file_management=auto scope=both; 

SQL> ALTER SYSTEM SET fal_server='standby' scope=both;

SQL> ALTER SYSTEM SET rac1.fal_client='rac1' scope=spfile scope=both;

SQL> ALTER SYSTEM SET rac2.fal_client='rac2' scope=spfile scope=both;

加上 scope=both立即生效。

SQL> create spfile='+DATA/rac/spfilerac.ora' from pfile='/u01/oracle/rman_bak/initrac.ora';

File created.

2.1.10.2      修改备库参数文件:

可以删除的参数:

*.cluster_database_instances=2

*.cluster_database=true

*.db_create_file_dest='+DATA'

rac2.instance_number=2

rac1.instance_number=1

*.remote_listener='LISTENERS_RAC'

修改initstandby.ora文件

修改新增参数:

*.control_files='/u01/oracle/rman_bak/standby.ctl'

*.db_unique_name='standby'

*.log_archive_config='dg_config=(rac,standby)'

*.db_file_name_convert='+DATA/rac/datafile','+DATA/standby/datafile','+DATA/rac/tempfile','+DATA/standby/tempfile'

*.log_file_name_convert='+RECV/rac/onlinelog','+RECV/standby/onlinelog'

*.log_archive_dest_1='LOCATION=+DATA/standby/archivelog valid_for=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=standby'

*.LOG_ARCHIVE_DEST_2='SERVICE=rac1 LGWR ASYNC valid_for=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=rac'

*.LOG_ARCHIVE_DEST_STATE_1=ENABLE

*.LOG_ARCHIVE_DEST_STATE_2=ENABLE

*.REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE

*.FAL_SERVER='rac'

*.FAL_CLIENT='standby'

*.STANDBY_FILE_MANAGEMENT='AUTO'

thread=1

undo_tablespace='UNDOTBS1'

 

 

*.user_dump_dest='/u01/oracle/admin/standby/udump'

*.audit_file_dest='/u01/oracle/admin/standby/adump'

*.background_dump_dest='/u01/oracle/admin/standby/bdump'

*.core_dump_dest='/u01/oracle/admin/standby/cdump'

 

 

*.db_unique_name='standby'

*.service_names='standby'

注:+DATA/standby/archivelog这个目录需要在备库手动创建,开始未创建,结果一直报错归档目录不合法。

2.1.11             进行rman备份

备份数据文件及控制文件

RMAN>  backup FORMAT  '/u01/oracle/rman_bak/db_%U' database plus archivelog;

-----------------delete all input;不要这个

RMAN>  BACKUP FORMAT  '/u01/oracle/rman_bak/control_%U'  CURRENT CONTROLFILE FOR STANDBY;

注:

在controlfile中记录着每一个archivelog的相关信息,OS下把这些物理文件delete掉后,在controlfile中仍然记录着这些archivelog的信息,

当我们手工清除archive目录下的文件后,这些记录并没有被我们从controlfile中清除掉,也就是oracle并不知道这些文件已经不存在了!

RMAN> crosscheck archivelog all;

RMAN> delete expired archivelog all;

进行几次归档

SQL>Alter system archive log current;

主库创建备库的控制文件

SQL> alter database create standby controlfile as '/u01/oracle/rman_bak/standby.ctl';

Database altered.

将RAC1上的/u01/oracle/rman_bak/下的所有文件,包含RMAN备份文件,tnsnames.ora, listener.ora和initstandby.ora拷贝至Standby的同样的目录上。

[oracle@std rman_bak]$ scp oracle@192.168.204.8:/u01/oracle/rman_bak/* ./

创建spfile

[oracle@std dbs]$ export ORACLE_SID=standby

[oracle@std dbs]$ sqlplus / as sysdba

SQL*Plus: Release 10.2.0.4.0 - Production on Tue Jan 6 17:30:51 2015

Copyright (c) 1982, 2007, Oracle.  All Rights Reserved.

Connected to an idle instance.

SQL> create spfile from pfile='/u01/oracle/product/10.2.0/db_1/dbs/initstandby.ora';

File created.

SQL> startup nomount

2.1.12             利用rman创建standby数据库

备库启动到nomount状态

SQL> startup pfile='/u01/oracle/product/10.2.0/db_1/dbs/initstandby.ora' nomount;

ORACLE instance started.

Total System Global Area  285212672 bytes

Fixed Size                  2083368 bytes

Variable Size              88081880 bytes

Database Buffers          188743680 bytes

Redo Buffers                6303744 bytes

SQL> create spfile from pfile='/u01/oracle/product/10.2.0/db_1/dbs/initstandby.ora';

File created.

主库恢复备库

[oracle@rac1 ~]$ rman target / auxiliary sys/sys@standby

Recovery Manager: Release 10.2.0.4.0 - Production on Wed Jan 7 10:52:22 2015

Copyright (c) 1982, 2007, Oracle.  All rights reserved.

connected to target database: RAC (DBID=2456162188)

connected to auxiliary database: RAC (not mounted)

RMAN> duplicate target database for standby;

Starting Duplicate Db at 07-JAN-15

using target database control file instead of recovery catalog

allocated channel: ORA_AUX_DISK_1

channel ORA_AUX_DISK_1: sid=155 devtype=DISK

contents of Memory Script:

{

   restore clone standby controlfile;

   sql clone 'alter database mount standby database';

}

executing Memory Script

Starting restore at 07-JAN-15

using channel ORA_AUX_DISK_1

channel ORA_AUX_DISK_1: restoring control file

channel ORA_AUX_DISK_1: copied control file copy

input filename=/u01/oracle/rman_bak/standby.ctl

output filename=/u01/oracle/rman_bak/standby.ctl

Finished restore at 07-JAN-15

sql statement: alter database mount standby database

released channel: ORA_AUX_DISK_1

WARNING: DB_FILE_NAME_CONVERT resulted in invalid ASM names; names changed to diskgroup only.

contents of Memory Script:

{

   set newname for tempfile  1 to

 "+data";

   switch clone tempfile all;

   set newname for datafile  1 to

 "+data";

   set newname for datafile  2 to

 "+data";

   set newname for datafile  3 to

 "+data";

   set newname for datafile  4 to

 "+data";

   set newname for datafile  5 to

 "+data";

   restore

   check readonly

   clone database

   ;

}

executing Memory Script

executing command: SET NEWNAME

renamed temporary file 1 to +data in control file

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

Starting restore at 07-JAN-15

allocated channel: ORA_AUX_DISK_1

channel ORA_AUX_DISK_1: sid=155 devtype=DISK

channel ORA_AUX_DISK_1: starting datafile backupset restore

channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set

restoring datafile 00001 to +DATA

restoring datafile 00002 to +DATA

restoring datafile 00003 to +DATA

restoring datafile 00004 to +DATA

restoring datafile 00005 to +DATA

channel ORA_AUX_DISK_1: reading from backup piece /u01/oracle/rman_bak/db_0hps54f4_1_1

channel ORA_AUX_DISK_1: restored backup piece 1

piece handle=/u01/oracle/rman_bak/db_0hps54f4_1_1 tag=TAG20150107T191548

channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:45

Finished restore at 07-JAN-15

contents of Memory Script:

{

   switch clone datafile all;

}

executing Memory Script

datafile 1 switched to datafile copy

input datafile copy recid=8 stamp=868395271 filename=+DATA/standby/datafile/system.260.868395229

datafile 2 switched to datafile copy

input datafile copy recid=9 stamp=868395275 filename=+DATA/standby/datafile/undotbs1.279.868395233

datafile 3 switched to datafile copy

input datafile copy recid=10 stamp=868395275 filename=+DATA/standby/datafile/sysaux.280.868395233

datafile 4 switched to datafile copy

input datafile copy recid=11 stamp=868395275 filename=+DATA/standby/datafile/users.277.868395235

datafile 5 switched to datafile copy

input datafile copy recid=12 stamp=868395275 filename=+DATA/standby/datafile/undotbs2.278.868395235

Finished Duplicate Db at 07-JAN-15

[oracle@std dbs]$ export ORACLE_SID=standby

[oracle@std dbs]$ sqlplus / as sysdba

SQL*Plus: Release 10.2.0.4.0 - Production on Tue Jan 6 20:48:47 2015

Copyright (c) 1982, 2007, Oracle.  All Rights Reserved.

Connected to:

Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production

With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> select status from v$instance;

STATUS

------------

MOUNTED

SQL> select member from v$logfile;

MEMBER

--------------------------------------------------------------------------------

+DATA/rac/onlinelog/group_2.262.868180179

+DATA/rac/onlinelog/group_1.261.868180177

+DATA/rac/onlinelog/group_3.265.868180327

+DATA/rac/onlinelog/group_4.266.868180329

SQL> select name from v$datafile;

NAME

--------------------------------------------------------------------------------

+DATA/standby/datafile/system.266.868308455

+DATA/standby/datafile/undotbs1.268.868308459

+DATA/standby/datafile/sysaux.267.868308459

+DATA/standby/datafile/users.270.868308459

+DATA/standby/datafile/undotbs2.269.868308459

SQL> SELECT NAME FROM V$TEMPFILE;

NAME

--------------------------------------------------------------------------------

+DATA

2.1.13             创建standby redo log日志

创建原则:日志文件大小相等、日志组数量要多1

主库查询联机日志

[oracle@rac1 admin]$ export ORACLE_SID=rac1

[oracle@rac1 admin]$ sqlplus / as sysdba

SQL*Plus: Release 10.2.0.4.0 - Production on Tue Jan 6 20:54:05 2015

Copyright (c) 1982, 2007, Oracle.  All Rights Reserved.

Connected to:

Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production

With the Partitioning, Real Application Clusters, OLAP, Data Mining

and Real Application Testing options

SQL> SELECT THREAD#,GROUP#,BYTES/1024/1024 FROM V$LOG;

   THREAD#     GROUP# BYTES/1024/1024

---------- ---------- ---------------

         1          1              50

         1          2              50

         2          3              50

         2          4              50

RAC有两个redo thread ,每个thread有两个日志组,每个日志文件大小50MB,所以要针对每个thread需要创建3组standby redo log,大小为50MB。

Standby 库执行:

alter database add standby logfile thread 1 group 5 ('+DATA/standby/onlinelog/st_redo_5.rdo') size 50m;

alter database add standby logfile thread 1 group 6 ('+DATA/standby/onlinelog/st_redo_6.rdo') size 50m;

alter database add standby logfile thread 1 group 7 ('+DATA/standby/onlinelog/st_redo_7.rdo') size 50m;

alter database add standby logfile thread 2 group 8 ('+DATA/standby/onlinelog/st_redo_8.rdo') size 50m;

alter database add standby logfile thread 2 group 9 ('+DATA/standby/onlinelog/st_redo_9.rdo') size 50m;

alter database add standby logfile thread 2 group 10 ('+DATA/standby/onlinelog/st_redo_10.rdo') size 50m;

SQL> select member from v$logfile;

MEMBER

--------------------------------------------------------------------------------

+DATA/rac/onlinelog/group_2.262.868180179

+DATA/rac/onlinelog/group_1.261.868180177

+DATA/rac/onlinelog/group_3.265.868180327

+DATA/rac/onlinelog/group_4.266.868180329

+DATA/standby/onlinelog/st_redo_5.rdo

+DATA/standby/onlinelog/st_redo_6.rdo

+DATA/standby/onlinelog/st_redo_7.rdo

+DATA/standby/onlinelog/st_redo_9.rdo

+DATA/standby/onlinelog/st_redo_10.rdo

+DATA/standby/onlinelog/st_redo_8.rdo

10 rows selected.

2.1.14             开始同步

在备库上启动redo apply

SQL> recover managed standby database disconnect from session;

Media recovery complete.

2.1.15             确认同步

SQL> select status from v$instance;

STATUS

------------

MOUNTED

SQL> select a.SWITCHOVER_STATUS from v$database a;

SWITCHOVER_STATUS

--------------------

SESSIONS ACTIVE

日志应用

SELECT SEQUENCE#,APPLIED FROM V$ARCHIVED_LOG ORDER BY SEQUENCE#;

备库执行:

select name from v$archived_log;

主库查看:

SQL> col dest_name format a20

SQL> select dest_name,status,error from v$archive_dest;

在rac某个实例上执行

SQL> create tablespace zhaoja2 datafile size 10m;

Tablespace created.

Rac每个实例上执行

SQL> alter system switch logfile;

System altered.

在standby上确认文件产生

SQL> select name from v$datafile;

2.1.16             Switchover

RAC环境,切换时primary和standby都只能有一个instance活动,其他的instance都必须关闭

(1)       在rac2上执行:

SQL> shutdown immediate;

(2)       在rac1上执行:

SQL> alter database commit to switchover to physical standby with session shutdown;

Database altered.

SQL> shutdown immediate;

ORA-01507: database not mounted

ORACLE instance shut down.

(3)       在standby上执行:

SQL> alter database commit to switchover to primary with session shutdown;

Database altered.

SQL> shutdown immediate

ORA-01109: database not open

Database dismounted.

ORACLE instance shut down.

SQL> startup

(4)       在rac1上创建standby redolog file:

SQL> startup mount;

alter database add standby logfile thread 1 group 5 size 50m;

alter database add standby logfile thread 1 group 6 size 50m;

alter database add standby logfile thread 1 group 7 size 50m;

alter database add standby logfile thread 2 group 8 size 50m;

alter database add standby logfile thread 2 group 9 size 50m;

alter database add standby logfile thread 2 group 10 size 50m;

(5)       开始同步,在rac1执行

SQL> recover managed standby database disconnect from session;

Media recovery complete

(6)       确认同步

在standby上执行:

SQL> create tablespace zhaoja4 datafile size 10m;

create tablespace zhaoja3 datafile size 10m

                                   *

ERROR at line 1:

ORA-02236: invalid file name

SQL> create tablespace zhaoja3 datafile '+DATA/standby/datafile/zhaoja3.dbf' size 10m;

Tablespace created.

SQL> alter system switch logfile;

System altered.

在rac1上查询:

SQL> select name from v$datafile;

NAME

--------------------------------------------------------------------------------

+DATA/rac/datafile/system.256.868180113

+DATA/rac/datafile/undotbs1.258.868180115

+DATA/rac/datafile/sysaux.257.868180115

+DATA/rac/datafile/users.259.868180115

+DATA/rac/datafile/undotbs2.264.868180247

+DATA/rac/datafile/zhaoja.276.868545559

+DATA/rac/datafile/zhaoja2.275.868614513

7 rows selected.

2.1.17             其他命令

关闭同步

SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;

切换日志

SQL> alter system switch logfile;

System altered.

2.2      rac primary和rac standby

最好关闭其中一个,在一个上面操作

2.2.1  配置host

2.2.1.1          Primary rac两个几点的hosts内容如下:

127.0.0.1               localhost

192.168.204.8          rac1

192.168.204.3          rac1-vip

10.10.0.2              rac1-priv

192.168.204.9          rac2

192.168.204.4          rac2-vip

10.10.0.3              rac2-priv

增加:

192.168.204.101         std1

192.168.204.102         std2

192.168.204.103         std1-vip

192.168.204.104         std2-vip

2.2.1.2          Standby rac的两个几点如下:

127.0.0.1               localhost

192.168.204.101         std1

192.168.204.103         std1-vip

10.10.0.11              std1-priv

192.168.204.102         std2

192.168.204.104         std2-vip

10.10.0.12              std2-priv

增加:

192.168.204.8          rac1

192.168.204.9          rac2

192.168.204.3          rac1-vip

192.168.204.4          rac2-vip

2.2.2  修改参数文件

2.2.2.1          Primary参数文件

SQL> show parameter db_unique_name

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

db_unique_name                       string      rac

SQL> ALTER SYSTEM SET service_names=rac scope=both;

SQL> ALTER SYSTEM SET LOG_ARCHIVE_CONFIG='DG_CONFIG=(rac,std)' scope=both;

SQL> ALTER SYSTEM SET db_file_name_convert='+DATA/rac/datafile/','+DATA/std/datafile/','+DATA/rac/tempfile/','+DATA/std/tempfile/' scope=spfile; 

SQL> ALTER SYSTEM SET log_file_name_convert='+RECV/rac/onlinelog','+RECV/std/onlinelog' scope=both;

ERROR at line 1:

ORA-02095: specified initialization parameter cannot be modified

SQL> ALTER SYSTEM SET LOG_ARCHIVE_DEST_1='LOCATION=+RECV/rac/archivelog valid_for=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=rac' scope=both;

SQL> ALTER SYSTEM SET LOG_ARCHIVE_DEST_2='service=std valid_for=(online_logfiles,primary_role) db_unique_name=std' scope=both; 

SQL> ALTER SYSTEM SET standby_file_management=auto scope=both;

SQL> ALTER SYSTEM SET fal_client='rac' scope=both;

SQL> ALTER SYSTEM SET fal_server='std' scope=both;

2.2.2.2          创建目录

mkdir -p /u01/oracle/admin/std/adump

mkdir -p /u01/oracle/admin/std/bdump

mkdir -p /u01/oracle/admin/std/cdump

mkdir -p /u01/oracle/admin/std/dpdump

mkdir -p /u01/oracle/admin/std/hdump

mkdir -p /u01/oracle/admin/std/udump

2.2.2.3          Standby参数文件

2.2.2.4          Primary上创建参数文件,copy到备库

SQL> CREATE PFILE='/u01/oracle/rman_bak/initstd.ora' FROM SPFILE;

[oracle@std rman_bak]$ scp oracle@192.168.204.8:/u01/oracle/rman_bak/initstd.ora ./

2.2.2.5          修改

*.control_files='+data/std/controlfile/Current.260.868180173'

*.log_archive_dest_1='LOCATION=+RECV/std/archivelog valid_for=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=std'

*.log_archive_dest_2='service=std valid_for=(online_logfiles,primary_role) db_unique_name=rac'

*.db_name='rac'

*.db_unique_name='std'

*.service_names='std'

std2.instance_number=2

std1.instance_number=1

*.audit_file_dest='/u01/oracle/admin/std/adump'

*.background_dump_dest='/u01/oracle/admin/std/bdump'

*.core_dump_dest='/u01/oracle/admin/std/cdump'

*.user_dump_dest='/u01/oracle/admin/std/udump'

去掉

rac1.local_listener='LISTENER_RAC1'

rac2.local_listener='LISTENER_RAC2'

*.local_listener='(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.204.8)(PORT = 3173))'

Asm上没有的目录需要手工创建下。

2.2.2.6          在ASM中创建standby的spfile

[oracle@std1 soft]$ export ORACLE_SID=+ASM1

SQL> alter diskgroup data add directory '+data/std';

或者通过 asmcmd -p 进入目录后用mkdir创建

[oracle@std1 soft]$ export ORACLE_SID=std1

[oracle@std1 soft]$ sqlplus / as sysdba

SQL*Plus: Release 10.2.0.4.0 - Production on Wed Jan 14 17:52:14 2015

Copyright (c) 1982, 2007, Oracle.  All Rights Reserved.

Connected to an idle instance.

SQL> create spfile='+DATA/std/spfilestd.ora' from pfile='/u01/oracle/rman_bak/initstd.ora';

2.2.2.7          为两个实例准备pfile

[oracle@std2 ~]$ cd /u01/oracle/product/10.2.0/db_1/dbs

[oracle@std1 dbs]$ echo "spfile='+DATA/std/spfilestd.ora'">initstd1.ora

[oracle@std2 dbs]$ echo "spfile='+DATA/std/spfilestd.ora'">initstd2.ora

2.2.3  为两个实例准备密码文件

[oracle@std1 dbs]$ orapwd file=orapwstd1 password=sys entries=5

[oracle@std2 dbs]$ orapwd file=orapwstd2 password=sys entries=5

2.2.4  备份主库

RMAN>  backup FORMAT  '/u01/oracle/rman_bak/db_%U' database;

RMAN>  backup FORMAT  '/u01/oracle/rman_bak/con_%U' current controlfile for standby;

[oracle@std rman_bak]$ scp oracle@192.168.204.8:/u01/oracle/rman_bak/* ./

2.2.5  创建standby

在PRIMARY的RAC1节点

[oracle@rac1 admin]$ rman target / auxiliary sys/sys@std

RMAN> duplicate target database for standby;

此时备库状态:

节点std1

SQL> select status from v$instance;

STATUS

------------

MOUNTED

注:Standby一个节点为nomount状态,这里我只启动了一个,等恢复完之后,再启动另外一个为mount状态。

2.2.6  创建standby redo log日志

创建原则:日志文件大小相等、日志组数量要多1

主库查询联机日志

[oracle@rac1 admin]$ export ORACLE_SID=rac1

[oracle@rac1 admin]$ sqlplus / as sysdba

SQL*Plus: Release 10.2.0.4.0 - Production on Tue Jan 6 20:54:05 2015

Copyright (c) 1982, 2007, Oracle.  All Rights Reserved.

Connected to:

Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production

With the Partitioning, Real Application Clusters, OLAP, Data Mining

and Real Application Testing options

SQL> SELECT THREAD#,GROUP#,BYTES/1024/1024 FROM V$LOG;

   THREAD#     GROUP# BYTES/1024/1024

---------- ---------- ---------------

         1          1              50

         1          2              50

         2          3              50

         2          4              50

RAC有两个redo thread ,每个thread有两个日志组,每个日志文件大小50MB,所以要针对每个thread需要创建3组standby redo log,大小为50MB。

Standby 库执行:

alter database add standby logfile thread 1 group 5 ('+DATA/std/onlinelog/st_redo_5.rdo') size 50m;

alter database add standby logfile thread 1 group 6 ('+DATA/std/onlinelog/st_redo_6.rdo') size 50m;

alter database add standby logfile thread 1 group 7 ('+DATA/std/onlinelog/st_redo_7.rdo') size 50m;

alter database add standby logfile thread 2 group 8 ('+DATA/std/onlinelog/st_redo_8.rdo') size 50m;

alter database add standby logfile thread 2 group 9 ('+DATA/std/onlinelog/st_redo_9.rdo') size 50m;

alter database add standby logfile thread 2 group 10 ('+DATA/std/onlinelog/st_redo_10.rdo') size 50m;

SQL> select member from v$logfile;

MEMBER

--------------------------------------------------------------------------------

+DATA/rac/onlinelog/group_2.262.868180179

+DATA/rac/onlinelog/group_1.261.868180177

+DATA/rac/onlinelog/group_3.265.868180327

+DATA/rac/onlinelog/group_4.266.868180329

+DATA/standby/onlinelog/st_redo_5.rdo

+DATA/standby/onlinelog/st_redo_6.rdo

+DATA/standby/onlinelog/st_redo_7.rdo

+DATA/standby/onlinelog/st_redo_9.rdo

+DATA/standby/onlinelog/st_redo_10.rdo

+DATA/standby/onlinelog/st_redo_8.rdo

10 rows selected.

2.2.7  把standby rac注册到crs中

因为standby rac不是通过dbca等工具创建,而是手工创建,所以不会自动注册到crs中,需要手工注册,下面操作可以在任何一个节点操作:

2.2.7.1          添加数据库和实例

[oracle@std1 rman_bak]$ srvctl add database -d std -o /u01/oracle/product/10.2.0/db_1/

[oracle@std1 rman_bak]$ srvctl add instance -d std -i std1 -n std1

[oracle@std1 rman_bak]$ srvctl add instance -d std -i std2 -n std2

Usage: srvctl add instance -d <name> -i <inst_name> -n <node_name>

2.2.7.2          指定数据库实例依赖ASM实例

[oracle@std1 rman_bak]$ srvctl modify instance -d std -i std1 -s +ASM1

[oracle@std1 rman_bak]$ srvctl modify instance -d std -i std2 -s +ASM2

如果ASM也需要手工注册???????????????????

[oracle@std1 rman_bak]$ srvctl add asm -n std1 -i +ASM1 -o /u01/oracle/product/10.2.0/db_1/ -p /u01/oracle/product/10.2.0/db_1/dbs/spfile+ASM1.ora

PRKS-1000 : ASM instance "+ASM1" already exists on node "std1"

系统启动时,自动启动ASM

[oracle@std1 rman_bak]$ srvctl enable asm -n std1 -i +ASM1

[oracle@std1 rman_bak]$ srvctl enable asm -n std2 -i +ASM2

2.2.8  在任意一个节点开始恢复,节点状态为mount

SQL> alter database recover managed standby database disconnect from session;

Database altered.

2.2.9  测试

在primary创建一个表空间

SQL> create tablespace zhaoja17 datafile size 10m;

Tablespace created.

SQL> select name from v$datafile;

NAME

--------------------------------------------------------------------------------

+DATA/rac/datafile/system.256.868180113

+DATA/rac/datafile/undotbs1.258.868180115

+DATA/rac/datafile/sysaux.257.868180115

+DATA/rac/datafile/users.259.868180115

+DATA/rac/datafile/undotbs2.264.868180247

+DATA/rac/datafile/zhaoja.276.868545559

+DATA/rac/datafile/zhaoja2.275.868614513

+DATA/rac/datafile/zhaoja3.273.868639251

+DATA/rac/datafile/zhaoja4.277.868785219

+DATA/rac/datafile/zhaoja15.278.869083171

10 rows selected.

执行日志切换

SQL> alter system switch logfile;

System altered.

在standby rac上查看

SQL> select name from v$datafile;

SQL> SELECT PROCESS, STATUS, THREAD#, SEQUENCE#, BLOCK#, BLOCKS FROM V$MANAGED_STANDBY;

日志应用

SELECT SEQUENCE#,APPLIED FROM V$ARCHIVED_LOG ORDER BY SEQUENCE#;

2.2.10             Switchover

3           问题:

3.1      WARNING: DB_FILE_NAME_CONVERT resulted in invalid ASM names; names changed to diskgroup only.

http://docs.oracle.com/cd/E11882_01/backup.112/e10642/rcmtspit.htm#CIHHGCGF

If the DB_FILE_NAME_CONVERT and LOG_FILE_NAME_CONVERT parameters change a substring other than the disk group name, the conversion is ignored and the resulting disk group name is used, for example:

DB_FILE_NAME_CONVERT='+DATAFILE/prod','+DATAFILE/tspitr'

The preceding command results in an invalid ASM OMF file name and the change is ignored. Instead, the files are created in disk group name +DATAFILE and the following message is issued:

WARNING: DB_FILE_NAME_CONVERT resulted in invalid ASM names; names changed to disk group only

3.2      RMAN> duplicate target database for standby;

报错:

restoring datafile 00001 to +DATA

restoring datafile 00002 to +DATA

restoring datafile 00003 to +DATA

restoring datafile 00004 to +DATA

restoring datafile 00005 to +DATA

channel ORA_AUX_DISK_1: reading from backup piece /u01/oracle/rman_bak/db_0hps54f4_1_1

ORA-19870: error reading backup piece /u01/oracle/rman_bak/db_0hps54f4_1_1

ORA-19504: failed to create file "+DATA"

ORA-17502: ksfdcre:4 Failed to create file +DATA

ORA-15001: diskgroup "DATA" does not exist or is not mounted

ORA-15077: could not locate ASM instance serving a required diskgroup

failover to previous backup

错误原因:

进入asm磁盘组,删除已有的文件

[oracle@std dbs]$ export ORACLE_SID=+ASM

[oracle@std dbs]$ asmcmd -p

ASMCMD [+] > ls

DATA/

RECV/

ASMCMD [+] > cd data

ASMCMD [+data] > ls

ASMCMD [+data/standby/datafile] > rm -rf *

3.3      日志未传送

(1)

SQL> select dest_name,status,error from v$archive_dest;

LOG_ARCHIVE_DEST_3   ERROR

ORA-00254: error in archive control string ''

查看错误日志

[oracle@rac1 dbs]$ tail -20 /u01/oracle/admin/rac/bdump/alert_rac1.log

Errors in file /u01/oracle/admin/rac/bdump/rac1_arc1_26523.trc:

ORA-00254: error in archive control string ''

Thu Jan  8 09:05:01 2015

FAL[server, ARC1]: FAL archive failed, see trace file.

Thu Jan  8 09:05:01 2015

Errors in file /u01/oracle/admin/rac/bdump/rac1_arc1_26523.trc:

ORA-16055: FAL request rejected

ARCH: FAL archive failed. Archiver continuing

Thu Jan  8 09:05:01 2015

ORACLE Instance rac1 - Archival Error. Archiver continuing.

Thu Jan  8 09:05:03 2015

Errors in file /u01/oracle/admin/rac/bdump/rac1_arc1_26523.trc:

ORA-00254: error in archive control string ''

FAL[server, ARC1]: FAL archive failed, see trace file.

Thu Jan  8 09:05:03 2015

Errors in file /u01/oracle/admin/rac/bdump/rac1_arc1_26523.trc:

ORA-16055: FAL request rejected

ARCH: FAL archive failed. Archiver continuing

Thu Jan  8 09:05:03 2015

ORACLE Instance rac1 - Archival Error. Archiver continuing.

查看trace文件

[oracle@rac1 dbs]$ tail -20 /u01/oracle/admin/rac/bdump/rac1_arc1_26523.trc

ORA-16055: FAL request rejected

ARCH: Connecting to console port...

ARCH: Connecting to console port...

FAL[server]: Selected inactive destination; resetting temporarily

Redo shipping client performing standby login

*** 2015-01-08 09:05:03.142 66535 kcrr.c

Logged on to standby successfully

Client logon and security negotiation successful!

Error 254 creating standby archive log file at host 'standby'

*** 2015-01-08 09:05:03.172 62692 kcrr.c

ARC1: Attempting destination LOG_ARCHIVE_DEST_3 network reconnect (254)

*** 2015-01-08 09:05:03.172 62692 kcrr.c

ARC1: Destination LOG_ARCHIVE_DEST_3 network reconnect abandoned

ORA-00254: error in archive control string ''

*** 2015-01-08 09:05:03.172 60970 kcrr.c

kcrrfail: dest:3 err:254 force:0 blast:1

kcrrwkx: unknown error:254

ORA-16055: FAL request rejected

ARCH: Connecting to console port...

ARCH: Connecting to console port...

查看错误代码

[oracle@rac1 rman_bak]$ oerr ora 254

00254, 00000, "error in archive control string '%s'"

// *Cause: The specified archive log location is invalid in the archive

//         command or the LOG_ARCHIVE_DEST initialization parameter.

// *Action: Check the archive string used to make sure it refers to a valid

//       online device.

解决办法:

LOG_ARCHIVE_DEST配置的不对,standby的参数文件:service_names未配置

(2)

PING[ARC0]: Heartbeat failed to connect to standby 'std'. Error is 16058

[oracle@rac1 admin]$ oerr ora 16058

16058, 00000, "standby database instance is not mounted"

// *Cause:  The RFS process on the standby database received an internal error.

// *Action: Check the standby alert log and RFS trace files for more

//          information.

查询备库alert日志,发现备库的归档日志目录由于未手工创建,报错,创建目录,正常。

3.4   其他莫名其妙的错误:

如果出现了莫名其妙的错误,绝大多数是某个参数配置错误(参数不合法),验证参数合法性即可。

3.4      日志传送了,但是未应用

SQL> SELECT PROCESS, STATUS, THREAD#, SEQUENCE#, BLOCK#, BLOCKS FROM V$MANAGED_STANDBY;

PROCESS   STATUS          THREAD#  SEQUENCE#     BLOCK#     BLOCKS

--------- ------------ ---------- ---------- ---------- ----------

ARCH      CLOSING               1         42          1         51

ARCH      CLOSING               2         36          1         24

RFS       IDLE                  0          0          0          0

RFS       IDLE                  0          0          0          0

MRP0      WAIT_FOR_GAP          1         38          0          0

这是在等38吗?查看主库38的归档已经被我删了,重新再恢复个standby试试,重新备份恢复standby正常。

Dataguard模式

SQL> select DATABASE_ROLE,PROTECTION_MODE,PROTECTION_LEVEL from v$database;

DATABASE_ROLE    PROTECTION_MODE      PROTECTION_LEVEL

---------------- -------------------- --------------------

PHYSICAL STANDBY MAXIMUM PERFORMANCE  MAXIMUM PERFORMANCE

3.5      删除监听

[oracle@std1 bin]$ ./crs_stop ora.std1.LISTENER_STD1.lsnr

Attempting to stop `ora.std1.LISTENER_STD1.lsnr` on member `std1`

Stop of `ora.std1.LISTENER_STD1.lsnr` on member `std1` succeeded.

[oracle@std1 bin]$ ./crs_unregister ora.std1.LISTENER_STD1.lsnr

[oracle@std1 bin]$ ./crs_unregister ora.std2.LISTENER_STD2.lsnr

3.6      ERROR:ORA-12528: TNS:listener: all appropriate instances are blocking new connections

总结ORA-12528问题是因为监听中的服务使用了动态服务,系统启动后,数据库没有正常的MOUNT,因此在动态模式下,就会出现这个问题,用静态的就不会有这个问题,因此上面的方法就是:

把监听设置为静态

在tnsnames.ora中追加(UR=A)

从启动服务

用静态注册的风险是,如果在instance运行中,lisener重新启动,就找不到instance了。换言之,静态注册需要先启动lisener,再启动instance。而且静态模式下,lisener status显示的是unknown
而且,用动态的话,instance nomount状态下,一般是dba需要进行操作(比如恢复),这个时候一般直接登陆到host进行,不使用tns远程连接

3.7      database name 'RAC' in control file is not

db_name参数设置问题

原文地址:https://www.cnblogs.com/huanhuanang/p/4235245.html