概念介绍:
前身是8i的standby数据库。是一种时时热备策略。
主库的redo条目时时发送到备库上,备库不断恢复主库的rendo和归档条目。备库最多和主库差一个redo文件。主库必须是归档的!
管理恢复进程:不断扫描备库redo条目的变化信息,有新的就应用。
DG核心是将redo传送到备份节点:归档参数有10个可用,启动第二归档路径设置在远程。主要在第二归档路径的设置上。
两种结构:
物理:备库只能在mount模式下做数据同步,打开模式(read only)下只能查看数据。
逻辑:可以打开,但是对对象要求比较严格(不能有大对象,支持较少的基础标量),对业务有分流的作用。
三种数据保护模式:
最大性能的物理standby:是所有保护模式的基础。主库唯一的负担就是多一个归档,备库应用归档不是时时的。互不影响,是归档文件级别的。主备有可能差成千上万的redo条目。数据传输不频繁,但是数据量大
最高可用:主备相差数据非常少,用redo条目级别同步。最多差几个redo条目。数据传输频繁,数据量小。
最大保护:主库产生redo传送过去,备库立即应用,成功后返回一个写入成功,主库收到消息之后才将buffer中的脏块写入磁盘,没有收到成功消息的话主库就不写入文件。牺牲了双倍的带宽,影响主库性能。等待双倍的IO换来一个数据块的写。(应用极少,太影响性能!)
所有模式的基础就是:最大性能的物理standby。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1.主库必须是归档:
racdb1 : shutdown immediate
racdb2 : shutdown immediate
--在其中任何一个实例上:
racdb1 : startup mount
racdb1 : alter database archivelog;
racdb1 : alter database open;
racdb2 : startup
col name for a65
select sequence#,thread#,name from v$archived_log;
2.主库要打开日志增强:
数据库日志增强模式之后,则之后 /*+ nologging */模式的insert就失效了!
alter database force logging;
SQL> select force_logging from v$database;
FOR
---
YES
3.为备库准备联机:(最大性能的standby不用,为了以后切换模式的时候准备)
由于备库性能不太好,要为redo准备出多几个日志组缓存数据.在主库中,因为将来要将控制文件拷贝到备库中,主要就是用的控制文件中的指针.
SQL> select GROUP#,THREAD#,SEQUENCE#,STATUS from v$log;
GROUP# THREAD# SEQUENCE# STATUS
---------- ---------- ---------- ----------------
1 1 12 INACTIVE
2 1 13 CURRENT
3 2 11 INACTIVE
4 2 12 CURRENT
alter database add standby logfile group 5;
alter database add standby logfile group 6;
alter database add standby logfile group 7;
SQL> select member from v$logfile;
MEMBER
--------------------------------------------------------------------------------
+DGA/racdb/onlinelog/group_2.265.740157863
+DGA/racdb/onlinelog/group_2.264.740157865
+DGA/racdb/onlinelog/group_1.269.740157859
+DGA/racdb/onlinelog/group_1.268.740157859
+DGA/racdb/onlinelog/group_3.267.740158235
+DGA/racdb/onlinelog/group_3.259.740158235
+DGA/racdb/onlinelog/group_4.257.740158237
+DGA/racdb/onlinelog/group_4.258.740158237
+DGA/racdb/onlinelog/group_5.293.740316119
+DGA/racdb/onlinelog/group_5.294.740316129
+DGA/racdb/onlinelog/group_6.295.740316157
+DGA/racdb/onlinelog/group_6.296.740316167
+DGA/racdb/onlinelog/group_7.297.740316197
+DGA/racdb/onlinelog/group_7.298.740316207
14 rows selected.
SQL> select GROUP#,THREAD#,SEQUENCE#,STATUS from v$log;
GROUP# THREAD# SEQUENCE# STATUS
---------- ---------- ---------- ----------------
1 1 12 INACTIVE
2 1 13 CURRENT
3 2 11 INACTIVE
4 2 12 CURRENT
4.修改主库参数文件:racdb1
--分别为主从数据库的db_unique_name
alter system set log_archive_config='dg_config=(racdb,auxdb1)'
SQL> show parameter log_archive_config
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
log_archive_config string dg_config=(racdb,auxdb1)
------参数简介-----------------------
db_unique_name 别名,用来区分主从数据库
remote_login_passwordfile= none忽略口令文件检查,EXCLUSIVE只有当前实例可以使用该口令文件但超级用户可以是多个,
SHARED多个实例可以共享口令文件但超级用户只能是SYS
log_archive_config='dg_config=(ORA10,STANDBY)' 允许发送和接收远程redo logs,参数值是DB_UNIQUE_NAME
log_archive_dest_1='location=G:\oracle\oradata\ORA10\archive VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=ORA10'
--VALID_FOR=(redo_log_type, database_role)
--默认值VALID_FOR=(ALL_LOGFILES, ALL_ROLES)
log_archive_dest_2='service=STANDBY VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=ORA10'
standby_archive_dest= 只与备库管理恢复模式有关
standby_file_management={ MANUAL | AUTO } 主库有增加和减少物理文件的动作是否应用到备用数据库当中
----------------------------------------
fal_client='STANDBY' (Fetch Archive Log)
fal_server='PRIMARY'
这两个参数不加也能够追加断档的日志
----------------------------------------
----------------------------------------
log_archive_dest_2='service=STANDBY LGWR ASYNC=20480 VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=ORA10'
ARCH/LGWR 默认使用ARCH模式传送,即归档日志级别传送redo,最大可用和最大保护模式需要 LGWR模式传送,即语句级传送redo条目,需要
建立备库的online redolog并且要使用日志的实时应用模式即LGWR SYNC AFFIM
SYNC/ASYNC 网络I/O操作方式,SYNC是实时模式,ASYNC异步模式,ASYNC=0 ~ 102400 blocks,异步是现存储在本地到达条件之后再传送
AFFIM/NOAFFIM 磁盘I/O模式(数据写模式),AFFIM同步并且发送成功写操作到主库;NOAFFIM主库无需等待备库日志写成功与否
--第一归档路径
alter system set log_archive_dest_1='location=+DGA VALID_FOR=(ONLINE_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=racdb';
location=如果是asm磁盘的话要写盘组的路径--
SQL> show parameter db_create
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_create_file_dest string +DGA
ONLINE_LOGFILES:是够是归档
ALL_ROLES:身份是任何的时候都产生归档
DB_UNIQUE_NAME=racdb --db_unique_name
--第二归档路径(STANDBY网络连接标识符)
alter system set log_archive_dest_2='service=auxdb1 VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=auxdb1';
service=:当前实例连接到远程数据库的服务命名,@之后键入的东西
PRIMARY_ROLE:身份是parameter才产生体制
DB_UNIQUE_NAME=远程数据库的名称
--增加归档进程数量
alter system set log_archive_max_processes=4;
--准备路径:racdb1
mkdir -p /u01/app/oracle/admin/auxdb1/adump
mkdir -p /u01/app/oracle/admin/auxdb1/bdump
mkdir -p /u01/app/oracle/admin/auxdb1/cdump
mkdir -p /u01/app/oracle/admin/auxdb1/udump
mkdir -p /u01/app/oracle/oradata/auxdb1
mkdir -p /home/oracle/arclog
mkdir -p /home/oracle/arcstd
mkdir -p /home/oracle/rmanbk
racdb2 :
mkdir -p /home/oracle/rmanbk
5.准备standby数据库的参数文件:
-----------------initauxdb1.ora-----------------------------------
*.audit_file_dest='/u01/app/oracle/admin/auxdb1/adump'
*.background_dump_dest='/u01/app/oracle/admin/auxdb1/bdump'
*.core_dump_dest='/u01/app/oracle/admin/auxdb1/cdump'
*.user_dump_dest='/u01/app/oracle/admin/auxdb1/udump'
*.compatible='10.2.0.1.0'
*.db_name=racdb ---一定是和主库一致
*.db_unique_name='auxdb1' --区分两个数据库的别名
*.control_files='/u01/app/oracle/oradata/auxdb1/control01.ctl'
*.REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE --远程的验证模式,使用口令文件
*.db_block_size=8192
*.sga_target=160m
*.pga_aggregate_target=20m
*.undo_management='AUTO'
*.undo_tablespace='UNDOTBS1'
*.standby_file_management='AUTO'
*.log_archive_config='dg_config=(racdb,auxdb1)'
*.log_archive_dest_1='location=/home/oracle/arclog/ VALID_FOR=(ONLINE_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=auxdb1'
*.LOG_ARCHIVE_DEST_2='SERVICE=racdb VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=racdb'
*.standby_archive_dest='/home/oracle/arcstd' ---在备库里要有,管理恢复进程在使用.主库传送过来的归档文件存放到这个路径下.
DB_FILE_NAME_CONVERT=('+DG1/racdb/datafile/','/u01/app/oracle/oradata/auxdb1/','+DG1/racdb/tempfile/','/u01/app/oracle/oradata/auxdb1/') --主库和从库的存放文件位置不一样的时候,做转换的时候使用.有多少个不同的路径,就要做多少对转换,一主一备.
LOG_FILE_NAME_CONVERT=('+DG1/racdb/onlinelog/','/u01/app/oracle/oradata/auxdb1/') --联机日志也要转换一下
由于从库是mount状态,则*.log_archive_dest_1和*.LOG_ARCHIVE_DEST_2参数是不生效的,这两个参数是为了将在切换的时候.
6.准备standby的口令文件:
scp 主库的口令文件并改名.
7.启动standby节点的实例.
8.配置主备数据库的网络,要求能互联.
如果网络配置不通的话,则将监听配置成静态的(手工将信息写入到文件中).
9.备份主数据库
配置rman参数:
racdb1 :
CONFIGURE channel device type disk format '/home/oracle/rmanbk/%d_%I_%s_%p_%T.bkp';
备份数据库:
backup as compressed backupset database include current controlfile FOR STANDBY;
如果两个实例的归档路径不一样,则要启动两个通道分别备份归档.:
run
{
allocate channel c1 device type disk format '/home/oracle/rmanbk/%d_%I_%e.bkp' connect sys/oracle@racdb1;
allocate channel c2 device type disk format '/home/oracle/rmanbk/%d_%I_%e.bkp' connect sys/oracle@racdb2;
backup archivelog all;
}
如果都在asm上则不用这么备份:
backup archivelog all;
将生成的备份片scp到standby到备库:
在启动rman同时连接目标与辅助数据库:(在主库和备库都行)
因为主库中有备份片中控制文件信息.
rman target / auxiliary sys/oracle@auxdb1 (在主库启动)
还原备份文件:
run
{
allocate channel c1 device type disk format '/home/oracle/rmanbk/%d_%I_%e.bkp' connect sys/oracle@racdb1;
allocate channel c2 device type disk format '/home/oracle/rmanbk/%d_%I_%e.bkp' connect sys/oracle@racdb2;
allocate auxiliary channel ac1 device type disk format '/home/oracle/rmanbk/%d_%I_%e.bkp'; -还原归档
allocate auxiliary channel ac2 device type disk format '/home/oracle/rmanbk/%d_%I_%e.bkp';
duplicate target database for standby; ---还原数据文件
}
如果报错则:
duplicate target database for standby nofilenamecheck;
命令成功之后数据库自动装载(mount)
在主生产库中教验归档终点是否有问题:
col dest_name for a20
col error for a30
select dest_id,dest_name,status,error from v$archive_dest where dest_id in (1,2);
在主库中切换归档日志,到从库中*.standby_archive_dest='/home/oracle/arcstd' 所指定的路径中查看主库的归档是否已经被传输过来.
如果主库归档终点没有问题而且已经传送,在从库中启动管理恢复进程:(要在mount模式下执行)
recover database managed standby database disconnect from session;
到从库中查看alert_.log中,查看最新的归档是否被应用.
Errors in file /u01/app/oracle/admin/auxdb1/bdump/auxdb1_mrp0_2617.trc:
ORA-19801: initialization parameter DB_RECOVERY_FILE_DEST is not set
Clearing online redo logfile 1 complete
SQL> create spfile from pfile;
SQL> alter system set DB_RECOVERY_FILE_DEST_SIZE=10000;
SQL> alter system set DB_RECOVERY_FILE_DEST='/home/oracle/aux_flasharea';
正常的alert_.log中会有这样的信息.等待的是current组就正确了.
Media Recovery Log /home/oracle/arcstd/1_27_740157858.dbf
Media Recovery Log /home/oracle/arcstd/1_28_740157858.dbf
Media Recovery Log /home/oracle/arcstd/2_26_740157858.dbf
Media Recovery Log /home/oracle/arcstd/2_27_740157858.dbf
Media Recovery Log /home/oracle/arcstd/2_28_740157858.dbf
Media Recovery Waiting for thread 1 sequence 29
数据测试:
1.在主库建立表然后插入数据.racdb1
SQL> conn scott/tiger
SQL> create table ; (i int);
SQL> begin
2 for i in 1..10000 loop
3 insert into gdt values (i);
4 end loop;
5 commit;
6 end;
7 /
2.切换几次日志
SQL> alter system switch logfile;
SQL> /
SQL> /
3.取消备库的管理恢复:
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
alter database open;
conn scott/tiger
select count(*) from gdt;
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/24756465/viewspace-717896/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/24756465/viewspace-717896/