ITPub博客

首页 > Linux操作系统 > Linux操作系统 > DG建立及配置

DG建立及配置

原创 Linux操作系统 作者:skuary 时间:2011-04-12 16:44:32 0 删除 编辑

目录

基本概念

Dataguard 直译过来就是数据卫士,它希望起到的主要作用就是保护数据。它如何保护数据呢,就是把受保护的数据放一份在另一台服务器上,通过对主服务器上事务日志的处理,接近实时的和受保护服务器上的数据库保持同步状态。最基本的Dataguard结构中至少需要2台服务器,在正常运行时,一台做主机角色(primary role),另一台充当备机角色(standby role)。主机角色响应应用发出的请求,提供完整的数据库服务。而备机通过几种不同的模式和主机存储的数据保持同步状态。必要时2台服务器可以随时进行角色的转换,这样在主机不可用的情况下,备机可以充当主机的作用,继续提供数据库服务,做到了数据库的不间断服务。在最极端的情况下,一台主机角色可以和8个备机角色共同组成一个dataguard。

Dataguard按照保护模式区分有三种工作模式:最大保护、最大可用、最大性能,其中最大性能模式对主机性能的影响最小,但安全性最差。

此外,根据同步处理方式的不同进行区分,dataguard又可以分为物理逻辑两种。其中物理方式的dataguard能提供最安全的数据保护,但备机平时需要处在待命和不可用的状态。

准备阶段

规划dataguard架构中的primary host(以下简称PRI)和standby host(以下简称STD)角色,按照不同角色分别设置。

为主机和备机各准备一个名称,该名称在dataguard中不同角色间通讯时使用。例如下面为fifa项目中主机角色取名为fifapri,备机角色取名为fifastd,下面注意这两个名称所用的位置。

打通pri和std

编辑所有dg角色主机的tnsnames.ora,使pri和std之间能够互通;例:

fifapri =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 10.100.20.68)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = fifadb)
    )
  )
fifastd =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 10.100.20.69)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = fifadb)
    )
  )

检查方法:

[oracle@db1]tnsping fifapri
[oracle@db1]tnsping fifastd

设置PRI FORCE LOGGING enable

操作:

Sql> conn / as sysdba;
Sql> alter database force logging;

检查方法:

Sql> select force_logging from v$database;

创建PRI的口令文件

[oracle@db1]cd $ORACLE_HOME/dbs/
[oracle@db1]orapwd file=orapwfifadb password=syspass

为PRI添加standby logfile

Sql> ALTER DATABASE ADD STANDBY LOGFILE
  group 11 ('/opt/oracle/oradata/fifadb/system/stdrdo01a.log','/opt/oracle/oradata/fifadb/system/stdrdo01b.log') size 50M,
  group 12 ('/opt/oracle/oradata/fifadb/system/stdrdo02a.log','/opt/oracle/oradata/fifadb/system/stdrdo02b.log') size 50M,
  group 13 ('/opt/oracle/oradata/fifadb/system/stdrdo03a.log','/opt/oracle/oradata/fifadb/system/stdrdo03b.log') size 50M,
  group 14 ('/opt/oracle/oradata/fifadb/system/stdrdo04a.log','/opt/oracle/oradata/fifadb/system/stdrdo04b.log') size 50M,
  group 15 ('/opt/oracle/oradata/fifadb/system/stdrdo05a.log','/opt/oracle/oradata/fifadb/system/stdrdo05b.log') size 50M,
  group 16 ('/opt/oracle/oradata/fifadb/system/stdrdo06a.log','/opt/oracle/oradata/fifadb/system/stdrdo06b.log') size 50M,
  group 17 ('/opt/oracle/oradata/fifadb/system/stdrdo07a.log','/opt/oracle/oradata/fifadb/system/stdrdo07b.log') size 50M,
  group 18 ('/opt/oracle/oradata/fifadb/system/stdrdo08a.log','/opt/oracle/oradata/fifadb/system/stdrdo08b.log') size 50M,
  group 19 ('/opt/oracle/oradata/fifadb/system/stdrdo09a.log','/opt/oracle/oradata/fifadb/system/stdrdo09b.log') size 50M,
  group 20 ('/opt/oracle/oradata/fifadb/system/stdrdo10a.log','/opt/oracle/oradata/fifadb/system/stdrdo10b.log') size 50M,
  group 21 ('/opt/oracle/oradata/fifadb/system/stdrdo11a.log','/opt/oracle/oradata/fifadb/system/stdrdo11b.log') size 50M;

