【干货】生产环境Oracle DG配置

以下配置除SID和IP地址不是真实生产环境以外,其余均为生产环境配置。

DG原理

老生常谈,DG的原理很简单,就是传输日志然后应用日志。
它的原理图如下:


DG原理图
  • 原理图说明:
  1. 日志传输服务将主库产生的日志数据传到从库。
  2. 应用服务(Apply Service)验证日志数据,并且更新从库的数据文件。
  3. 主数据库的写进程更新数据文件,并不依赖于DataGuard架构。
  4. 当网络或者从库故障恢复时,DG自动重传已经被主库归档的日志数据。

一、配置流程图

[主库配置] >[备库配置] >[RMAN恢复] >[测试验证] >[更改归档] >[启停操作]

二、现场环境情况

名称 数据库名 数据库版本 系统版本 虚拟IP 实例名 安装目录
主库 db1 10.2.0.4 rhel72 172.31.31.1 abcd /u01/app/oracle/product/11.2.0/db_1
灾备库 dbstd 10.2.0.4 rhel72 172.30.110.110 abcd /u01/app/oracle/product/11.2.0/db_1

三、 配置新主机环境

  • 安装数据库(略)
  • 修改参数(新主机)
    /etc/sysctl.conf
kernel.shmall = 67108864
kernel.shmmax=53687091199
kernel.shmmni = 4096
kernel.sem = 3010 385280 3010 128
net.ipv4.ip_local_port_range = 9000 65500
net.core.rmem_default=262144   
net.core.wmem_default=262144     
net.core.wmem_max=1048576
fs.file-max = 6815744
net.core.rmem_max = 4194304
fs.aio-max-nr = 1048576

/etc/security/limits.conf

oracle soft nproc 2047
oracle hard nproc 16384
oracle soft nofile 1024
oracle hard nofile 65536

/etc/pam.d/login

session required pam_limits.so
  • 创建用户、组和目录(新主机)
    创建用户和组
/usr/sbin/groupadd oinstall 
/usr/sbin/groupadd dba 
/usr/sbin/useradd -g oinstall -G dba oracle
passwd oracle 

创建目录

mkdir -p /u01/app/oracle/product/11.2.0/db_1
chown -R oracle:oinstall /u01/app/oracle/product/11.2.0/db_1
  • 修改OS版本(新主机)
vi /etc/redhat-release
Red Hat Enterprise Linux AS release 4 (Nahant Update 8)  
  • 修改用户配置环境(新主机)
umask 022
TMP=/tmp
TMPDIR=/tmp
PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
LD_LIBRARY_PATH=/usr/lib:/usr/X11R6/lib
ORACLE_BASE=/u01/app/oracle
ORACLE_HOME=$ORACLE_BASE/product/11.2.0/db_1
ORACLE_SID=
LD_LIBRARY_PATH=$ORACLE_HOME/jdk/jre/lib/i386:$ORACLE_HOME/jdk/jre/lib/i386/server:$ORACLE_HOME/rdbms/lib:$ORACLE_HOME/lib:$LD_LIBRARY_PATH
PATH=$ORACLE_HOME/bin:$PATH
NLS_LANG=American_America.ZHS16GBK
export ORACLE_BASE ORACLE_HOME ORACLE_SID LD_LIBRARY_PATH PATH NLS_LANG TMP TMPDIR 
  • 备库安装oracle软件(略)
  • 检查依赖包(linux),缺少的需要安装上。
rpm -q binutils compat-libstdc++ elfutils-libelf elfutils-libelf-devel glibc glibc-common glibc-devel gcc gcc-c++ libaio libaio-devel libgcc libstdc++ libstdc++-devel make sysstat unixODBC unixODBC-devel

yum --enablerepo=rhel-media install binutils compat-libstdc++ elfutils-libelf elfutils-libelf-devel glibc glibc-common glibc-devel gcc gcc-c++ libaio libaio-devel libgcc libstdc++ libstdc++-devel make sysstat unixODBC unixODBC-devel
  • 备库升级到10204
    • 建一个测试库
      dbca
    • 开始升级
