暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

ORACLE 11.2.0.4 ADG实战(一)单实例篇

踱岚视角 2024-09-24
61

一、     环境说明

  开始配置 Oracle Active Data Gurad 之前, 需要事先准备好相应的环境, 根据规划安装主备库的数据库环境,备库只需安装数据库软件,不需要创建实例,本次实施环境全程通过vmware workstation搭建的虚拟机环境进行的测试,,先搭建一个主库环境,不建库,然后通过虚拟机克隆的方式生成备库的环境,再在主库上建库,配置ADG的环境。

1.1、基础环境

1.1.1、操作系统版本

Red Hat Enterprise Linux Server release 6.5 (Santiago)

Kernel \r on an \m

注:主从库尽量保持一致。

1.1.2、数据库版本

Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

PL/SQL Release 11.2.0.4.0 - Production
CORE    11.2.0.4.0      Production
TNS for Linux: Version 11.2.0.4.0 - Production
NLSRTL Version 11.2.0.4.0 - Production


[oracle@primary OPatch]$ ./opatch lspatches

35574075;Database Patch Set Update : 11.2.0.4.231017 (35574075)


OPatch succeeded.

注:主从库尽量保持一致。

1.1.3、存储规划

项目

项目值

备注

数据库安装目录

/u01/app/oracle/product/11.2.0/db_1

按实际调整

数据库数据存储目录

/u01/app/oracle/oradata/oradb

按实际调整

数据库日志文件目录

/u01/app/oracle/admin/oradb/adump

按实际调整

数据库归档目录

/home/oracle/archive


注:主从库尽量保持一致。

1.1.4、IP地址

服务器

主机名

IP地址

端口号

备注

主库

Master

192.168.56.100

1521

按实际调整

从库

Slave

192.168.56.101

1521

按实际调整

1.1.5、数据库参数

参数名

主库

从库

db_unique_name

pri

sty

log_archive_config

DG_CONFIG=(pri,sty)

DG_CONFIG=(pri,sty)

log_archive_dest_1

LOCATION=/home/oracle/archive  VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=pri

LOCATION=/home/oracle/archive  VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=sty

log_archive_dest_2

SERVICE=sty  LGWR SYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=sty

SERVICE=pri  LGWR SYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=pri

log_archive_dest_state_1

ENABLE

ENABLE

log_archive_dest_state_2

ENABLE

ENABLE

fal_server

sty

pri

fal_client

pri

sty

standby_file_management

AUTO

AUTO

1.2、操作系统配置

1.2.1、配置域名解析文件

主库:/etc/hosts

192.168.56.100 primary

192.168.56.101 standby

 

备库:/etc/hosts

192.168.56.100 primary

192.168.56.101 standby

1.2.2、主备服务器关闭防火墙

[root@primary ~]# service iptables stop

iptables: Setting chains to policy  ACCEPT: filter          [  OK  ]

iptables: Flushing firewall rules:                         [  OK  ]

iptables: Unloading modules:                               [  OK  ]

[root@primary ~]# chkconfig --level 345  iptables off

1.2.3、备库侧创建必要的目录

mkdir -p u01/app/oracle/oradata/oradb

mkdir -p u01/app/oracle/fast_recovery_area/oradb

mkdir -p u01/app/oracle/admin/oradb/adump

mkdir -p /home/oracle/archive

二、     ADG部署

2.1、主库侧配置静态监听

listener.ora

 

LISTENER =

  (DESCRIPTION_LIST =

    (DESCRIPTION =

      (ADDRESS = (PROTOCOL = TCP)(HOST =  primary)(PORT = 1521))

      (ADDRESS = (PROTOCOL = IPC)(KEY =  EXTPROC1521))

    )

  )

                       

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 =

     (SID_NAME = oradb)

     (ORACLE_HOME =  /u01/app/oracle/product/11.2.0/db_1)

    )

   )

 

ADR_BASE_LISTENER =  /u01/app/oracle

#关闭监听器

lsnrctl stop