检查方法:

Sql> select group#,thread#,sequence#,archived,status from v$standby_log;

修改PRI数据库的初始参数

先创建pfile

Sql>create pfile from spfile;

然后向pfile文件中添加参数

#PRI数据库的全局唯一名
*.global_names=TRUE
*.db_unique_name='fifapri'
#dataguard主机角色列表
*.LOG_ARCHIVE_CONFIG='DG_CONFIG=(fifapri,fifastd)'
#本地归档日志
*.LOG_ARCHIVE_DEST_1='LOCATION=/opt/oracle/oradata/fifadb/arch VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=fifapri'
#远程归档推送端口
*.log_archive_dest_2='SERVICE=fifastd ARCH ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=fifastd'
#standby模式下的中继归档路径
*.LOG_ARCHIVE_DEST_3='LOCATION=/opt/oracle/oradata/fifadb/arch2 VALID_FOR=(STANDBY_LOGFILES,STANDBY_ROLE) DB_UNIQUE_NAME=fifapri’

*.LOG_ARCHIVE_DEST_STATE_1=ENABLE
*.LOG_ARCHIVE_DEST_STATE_2=ENABLE
*.LOG_ARCHIVE_DEST_STATE_3=ENABLE
*.FAL_SERVER=fifastd
*.FAL_CLIENT=fifapri

PRI的设置参数生效和搬迁数据

打开PRI的归档模式并使参数的修改生效

SQL> shutdown immediate;
SQL> startup nomount pfile =${ORACLE_HOME}/dbs/init${ORACLE_SID}.ora;
SQL> create spfile from pfile;
SQL> shutdown immediate;
SQL> startup mount;
SQL> alter database archivelog;

创建standby control file

SQL> alter database create standby controlfile as '/opt/oracle/oradata/fifadb/system/std.ctl';
SQL> shutdown immediate; 

复制文件

从PRI复制以下文件到STD相应位置

  • 全部数据文件
  • 口令文件
  • 上述第6步创建的控制文件

注:数据文件可以通过以上方式直接复制,也可以通过RMAN将数据库完整备份后在STD进行恢复;

注意:如果通过不同身份如root用户将文件复制到STD后,可能会改变STD上文件的所有者为root,复制完成后一定要注意将文件所有者修改为oracle

[root@db2]chown -R oracle.dba $ORACLE_BASE/oradata
[root@db2]chown -R oracle.dba $ORACLE_BASE/admin/$ORACLE_SID/orapwfifadb

\t 以上三种文件复制完成后即可启动PRI:

SQL> STARTUP;

设置STD并启用物理模式DG

设置std数据库的初始参数

类似PRI,但需要注意数据库名及角色的修改替换

#STD数据库的全局唯一名
*.global_names=TRUE 
*.db_unique_name='fifastd'
#dataguard主机角色列表
*.LOG_ARCHIVE_CONFIG='DG_CONFIG=(fifapri,fifastd)'
#本地归档日志
*.LOG_ARCHIVE_DEST_1='LOCATION=/opt/oracle/oradata/fifadb/arch VALID_FOR=(online_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=fifastd'
#远程归档推送端口:注意下面的 ARCH ASYNC,这里指定了DG的工作模式为归档日志和异步,即主机性能开销最小的方式
*.log_archive_dest_2='SERVICE=fifapri ARCH ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=fifapri'
#standby模式下的中继归档路径
*.LOG_ARCHIVE_DEST_3='LOCATION=/opt/oracle/oradata/fifadb/arch2 VALID_FOR=(STANDBY_LOGFILES,STANDBY_ROLE) DB_UNIQUE_NAME=fifastd'
*.LOG_ARCHIVE_DEST_STATE_1=ENABLE
*.LOG_ARCHIVE_DEST_STATE_2=ENABLE
*.LOG_ARCHIVE_DEST_STATE_3=ENABLE
*.FAL_SERVER=fifapri
*.FAL_CLIENT=fifastd

