zl程序教程

您现在的位置是:首页 >  其它

当前栏目

DG2.1——物理备库搭建

搭建 物理
2023-09-27 14:28:18 时间

原文转自:http://blog.csdn.net/tianlesoftware/article/details/5547565

1、linux平台


Data Guard 环境:

操作系统: redhat 5.5

Primary数据库:

IP地址:211.87.147.69

数据库SID:mynew1

DB_UNIQUE_NAME:mynew1_pd

 

Standby数据库:

IP地址:211.87.147.68

数据库SID:mynew1

DB_UNIQUE_NAME:mynew1_st

 

 

 

一. Primary 端的配置

 

1.  主库设置为force logging 模式

SQL  alter database force logging;

 

2. 主库设为归档模式

SQL  archive log list; 

SQL  shutdown immediate 

SQL  startup mount 

SQL  alter database archivelog; 

SQL  archive log list; 

 

3. 添加redo log file

添加一个新的Standby Redologs组(注意组号不要与当前存在的Online Redologs组重复),并为该组指定一个成员:

SQL  ALTER DATABASE ADD STANDBY LOGFILE GROUP 4 (/u01/app/oracle/oradata/mynew1/redo04.log) size 50M; 

SQL  ALTER DATABASE ADD STANDBY LOGFILE GROUP 5 (/u01/app/oracle/oradata/mynew1/redo05.log) size 50M; 

SQL  ALTER DATABASE ADD STANDBY LOGFILE GROUP 6 (/u01/app/oracle/oradata/mynew1/redo06.log) size 50M; 

SQL  ALTER DATABASE ADD STANDBY LOGFILE GROUP 7 (/u01/app/oracle/oradata/mynew1/redo07.log) size 50M; 


4. 修改listener.ora 和tnsnames.ora 文件

 

Listener.ora 文件:

 

SID_LIST_LISTENER =

  (SID_LIST =

    (SID_DESC =

      (SID_NAME = PLSExtProc)

      (ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1)

      (PROGRAM = extproc)

    )

(SID_DESC =

(GLOBAL_DBNAME = mynew1)

(ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1)

        (SID_NAME = mynew1)  

    )

  )

 

LISTENER =

  (DESCRIPTION_LIST =

    (DESCRIPTION =

      (ADDRESS = (PROTOCOL = TCP)(HOST = localhost.localdomain)(PORT = 1521))

      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))

    )

  )

 

注意:SID_LIST_LISTENER 配置的是静态注册,如果没有该参数,而且Data Guard 启动顺序又不正确,那么在主库可能会报 PING[ARC1]: Heartbeat failed to connect to standby orcl_st. Error is 12514. 错误,导致归档无法完成。

 


Tnsnames.ora 文件:


ORCL_ST =

  (DESCRIPTION =

    (ADDRESS_LIST =

      (ADDRESS = (PROTOCOL = TCP)(HOST = 211.87.147.68)(PORT = 1521))

    )

    (CONNECT_DATA =

(SERVER = DEDICATED)

      (SERVICE_NAME = mynew1)

    )

  )

 

ORCL_PD =

  (DESCRIPTION =

    (ADDRESS_LIST =

      (ADDRESS = (PROTOCOL = TCP)(HOST = 211.87.147.69)(PORT = 1521))

    )

    (CONNECT_DATA =

          (SERVER = DEDICATED)

      (SERVICE_NAME = mynew1)

    )

  )


5. 创建备库的密码文件和控制文件

SQL  alter database create standby controlfile as /u01/app/oracle/control01.ctl;


-- 说明: 判断一个数据库是Primary还是Standby,就是通过控制文件来判断的。


[oracle@localhost dbs]$ orapwd file=/u01/app/oracle/product/10.2.0/db_1/dbs/orapwmynew1 password=liu123

如果已经存在,就不用创建了。 缺省情况下,win下口令文件的格式是pwdsid.ora,unix下的格式是orapwSID(大小写敏感)

 

6. 修改初始化参数文件

SQL  create pfile=/u01/app/oracle/initmynew1.ora from spfile;

 

在initmynew1.ora 添加如下内容:


####主库参数######
*.DB_NAME =mynew1;  ——一般原来参数里有,不需要添加
#--监听中配置的
*.DB_UNIQUE_NAME=mynew1_pd  
#--列出DG中所有DB_UNIQUE_NAME
*.LOG_ARCHIVE_CONFIG=DG_CONFIG=(mynew1_pd,mynew1_st) 
*.LOG_ARCHIVE_DEST_1=LOCATION=/u01/app/oracle/archive VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=mynew1_pd
*.LOG_ARCHIVE_DEST_2=service=mynew1_st DB_UNIQUE_NAME=mynew1_st


*.LOG_ARCHIVE_DEST_STATE_1=ENABLE 
*.LOG_ARCHIVE_DEST_STATE_2=ENABLE 
*.REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE


#####备库参数#######
*.FAL_SERVER=mynew1_st
*.FAL_CLIENT=mynew1_pd
*.standby_file_management=AUTO  
*.standby_archive_dest=/u01/app/oracle/archive
#如果主备库目录不同,还需要添加:
#*.log_file_name_convert=/u02/oradata/orcl/,/u03/oradata/orcl/
#*.db_file_name_convert=/u02/oradata/orcl/,/u03/oradata/orcl/

 -- 注意:mynew1_st   ,     mynew1_pd 是在tnsnames文件中配置的

 