startup upgrade
SPOOL patch.log
@?/rdbms/admin/catupgrd.sql
@?/rdbms/admin/utlrp.sql
SPOOL OFF

四、DG配置

  • 主库ABCD设置为force logging 模式
alter database force logging; 
  • 主库abcd设为归档模式(如果已有,可省略)
archive log list;
shutdown immediate
startup mount
alter database archivelog;
archive log list; 
alter database open;
  • 主库ABCD创建参数文件
create pfile from spfile;
  • 主库ABCD上建立的备库控制文件standby.ctl
alter database create standby controlfile as ‘/tmp/rman/standby.ctl’
  • 主库abcd进行RMAN备份
export ORACLE_SID=abcd
rman target /
CONFIGURE CONTROLFILE AUTOBACKUP ON  -------show all查看,如果不为ON,则照此修改
backup as compressed backupset device type disk format '/databackp/rman/%U' current controlfile for Standby; 
#backup device type disk format '/databackp/rman/%U' database plus archivelog; 
backup as compressed backupset device type disk '/databackp/rman/%U' database plus archivelog;
backup device type disk format '/databackp/rman/%U' current controlfile for Standby; 

拷贝数据文件

将RMAN备份文件全部上传至备用服务器/tmp/rman目录
将主库pfile和密码文件上传至备库相应位置
将主库控制文件上传至备库相应位置    
  • 主库SPFILE修改
    • 主库在不停机时执行
alter system set log_archive_config='dg_config=(abcd,abcdstd)' scope=spfile;
alter system set log_archive_dest_1='location=/oradata/arch_data VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=abcd' scope=spfile;
alter system set log_archive_dest_2='service=abcdstd LGWR SYNC NET_TIMEOUT=20 REOPEN=20 AFFIRM VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=abcdstd' scope=spfile;
alter system set log_archive_max_processes=5 scope=spfile;
alter system set log_archive_dest_state_1=ENABLE scope=spfile;
alter system set log_archive_dest_state_2=ENABLE scope=spfile;
alter system set remote_login_passwordfile=EXCLUSIVE scope=spfile;
alter system set fal_server='abcdstd' scope=spfile;
alter system set fal_client='abcd' scope=spfile;
alter system set db_file_name_convert ='abcdstd','abcd' scope=spfile;
alter system set log_file_name_convert='abcdstd','abcd' scope=spfile;
alter system set standby_file_management='AUTO' scope=spfile;
alter system set standby_archive_dest='location=/oradata/arch_data/abcdstdby' scope=spfile;
  • 修改后的主pfile:
*.db_unique_name='abcd'
*.log_archive_config='dg_config=(abcd,abcdstd)'
*.log_archive_dest_1='location=/oradata/arch_data VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=abcd'
*.log_archive_dest_2='service=abcdstd LGWR SYNC NET_TIMEOUT=20 REOPEN=20 AFFIRM VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=abcdstd'
*.log_archive_max_processes=5 
*.remote_login_passwordfile=EXCLUSIVE
*.fal_client='abcd'
*.fal_server='abcdstd'
*.standby_file_management='AUTO'
*.log_archive_dest_state_1=ENABLE
*.log_archive_dest_state_2=ENABLE
*.db_file_name_convert ='abcdstd','abcd'
*.log_file_name_convert='abcdstd','abcd'
*.standby_archive_dest='location=/oradata/arch_data/abcdstdby'
  • 主库创建pfile
create pfile from spfile;
  • 配置主库监听
LISTENER=
        (DESCRIPTION_LIST=
                (DESCRIPTION=
                (ADDRESS_LIST=
                        (ADDRESS=(PROTOCOL=TCP)(HOST=172.31.31.1)(PORT=1521)
                        )
                )
                (ADDRESS_LIST=
                        (ADDRESS=(PROTOCOL=IPC)(KEY=EXPROC))
                        )
                )
        )
SID_LIST_LISTENER=
        (SID_LIST=
                (SID_DESC=
                        (SID_NAME=PLSExtProc)
                        (ORACLE_HOME=/u01/app/oracle/product/11.2.0/db_1)
                        (PROGRAM=extproc)
                )
                (SID_DESC=
                        (GLOBAL_DBNAME=abcd)
                        (ORACLE_HOME=/u01/app/oracle/product/11.2.0/db_1)
                        (SID_NAME=abcd)
                )
        )
  • 配置主库TNS