#启动监听器

lsnrctl start

2.2、主库侧配置本地服务名

tnsnames.ora

 

STY =

  (DESCRIPTION =

     (ADDRESS_LIST =

      (ADDRESS =  (PROTOCOL = TCP)(HOST = 192.168.56.101)(PORT = 1521))

    )

     (CONNECT_DATA =

       (SERVICE_NAME = oradb)

    )

  )

 

PRI =

  (DESCRIPTION =

     (ADDRESS_LIST =

      (ADDRESS =  (PROTOCOL = TCP)(HOST = 192.168.56.100)(PORT = 1521))

    )

     (CONNECT_DATA =

       (SERVICE_NAME = oradb)

)

  )

2.3、备库侧配置静态监听、本地服务名

#主库服务器操作

 

scp listener.ora tnasnames.ora  oracle@standby:$ORACLE_HOME/network/admin

 

#备库服务器上操作

修改监听器文件中host为备机

LISTENER =

   (DESCRIPTION_LIST =

    (DESCRIPTION  =

      (ADDRESS =  (PROTOCOL = TCP)(HOST = standby)(PORT = 1521))

      (ADDRESS =  (PROTOCOL = IPC)(KEY = EXTPROC1521))

    )

  )

 

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  =

     (SID_NAME =  oradb)

      (ORACLE_HOME = /u01/app/oracle/product/11.2.0/db_1)

    )

   )

 

ADR_BASE_LISTENER = /u01/app/oracle

 

#关闭监听器

lsnrctl stop

#启动监听器

lsnrctl start

2.4、主库侧开启归档、附加日志

#配置归档路径和开启附加日志

startup mount;

alter database archivelog;

alter database force logging;

alter database open;

2.5、主库侧配置归档删除策略

$ rman target /

RMAN> CONFIGURE ARCHIVELOG DELETION  POLICY TO SHIPPED TO ALL STANDBY;

 

RMAN> show all;

RMAN configuration parameters for database  with db_unique_name JBDB are:

CONFIGURE RETENTION POLICY TO REDUNDANCY 1;  # default

CONFIGURE BACKUP OPTIMIZATION OFF; #  default

CONFIGURE DEFAULT DEVICE TYPE TO DISK; #  default

CONFIGURE CONTROLFILE AUTOBACKUP OFF; #  default

CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR  DEVICE TYPE DISK TO '%F'; # default

CONFIGURE DEVICE TYPE DISK PARALLELISM 1  BACKUP TYPE TO BACKUPSET; # default

CONFIGURE DATAFILE BACKUP COPIES FOR DEVICE  TYPE DISK TO 1; # default

CONFIGURE ARCHIVELOG BACKUP COPIES FOR  DEVICE TYPE DISK TO 1; # default

CONFIGURE MAXSETSIZE TO UNLIMITED; #  default

CONFIGURE ENCRYPTION FOR DATABASE OFF; #  default

CONFIGURE ENCRYPTION ALGORITHM 'AES128'; #  default

CONFIGURE COMPRESSION ALGORITHM 'BASIC' AS  OF RELEASE 'DEFAULT' OPTIMIZE FOR LOAD TRUE ; # default

CONFIGURE ARCHIVELOG DELETION  POLICY TO APPLIED ON ALL STANDBY;

CONFIGURE SNAPSHOT CONTROLFILE NAME TO  '/u01/app/oracle/product/11.2.0/dbhome_1/dbs/snapcf_jbdb1.f'; # default

 

RMAN>

2.6、主库侧配置standby redo log

standby redo log的文件大小与primary 数据库online redo log 文件大小相同

standby redo log日志文件组的个数依照下面的原则进行计算:

Standby redo log组数公式>=(每个instance日志组个数+1)*instance个数

假如只有一个节点,这个节点有三组redolog,

所以Standby redo log组数>=(3+1)*1 == 4

所以至少需要创建4组Standby redo log。

#查看 Online redo log 大小及位置:

select group#,thread#,members,bytes from v$log;

