ADG原理介绍
随着Oracle ADG的出现,Oracle在读写分离的支持上又进一步了,可以在延迟很少的情况下提供读,而且不会出现复制错误或者数据不一致的问题。
Active Dataguard Reader Farm架构至少存在以下优势:
(1)管理维护简单,DBA只要熟悉Dataguard的管理即可,无需再额外学习其他方面的新知识;
(2)Active Dataguard Reader Farm节点是灵活可扩展的,可以在线添加或者删除节点,并且可以线性扩展而不对生产系统造成影响
(3)可以真正做到实时查询,不会应为大事务造成同步阻塞,性能有保障
(4)没有数据类型的限制
(5)高可用性,节点的宕机都不会影响到数据库的可用性。
但是同时也需要注意:
(1)Active Dataguard是11g数据库单独的一个option,需要单独付费的
(2)无法在Active Dataguard Reader Farm节点单独创建索引进行查询优化
(3)在所有Active Dataguard Reader Farm节点上sql的执行计划最好保持一致
以上仅仅只是对Active Dataguard和Active Dataguard Reader Farm做一个简单的介绍,以下是读写分离的架构图,下面奉上搭建步骤
1.准备工作
首先得准备两个能够PING通,并且装了Oracle软件且已经建库的Linux虚拟机,至少有一个虚拟机已经建好库,两个库SID尽量相同,这样会减少很多创建目录的麻烦,这里库的SID都是tms,linux严格区分大小写,所以SID的大小写得注意。
我这里有两个名为rac1和rac2的CentOS虚拟机。
rac1:192.168.87.130(主库) sid:tms
rac2:192.168.87.131(备库) sid:tms
2.在主库做一些操作
2.1强制force logging
SQL> shutdown immediate
SQL> startup mount
SQL> alter database force logging; --修改数据库为强制记日志,这是必须的操作,主库的每一步操作都得记录到日志中去。
2.2开启主库的归档模式
SQL> alter database archivelog; --修改数据库为归档模式,因为dg是通过传送归档日志到备库然后应用来保证主备库一致的。
2.3创建standby redo log
SQL> alter database add standby logfile group 4 ('/u01/app/oracle/oradata/tms/redo04.log') size 50m;
SQL> alter database add standby logfile group 5 ('/u01/app/oracle/oradata/tms/redo05.log') size 50m;
SQL> alter database add standby logfile group 6 ('/u01/app/oracle/oradata/tms/redo06.log') size 50m;
SQL> alter database add standby logfile group 7 ('/u01/app/oracle/oradata/tms/redo07.log') size 50m;
2.4创建pfile
SQL> create pfile from spfile; --这里创建pfile是为了做一些主库参数的配置,并且还得拷贝到备库再次修改成备库的配置。
SQL> shutdown immediate
2.5创建主备库归档目录
[oracle@rac1 ~]$ cd $ORACLE_BASE/oradata/tms
[oracle@rac1 tms]$ mkdir archivelog --建立这个目录是为了存放主库的归档日志文件,并且这个目录会和其他数据文件等等一起拷贝到备库。
2.6在主备库同时创建静态监听listener和tnsname
这里以主库为例,备库自行修改
[oracle@rac1 admin]$ more listener.ora
SID_LIST_LISTENER =
(SID_LIST=
(SID_DESC=
(SID_NAME = PLSExtProc)
(ORACLE_HOME = u01/app/oracle/11.2.0/product/db)
(PROGRAM = extproc)
)
(SID_DESC =
(SID_NAME = tms)
(ORACLE_HOME = u01/app/oracle/11.2.0/product/db)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.87.130)(PORT = 1521))
)
)
ADR_BASE_LISTENER = u01/app/oracle
DIAG_ADR_ENABLED_LISTENER=OFF
INBOUND_CONNECT_TIMEOUT_LISTENER=0
[oracle@rac1 admin]$ more tnsnames.ora
TMS_ST =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.87.131)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = tms)
)
)
TMS_PD =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.87.130)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = tms)
)
)
[oracle@rac1 admin]$ lsnrctl start --启动监听
2.7修改主库pfile文件
[oracle@rac1 dbs]$ vi inittms.ora
--添加如下内容,这个是为了搭建DG添加的配置参数,主备库是有区分的,请注意
DB_UNIQUE_NAME=tms_pd
LOG_ARCHIVE_CONFIG='DG_CONFIG=(tms_pd,tms_st)'
LOG_ARCHIVE_DEST_1=
'LOCATION=/u01/app/oracle/oradata/tms/archivelog
VALID_FOR=(ALL_LOGFILES,ALL_ROLES)
DB_UNIQUE_NAME=tms_pd'
LOG_ARCHIVE_DEST_2=
'SERVICE=tms_st ASYNC
VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE)
DB_UNIQUE_NAME=tms_st'
LOG_ARCHIVE_DEST_STATE_1=ENABLE
LOG_ARCHIVE_DEST_STATE_2=ENABLE
REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE
LOG_ARCHIVE_FORMAT=%t_%s_%r.arc
FAL_SERVER=tms_st
STANDBY_FILE_MANAGEMENT=AUTO
LOG_FILE_NAME_CONVERT='/u01/app/oracle/oradata/tms','/u01/app/oracle/oradata/tms'
2.8用pfile启动主库,并创建spfile
SQL> shutdown immediate
SQL> startup nomount pfile='/u01/app/oracle/11.2.0/product/db/dbs/inittms.ora'
SQL> create spfile from pfile;
2.9创建主备库的备份目录
主库
[oracle@rac1 tms]$ mkdir u01/app/oracle/oradata/tms/backup
备库
[oracle@rac1 tms]$ mkdir /u01/app/oracle/oradata/tms/backup
2.10将口令验证文件和pfile发送到备库
[oracle@rac1 tms]$ scp orapwtms inittms.ora 192.168.87.131:$ORACLE_HOME/dbs
3.在主库做一些操作
3.1在备库修改从主库拷贝来的pfile
[oracle@rac2 dbs]$ vi inittms.ora
--主备需要修改的部分已标红
DB_UNIQUE_NAME=tms_st
LOG_ARCHIVE_CONFIG='DG_CONFIG=(tms_pd,tms_st)'
LOG_ARCHIVE_DEST_1=
'LOCATION=/u01/app/oracle/oradata/tms/archivelog
VALID_FOR=(ALL_LOGFILES,ALL_ROLES)
DB_UNIQUE_NAME=tms_st'
LOG_ARCHIVE_DEST_2=
'SERVICE=tms_st ASYNC
VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE)
DB_UNIQUE_NAME=tms_pd'
LOG_ARCHIVE_DEST_STATE_1=ENABLE
LOG_ARCHIVE_DEST_STATE_2=ENABLE
REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE
LOG_ARCHIVE_FORMAT=%t_%s_%r.arc
FAL_SERVER=tms_pd
STANDBY_FILE_MANAGEMENT=AUTO
LOG_FILE_NAME_CONVERT='/u01/app/oracle/oradata/tms','/u01/app/oracle/oradata/tms'
3.2启动备库到nomount
SQL> startup nomount
备注:此时若遇到ERROR:
ORA-09925: Unable to create audit trail file
Linux Error: 2: No such file or directory
Additional information: 9925
原因是缺少目录
*.audit_file_dest='/u01/app/oracle/admin/tms/adump'
在/u01/app/oracle/admin/tms下创建adump,dpdump,pfile即可
3.3传输主库的temp表空间到备库,并且启动主库
[oracle@rac1 ~]$ cd $ORACLE_BASE/oradata/tms
[oracle@rac1 tms]$ scp temp01.dbf 192.168.87.131:/$ORACLE_BASE/oradata/tms
[oracle@rac1 tms]$ sqlplus / as sysdba
SQL> startup force;
3.4在备库开始使用RMAN进行ADG
[oracle@rac2 ~]$ sqlplus / as sysdba
SQL> startup nomount
SQL> exit
[oracle@rac2 ~]$ rman target sys/oracle@orcl_pd auxiliary sys/oracle@orcl_st
RMAN> duplicate target database for standby from active database nofilenamecheck;
3.5打开备库并开启apply service
SQL> alter database open;
SQL> select open_mode from v$database;
OPEN_MODE
--------------------
READ ONLY
SQL> alter database recover managed standby database disconnect from session;
4.验证
主库
SQL> create table test(id number(10),name varchar2(20));
SQL> insert into test values(1,'test1');
SQL> insert into test values(2,'test2');
SQL> commit;
SQL> alter system switch logfile;
备库
SQL> desc test;
SQL> select * from test;
5.查看备库启动的DG进程
SQL> select process,client_process,sequence#,status from v$managed_standby;
6.查看数据库的保护模式
SQL> select database_role,protection_mode,protection_level,open_mode from v$database;
7.查看DG的日志信息
SQL> select * from v$dataguard_status;