EXTPROC_CONNECTION_DATA =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
    )
    (CONNECT_DATA =
      (SID = PLSExtProc)
      (PRESENTATION = RO)
    )
  )
abcd =
        (DESCRIPTION =
                (ADDRESS = (PROTOCOL = TCP)(HOST = 172.31.31.1)(PORT = 1521))
                        (CONNECT_DATA =
                                (SERVER = DEDICATED)
                                (SERVICE_NAME = abcd)
                        )
        )
abcdSTD =
       (DESCRIPTION =
             (ADDRESS = (PROTOCOL = TCP)(HOST = 172.30.110.110)(PORT = 1521))
                       (CONNECT_DATA =
                       (SERVER = DEDICATED)
                       (SERVICE_NAME = abcd)
                       )
       )
  • 重启主库监听
lsnrctl reload
  • 修改后的备pfile
*.db_unique_name='abcdstd'
*.log_archive_config='dg_config=(abcdstd,abcd)'
*.log_archive_dest_1='location=/oradata/arch_data VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=abcdstd'
*.log_archive_dest_2='service=abcd LGWR SYNC NET_TIMEOUT=20 REOPEN=20 AFFIRM VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=abcd'
*.log_archive_max_processes=5 
*.remote_login_passwordfile=EXCLUSIVE
*.fal_client='abcdstd'
*.fal_server='abcd'
*.standby_file_management='AUTO'
*.log_archive_dest_state_1=ENABLE
*.log_archive_dest_state_2=ENABLE
*.db_file_name_convert ='abcd','abcdstd'
*.log_file_name_convert='abcd','abcdstd'
*.standby_archive_dest='location=/oradata/arch_data/abcdstdby'
  • 配置备库监听
LISTENER=
        (DESCRIPTION_LIST=
                (DESCRIPTION=
                (ADDRESS_LIST=
                        (ADDRESS=(PROTOCOL=TCP)(HOST=172.30.110.110)(PORT=1521)
                        )
                )
                (ADDRESS_LIST=
                        (ADDRESS=(PROTOCOL=IPC)(KEY=EXPROC))
                        )
                )
        )
SID_LIST_LISTENER=
        (SID_LIST=
                (SID_DESC=
                        (SID_NAME=PLSExtProc)
                        (ORACLE_HOME=/u01/app/oracle/product/11.2.0/db_1)
                        (PROGRAM=extproc)
                )
                (SID_DESC=
                        (GLOBAL_DBNAME=abcd)
                        (ORACLE_HOME=/u01/app/oracle/product/11.2.0/db_1)
                        (SID_NAME=abcd)
                )
        )
  • 配置备库TNS
EXTPROC_CONNECTION_DATA =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
    )
    (CONNECT_DATA =
      (SID = PLSExtProc)
      (PRESENTATION = RO)
    )
  )
abcd =
        (DESCRIPTION =
                (ADDRESS = (PROTOCOL = TCP)(HOST = 172.31.31.1)(PORT = 1521))
                        (CONNECT_DATA =
                                (SERVER = DEDICATED)
                                (SERVICE_NAME = abcd)
                        )
        )
abcdSTD =
       (DESCRIPTION =
             (ADDRESS = (PROTOCOL = TCP)(HOST = 172.30.110.110)(PORT = 1521))
                       (CONNECT_DATA =
                       (SERVER = DEDICATED)
                       (SERVICE_NAME = abcd)
                       )
       )

  • 主备测试监听
tnsping abcd
tnsping abcdstd

五、RMAN恢复备库

  • 相同目录恢复
export ORACLE_SID=abcd
sqlplus "/as sysdb"
startup nomount
  • 另开一个窗口duplicate数据库
