如何搭建一个 Data Guard 环境

本文总结了Oracle DataGuard的服务器设置、DB安装、DG环境搭建、后续调整、RMAN备份部署、备库归档文件删除脚本、监控脚本及导入数据的关键步骤和注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在Blog里零零散散的讲了一些DB维护的东西,比较杂,也比较散。这里就Oracle Data Guard这块做一个小结。主要是流程上的东西。做个参考,以后装DG,照这个流程走就ok了。

一.服务器设置

1.1硬盘的规划

根据自己的业务量来规划硬盘。我上周搭建的DG,用了4块SAS硬盘。单盘300G,1.5w转/s。这个IOPS大概在150M/s。是个估算值。做了RAID1.

不同的RAID对IOPS是有影响的。

1.2将硬盘挂载到服务器上

这块参考我的Blog:

Linux下挂载硬盘的方法

http://blog.youkuaiyun.com/xujinyang/article/details/6925116

二.安装DB

这部分包括2块,安装DB软件和升级。如果是10g的话,可以先将DB升级到10.2.0.5。升级的原因是为了避免某些bug。

先安装软件,升级,升级完在用DBCA创建实例。这样比安装DB和创建实例之后升级要简单点。

2.1安装DB软件

具体步骤参考BLog:

32位系统,参考:linux平台下oracle数据库安装

http://blog.youkuaiyun.com/xujinyang/article/details/6830215

64位系统参考:64位linux平台下Oracle安装文档

http://blog.youkuaiyun.com/xujinyang/article/details/6829320

2.2升级DB软件

具体步骤参考Blog:

linux平台下oracle从10.2.0.1升级到10.2.0.4

http://blog.youkuaiyun.com/xujinyang/article/details/6830174

其实,升级的步骤,在升级包的readme.html里有详细的说明,可以照那个步骤来。

2.3在主库DBCA创建实例

在我的Blog有说明:

如何搭建一个数据库服务器平台

http://blog.youkuaiyun.com/xujinyang/article/details/6822424

在这里简单的说一下:

(1)redo文件默认是50M,改成100M

(2)每个redo group里改成2个redo logfile。大小100M

(3)检查一下字符集:ZHS16GBK

(4)设置SGA,PGA大小。

OLTP系统一般的规则是:

SGA=内存*80%*80%

PGA=内存*80%*20%

三.搭建DG环境

这块内容参考BLog:

Oracle Data Guard理论知识

http://blog.youkuaiyun.com/xujinyang/article/details/6833263

Oracle Data Guard Linux平台Physical Standby搭建实例

http://blog.youkuaiyun.com/xujinyang/article/details/6829555

在这里补充一点,在我装的2套DG上都遇到一个问题。就是主库的sys用户密码会改变。怀疑和安装过程中copy密码文件的过程有关。因为找不到其他原因了。所以安装之后,用原来的sys密码连接一下。如果不能使用,赶紧重新设置一下。然后在copy到备库。不然在客户端就不能用sys用户登陆了。

如果是现在有DG,不知道sys用户密码。我在测试环境下测试过,在不停DG的情况下,直接修改sys用户密码,然后copy到备库。这样是可以使用的。生产库上没有做过。

四.后续的调整

在这部分,主要是修改一些参数和数据文件的变动。

4.1修改数据文件

用SQL命令,或者用Toad都可以。

(1)将SYSTEM,SYSAUX这2个系统表空间增加到1G,并设置为自动增长,每次10M

(2)UNDO表空间,设成32G(4*8G)或者16G(2*8G)。关闭自动扩展。

(3)TEMP表空间,设成32G(4*8G)或者16G(2*8G)。关闭自动扩展。

4.2参数修改

(1)修改undo_retention

undo_retention只是指定undo数据的过期时间,默认是900s,15分钟。建议改成10800s,即3个小时。

SQL> alter system set undo_retention=10800 scope=both;

系统已更改。

(2)修改sessions和processes参数

SQL> alter system set sessions=2000 scope=spfile;

系统已更改。

SQL> alter system set processes=1000 scope=spfile;

系统已更改。

(3)修改CONTROL_FILE_RECORD_KEEP_TIME参数

该参数设置控制文件中存储备份记录的时间,在用RMAN的时候会涉及到这个参数。备份记录包括完全的数据库备份记录,以及指定的数据文件,控制文件,参数文件和归档目录的备份记录。数据库参数CONTROL_FILE_RECORD_KEEP_TIME以天为单位(默认值为7天),因此在默认情况下,Oracle会将RMAN备份和恢复记录保存7天。可以将该参数设置为0到365之间的任意值。

SQL> alter system set control_file_record_keep_time=14;

系统已更改。

(4)设置open_links_per_instance和open_links参数

关于这2个参数的说明,参考Blog:

open_links_per_instance和open_links参数说明

http://blog.youkuaiyun.com/xujinyang/article/details/6831334

这2个参数修改之后,需要重启才能生效,所以,在安装DB的时候,就把这个参数修改了。默认值是4,如果用到话就太小了。所以在安装的时候,就给修改了。修改建议值:100。