用/u01/app/oracle/initmynew1.ora 这个pfile 启动数据库,并生成spfile。

SQL  shutdown immediate

Database closed.

Database dismounted.

ORACLE instance shut down.

SQL  startup pfile=/u01/app/oracle/initmynew1.ora;

ORACLE instance started.

Total System Global Area  167772160 bytes

Fixed Size                  1218316 bytes

Variable Size              79694068 bytes

Database Buffers           83886080 bytes

Redo Buffers                2973696 bytes

Database mounted.

Database opened.

SQL  create spfile from pfile=/u01/app/oracle/initmynew1.ora;

File created.

 

 

二. Standby 端配置

 

 1. 创建备库存放数据文件和后台跟踪目录, 这个目录可以和主库相同, 如果不同,就需要在主库的初始化文件中进行转换。 

如:

*.log_file_name_convert=/u02/oradata/orcl/,/u03/oradata/orcl/

*.db_file_name_convert=/u02/oradata/orcl/,/u03/oradata/orcl/

 在standby创建如下目录:

   $ORACLE_BASE/ORADATA/mynew1 


   $ORACLE_BASE/admin/mynew1 

   $ORACLE_BASE/admin/mynew1/adump 

   $ORACLE_BASE/admin/mynew1/bdump 

   $ORACLE_BASE/admin/mynew1/cdump 

   $ORACLE_BASE/admin/mynew1/dpdump 

   $ORACLE_BASE/admin/mynew1/pfile 

   $ORACLE_BASE/admin/mynew1/udump 


 

2. 将主库的密码文件,控制文件,数据文件,参数文件,日志文件copy到备库。 

说明一点,这个控制文件是我们自己创建的standby 控制文件。将copy过来的控制文件再复制三份就可以了。  主备的控制文件是不一样的。  这里除了采用直接copy 文件之外,还可以采用Rman 恢复来做。 直接copy 需要停数据库,如果采用RMAN 的话,就不需要停机了。

 

现在进入主库(primary database)执行如下操作:

[oracle@localhost orcl]$ pwd

/u01/app/oracle/oradata/orcl

[oracle@localhost orcl]$ ls

control01.ctl  redo01.log  redo04.log  redo07.log    temp01.dbf

control02.ctl  redo02.log  redo05.log  sysaux01.dbf  undotbs01.dbf

control03.ctl  redo03.log  redo06.log  system01.dbf  users01.dbf

[oracle@localhost mynew1]$ scp *.dbf 211.87.147.68://u01/app/oracle/oradata/mynew1

[oracle@localhost u01]$ scp *.ctl 211.87.147.68://u01/app/oracle/oradata/mynew1

[oracle@localhost mynew1]$ scp *.log 211.87.147.68://u01/app/oracle/oradata/mynew1

[oracle@localhost u01]$ scp initorcl.ora 211.87.147.68://u01/app/oracle/product/10.2.0/db_1/dbs

[oracle@localhost dbs]$ scp orapworcl 211.87.147.68://u01/app/oracle/product/10.2.0/db_1/dbs


可以直接通过scp命令将主库(primary database)的文件复制到备库(standby database) 前提是主库 备库的ip配置正确,对应的目录都存在。

 

3. 修改初始化参数文件


进入备库的dbs目录,把刚刚拷贝过来的initmynew1.ora用vi编辑器打开:

修改之后如下:

####主库参数######
*.DB_NAME =mynew1;
#--监听中配置的
*.DB_UNIQUE_NAME=mynew1_st  
#--列出DG中所有DB_UNIQUE_NAME
*.LOG_ARCHIVE_CONFIG=DG_CONFIG=(mynew1_pd,mynew1_st) 
*.LOG_ARCHIVE_DEST_1=LOCATION=/u01/archive VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=mynew1_st
*.LOG_ARCHIVE_DEST_2=service=mynew1_pd DB_UNIQUE_NAME=mynew1_pd


*.LOG_ARCHIVE_DEST_STATE_1=ENABLE 
*.LOG_ARCHIVE_DEST_STATE_2=ENABLE 
*.REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE


#####备库参数#######
*.FAL_SERVER=mynew1_pd
*.FAL_CLIENT=mynew1_st
*.standby_file_management=AUTO  
*.standby_archive_dest=/u01/archive
#如果主备库目录不同,还需要添加:
#*.log_file_name_convert=/u02/oradata/orcl/,/u03/oradata/orcl/
#*.db_file_name_convert=/u02/oradata/orcl/,/u03/oradata/orcl/

 

4. 修改listener.ora 和 tnsnames.ora 文件,如果不存在,就从主库上copy 过去,不要修改tnsnames.ora。记得吧listener.ora的host地址改成备库的IP地址。

 

5. 在备库添加redo log file

  如果主库没有添加redo log file,可以先用copy 过来的初始化文件将数据库启动到mount 状态。在创建个spfile,最后添加redo log。

SQL  startup mount pfile=/u01/app/oracle/product/10.2.0/db_1/dbs/initmynew1.ora

ORACLE instance started.

SQL  create spfile from pfile=/u01/app/oracle/product/10.2.0/db_1/dbs/initmynew1.ora;

 

添加一个新的Standby Redologs组(注意组号不要与当前存在的Online Redologs组重复),并为该组指定一个成员:

SQL  ALTER DATABASE ADD STANDBY LOGFILE GROUP 4 (/u01/app/oracle/oradata/orcl/redo04.log) size 50M; 

SQL  ALTER DATABASE ADD STANDBY LOGFILE GROUP 5 (/u01/app/oracle/oradata/orcl/redo05.log) size 50M; 

SQL  ALTER DATABASE ADD STANDBY LOGFILE GROUP 6 (/u01/app/oracle/oradata/orcl/redo06.log) size 50M; 

SQL  ALTER DATABASE ADD STANDBY LOGFILE GROUP 7 (/u01/app/oracle/oradata/orcl/redo07.log) size 50M; 

 

提示,由于从Primary数据库复制文件时并没有复制Online Redologs,因此物理Standby数据库在第一次启动REDO应用时,会在Alert文件中报Online Redo Logfile文件不存在,没有关系,物理Standby会自动重建这批文件,同时你也不用担心会丢失数据,Online Redologs中的数据会以归档文件的形式从Primary端接收。

 

 

至此,Data Guard 的操作已经完成,下面来开始验证。

 

 

注意Data Guard 启动顺序:

启动顺序:先standby ,后primary;
       关闭顺序:先primary 后standby;

 

 

在备库将实例启动到mount 状态:

SQL  startup nomount;

SQL alter database mount standby database ; 

SQL ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL; 

SQL alter database recover managed standby database disconnect from session; 

 

在备库启动监听:

$lsnrctl start

 

在主库启动实例:

SQL  startup;

 

在主库启动监听:

$lsnrctl start

 

在主库验证归档目录是否有效:

SQL  SELECT STATUS,DESTINATION, ERROR FROM V$ARCHIVE_DEST;

如果有错误,要排查原因。

 

SQL  alter system switch logfile;

 

SQL  select max(sequence#) from v$archived_log;

 

MAX(SEQUENCE#)

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

            70

 

主备查询结果一致,Data Guard 搭建结束。

 

 

 

注意:如果在主库执行 alter database clear unarchived logfile或alter database open resetlogs , 则dataguard要重建。

 

 在以上操作中,遇到了各种错误,包括tnsping不通,备库无法归档等错误详情处理方法参照博客:


 

 

三. 一些其他操作 

 

1. 首先查看当前的保护模式   ---primary数据库操作

SQL  select protection_mode,protection_level from v$database;

PROTECTION_MODE         PROTECTION_LEVEL

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

MAXIMUM PERFORMANCE     MAXIMUM PERFORMANCE

 

2. 设置新的数据保护模式并重启数据库    --primary数据库操作

 

当保护模式更改顺序:

maximize protection ---   maximize availability ----  maximize performance

当在把dataguard的保护级别按这上面的顺序减低的时候, 不需要primary库在mount状态,否则primary 必须在mount 状态。 

 

如:
SQL   alter database set standby database to maximize availability;

 alter database set standby database to maximize availability

*

ERROR at line 1:

ORA-01126: database must be mounted in this instance and not open in any

instance

 

SQL  shutdown immediate

Database closed.

Database dismounted.

ORACLE instance shut down.

SQL  startup mount;

ORACLE instance started.

 

Total System Global Area  167772160 bytes

Fixed Size                  1218316 bytes

Variable Size              79694068 bytes

Database Buffers           83886080 bytes

Redo Buffers                2973696 bytes

Database mounted.

SQL  alter database set standby database to maximize availability;

Database altered.

SQL  alter database open;

alter database open

*

ERROR at line 1:

ORA-03113: end-of-file on communication channel

 

报错了,这是因为最大可用性需要先修改日志传送方式为lgwr同步方式,否则,数据库是无法open.

 

Maximum protection/AVAILABILITY模式必须满足以下条件

Redo Archival Process: LGWR

Network Tranmission mode: SYNC

Disk Write Option: AFFIRM

Standby Redo Logs: Yes

standby database type: Physical Only

 

SQL  alter system set log_archive_dest_2=service=mynew1_st lgwr sync AFFIRM;

System altered.

SQL  shutdown immediate

Database closed.

Database dismounted.

ORACLE instance shut down.

SQL  startup mount;

ORACLE instance started.

Total System Global Area  167772160 bytes

Fixed Size                  1218316 bytes

Variable Size              79694068 bytes

Database Buffers           83886080 bytes

Redo Buffers                2973696 bytes

Database mounted.

SQL  alter database set standby database to maximize availability;

Database altered.

SQL  alter database open;

Database altered.

SQL  select protection_mode,protection_level from v$database;

PROTECTION_MODE                PROTECTION_LEVEL

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

MAXIMUM AVAILABILITY           MAXIMUM AVAILABILITY

 

 

alter database set standby database to maximize performance;

提示:maximize后可跟{PROTECTION | AVAILABILITY | PERFORMANCE},分别对应最大保护,最高可用性及最高性能。

 

在最大保护模式下,直接关闭备库是不行的,如果在备库上关闭数据库,会有如下提示:
SQL  shutdown immediate
ORA-01154: database busy. Open, close, mount, and dismount not allowed now
SQL
在最大保护模式下,备库是不允许关闭的,此时首先关闭主库,然后备库就可以顺利关闭了。

注意: 主库的保护模式修改之后,备库的模式也会改变,和主库保持一致。 

 

 

3. 查看日志归档情况

 

主库进行日志切换: 

SQL Alter system switch logfile; 

 

select max(sequence#) from v$archived_log; 

select max(sequence#) from v$log_history; 

select group#,sequence#,archived,status from v$log; 

select name,sequence#,applied from v$archived_log; 

select sequence#,applied from v$archived_log; 

 

若不同步, 

1) 看log日志, archive是否有丢失 

2)可以在备库坐如下操作: 

alter database recover managed standby database cancel; 

alter database recover managed standby database disconnect from session; 

 

 

四. 主备库切换 

 

 

4.1 Switchover 

 

一般SWITCHOVER切换都是计划中的切换,特点是在切换后,不会丢失任何的数据,而且这个过程是可逆的,整个DATA GUARD环境不会被破坏,原来DATA GUARD环境中的所有物理和逻辑STANDBY都可以继续工作。

 在进行DATA GUARD的物理STANDBY切换前需要注意: 

1)确认主库和从库间网络连接通畅; 

2)确认没有活动的会话连接在数据库中; 