rman target sys/oracle@abcd auxiliary /
RUN
{
allocate channel c1 type disk;
allocate channel c2 type disk;
allocate channel c3 type disk;
allocate channel c4 type disk;
allocate auxiliary channel t1 type disk;
allocate auxiliary channel t2 type disk;
allocate auxiliary channel t3 type disk;
allocate auxiliary channel t4 type disk;
DUPLICATE TARGET DATABASE FOR STANDBY NOFILENAMECHECK;
release channel c1;
release channel c2;
release channel c3;
release channel c4;
release channel t1;
release channel t2;
release channel t3;
release channel t4;
}
  • 在duplicate数据库完成之后,转到startup nomount的SQL窗口
alter database recover managed Standby database disconnect from session no timeout;
#alter tablespace temp add tempfile '/oradata/db_sys_data/dgtemp' size 30M;
shutdown immediate;     
  • 备库启动建立standby redolog
startup nomount;
  • 检查是否有standby redolog的记录,有则删除
  1. 检查记录
select 'alter database drop standby logfile group '||group#||';' from v$standby_log;    
  1. 检查出有记录后,执行删除操作
alter database drop standby logfile group 4;
alter database drop standby logfile group 5;
alter database drop standby logfile group 6;
alter database drop standby logfile group 7;
  • 备库建立standby logfile
  1. 删除以前的redo
#alter database drop logfile group 4;
#alter database drop logfile group 5;
#alter database drop logfile group 6;
#alter database drop logfile group 7;
  1. 添加新REDO
ALTER DATABASE ADD STANDBY LOGFILE GROUP 4 ('/oradata/db_sys_data/abcdstd/redo04.log') size 512M;
ALTER DATABASE ADD STANDBY LOGFILE GROUP 5 ('/oradata/db_sys_data/abcdstd/redo05.log') size 512M;
ALTER DATABASE ADD STANDBY LOGFILE GROUP 6 ('/oradata/db_sys_data/abcdstd/redo06.log') size 512M;
ALTER DATABASE ADD STANDBY LOGFILE GROUP 7 ('/oradata/db_sys_data/abcdstd/redo07.log') size 512M; 
  • 查看备库的standby logfile:
select group#,thread#,sequence#,status from v$standby_log;      
  • 主备库中查看存档参数是否正常
#主库abcd:
col dest_name for a30
col error for a20
select dest_name,status,error,target,process from v$archive_dest where rownum<=2;

#备库:
col dest_name for a30
col error for a20
select dest_name,status,error,target,process from v$archive_dest where rownum<=2;
  • 查看主备库保护模式
#查看主库abcd保护模式:
select protection_mode,database_role,protection_level,open_mode from v$database; 

#查看备库保护模式:
select protection_mode,database_role,protection_level,open_mode from v$database;        
  • 开启物理备库的实时redo应用
startup nomount;
alter database mount standby database ;
alter database recover managed standby database using current logfile disconnect from session;
  • 验证备库应用了日志
#主库abcd:
alter system switch logfile;

#备库:最后一行APPLIED为YES则表示已经实时应用    
select sequence#,applied from v$archived_log;   

六、测试

  1. 在主库上新建一张表
create table test_table as select * from dba_users;
  1. 在备库上查看此表是否已经存在
sqlplus / as sysdba
alter database recover managed standby database cancel;
alter database open read only;
  1. 查询刚才主库上创建的表,如果表存在,那就说明DG已经正常工作。
select * from test_table;

4.备库恢复到数据接收模式

shutdwon immediate;
startup mount;
alter database recover managed standby database using current logfile disconnect from session;
  1. 备库检查同步状态,主要查看最后一行APPLIED为YES则表示应经应用
select sequence#,applied from v$archived_log; 

七、更改主库RMAN的日志归档方式

When backups of archived redo log files are taken on the primary database:

#备库
CONFIGURE ARCHIVELOG DELETION POLICY TO APPLIED ON STANDBY;
#主库
CONFIGURE ARCHIVELOG DELETION POLICY TO NONE;

八、启停相关操作

  • DG启动顺序
    • 先standby后primary
#standby操作
startup nomount;
alter database mount standby database ;
alter database recover managed standby database using current logfile disconnect from session;
lsnrctl start

#primary操作
startup
lsnrctl start

你可能感兴趣的:(【干货】生产环境Oracle DG配置)