Chinaunix首页 | 论坛 | 博客
  • 博客访问: 650480
  • 博文数量: 168
  • 博客积分: 2928
  • 博客等级: 中校
  • 技术积分: 1904
  • 用 户 组: 普通用户
  • 注册时间: 2010-01-04 09:56
文章分类

全部博文(168)

文章存档

2010年(168)

我的朋友

分类: Oracle

2010-01-19 12:27:24

Oracle 10GR2 DataGuard 实例 收藏
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 ­
­
Data Guard默认是maximize performance, 可以用以下语句来进行模式间的切换。 ­
ALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE {PROTECTION | AVAILABILITY | PERFORMANCE}; ­
修改主数据库保护模式需要重启数据库才能生效。 ­
select protection_mode,protection_level from v$database; ­
­
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 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; ­
­
--------------------------------------------------------------------------- ­
测试 ­
­
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数据库操作
语句非常简单,如下:
SQL> alter database set standby database to maximize availability;
 
数据库已更改。
提示:maximize后可跟{PROTECTION | AVAILABILITY | PERFORMANCE},分别对应最大保护,最高可用性及最高性能。
 
3. Down掉数据库,重新启动
SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup
 
 
 
4、看一下当前的保护模式    --primary数据库操作
 
SQL> select protection_mode,protection_level from v$database;
 
PROTECTION_MODE      PROTECTION_LEVEL
-------------------- --------------------
MAXIMUM AVAILABILITY MAXIMUM AVAILABILITY
 
 
阅读(677) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~