替换STD上的所有控制文件为上述第6步产生的std.ctl;

[oracle@db2]cp std.crl system/control1.ctl
[oracle@db2]cp std.crl system/control2.ctl

mount std

SQL> startup nomount pfile =${oracle_home}/dbs/init${oracle_sid}.ora;
SQL> create spfile from pfile;
SQL> alter database mount standby database;
SQL> alter database recover managed standby database disconnect from session;

可选下面的同步立即生效模式:

SQL> alter database recover managed standby database using current logfile disconnect from session;

ARCHIVE LOG LIST;

#切换到readonly模式观察同步的状况
SQL> alter database recover managed standby database cancel;
SQL> alter database open read only;

到此,DG物理模式创建完成!

切换DG物理模式到逻辑模式

角色切换测试

需要注意的是,一旦切换到逻辑模式后,oracle将不再支持主备机间的角色切换。

因此在切换前务必保证物理DG的模式安装完成,或先进行角色切换的测试,切换手段是下面这样:

Physical Standby switchover:

In Primary Database:

SQL> alter database commit to switchover to physical standby;
SQL> shutdown immediate;
SQL> startup nomount;
SQL> alter database mount standby database;

In standby Database:

SQL> alter database commit to switchover to primary;
SQL> shutdown immediate;
SQL> startup;

In Primary Database:

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

If the primary Database is down,we can use fllowing step to active standby database:

SQL> alter database recover managed standby database finish;
SQL> alter database commit to switchover to primary;
SQL> shutdown immediate;
SQL> startup;

在PRI上注意检查是否存在不支持逻辑模式的用户表

SQL> select owner, table_name from dba_logstdby_not_unique
  where (owner, table_name) not in
  (select distinct owner, table_name from dba_logstdby_unsupported)
  and bad_column = 'y';

如果只有系统表,可以忽略

切换到logical standby

在STD上执行:

ALTER database recover managed standby database cancel;

在PRI上执行:

EXECUTE DBMS_LOGSTDBY.build;

在STD上执行:

ALTER database recover TO logical standby fifadb;

在STD上创建新的口令文件

可选:如果主机名被修改的话才需要进行这一步

[oracle@db2]orapwd file=orapwfifastd password=sys

重启动STD,并打开logic standby apply

SQL> shutdown;
SQL> startup mount;
SQL> alter database open resetlogs;
SQL> alter database start logical standby apply immediate;

如果成功的话应该可以看到以下查询有输出结果:

SQL> select * from v$logstdby_process;

杂项(有待整理)

切换pri上的archive log

用以观察std的同步情况

SQL> alter system switch logfile

archive log list;

暂停logic standby apply

SQL> alter database stop logical standby apply;

恢复logic standby apply

SQL> alter database start logical standby apply immediate;

跳过对象同步

以跳过perfstat为例(把这个换成其它对象名就能跳过相应对象的同步)

SQL> alter database stop logical standby apply;
SQL> execute dbms_logstdby.skip (stmt => 'dml',schema_name => 'PERFSTAT', object_name => '%');
SQL> execute dbms_logstdby.skip (stmt => 'schema_ddl',schema_name => 'PERFSTAT', object_name => '%');
SQL> alter database start logical standby apply immediate;

一些参数优化