SQL> alter system set open_links=100 scope=spfile;

系统已更改。

五.部署RMAN备份

在部署脚本之前,记得修改2个参数:

RMAN> CONFIGURE CONTROLFILE AUTOBACKUP ON;

RMAN> CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS;

配置DG主库RMAN 归档文件的删除策略:

RMAN>configure archivelog deletion policy to applied on standby;

参考:

Nocatalog下的RMAN增量备份shell脚本

http://blog.youkuaiyun.com/xujinyang/article/details/6830525

Linux平台下RMAN全备和增量备份shell脚本

http://blog.youkuaiyun.com/xujinyang/article/details/6838002

如何搭建RMAN备份平台

http://blog.youkuaiyun.com/xujinyang/article/details/6837452

六.在备库部署删除归档文件脚本

DG备库的归档文件不能自动删除。需要使用脚本来删除。

参考:

Oracle Data Guard备库归档文件删除脚本

http://blog.youkuaiyun.com/xujinyang/article/details/6833094

七.部署其他的监控脚本

这部分监控如CPU,磁盘空间,表空间使用率。alert log日志等。以前有个shell的脚本,可以监控这些。最近在整理一个Python的监控脚本。

7.1alert log按天存放

这样做主要还是方便查看alert log。参考:

Oracle alert log按天存放脚本

http://blog.youkuaiyun.com/xujinyang/article/details/6925178

7.2以前弄的一个监控DG的批处理脚本

每天早上上班运行下,DG的情况就能清楚的显示出来了。省事很多。后来懒的运行批处理命令,改成每天定时发到邮箱了。

Check.sql

conn sys/PWD@SID as sysdba

host title数据库日常检查

column dest_name format a30

column destination format a20

column MEMBER format a45

column归档地format a20

column TABLESPACE_NAME format a10

column FREE_RATE format a10

host cls

prompt ****************************实例状态************************************;

select instance_name实例名,version版本,status状态,database_status数据库状态from v$instance;

prompt ****************************数据库状态*************************************;

select name,log_mode归档模式,open_mode打开模式from v$database;

prompt ****************************控制文件状态***********************************;

column name format a40

select status,name from v$controlfile;

prompt ****************************日志文件状态***********************************;

select GROUP#,status,type,member from v$logfile;

prompt*****************************归档目的地状态*********************************;

select dest_name ,status状态,database_mode数据库模式,destination归档地from v$archive_dest_status where dest_id in('1','2');

set heading off;

select '************数据库已连续运行'|| round(a.atime-b.startup_time)||'天'||'*******************************************' from(select sysdate atime from dual) a,v$instance b;

set heading on;

prompt*****************************会话数*************************************;

select sessions_current当前会话数,sessions_highwater实例最高值from v$license;

prompt**********************表空间监控(FREE_RATE小于10%为异常) ********************;

select a.tablespace_name, round(a.total_size) "total_size(MB)",

round(a.total_size)-round(b.free_size,3) "used_size(MB)",

round(b.free_size,3) "free_size(MB)", round(b.free_size/total_size*100,2)||'%' free_rate

from ( select tablespace_name, sum(bytes)/1024/1024 total_size

from dba_data_files

group by tablespace_name ) a,

( select tablespace_name, sum(bytes)/1024/1024 free_size

from dba_free_space

group by tablespace_name ) b

where a.tablespace_name = b.tablespace_name(+);

prompt ****************************表空间OFFLINE(显示为空正常) ********************;

select tablespace_name表空间名,status状态from dba_tablespaces where status='OFFLINE';

prompt **************************** SEQUENCE同步数*********************************;

select max(sequence#)from v$log_history;

CONN sys/PWD@SID_ST as sysdba;

prompt ****************************备库SEQUENCE同步数*****************************;

select max(sequence#)from v$log_history;

prompt ****************************备库日志未应用(显示为空正常) *******************;

select sequence#,applied from v$archived_log where applied='NO' and sequence#>2453;

prompt ****************************备库日志应用(显示最近十个日志) *****************;

select * from(select sequence#,applied from v$archived_log order by sequence# desc) where rownum<=10;

set time on

disconnect

Check.bat

sqlplus /nolog @check.sql

7.3其他监控脚本

参考:

8个DBA最常用的监控Oracle数据库的常用shell脚本

http://blog.youkuaiyun.com/xujinyang/article/details/6830090

八.导入数据

用逻辑导出导入就可以了。在导入之前建好表空间,注意:数据和索引分别存放在不同的表空间。在建用户。最后导入数据。

对于某些系统(如移动的BOSS计费系统),在建sequence的时候,注意下sequence的cache大小。默认值是20.一般是够用的。

Oracle Sequence Cache参数说明

http://blog.youkuaiyun.com/xujinyang/article/details/6831361

导入的过程也会产生归档文件,只需要在主库导入即可。备库会自动同步。如果数据量大的话,这个同步过程会比较慢。因为imp会产生大量的归档文件。

DG的东西就这么多了。最后3句话:

(1)备份重于一切

(2)责任重于一切

(3)DBA要胆大心细,遇事不慌

------------------------------------------------------------------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值