dataguard实现.docx
- 文档编号:12255447
- 上传时间:2023-04-17
- 格式:DOCX
- 页数:23
- 大小:22.88KB
dataguard实现.docx
《dataguard实现.docx》由会员分享,可在线阅读,更多相关《dataguard实现.docx(23页珍藏版)》请在冰豆网上搜索。
dataguard实现
DataGuard的实现
从库为physicalstandby
操作系统:
RedHatAS3
Oracle:
9.2.0.4
限于条件,在一台机器上实现DataGuard.
PrimarySID:
reddb
StandbySID:
reddbstd
其中主库的数据文件目录是:
/oracle/oradata/reddb
设计备库的数据文件目录是:
/oracle/oradata/reddb_stdby_
一Primary的准备
1确认主数据库为归档模式
sql>archiveloglist;
如果是非归档模式,执行如下:
sql>altersystemsetlog_archive_start=truescope=spfile;
sql>shutdownimmediate
sql>startupmount
sql>alterdatabasearchivelog;
sql>alterdatabaseopen;
2确认主库处于Forcelogging模式
sql>ALTERDATABASEFORCELOGGING;
说明:
对于DirectInsert,有可能不会产生redo,这样如果直接写入数据到主库,而由于不产生日志,那么就会导致备库的数据与主库不一致.
3创建主库的本地归档目录
在/oracle/oradata/reddb下创建local_arch目录,
作为主库的本地归档目录
4设置主库的本地归档目录
sql>altersystemsetlog_archive_dest_1=’location=/oracle/oradata/reddb/local_arch’scope=spfile;
sql>altersystemsetlog_archive_dest_state_1=enablescope=spfile;
sql>shutdownimmediate
sql>startup
说明:
在设置了数据库的归档模式后,整个数据库就进入了归档的模式;
如果尚未设置log_archive_start=true,则数据库处于手工归档状态,
如果设置了此参数,则处于自动归档状态;
在自动归档状态下,如果没有设置log_archive_dest,则Oracle会选择一个默认目录作为归档目的地;
如果设置了log_archive_dest,则不能再增设一个log_archive_dest_n;
因此对于DG由于至少需要两个归档目的地(本地和远端),那么就不能设置log_archive_dest.
5测试本地归档
sql>altersystemswitchlogfil;
通过切换,会发现在/oracle/oradata/reddb/arch下
能生成归档日志.
6建立主库的备用归档路径
在/oracle/oradata/reddb下创建stdby_arch目录,
作为主库的备用归档目录;当主库切换为备库时,其接收的归档日志存放于此目录下.
7为了能是主备进行切换,需要将主库的参数文件进行修改,
添加如下:
LOG_ARCHIVE_DEST_2='SERVICE=reddbstd'
LOG_ARCHIVE_DEST_STATE_2=ENABLE
REMOTE_ARCHIVE_ENABLE=true
FAL_SERVER=reddbstd
FAL_CLIENT=reddb
DB_FILE_NAME_CONVERT=('/oracle/oradata/reddb_stdby/','/oracle/oradata/reddb/’)
LOG_FILE_NAME_CONVERT=('/oracle/oradata/reddb_stdby/','/oracle/oradata/reddb/’)
STANDBY_ARCHIVE_DEST/oracle/oradata/reddb/stdby_arch
STANDBY_FILE_MANAGEMENT=AUTO
二备库的创建
1创建备库的数据文件所在的目录
在/oracle/oradata下执行:
mkdirreddb_stdby
2冷备份数据文件
sql>shutdown
$cp/oracle/oradata/reddb/*.dbf/oracle/oradata/reddb_stdby/
$cp/oracle/oradata/reddb/*.log/oracle/oradata/reddb_stdby/
sql>startup
3生成备库的控制文件
sql>ALTERDATABASECREATESTANDBYCONTROLFILEAS
‘/oracle/oradata/reddb_stdby/control_std.ctl’;
此处的控制文件名应该与主库的不一样;
另外,生成控制文件的步骤应该在备份数据文件后面.
4生成备库的参数文件
SQL>CREATEPFILE=’/oracle/oradata/reddb_stdby/initreddbstd.ora’FROMSPFILE;
5建立备库的本地归档路径
在/oracle/oradata/reddb_stdby/下建立
arch目录
6建立备库的DUMP目录
在/oracle/oradata/reddb_stdby/下建立
bdump
cdump
udump
等目录
7修改从库的参数文件
这个参数文件是从主库直接copy过来的,有不合适的地方需要修改.
*.background_dump_dest='/oracle/admin/reddb/bdump'
修改为
*.background_dump_dest='/oracle/oradata/reddb_stdby/bdump'
*.compatible='9.2.0.0.0'
*.control_files='/oracle/oradata/reddb/control01.ctl','/oracle/oradata/reddb/control02.ctl','/oracle/oradata/reddb/control03.ctl'
修改为:
*.control_files='/oracle/oradata/reddb_stdby/control_std.ctl'
*.core_dump_dest='/oracle/admin/reddb/cdump'
修改为:
*.core_dump_dest='/oracle/oradata/reddb_stdby/cdump'
*.db_block_size=8192
*.db_cache_size=25165824
*.db_domain=''
*.db_file_multiblock_read_count=16
*.db_name='reddb'
*.fast_start_mttr_target=300
*.hash_join_enabled=TRUE
*.instance_name='reddb'
修改为:
*.db_name='reddbstd'
(实例名)
*.java_pool_size=0
*.large_pool_size=8388608
*.log_archive_dest_1='location=/oracle/oradata/reddb/local_arch'
修改为:
*.log_archive_dest_1='location=/oracle/oradata/reddb_stdby/local_arch'
*.log_archive_dest_state_1='ENABLE'
*.log_archive_start=TRUE
*.open_cursors=300
*.pga_aggregate_target=25165824
*.processes=150
*.query_rewrite_enabled='FALSE'
*.remote_login_passwordfile='EXCLUSIVE'
*.shared_pool_size=83886080
*.sort_area_size=524288
*.star_transformation_enabled='FALSE'
*.timed_statistics=TRUE
*.undo_management='AUTO'
*.undo_retention=10800
*.undo_tablespace='UNDOTBS1'
*.user_dump_dest='/oracle/admin/reddb/udump'
修改为:
*.user_dump_dest='/oracle/oradata/reddb_stdby/udump'
需要增加的参数:
standby_archive_dest=’/oracle/oradata/reddb_stdby/stdby_arch/'
#Specifythelocationofthearchivedredologsthat
#willbereceivedfromtheprimarydatabase.
#这个参数是指从
db_file_name_convert=(’/oracle/oradata/reddb/’,
’/oracle/oradata/reddb_stdby/’)
log_file_name_convert=(’/oracle/oradata/reddb/’,
’/oracle/oradata/reddb_stdby/’)
log_archive_format=%t_%s.dbf
log_archive_dest_1=(’LOCATION=/oracle/oradata/reddb_stdby/local_arch'’)
log_archive_dest_1-Specifythelocationwheretheredologsaretobe
archivedonthestandbysystem.(Ifaswitchoveroccursandthisinstance
becomestheprimarydatabase,thenthisparameterwillspecifythelocation
wheretheonlineredologswillbearchived.)
standby_file_management=AUTO
remote_archive_enable=TRUE
lock_name_space=reddbstd
为了是备库能切换为主库的角色,增加参数如下:
FAL_SERVER=reddb
FAL_CLIENT=reddbstd
LOG_ARCHIVE_DEST_2='SERVICE=reddb'
LOG_ARCHIVE_DEST_STATE_2=ENABLE
三启动从库
生成口令文件:
$/oracle/product/9.2.0.4/bin/orapwdfile=/oracle/product/9.2.0.4/dbs/orapwreddbstdpassword=sys
$exportORACLE_SID=reddbstd
$sqlplus“/assysdba”
sql>startupnomountpfile=/oracle/oradata/reddb_stdby/initreddbstd.ora
sql>createspfilefrompfile=/oracle/oradata/reddb_stdby/initreddbstd.ora
sql>shutdown
sql>exit
$sqlplus“/assysdba”
sql>startupnomount
sql>alterdatabasemountstandbydatabase;
sql>alterdatabaserecovermanagedstandbydatabase
>disconnectfromsession;
四关闭从库
1先将主库对应的远程归档路径置为无效
主库操作:
sql>altersystemsetlog_archive_dest_state_1=deferscope=memory;
2如果从库正在进行recover,则取消之
从库操作,查看是否有MRP0或MRP进程
SQL>SELECTPROCESS,STATUSFROMV$MANAGED_STANDBY;
3
执行
SQL>ALTERDATABASERECOVERMANAGEDSTANDBYDATABASECANCEL;
4关闭从库
sql>shutdownimmediate;
五启动主库
修改initreddb.ora文件如上所示.
sql>startuppfile=/oacle/product/9.2.0.4/dbs/initreddb.ora
sql>createspfilefrompfile
sql>shutdown
sql>startup
六配置侦听及网络服务名
由于主备库是在一台机器上,所以只需各配置一个listener.ora和tnsnames.ora文件即可.
Listener.ora文件内容:
LISTENER=
(DESCRIPTION=
(ADDRESS=(PROTOCOL=TCP)(HOST=linux)(PORT=1521))
)
SID_LIST_LISTENER=
(SID_LIST=
(SID_DESC=
(GLOBAL_DBNAME=reddb)
(ORACLE_HOME=/oracle/product/9.2.0.4)
(SID_NAME=reddb)
)
)
LISTENERSTD=
(DESCRIPTION=
(ADDRESS=(PROTOCOL=TCP)(HOST=linux)(PORT=1523))
)
SID_LIST_LISTENERSTD=
(SID_LIST=
(SID_DESC=
(GLOBAL_DBNAME=reddbstd)
(ORACLE_HOME=/oracle/product/9.2.0.4)
(SID_NAME=reddbstd)
)
)
tnsnames.ora文件内容:
REDDB=
(DESCRIPTION=
(ADDRESS_LIST=
(ADDRESS=(PROTOCOL=TCP)(HOST=linux)(PORT=1521))
)
(CONNECT_DATA=
(SERVER=DEDICATED)
(SERVICE_NAME=reddb)
)
)
REDDBSTD=
(DESCRIPTION=
(ADDRESS_LIST=
(ADDRESS=(PROTOCOL=TCP)(HOST=linux)(PORT=1523))
)
(CONNECT_DATA=
(SERVICE_NAME=reddbstd)
)
)
主从库的启动顺序:
从库的listener
从库
主库的listener
主库
七验证备库
1查看从库当前存在的归档日志
SQL>SELECTSEQUENCE#,FIRST_TIME,NEXT_TIME
FROMV$ARCHIVED_LOGORDERBYSEQUENCE#;
2在主库上归档当前日志
SQL>ALTERSYSTEMARCHIVELOGCURRENT;
3查看从库当前归档的日志
SQL>SELECTSEQUENCE#,FIRST_TIME,NEXT_TIME
2>FROMV$ARCHIVED_LOGORDERBYSEQUENCE#;
4查看从库当前归档日志是否已被apply
SQL>SELECTSEQUENCE#,APPLIEDFROMV$ARCHIVED_LOG
2ORDERBYSEQUENCE#;
5查看从库上app进程的信息
SQL>SELECTPROCESS,STATUS,THREAD#,SEQUENCE#,BLOCK#,BLOCKS
2>FROMV$MANAGED_STANDBY;
6查看从库归档日志被app的情况
SQL>SELECTARCHIVED_THREAD#,ARCHIVED_SEQ#,APPLIED_THREAD#,APPLIED_SEQ#
2>FROMV$ARCHIVE_DEST_STATUS;
7查看从库的已归档日志信息
SQL>SELECTREGISTRAR,CREATOR,THREAD#,SEQUENCE#,FIRST_CHANGE#,
2>NEXT_CHANGE#FROMV$ARCHIVED_LOG;
8在主库上执行
sql>createtabletest(bnumber);
sql>insertintotestvalues
(1);
sql>commit;
sql>altersystemswitchlogfile;
9在从库上执行
sql>alterdatabaserecovermanagedstandbydatabasecancel;
sql>alterdatabaseopenreadonly;
sql>select*fromtest;
应该能检索出有值为1的记录.
10在主库上执行
sql>createtabletest(bnumber);
sql>insertintotestvalues
(2);
sql>commit;
sql>altersystemswitchlogfile;
11在从库上执行
sql>select*fromtest;
这时应没有值为2的记录,因为从库处于openreadonly模式,不能进行恢复;也就是说managedrecover和readonly是从库两个互斥的运行模式.
执行
Sql>selectsequence#,archived,appliedfromv$archived_log;
通过这个结果就能发现有个已归档的日志没有被applied.
八监测备库的信息
1检查进程
在备库上执行:
SQL>SELECTPROCESS,CLIENT_PROCESS,SEQUENCE#,STATUSFROMV$MANAGED_STANDBY;
2查看归档日志
在主备库上执行
SQL>SELECTARCHIVED_THREAD#,ARCHIVED_SEQ#,APPLIED_THREAD#,APPLIED_SEQ#
2>FROMV$ARCHIVE_DEST_STATUS;
3查看备库上已归档的日志
备库上执行:
SQL>SELECTNAME,CREATOR,SEQUENCE#,APPLIED,COMPLETION_TIME
2>FROMV$ARCHIVED_LOG;
4查看主库的已归档信息
SQL>SELECTFIRST_TIME,FIRST_CHANGE#,NEXT_CHANGE#,SEQUENCE#FROMV$LOG_
HISTORY;
5查看从库的刚被apply的日志
SQL>SELECTTHREAD#,MAX(SEQUENCE#)AS"LAST_APPLIED_LOG"
2>FROMV$LOG_HISTORY
3>GROUPBYTHREAD#;
或者
SQL>SELECTTHREAD#,SEQUENCE#,APPLIEDFROMV$ARCHIVED_LOG;
6查看主库上尚未被传递到从库的日志
假设主库上的本地DEST_ID为1;远程DEST_ID为2;
这可通过v$archive_dest来确定.
SELECTLOCAL.THREAD#,LOCAL.SEQUENCE#FROM
(SELECTTHREAD#,SEQUENCE#FROMV$ARCHIVED_LOGWHEREDEST_ID=1)LOCAL
WHERE
LOCAL.SEQUENCE#NOTIN
(SELECTSEQUENCE#FROMV$ARCHIVED_LOGWHEREDEST_ID=2AND
THREAD#=LOCAL.THREAD#);
九问题解决
1检查主库上的归档路径是否正确
SQL>SELECTDESTINATION,ERRORFROMV$ARCHIVE_DEST;
2如果备库没能收到归档日志
1)先检查主库上的归档路径是否有问题
SELECTDEST_ID"ID",
STATUS"DB_status",
DESTINATION"Archive_dest",
ERROR"Error"
FROMV$ARCHIVE_DEST;
2)如果上面正常,则检查:
主库上关于备库的servicename正确否?
归档路径正确否?
相应归档路径的state是否为enable
备库上的listener已启动否?
备库启动否?
十相关知识
1三种保护模式
MaximumPerformance
MaximumAvailability
MaximumProtection
2日志传递进程
主库上传递日志的进程可以是LGWR或ARCH.
对于MaximumAvailability和MaximumProtection两种模式,必须由LGWR进行传递,因为主库要求实时获取从库的事务信息;
对于MaximumPerformance模式,则可使用LGWR或ARCH.
如果是LGWR传递,则从库的接收者是RFS进程,接收的日志信息写入standbyredolog;当主库进行日志switch时,会触发从库的arch进程也将standbyredolog归档到log_archive_dest_n所指定的本地归档路径.
如果时ARCH传递,则从库的接收者是RFS进程,每当主库进行日志switch时,从库会接收到一个完整的redo文件,RFS会将其直接放到standby_archive_dest路径下;此时,主库上的每个arch进程会在从库对应一个RFS进程.
十一保护模式的转换
1在缺省情况下,备库是处于MaximumPerformance模式;主库的日志传递进程是Arch
在主库上查询:
sql>selectprotectionfromv$archive_dest_status;
在从库上查询:
sql>selectprocess,client_processfromv$managed_standby;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- dataguard 实现
![提示](https://static.bdocx.com/images/bang_tan.gif)