Oracle 11g DG搭建测试
DG(Data Guard)原理结构图
0x00 环境规划说明
主机名称 | IP地址 | SID | db_unique_name | 角色 |
master | 10.20.140.9 | test | test | 主库 |
standby | 10.20.140.10 |
test_dg |
test_dg | 从库 |
0x01 oracle 11g 安装
请查看博主之前的安装文档,这里不在赘述
传送门:https://www.cnblogs.com/DevilCisco/p/16446035.html
oracle主从库的环境变量
名称
|
角色
|
ORACLE_BASE
|
ORACLE_HOME
|
ORACLE_SID
|
ORACLE_UNQNAME
|
PATH
|
LD_LIBRARY_PATH
|
LANG
|
NLS_LANG
|
master
|
主库
|
/home/data/oracle
|
$ORACLE_BASE/product/11.2.0/db_1
|
test
|
test
|
$ORACLE_HOME/bin:/usr/sbin:$PATH
|
$ORACLE_HOME/lib:/lib:/usr/lib
|
C
|
AMERICAN_AMERICA.AL32UTF8
|
standby
|
从库
|
/home/data/oracle
|
$ORACLE_BASE/product/11.2.0/db_1
|
test_dg
|
test_dg
|
$ORACLE_HOME/bin:/usr/sbin:$PATH
|
$ORACLE_HOME/bin:/usr/sbin:$PATH
|
C
|
AMERICAN_AMERICA.AL32UTF8
|
注意:本次环境搭建采取的方法是主库安装oracle11g并创建监听及数据库,而从库只安装oracle11g 软件及创建监听,并无创建任何数据库
0x02 搭建主要步骤
-
开启主库强制日志模式
-
开启主库归档日志,并指定归档路径及归档文件格式
-
主库添加standby redo log
-
修改主库配置,添加DG配置
-
将主库的pfile及密码文件传送至从库,并修改名称及相应配置
-
主库及从库配置静态监听
-
主库按照最新配置启动
-
从库按照最新配置启动至nomount状态
-
在从库启动rman 测试主库及从库的辅助连接
-
在从库启动duplicate 复制主库文件至从库
-
启动从库
-
启动从库的MRP
-
验证同步
0x03 搭建过程
oracle sqlplus优化,修改登录提示符。传送门:https://www.cnblogs.com/DevilCisco/p/16739646.html
su - oracle sqlplus / as sysdba #开启主库强制日志模式 alter database force logging; #查询当前 select open_mode,log_mode,force_logging from v$database;
#查看当前是否开启归档 archive log list; #如果未开启,请关闭数据库并启动至mount状态 shutdown immediate; startup mount; #系统内创建归档目录开启归档 mkdir -p /home/data/oracle/oradata/arch sqlplus / as sysdba #指定归档目录位置 alter system set log_archive_dest_1='location=/home/data/oracle/oradata/arch'; #设置归档文件格式 alter system set log_archive_format='arch_test_%t_%s_%r.arc' scope=spfile; #开启归档 alter database archivelog; #打开数据库 alter database open; #查看归档设置 archive log list; show parameter archive;
查看当前日志组及文件
su - oracle sqlplus / as sysdba #查看当前日志组 select * from v$logfile;
添加standby redo log 日志组,创建目录并指定文件位置
#创建standby redo log日志目录 mkdir -p /home/data/oracle/oradata/standby_redo #添加standby redo log alter database add standby logfile group 4 ('/home/data/oracle/oradata/standby_redo/standby_redo01.log') size 100m; alter database add standby logfile group 5 ('/home/data/oracle/oradata/standby_redo/standby_redo02.log') size 100m; alter database add standby logfile group 6 ('/home/data/oracle/oradata/standby_redo/standby_redo03.log') size 100m; alter database add standby logfile group 7 ('/home/data/oracle/oradata/standby_redo/standby_redo04.log') size 100m; #查看当前设置的standby redo select * from v$standby_log;
su - oracle sqlplus / as sysdba #设置db_unique_name alter system set db_unique_name='test' scope=spfile; #设置DG归档应用重做的主从库 alter system set log_archive_config='DG_CONFIG=(test,test_dg)'; #指定主库归档路径对应的db_unique_name及所属角色 alter system set log_archive_dest_1='LOCATION=/home/data/oracle/oradata/arch db_unique_name=test valid_for=(ALL_LOGFILES,ALL_ROLES)'; #指定从库的service name 同步方式为异步 db_unique_name及所属角色 alter system set log_archive_dest_2='SERVICE=test_dg ASYNC lgwr db_unique_name=test_dg valid_for=(ONLINE_LOGFILES,PRIMARY_ROLE)'; #启用主库及DG备库的归档路径设置 alter system set log_archive_dest_state_1=enable; alter system set log_archive_dest_state_2=enable; #设置归档最大进程数 alter system set log_archive_max_processes=4; #设置远程登录密码模式为独占模式 alter system set remote_login_passwordfile='EXCLUSIVE' scope=spfile; #设置主从同步文件时的目录 #这里须设置绝对路径,一般为主库的数据文件,控制文件等所在目录 ,主库无需设置,从库设置 alter system set db_file_name_convert='test','test_dg' scope=spfile; alter system set log_file_name_convert='test','test_dg' scope=spfile; #设置主从同步的管理方式为自动 alter system set standby_file_management='AUTO'; #指定FAL的server和client alter system set fal_server='test_dg'; alter system set fal_client='test';
FAL server client说明:
FAL指获取归档日志(Fetch Archived Log)
在一定的条件下,或者因为网络失败,或者因为资源紧张,会在primary和standby之间产生裂隙,也就是有些归档日志没有及时的传输并应用到standby库。
因为MRP(managed recovery process)/LSP(logical standby process)没有与primary直接通讯的能力来获取丢失的归档日志。因此这些gaps通过FAL客户和服务器来解决,由初始化参数定义FAL_CLIENT和FAL_SERVER。 FAL_SERVER指定一个Oracle Net service name,standby数据库使用这个参数连接到FAL server,这个参数适用于standby站点。比如,FAL_SERVER = PrimaryDB,此处PrimaryDB是一个TNS name,指向primary库。 FAL_CLIENT指定一个FAL客户端的名字,以便FAL Server可以引用standby库,这也是一个TNS name,primary库必须适当配置此TNS name指向stanby库。这个参数也是在standby库端设置。
比如,FAL_CLIENT = StandbyDB,StandbyDB是standby库的TNS name。 FAL_CLIENT和FAL_SERVER应该成对设置或改变。 这两个参数只需在standby库设置,但也可以在primary库设置这两个参数,以方便switchover或failover时primary库转变为standby角色
DG是互相转换的,为了避免gaps,指定FAL会避免很多问题,一般FAL_CLIENT 为自身,FAL_SERVER指定对方
将主库的pfile及密码文件传送至从库,并修改名称及相应配置
检查主库配置,创建pfile文件
sqlplus / as sysdba
create pfile from spfile
#此时会在$ORACLE_HOME/dbs 目录下生成一个名称为:init<SID>.ora的文件
检查配置文件后,将刚刚生成的文件以及密码文件orapw+<sid> 通过scp发送给从库,并在从库更改文件名称为从库的SID
这里从库的sid为:test_dg,那pfile以及密码文件的名称分别更改为:inittest_dg.ora orapwtest_dg
修改inittest_dg.ora配置项
vi inittest_dg.ora #注意修改sid test_dg.__db_cache_size=3204448256 test_dg.__java_pool_size=16777216 test_dg.__large_pool_size=33554432 test_dg.__oracle_base='/home/data/oracle'#ORACLE_BASE set from environment test_dg.__pga_aggregate_target=2701131776 test_dg.__sga_target=4043309056 test_dg.__shared_io_pool_size=0 test_dg.__shared_pool_size=738197504 test_dg.__streams_pool_size=0 #提前创建该目录,此目录地址无须刻意修改为从库sid目录,和主库保持一致也行,但是目录必须提前创建好 *.audit_file_dest='/home/data/oracle/admin/test/adump' *.audit_trail='db' *.compatible='11.2.0.4.0' *.control_files='/home/data/oracle/oradata/test/control01.ctl','/home/data/oracle/oradata/test/control02.ctl' *.db_block_size=8192 *.db_domain='' #这里必须注意,需要填写的是主库的数据文件所在的目录,且后面从库的目录必须提前创建好,这里用的是和主库一样的路径。 *.db_file_name_convert='/home/data/oracle/oradata/test','/home/data/oracle/oradata/test' #这里的db_name 必须是主库的,可以通过在主库中show parameter name 来查看db_name *.db_name='test' #这里设置的是从库的unique_name *.db_unique_name='test_dg' *.diagnostic_dest='/home/data/oracle' *.dispatchers='(PROTOCOL=TCP) (SERVICE=testXDB)' #这里设置的是和主库相反的设置 *.fal_client='test_dg' *.fal_server='test' *.log_archive_config='DG_CONFIG=(test,test_dg)' #注意修改,此时是从库的配置文件,dest_1是从库,dest_2是主库 *.log_archive_dest_1='LOCATION=/home/data/oracle/oradata/arch db_unique_name=test_dg valid_for=(ALL_LOGFILES,ALL_ROLES)' #和主库的配置互相呼应 *.log_archive_dest_2='SERVICE=test ASYNC lgwr db_unique_name=test valid_for=(ONLINE_LOGFILES,PRIMARY_ROLE)' *.log_archive_dest_state_1='ENABLE' *.log_archive_dest_state_2='ENABLE' *.log_archive_format='arch_test_%t_%s_%r.arc' *.log_archive_max_processes=4 #同样设置的必须是绝对路径,本次使用的是和主库一样的目录,已提前创建好 *.log_file_name_convert='/home/data/oracle/oradata/test','/home/data/oracle/oradata/test' *.memory_target=6728712192 *.open_cursors=300 *.processes=150 *.remote_login_passwordfile='EXCLUSIVE' *.standby_file_management='AUTO' *.undo_tablespace='UNDOTBS1'
下面是关键配置项,需要注意:
#这里必须注意,需要填写的是主库的数据文件所在的目录,且后面从库的目录必须提前创建好,这里用的是和主库一样的路径。
*.db_file_name_convert='/home/data/oracle/oradata/test','/home/data/oracle/oradata/test'
#这里的db_name 必须是主库的,可以通过在主库中show parameter name 来查看db_name
*.db_name='test'
#这里设置的是和主库相反的设置
*.fal_client='test_dg'
*.fal_server='test'
*.log_archive_config='DG_CONFIG=(test,test_dg)'
#注意修改,此时是从库的配置文件,dest_1是从库,dest_2是主库
*.log_archive_dest_1='LOCATION=/home/data/oracle/oradata/arch db_unique_name=test_dg valid_for=(ALL_LOGFILES,ALL_ROLES)'
#和主库的配置互相呼应
*.log_archive_dest_2='SERVICE=test ASYNC lgwr db_unique_name=test valid_for=(ONLINE_LOGFILES,PRIMARY_ROLE)'
#同样设置的必须是绝对路径,本次使用的是和主库一样的目录,已提前创建好 *.log_file_name_convert='/home/data/oracle/oradata/test','/home/data/oracle/oradata/test'
主库及从库配置静态监听
主库:
vi $ORACLE_HOME/network/admin/listener.ora #追加如下内容 SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (GLOBAL_DBNAME = test) #主库的db_unique_name (ORACLE_HOME = /home/data/oracle/product/11.2.0/db_1) (SID_NAME= test) #主库的sid ) )
vi $ORACLE_HOME/network/admin/tnsnames.ora #追加如下内容 test = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 10.20.140.9)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = test) ) ) test_dg = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 10.20.140.10)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = test_dg) ) )
从库:
vi $ORACLE_HOME/network/admin/listener.ora #追加如下内容 SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (GLOBAL_DBNAME = test_dg) #从库的db_unique_name (ORACLE_HOME = /home/data/oracle/product/11.2.0/db_1) (SID_NAME= test_dg) #从库的sid ) )
vi $ORACLE_HOME/network/admin/tnsnames.ora #追加如下内容 test = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 10.20.140.9)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = test) ) ) test_dg = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 10.20.140.10)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = test_dg) ) )
主库和从库重新启动监听
lsnrctl stop
lsnrctl start
lsnrctl status
正常情况下静态监听的状态为Unknown,动态监听的状态为Ready,如图
#因为主库更改了配置,并生成了新的pfile,因此我们启动创建新的spfile sqlplus / as sysdba shutdown immediate; startup nomount pfile='/home/data/oracle/product/11.2.0/db_1/dbs/inittest.ora'; create spfile from pfile; shutdown immediate; startup;
sqlplus / as sysdba startup nomount pfile='/home/data/oracle/product/11.2.0/db_1/dbs/inittest_dg.ora';
#创建spfile
create spfile from pfile;
rman target sys/主库sys密码@test auxiliary sys/从库sys密码@test_dg
如果正常应当为如下图:
Rman> duplicate target database for standby from active database nofilenamecheck; #此时会启动复制数据库脚本复制数据文件
下面是博主在这一步遇到的错误,贴出来避免大家入坑
ORA-17628错误:
这个错误就是没有将从库配置中db_file_name_convert和log_file_name_convert路径写成绝对路径,且从库没有提前创建好,导致无法复制数据文件到从库
解决方法:更改参数 重启数据库至nomount状态
sqlplus / as sysdba alter system set db_file_name_conert='/home/data/oracle/oradata/test','/home/data/oracle/oradata/test' scope=spfile; alter system set log_file_name_conert='/home/data/oracle/oradata/test','/home/data/oracle/oradata/test' scope=spfile;
shutdown immediate;
startup nomount;
接着从新开始duplicate ,此时需要退出Rman 重新连接
rman target sys/主库sys密码@test auxiliary sys/从库sys密码@test_dg
ORA-27040错误:
该错误是由于从库没有提前创建standby_redo日志组对应的目录
解决方法:创建目录,重新启动duplicate
mkdir -p /home/data/oracle/oradata/standby_redo/
上图代表duplicate 完成,成功复制数据库
从库启动默认是只读的方式 read only
sqlplus / as sysdba select status from v$intance; #此时应显示的是mounted #打开数据库 alter database open; #查看数据库当前的open_mode select open_mode from v$database;
alter database recover managed standby database disconnection from session;
查看MRP进程
select PROCESS,SEQUENCE#,STATUS,DELAY_MINS from v$managed_standby;
查看主库的进程
select process,sequence#,status,delay_mins from v$managed_standby;
主库:创建表,插入新的数据,由于当前使用的异步同步,因此需要主库切归档才会触发同步
create table abc (id int); insert into abc values (222); insert into abc values(333); commit alter system switch logfile;
查看当前DG使用的模式:
select dbid,name,current_scn,protection_mode,database_role,force_logging,open_mode,switchover_status from v$database;
可以看到,使用的是默认的最大性能模式
0x04 DG的日常启停
停止:
- 先停止备库的redo日志应用
- 关闭主库
- 关闭备库
alter database recover managed standby database cancel;
#关闭主库
shutdown immediate;
#关闭备库
shutdown immediate;
启动:
- 启动主库和备库的监听
- 启动备库至nomount
- 指定备库为standby database
- 以只读模式打开备库
- 启动主库
#启动监听 lsnrctl start #启动备库 startup nomount #更改备库为standby alter database mount standby database #以只读模式打开备库 alter database open read only #启动同步进程 alter database recover managed standby database usingcurrent logfile disconnect from session; #启动主库 startup
至此,DataGuard 初步测试完成。关于DG还会有其他模式的测试。 测试环境,文中如有纰漏,欢迎评论指正。