3)PRIMARY数据库处于打开的状态,STANDBY数据库处于MOUNT状态;

4)确保STANDBY数据库处于ARCHIVELOG模式; 

5)如果设置了REDO应用的延迟,那么将这个设置去掉; 

6)确保配置了主库和从库的初始化参数,使得切换完成后,DATA GUARD机制可以顺利的运行。 ­

 

主库:

1. 查看switchover 状态 

SQL  SELECT SWITCHOVER_STATUS FROM V$DATABASE;

SWITCHOVER_STATUS

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

TO STANDBY

 

附: A:switchover_status出现session active/not allowed 

 

 当出现session active的时候表示还有活动的session,则运行 

 Alter database commit to switchover to physical standby with session shutdown; 

     当出现not allowed时,在官方文档说转换会不成功,但是我测试的时候成功了。 

 

     B.ora- 01153: an incompatible media recovery is active 

        运行下面代码 

        Alter database recover managed standby database finish; 

        或者Alter database recover managed standby database finish force; 

        Alter database recover managed standby database disconnect from session; 

 

2 切换成备库 

SQL Alter database commit to switchover to physical standby with session shutdown; 

或者

SQL  ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY; 

     Database altered. 

 

3 启动到mount和应用日志状态 

SQL  SHUTDOWN IMMEDIATE 

SQL  startup nomount; 

SQL  alter database mount standby database; 

SQL  ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION; 

 

4. 查看数据库模式 

SQL select dest_name,status,database_mode,recovery_mode,protection_mode from v$archive_dest_status; 

SQL select status,database_mode from v$archive_dest_status; 

 

 

备库: 

1.查看switchover状态 

SQL  SELECT SWITCHOVER_STATUS FROM V$DATABASE; 

    TO PRIMARY 

附:若不是用此语句切换:ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY with session shutdown 

 

补充:若出现:ORA-16139: media recovery required

是因为没有执行:alter database recover managed standby database disconnect from session; 

 

2. 切换成主库 

SQL  ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY; 

Database altered. 

SQL  shutdown immediate; 

SQL  startup; 

SQL  alter system switch logfile; 

 

3. 查看数据库模式 

SQL select dest_name,status,database_mode,recovery_mode,protection_mode from v$archive_dest_status; 

SQL select status,database_mode from v$archive_dest_status; 

 

验证同步:

SQL  select max(sequence#) from v$archived_log;

MAX(SEQUENCE#)

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

            78

 

 

 

4.2.  Failovers: 

 

FAILOVER切换一般是PRIMARY数据库发生故障后的切换,这种情况是STANDBY数据库发挥其作用的情况。这种切换发生后,可能会造成数据的丢失。而且这个过程不是可逆的,DATA GUARD环境会被破坏。 

 

由于PRIMARY数据库已经无法启动,所以FAILOVER切换所需的条件并不多,只要检查STANDBY是否运行在最大保护模式下,如果是的话,需要将其置为最大性能模式,否则切换到PRIMARY角色也无法启动。 

 

 

1. 查看是否有日志GAP,没有应用的日志: 

 

    SQL  SELECT UNIQUE THREAD#, MAX(SEQUENCE#) OVER(PARTITION BY THREAD#) LAST FROM V$ARCHIVED_LOG; 

SQL  SELECT THREAD#, LOW_SEQUENCE#, HIGH_SEQUENCE# FROM V$ARCHIVE_GAP; 

 

如果有,则拷贝过来并且注册 

SQL  ALTER DATABASE REGISTER PHYSICAL LOGFILE 路径; 

重复查看直到没有应用的日志: 

 

2. 然后停止应用归档: 

SQL  ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL; 

Database altered. 

 

3. 下面将STANDBY数据库切换为PRIMARY数据库: ­

SQL  ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH; 

或 SQL  ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH FORCE; 

Database altered. 

 

SQL  SELECT DATABASE_ROLE FROM V$DATABASE; 

DATABASE_ROLE 

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

PHYSICAL STANDBY 

 

SQL  ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY; 

Database altered. 

 

    SQL  ALTER DATABASE OPEN; 或者 shutdown immediate+startup 

Database altered. 

 

检查数据库是否已经切换成功: 

 

SQL  SELECT DATABASE_ROLE FROM V$DATABASE; 

DATABASE_ROLE 

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

PRIMARY 

 

至此,FAILOVER切换完成。这个时候应该马上对新的PRIMARY数据库进行备份。




2、windows平台


server A: 10.85.10.44  SID=orcl ­

target server B: 10.85.10.43 ­

oracle version:10.2.0.1 ­

OS platform : windows XP ­


Primary设置: ­

1. 设置主数据库为force logging 模式 ­

SQL sqlplus "/as sysdba" ­

SQL alter database force logging; ­

2. 设置主数据库为归档模式 ­

SQL archive log list ­

SQL shutdown immediate ­

SQL startup mount ­

SQL alter database archivelog; ­

SQL archive log list ­

3. 添加"备用联机日志文件" ­

先查看日志文件位置: ­

SQL select * from v$logfile; ­

在添加: ­

SQL alter database add standby logfile group 4 (D:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/redo04.log) size 50m; ­

SQL alter database add standby logfile group 5 (D:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/redo05.log) size 50m; ­

SQL alter database add standby logfile group 6 (D:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/redo06.log) size 50m; ­

SQL alter database add standby logfile group 7 (D:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/redo07.log) size 50m; ­

4. 创建主库的初始化参数给备库用 ­

SQL Create pfile from spfile; ­

产生的文件名为initorcl.ora 存放目录默认放在$ORACLE_HOME/database下 ­

5. 在主库创建备库的控制文件 和密码文件 ­

SQL Alter database create standby controlfile as D:/oracle/product/10.2.0/control01.ctl; ­

D: orapwd file=D:/PWDorcl.ora password=admin entries=5; ­

 

缺省情况下,win下口令文件的格式是pwdsid.ora,unix下的格式是orapwSID(大小写敏感)


6.  在主库创建监听和配置tnsnams.ora ­

listener.ora配置如下: ­

# listener.ora Network Configuration File: D:/oracle/product/10.2.0/db_1/network/admin/listener.ora­

# Generated by Oracle configuration tools.­

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 = orcl)­

      (ORACLE_HOME = D:/oracle/product/10.2.0/db_1)­

      (SID_NAME = orcl)­

    )­

  )­