SQL> alter database stop logical standby apply;
SQL> alter system set shared_pool_size=768M scope=both;
SQL> alter system set parallel_max_servers=32 scope = both;
SQL> execute dbms_logstdby.apply_set('max_sga', 512);
SQL> execute dbms_logstdby.apply_set('prepare_servers', 4);
SQL> execute dbms_logstdby.apply_set('apply_servers', 4);
SQL> alter database start logical standby apply immediate;

备机执行statspack

以下需要有alter database的权限

sqlplus -s "/ as sysdba" << eof
alter session disable guard;
exec statspack.snap;
alter session enable guard;

备机安装statspack

关于logical standby服务器上不那么和谐需要点技巧的perfstat安装问题

[oracle@db2]cd $ORACLE_HOME/rdbms/admin
[oracle@db2]sqlplus “/ as sysdba”
Sql>@spdrop.sql
Sql>host
vi  spcusr.sql

找到grant XXX to perfstat附近,ADD:

grant alter session to perfstat;
grant alter database to perfstat;

编辑spctab.sql,在第一行ADD

alter session disable guard;

编辑spcpkg.sql,在第一行ADD

alter session disable guard;

然后执行

sql> @spcreate.sql

调整dataguard工作模式

STD:

Sql> alter database stop logical standby apply;

PRI:

Sql> alter system set log_archive_dest_2='SERVICE=fifastd LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=fifastd' scope=both;

STD:

Sql> alter database start logical standby apply immediate;


常用维护命令收集

Start Standby Database

startup nomount
alter database mount standby database;
alter database recover managed standby database disconnect;

Disable/Enable archive log destinations

alter system set log_archive_dest_state_2 = 'defer';
alter system set log_archive_dest_state_2 = 'enable';

To remove a delay from a standby

alter database recover managed standby database cancel;
alter database recover managed standby database nodelay disconnect;

Stop and Start of Logical standby apply

alter database stop logical standby apply;
alter database start logical standby apply;

Register missing archive log file Find archive log gap by query:

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

register using:

ALTER DATABASE REGISTER PHYSICAL LOGFILE 'filespec1';

严格说起来,似乎密码文件也不是必须的,但是要保证主备机的sys密码一致,所以copy密码文件不失为一种最简单的方法。

如果发现alertlog中有类似

Errors in file /opt/oracle/admin/fifadb/bdump/fifadb_arc0_31591.trc:
ORA-01031: insufficient privileges
PING[ARC0]: Heartbeat failed to connect to standby 'fifastd'. Error is 1031.

这样的错误,说明两边sys密码不一致,直接在oracle中修改密码并重启数据库即可。

如果DataGuard同步不能

可以参见DG的重建

关于监控

常规监控视图:

  • DBA_LOGSTDBY_EVENTS 可以查看发生的一些特殊事件
  • DBA_LOGSTDBY_LOG 可以查看DG操作到那个日志了最后工作的时间
  • V$LOGSTDBY_PROCESS 可以查看DG的进程
  • V$LOGSTDBY_PROGRESS 可以查看DG操作到那个SCN号即最后工作的时间
  • V$LOGSTDBY_STATE 可以查看LOGMINER使用的SESSION
  • V$LOGSTDBY_STATS 可以看到DG的性能
  • V$DATAGUARD_STATS 可以查看未应用日志的应用时间

一些监控脚本:

select 'APPLIER' as DG_proc,sum(decode(type,'APPLIER',1,0)) as cnt from  V$LOGSTDBY_PROCESS ;
SELECT restart_time,mining_time,latest_time,applied_time FROM v$LOGSTDBY_PROGRESS;


观察V$LOGSTDBY_STATS 中以下数值的变化:

select value from v$logstdby_stats where name like 'bytes of redo processed';
select name,value from v$logstdby_stats where name like 'transactions%';

观察DBA_LOGSTDBY_LOG 中的时间和数值变化:

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/25618347/viewspace-713875/,如需转载,请注明出处,否则将追究法律责任。

上一篇: DG的重建
下一篇: CCU迁移
请登录后发表评论 登录
全部评论

注册时间:2011-03-31

  • 博文量
    88
  • 访问量
    316994