目录 |
基本概念
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上执行:
database recover managed standby database cancel
在PRI上执行:
build
在STD上执行:
database recover 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/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/25618347/viewspace-713875/