LISTENER =­

  (DESCRIPTION_LIST =­

    (DESCRIPTION =­

      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))­

      (ADDRESS = (PROTOCOL = TCP)(HOST = 10.85.3.44)(PORT = 1521))­

    )­

  )­



tnsnames.ora配置如下: ­

# tnsnames.ora Network Configuration File: D:/oracle/product/10.2.0/db_1/network/admin/tnsnames.ora­

# Generated by Oracle configuration tools.­

primary =­

  (DESCRIPTION =­

    (ADDRESS = (PROTOCOL = TCP)(HOST = 10.85.3.44)(PORT = 1521))­

    (CONNECT_DATA =­

      (SERVER = DEDICATED)­

      (SERVICE_NAME = orcl)­

    )­

  )­

standby =­

  (DESCRIPTION =­

    (ADDRESS = (PROTOCOL = TCP)(HOST = 10.85.3.43)(PORT = 1521))­

    (CONNECT_DATA =­

      (SERVER = DEDICATED)­

      (SERVICE_NAME = orcl)­

    )­

  )­

EXTPROC_CONNECTION_DATA =­

  (DESCRIPTION =­

    (ADDRESS_LIST =­

      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))­

    )­

    (CONNECT_DATA =­

      (SID = PLSExtProc)­

      (PRESENTATION = RO)­

    )­

  )­


7. 在initorcl.ora添加以下内容: ­

*.log_archive_format=%T%S%r.ARC ­

*.DB_UNIQUE_NAME=primary ­

*.log_archive_config=DG_CONFIG=(primary,standby) ­

*.log_archive_dest_1=location=D:/oracle/product/10.2.0/oradata/arch VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=primary

*.log_archive_dest_2=SERVICE=standby arch ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=standby ­

*.STANDBY_FILE_MANAGEMENT=AUTO ­

*.LOG_ARCHIVE_DEST_STATE_1=ENABLE ­

*.LOG_ARCHIVE_DEST_STATE_2=ENABLE ­

*.FAL_SERVER=standby ­

*.FAL_CLIENT=primary ­

关闭数据库,在用initorcl.ora重启,并创建spfile文件 ­

SQL startup pfile=$ORACLE_HOME/database/initorcl.ora ­

SQL create spfile from pfile=$ORACLE_HOME/database/initorcl.ora ­



8.­A. 拷贝数据文件,参数文件,控制文件,密码文件到备库上 ­

initorcl.ora参数文件,PWDorcl.ora密码文件考到$ORACLE_HOME/database下的, ­

controlbak.ctl 考到$ORACLE_base/oradata/orcl/下,并分别重命名为control01.ctl,control01.ctl,control01.ctl ­

数据文件考到$ORACLE_base/oradata/orcl/下 ­

B. 用Rman拷贝,不用停机­

$ rman target /­

RMAN backup full format D:/FULL_%d_%T_%s.bak database include current controlfile for standby;­

RMAN sql alter system archive log current;­

RMAN Backup ArchiveLog all format=D:/arch_%d_%T_%s.bak; ­

备份完后将备份文件拷到standby上同样的目录,强调:同样的目录,在standby进行rman 恢复即可­



9. 启动主数据库 ­

SQL startup ­

--------------------------------------------------------------------- ­

Standy操作: ­

1. 用oradim工具创建备库orcl实例 ­

oradim.exe -new -sid orcl -startmode m ­

