DG 环境搭建
1.设置归档模式
DG环境的搭建必须要把数据库启动到归档模式,并且为了避免开发人员使用nologging语句,我们还要把数据库设置为force logging。
查看数据库是否运行在归档模式:
#su - oracle
$sqlplus / as sysdba
SQL>archive log list;
如图所示,数据库运行在非归档模式,下面我们开始操作,把数据库修改为归档模式:首先关闭数据库
SQL>shutdown immediate;
启动数据库到mount状态下
SQL>startup mount;
SQL>select open_mode from v$database;
(查询结果必须是MOUNTED哦,如果输出的是其它方式,证明操作有误,请重新关闭数据库进行操作)
把数据库修改为归档模式并打开数据库:
SQL>alter database archivelog;
SQL>alter database open;
SQL>archive log list;
图中可以看到我们数据库已经运行在归档模式了,其中Archive destination就是归档日志存放的路径,稍后我们会修改下存放路径。
数据库打开后,我们需要把数据库设为force logging:
SQL>alter database force logging;
SQL> select name,log_mode,force_logging from v$database;
2.添加standby 日志
standby logfile的数量和大小均要与redo logfile相同
查询主库当前redo logfile的数量
SQL> select thread#,group#,members,bytes/1024/1024 from v$log;
从图中可以看到我们主库有三组大小为50M的redo logfile,故我们也需要创建同样数量和大小的standby logfile:
SQL>alter database add standby logfile group 11('/data/oradata/ocrl/redo/redo11_stb01.log') size 50M;
SQL>alter database add standby logfile group 12('/data/oradata/ocrl/redo/redo12_stb01.log') size 50M;
SQL>alter database add standby logfile group 13 ('/data/oradata/ocrl/redo/redo13_stb01.log')size 50M;
SQL>select group#,thread#,sequence#,archived,status from v$standby_log;
3.设置数据库口令文件的使用模式
执行以下命令查看remote_login_passwordfile的值是否EXCLUSIVE
SQL>show parameter remote_login_passwordfile
如果不是,执行以下命令进行设置,并且重启数据库,使其生效:
SQL>alter system set remote_login_passwordfile=EXCLUSIVE scope=spfile;
SQL>shutdown immediate;
SQL>startup;
4.参数设置
DG的搭建需要修改许多数据库的参数,并且部分参数主备库之间有点区别,这需要各位在配置过程细心一点。
a)主库参数设置
SQL>show parameter db_unique_name
SQL>alter system set log_archive_config='dg_config=(ocrl,ocrls)' scope=spfile;
其中dg_config填写的是主备库的db_unique_name。
设置归档日志的存放位置:
SQL>alter system set log_archive_dest_1='LOCATION=/data/oradata/ocrl/archivelogvalid_for=(all_logfiles,all_roles) db_unique_name=ocrl' scope=spfile;
SQL> alter system set log_archive_dest_2='SERVICE=ocrls ASYNCVALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=ocrls' scope=spfile;
注:第一个ocrls是tnsname.ora的连接名,第二个ocrls是DB_UNIQUE_NAME
启用设置的日志路径:
SQL>alter system set log_archive_dest_state_1=enable scope=spfile;
SQL>alter system set log_archive_dest_state_2=enable scope=spfile;
设置归档日志进程的最大数量(视实际情况调整):
SQL>alter system set log_archive_max_processes=30 scope=both;
设置standby库从哪个数据库获取归档日志(只对standby库有效,在主库上设置是为了在故障切换后,主库可以成为备库使用):
SQL>alter system set fal_server=ocrlsscope=both;
设置文件管理模式,此项设置为自动,不然在主库创建数据文件后,备库不会自动创建:
SQL>alter system set standby_file_management=auto scope=spfile;
启用OMF功能:
SQL> alter system set db_create_file_dest='/data/oradata/ocrl/datafile' scope=spfile;
如果主备库文件的存放路径不同,还需要设置以下两个参数(需要重启数据库生效):
SQL> alter system set db_file_name_convert='/data/oradata/ocrls/datafile','/data/oradata/ocrl/datafile','/data/oradata/ocrls/tempfile','/data/oradata/ocrl/tempfile' scope=spfile;
SQL> alter system set log_file_name_convert='/data/oradata/ocrls/redo','/data/oradata/ocrl/redo' scope=spfile;
这步路径的先后顺序在主备库上的设置是不一样的,大家要注意!
b)备库参数设置
完成了以上步骤后,通过以下命令生成一个pfile文件给备库使用:
SQL>create pfile from spfile;
打开生成的文件,修改部分参数,具体如下:
*.audit_file_dest='/u01/app/oracle/admin/ocrls/adump'
*.audit_trail='db'
*.compatible='12.1.0.2.0'
*.control_files='/data/oradata/ocrls/control/control01.ctl','/data/oradata/ocrls/control/control02.ctl'#Restore Controlfile
*.db_block_size=8192
*.db_create_file_dest='/data/oradata/ocrls/datafile'
*.db_domain=''
*.db_file_name_convert='/data/oradata/ocrl/datafile','/data/oradata/ocrls/datafile','/data/oradata/ocrl/tempfile','/data/oradata/ocrls/tempfile'
*.db_name='ocrl'//(这个保持跟主库一样,不能修改)
*.db_unique_name='ocrls' //(设置备库的名字)
*. fal_server=ocrl
*.db_recovery_file_dest_size=10737418240
*.db_recovery_file_dest='/data/oradata/ocrls/flashback'
*.diagnostic_dest='/u01/app/oracle'
*.dispatchers='(PROTOCOL=TCP)(SERVICE=ocrlsXDB)'
*.log_archive_config='dg_config=(ocrl,ocrls)'
*.log_archive_dest_1='LOCATION=/data/oradata/ocrls/archivelog valid_for=(all_logfiles,all_roles) db_unique_name=ocrls'
*.log_archive_dest_2='SERVICE=ocrl ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=ocrl'
*.log_archive_dest_state_1='ENABLE'
*.log_archive_dest_state_2='ENABLE'
*.log_archive_format='%t_%s_%r.arc'
*.log_archive_max_processes=30
*.log_file_name_convert='/data/oradata/ocrl/redo','/data/oradata/ocrls/redo'
*.memory_target=718m
*.open_cursors=300
*.processes=300
*.remote_login_passwordfile='EXCLUSIVE'
*.standby_file_management='AUTO'
*.undo_tablespace='UNDOTBS1'
(配置参数的时候要注意,有些地方跟主库的不一样哦)
c)密码文件配置
密码文件是创建DG不可缺少的一部分,主库的密码文件一般在$ORACLE_HOME/dbs,命名格式是:orapw+db_unique_name
上图是主库的密码文件,如果不存在此文件,我们可以通过以下命令生成一个:
#su - oracle
$cd $ORACLE_HOME/dbs
$orapwdfile=orapwocrl password=oracle
我们将密码文件和刚才修改好的pfile一起拷贝到备库的$ORACLE_HOME/dbs目录下,并重命名密码文件的名字:
主库上copy到备库的方法
备库上修改密码文件名和参数文件
5.listener.ora与tnsnames.ora配置
这两个文件均在$ORACLE_HOME/network/admin目录下,如果没有,可以自行创建一下
a)备库配置
listener.ora内容如下:
LISTENER=
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST =192.168.180.44)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY =EXTPROC1521))
)
)
SID_LIST_LISTENER=
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = ocrls)
(ORACLE_HOME =/u01/app/oracle/product/12.1.0/db_1)
(SID_NAME = ocrls)
)
)
tnsname.ora内容如下:
ocrls =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL= TCP)(HOST = 192.168.180.44)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME =ocrls)
)
)
重启一下监听:
$lsnrctl stop
$lsnrctl start
b)主库配置
listener.ora内容如下:
LISTENER=
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST =192.168.180.44)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY =EXTPROC1521))
)
)
SID_LIST_LISTENER=
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = ocrls)
(ORACLE_HOME =/u01/app/oracle/product/12.1.0/db_1)
(SID_NAME = ocrls)
)
)
tnsname.ora内容如下:
ocrl =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL= TCP)(HOST = 192.168.180.43)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME =ocrl)
)
)
ocrls =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL= TCP)(HOST = 192.168.180.44)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME =ocrls)
)
)
执行以下命令重启监听,使配置生效:
$lsnrctl stop
$lsnrctl start
做完以上配置后,在主备库上执行以下命令,确保两个主机之间网络相通:
$tnsping ocrl
$tnsping ocrls
主库上执行:
备库上执行
6.目录创建
参数和网络配置好后,我们需要为备库dump文件创建相应的目录(对照主库$ORACLE_BASE/admin):
ocrls:/home/oracle@standby>mkdir -p $ORACLE_BASE/admin/ocrls/adump
ocrls:/home/oracle@standby>mkdir -p $ORACLE_BASE/admin/ocrls/dpdump
为数据库文件创建目录(就是之前db_file_name_convert和log_file_name_convert的目录)
ocrls:/data/oradata/ocrls@standby>mkdir -p/data/oradata/ocrls/redo/
ocrls:/data/oradata/ocrls@standby>mkdir -p/data/oradata/ocrls/datafile/
ocrls:/data/oradata/ocrls@standby>mkdir -p /data/oradata/ocrls/control/
7.RMAN复制创建standby库
准备工作都完成了,那我们可以开始standby库的创建了。
注:以下操作在备库完成
a)文件复制
先,我们使用之前修改的pfile把备库启动到nomount状态,生成spfile:
$echo $ORACLE_SID (确认SID是否我们设置的)
SQL> startup nomount pfile='/u01/app/oracle/product/12.1.0/db_1/dbs/initocrls.ora'
SQL> create spfile from pfile;
SQL>shutdown immediate;
SQL>exit;
从spfile启动
复制数据文件,在备库上操作
ocrls:/home/oracle@standby>rman target sys/oracle@ocrl auxiliary sys/oracle@ocrls
确认我们已经连接上主库和备库后,执行以下命令:
RMAN> duplicate target database for standby from active database;
命令执行完后,可以看到主库在开始复制文件到备库中
耐心等待任务的完成,如果中间有错误导致异常退出,需要根据错误信息进行分析。
以下表示执行成功:
复制完成后,打开数据库开启实时同步:
SQL> alter database open;
SQL> alter database recover managed standby database using current logfile
disconnect from session;
查看数据库状态
登陆到主库
$sqlplus / as sysdba
SQL>select database_rolefrom v$database;
登录到备库:
$sqlplus / as sysdba
SQL>select database_rolefrom v$database;
检查归档日志是否能正常传输(日志的序号必须是一样的):
主库
SQL> selectSEQUENCE#, FIRST_TIME, NEXT_TIME, APPLIED, ARCHIVED from V$ARCHIVED_LOG;
备库
SQL> selectSEQUENCE#, FIRST_TIME, NEXT_TIME, APPLIED, ARCHIVED from V$ARCHIVED_LOG;
b)切换日志测试
主库
SQL>alter system switch logfile;
SQL>select SEQUENCE#, FIRST_TIME, NEXT_TIME, APPLIED, ARCHIVED from V$ARCHIVED_LOG;
备库
SQL> select max(sequence#)from v$archived_log;
这样,我们的DG已经配置成功了!