select group#,member from v$logfile;

 

#添加Standby redo log

alter database add standby logfile group 4  '/u01/app/oracle/oradata/std_redo04.log' size 50m;

alter database add standby logfile group 5 '/u01/app/oracle/oradata/std_redo05.log'  size 50m;

alter database add standby logfile group 6  '/u01/app/oracle/oradata/std_redo06.log' size 50m;

alter database add standby logfile group 7  '/u01/app/oracle/oradata/std_redo07.log' size 50m;

 

#再次查看 Online redo  log 大小及位置:

select group#,thread#,members,bytes from v$log;

select group#,member from v$logfile;

 

#查看 standby redo log  信息:

SELECT  GROUP#,THREAD#,SEQUENCE#,ARCHIVED,STATUS FROM V$STANDBY_LOG;

2.7、主库侧配置ADG参数

#备份spfile文件

create pfile=’/tmp/initbak20211013.ora’ from spfile;

#配置ADG相关参数

alter system set db_unique_name=pri scope=spfile;

alter system set log_archive_config =  'DG_CONFIG=(pri,sty)' scope=spfile;

alter system set log_archive_dest_1 = 'LOCATION=/home/oracle/archive  VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=pri' scope=spfile;

alter system set log_archive_dest_2 =  'SERVICE=sty LGWR SYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE)  DB_UNIQUE_NAME=sty' scope=spfile;

alter system set log_archive_dest_state_1 = ENABLE;

alter system set log_archive_dest_state_2 = ENABLE;

alter system set fal_server=sty scope=spfile;

alter system set fal_client=pri scope=spfile;

alter system set standby_file_management=AUTO  scope=spfile;

 

#重启数据库生效

shutdown

startup

2.8、将主库侧密码文件发送至备库端相应位置

cd $ORACLE_HOME/dbs

scp orapworadb oracle@standby:$ORACLE_HOME/dbs/orapworadb

2.9、主库侧创建备库初始化参数文件发送至备库侧相应位置

create pfile='/tmp/initoradb.ora' from spfile;

 

scp /tmp/initoradb oracle@standby:/$ORACLE_HOME/dbs/

2.10、备库侧修改参数文件

#配置ADG相关参数

sqlplus / as sysdba

startup nomount;

create spfile from pfile;

 

#重启数据库

shutdown

startup nomount

 

alter system set db_unique_name=sty  scope=spfile;

alter system set  log_archive_config='DG_CONFIG=(pri,sty)' scope=spfile;

alter system set log_archive_dest_1 =  'LOCATION=/home/oracle/archive VALID_FOR=(ALL_LOGFILES,ALL_ROLES)  DB_UNIQUE_NAME=sty' scope=spfile;

alter system set log_archive_dest_2 =  'SERVICE=pri LGWR SYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE)  DB_UNIQUE_NAME=pri' scope=spfile;

alter system set fal_server=pri  scope=spfile;

alter system set fal_client=sty  scope=spfile;

alter system set standby_file_management=AUTO  scope=spfile;

 

#重启数据库生效

shutdown

startup nomount

 

2.11、初始化备库数据库

本次选用使用duplicate命令创建standby数据库,因为duplicate时间较长,需在后台运行防止过程中断:

vi dup_dataguard.sh

 

rman target sys/system@pri  auxiliary sys/system@sty nocatalog <<EOF

duplicate target  database for standby from active database dorecover nofilenamecheck;

EOF

 

nohup sh dup_dataguard.sh  > dup_dg.log &

 

tail -200f dup_dg.log

 

#为保证duplicate连接正常,可以先这样测试连接可用:

sqlplus sys/system@pri as sysdba

sqlplus sys/system@sty as sysdba

 

2.12、备库侧开启实时日志应用

shutdown immediate;

startup;

select  database_role,protection_mode,protection_level,open_mode from v$database;

select process,client_process,sequence#,status  from v$managed_standby;

recover managed standby database using  current logfile disconnect from session;

select  process,client_process,sequence#,status from v$managed_standby;