oradim.exe -edit -sid orcl -startmode a ­

2. 创建备库存放数据文件和后台跟踪目录 ­

   $ORACLE_BASE/ORADATA/ORCL ­

   $ORACLE_BASE/admin/orcl ­

   $ORACLE_BASE/admin/orcl/adump ­

   $ORACLE_BASE/admin/orcl/bdump ­

   $ORACLE_BASE/admin/orcl/cdump ­

   $ORACLE_BASE/admin/orcl/dpdump ­

   $ORACLE_BASE/admin/orcl/pfile ­

   $ORACLE_BASE/admin/orcl/udump ­

   $ORACLE_BASE/admin/orcl/ ­

3. 添加"备用联机日志文件" ­

SQL startup mount ­

先查看日志文件位置: ­

SQL select * from v$logfile; ­

在添加: ­

SQL alter database add standby logfile group 4 (D:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/redo04.log) size 50m; ­

SQL alter database add standby logfile group 5 (D:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/redo05.log) size 50m; ­

SQL alter database add standby logfile group 6 (D:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/redo06.log) size 50m; ­

SQL alter database add standby logfile group 7 (D:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/redo07.log) size 50m; ­

4. 在备库创建监听和配置tnsnams.ora ­

listener.ora配置如下: ­

# listener.ora Network Configuration File: D:/oracle/product/10.2.0/db_1/network/admin/listener.ora­

# Generated by Oracle configuration tools.­

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 = orcl)­

      (ORACLE_HOME = D:/oracle/product/10.2.0/db_1)­

      (SID_NAME = orcl)­

    )­

  )­

LISTENER =­

  (DESCRIPTION_LIST =­

    (DESCRIPTION =­

      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))­

      (ADDRESS = (PROTOCOL = TCP)(HOST = 10.85.3.44)(PORT = 1521))­

    )­

  )­

tnsnames.ora配置如下: ­

# tnsnames.ora Network Configuration File: D:/oracle/product/10.2.0/db_1/network/admin/tnsnames.ora­

# Generated by Oracle configuration tools.­

primary =­

  (DESCRIPTION =­

    (ADDRESS = (PROTOCOL = TCP)(HOST = 10.85.3.44)(PORT = 1521))­

    (CONNECT_DATA =­

      (SERVER = DEDICATED)­

      (SERVICE_NAME = orcl)­

    )­

  )­

standby =­

  (DESCRIPTION =­

    (ADDRESS = (PROTOCOL = TCP)(HOST = 10.85.3.43)(PORT = 1521))­

    (CONNECT_DATA =­

      (SERVER = DEDICATED)­

      (SERVICE_NAME = orcl)­

    )­

  )­

EXTPROC_CONNECTION_DATA =­

  (DESCRIPTION =­

    (ADDRESS_LIST =­

      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))­

    )­

    (CONNECT_DATA =­

      (SID = PLSExtProc)­

      (PRESENTATION = RO)­

    )­

  )­

5. 测试主备之间网络连通 ­

  primary: ­

   C: lsnrctl start ­

   C: tnsping standby ­

standby ­

   C: lsnrctl start ­

   C: tnsping primary ­

6. 配置备库初始化参数 ­

编辑$ORACLE_HOME/database目录下的initorcl.ora添加以下内容 ­

*.log_archive_format=%T%S%r.ARC ­

*.DB_UNIQUE_NAME=standby ­

*.log_archive_config=DG_CONFIG=(primary,standby) ­

*.log_archive_dest_1=location=D:/oracle/product/10.2.0/oradata/arch VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=standby

*.log_archive_dest_2=SERVICE=primary arch ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=primary ­

*.STANDBY_FILE_MANAGEMENT=AUTO ­

*.LOG_ARCHIVE_DEST_STATE_1=ENABLE ­

*.LOG_ARCHIVE_DEST_STATE_2=ENABLE ­

*.FAL_SERVER=primary ­

*.FAL_CLIENT=standby ­

7. 启动备用数据库 ­

C: set ORACLE_SID=orcl ­

SQL sqlplus "/as sysdba" ­

SQL startup nomount pfile=D:/oracle/product/10.2.0/db_1/database/initorcl.ora; ­

SQL create spfile from pfile=D:/oracle/product/10.2.0/db_1/database/initorcl.ora; ­

若采用Rman备份的, 则在此standby 端进行 Rman还原数据库:­

$rman target sys/admin@primary auxiliary /­

RMAN duplicate target database for standby dorecover nofilenamecheck;

SQL alter database mount standby database ; ­

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

--------------------------------------------------------------------------- ­

测试 ­

 

注意Data Guard 启动顺序:

启动顺序:先standby ,后primary;
       关闭顺序:先primary 后standby;

 

 

在备库将实例启动到mount 状态:

SQL  startup nomount;

SQL alter database mount standby database ; 

SQL ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL; 

SQL alter database recover managed standby database disconnect from session; 

 

在备库启动监听:

$lsnrctl start

 

在主库启动实例:

SQL  startup;

 

在主库启动监听:

$lsnrctl start

 

在主库验证归档目录是否有效:

SQL  SELECT STATUS,DESTINATION, ERROR FROM V$ARCHIVE_DEST;

如果有错误,要排查原因。

 

SQL  alter system switch logfile;

 