2.13、主库侧数据库定时备份及归档日志清理机

建立rman备份机制,同时清理过期失效的归档日志。(此处省略)

2.14、备库归档日志定期删除

部署定时任务进行历史归档清理 因为备库没有备份任务,为防止后续备库端归档满,需要部署定时任务进行历史归档清理,下面给出一个示例:

mkdir /home/oracle/scripts

cd /home/oracle/scripts

vi del_arch.sh


rman target / <<EOF >>  /home/oracle/scripts/del_arch.log

delete noprompt archivelog all  completed before 'sysdate - 1/24';

EOF

 

chmod +x del_arch.sh

crontab -e

0 * * * * /bin/sh  /home/oracle/scripts/del_arch.sh

 


三、     ADG部署测试

3.1、主库侧执行日志切换

在主库侧执行日志,观测备库是否同步执行了切换操作。

#pri执行日志切换

archive log list;

alter system switch logfile;

archive log list;

 

#sty观测日志的sequence是否同步变化

archive log list;

archive log list;

3.2、查看备库启动的DG进程

select  process,client_process,sequence#,status from v$managed_standby;

3.3、查看数据库保护模式

#primary 端查看,我们可以看到数据库的保护模式为最大性能

select  database_role,protection_mode,protection_level,open_mode from v$database;

 

#standby 端查看,也是一样的。

select  database_role,protection_mode,protection_level,open_mode from v$database;

3.4、查看DG的日志信息

select * from  v$dataguard_status;

3.5、数据库同步LAG确认

#方式一:

查询结果显示,在DATUM_TIME列是接近当前时间的情况下,transport lag和apply lag两列的值均为0或是接近0,一般认定是同步正常。

set lines 1000

col value for a15

select * from v$dataguard_stats;

 

#方式二:

查询备库的SCN,观察是否随着时间不断增长,以此来辅助判断DG实时同步:

select current_scn from v$database;

3.6、数据库同步异常故障排除

主库查询对应dest_id的error信息:

select error from v$archive_dest  where dest_id = 2;

四、     数据同步验证

4.1、主库解锁scott用户

#在primary端创建解锁scott用户并创建测试表,插入10000行数据

#primary 端操作如下内容

SQL> set line 200

SQL> select username,default_tablespace,account_status  from dba_users where username='SCOTT';

 

USERNAME           DEFAULT_TABLESPACE             ACCOUNT_STATUS

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

SCOTT                          USERS                          EXPIRED &  LOCKED

 

SQL> alter user scott account  unlock;

 

User altered.

 

SQL> conn scott/tiger;

ERROR:

ORA-28001: the password has expired

 

Changing password for scott

New password:

Retype new password:

Password changed

Connected.

 

SQL> show user

USER is "SCOTT"

SQL> select * from tab;

 

TNAME                          TABTYPE  CLUSTERID

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

BONUS                          TABLE

DEPT                           TABLE

EMP                            TABLE

SALGRADE                       TABLE

 

4.2、主库添加数据,验证数据是否能同步

#在primary端创建解锁scott用户并创建测试表,插入10000行数据

#primary 端操作如下内容

SQL> create table test001 (id  number(10),name varchar2(20));

 

Table created.

 

SQL>  begin

         for i in 1..10000 loop

            insert into test001 values  (1,'ww');

        end loop;

       end;

       /

 

PL/SQL procedure successfully  completed.

 

SQL> commit;

Commit complete.

4.3、备库验证数据是否能同步

#standby端查询scott用户是否解锁,以及test001表是否创建并且插入了10000行数据:

SQL> conn scott/tiger;

Connected.

 

SQL> select * from tab;  

 

TNAME                          TABTYPE  CLUSTERID

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

BONUS                          TABLE

DEPT                           TABLE

EMP                            TABLE

SALGRADE                       TABLE

TEST001                        TABLE

 

SQL> select count(*) from  test001;

 

   COUNT(*)

----------

      10000

 


文章转载自踱岚视角,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论