SQL  select max(sequence#) from v$archived_log;

 

MAX(SEQUENCE#)

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

            70

 

主备查询结果一致,Data Guard 搭建结束。

 

 

1. 测试主库产生的归档日志是否能正常传送到归档日志 ­

主库进行日志切换: ­

SQL Alter system switch logfile; ­

  然后分别查看主库和备库的D:/arch目录下是否产生了同样的归档日志 ­

文件。 ­

select max(sequence#) from v$archived_log; ­

select max(sequence#) from v$log_history; ­

select group#,sequence#,archived,status from v$log; ­

select name,sequence#,applied from v$archived_log; ­

select sequence#,applied from v$archived_log; ­

若不同步, ­

1. 看log日志, archive是否有丢失 ­

2. 可以在备库坐如下操作: ­

alter database recover managed standby database cancel; ­

alter database recover managed standby database disconnect from session; ­

----------------------------------------------------------------------- ­

主备库切换 ­

1. switchover ­

一般SWITCHOVER切换都是计划中的切换,特点是在切换后,不会丢失任何的数据,而且这个过程是可逆的,整个DATA GUARD环境不会被破坏,原来DATA GUARD环境中的所有物理和逻辑STANDBY都可以继续工作。 在进行DATA GUARD的物理STANDBY切换前需要注意: ­

确认主库和从库间网络连接通畅; ­

确认没有活动的会话连接在数据库中; ­

PRIMARY数据库处于打开的状态,STANDBY数据库处于MOUNT状态; ­

确保STANDBY数据库处于ARCHIVELOG模式; ­

如果设置了REDO应用的延迟,那么将这个设置去掉; ­

确保配置了主库和从库的初始化参数,使得切换完成后,DATA GUARD机制可以顺利的运行。 ­

主库: ­

1. 查看switchover 状态 ­

SQL SELECT SWITCHOVER_STATUS FROM V$DATABASE; ­

      to standby ­

附: A:switchover_status出现session active/not allowed ­

        当出现session active的时候表示还有活动的session,则运行 ­

         Alter database commit to switchover to physical standby with session shutdown; ­

      当出现not allowed时,在官方文档说转换会不成功,但是我测试的时候成功了,如果大家在测试不成功的时候再和我说,让我看看在什么情况下会不成功。 ­

   ­

     B.ora- 01153: an incompatible media recovery is active ­

        运行下面代码 ­

        Alter database recover managed standby database finish; ­

        或者Alter database recover managed standby database finish force; ­

        Alter database recover managed standby database disconnect from session; ­

2 切换成备库 ­

SQL Alter database commit to switchover to physical standby with session shutdown; ­

SQL ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY; ­

     Database altered. ­

3 启动到mount和应用日志状态 ­

SQL SHUTDOWN IMMEDIATE ­

SQL startup nomount; ­

SQL alter database mount standby database; ­

SQL ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION; ­

4. 查看数据库模式 ­

SQL select dest_name,status,database_mode,recovery_mode,protection_mode from v$archive_dest_status; ­

SQL select status,database_mode from v$archive_dest_status; ­

备库: ­

1.查看switchover状态 ­

SQL SELECT SWITCHOVER_STATUS FROM V$DATABASE; ­

    TO PRIMARY ­

附:若不是用此语句切换:ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY with session shutdown ­

2. 切换成主库 ­

SQL ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY; ­

Database altered. ­

SQL shutdown immediate; ­

SQL startup; ­

SQL alter system switch logfile; ­

3. 查看数据库模式 ­

SQL select dest_name,status,database_mode,recovery_mode,protection_mode from v$archive_dest_status; ­

SQL select status,database_mode from v$archive_dest_status; ­

注意地方: ­

如果做了switchover,主库参数设置成以下方式,会触发ora-16009错误 ­

Alert system set log_archive_dest_2=’service=primary ­

DB_UNIQUE_NAME=orcl’ scope=spfile; ­

然后再alert_orcl.log 日志中会出现以下错误内容 ­

Thu Nov 27 10:19:12 2008 ­

Redo Shipping Client Connect ­

-- Connected User is Valid ­

RFS[2]: Assigned to RFS process 1292 ­

RFS[2]: Database mount ID mismatch [0x4781d95f:0x47823be1] ­

RFS[2]: Client instance is standby database i ­

RFS[2]: Not using real app ­

Thu Nov 27 10:19Errors in file ­

d:/oracle/product/10.2.0/admin/orcl/udump/orc ­

ORA-16009: 远程归档日 ­

从metalink上查到: ­

* fact: Oracle Server - Enterprise Edition 9 ­

* symptom: Errors appears in alert.log on primary database ­

* symptom: RFS: client instance is standby database instead ­

* symptom: RFS: Not using real application clusters ­

* symptom: Errors appear in alert.log on standby database ­

* symptom: ­

database ­

standby database ­

primary database ­

* symptom: Standby redo log files are defined on the standby database ­

* cause: The standby redo log files are synchronously filled with redo ­

from the primary database. When a logswitch occur on the primary database, ­

those files are archived on the standby database before being applyed on ­

it. The archiving process on the standby database should only archive to ­

the local disks on tprimarfix: ­

Disable the remote archiving on the standby databasExample: alter system set log_archive_dest_2 = ­

是因为没有把standby 上的log_archive_dest_2 清空导致的。 ­

另外也有可 ­

bug 4676659 ­

Standby may not be recognised (ORA-16009) ­

When the log transport is LGWR ASYNC and logical standby has ­

LOG_ARCHIVE_DEST setting VALID_FOR=(ONLINE_LOGFILE, PRIMARY_ROLE) ­

ORA-16009 is reportedregular interWorkaround: ­

There is no workaround to prevent ORA-16009 from appearing in alert logs. ­

2. Failovers: ­

FAILOVER切换一般是PRIMARY数据库发生故障后的切换,这种情况是STANDBY数据库发挥其作用的情况。这种切换发生后,可能会造成数据的丢失。而且这个过程不是可逆的,DATA GUARD环境会被破坏。 ­

由于PRIMARY数据库已经无法启动,所以FAILOVER切换所需的条件并不多,只要检查STANDBY是否运行在最大保护模式下,如果是的话,需要将其置为最大性能模式,否则切换到PRIMARY角色也无法启动。 ­

1.查看是否有日志GAP,没有应用的日志: ­

    SQL SELECT UNIQUE THREAD#, MAX(SEQUENCE#) OVER(PARTITION BY THREAD#) LAST FROM V$ARCHIVED_LOG; ­

SQL SELECT THREAD#, LOW_SEQUENCE#, HIGH_SEQUENCE# FROM V$ARCHIVE_GAP; ­

如果有,则拷贝过来并且注册 ­

SQL ALTER DATABASE REGISTER PHYSICAL LOGFILE 路径; ­

重复查看直到没有应用的日志: ­

2. 然后停止应用归档: ­

SQL ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL; ­

Database altered. ­

3. 下面将STANDBY数据库切换为PRIMARY数据库: ­

SQL ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH; ­

或 SQL ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH FORCE; ­

Database altered. ­

SQL SELECT DATABASE_ROLE FROM V$DATABASE; ­

DATABASE_ROLE ­

---------------- ­

PHYSICAL STANDBY ­

SQL ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY; ­

Database altered. ­

    SQL ALTER DATABASE OPEN; 或者 shutdown immediate+startup ­

Database altered. ­

检查数据库是否已经切换成功: ­

SQL SELECT DATABASE_ROLE FROM V$DATABASE; ­

DATABASE_ROLE ­

---------------- ­

PRIMARY ­

至此,FAILOVER切换完成。这个时候应该马上对新的PRIMARY数据库进行备份。­

 

数据库模式查看:

 

1. 首先查看当前的保护模式   ---primary数据库操作

SQL  select protection_mode,protection_level from v$database;

PROTECTION_MODE      PROTECTION_LEVEL

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

MAXIMUM PERFORMANCE  MAXIMUM PERFORMANCE

 

2. 设置新的数据保护模式并重启数据库    --primary数据库操作

 

当保护模式更改顺序:

maximize protection ---   maximize availability ----  maximize performance

当在把dataguard的保护级别按这上面的顺序减低的时候, 不需要primary库在mount状态,否则primary 必须在mount 状态。 

 

如:
SQL   alter database set standby database to maximize availability;

 alter database set standby database to maximize availability

*

ERROR at line 1:

ORA-01126: database must be mounted in this instance and not open in any

instance

 

SQL  shutdown immediate

Database closed.

Database dismounted.

ORACLE instance shut down.

SQL  startup mount;

ORACLE instance started.

 

Total System Global Area  167772160 bytes

Fixed Size                  1218316 bytes

Variable Size              79694068 bytes

Database Buffers           83886080 bytes

Redo Buffers                2973696 bytes

Database mounted.

SQL  alter database set standby database to maximize availability;

Database altered.

SQL  alter database open;

alter database open

*

ERROR at line 1:

ORA-03113: end-of-file on communication channel

 

报错了,这是因为最大可用性需要先修改日志传送方式为lgwr同步方式,否则,数据库是无法open.

 

Maximum protection/AVAILABILITY模式必须满足以下条件

Redo Archival Process: LGWR

Network Tranmission mode: SYNC

Disk Write Option: AFFIRM

Standby Redo Logs: Yes

standby database type: Physical Only

 

SQL  alter system set log_archive_dest_2=service=orcl_st lgwr sync AFFIRM;

System altered.

SQL  shutdown immediate

Database closed.

Database dismounted.

ORACLE instance shut down.

SQL  startup mount;

ORACLE instance started.

Total System Global Area  167772160 bytes

Fixed Size                  1218316 bytes

Variable Size              79694068 bytes

Database Buffers           83886080 bytes

Redo Buffers                2973696 bytes

Database mounted.

SQL  alter database set standby database to maximize availability;

Database altered.

SQL  alter database open;

Database altered.

SQL  select protection_mode,protection_level from v$database;

PROTECTION_MODE      PROTECTION_LEVEL

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

MAXIMUM AVAILABILITY MAXIMUM AVAILABILITY

 

 

alter database set standby database to maximize performance;

提示:maximize后可跟{PROTECTION | AVAILABILITY | PERFORMANCE},分别对应最大保护,最高可用性及最高性能。

 

在最大保护模式下,直接关闭备库是不行的,如果在备库上关闭数据库,会有如下提示:
SQL  shutdown immediate
ORA-01154: database busy. Open, close, mount, and dismount not allowed now
SQL
在最大保护模式下,备库是不允许关闭的,此时首先关闭主库,然后备库就可以顺利关闭了。

注意: 主库的保护模式修改之后,备库的模式也会改变,和主库保持一致。