主库与备库建议操作系统版本一致,主库与备库目录路径可以相同也可以不同。主库与备库BD_NAME必须一致,主库与备库数据库软件版本必须一致,包括应用补丁。
查询数据库安装版本:
以Oracle用户登录,进入ORACLE_HOME下OPatch目录,执行以下命令: ./opatch lspatches
结果如下:
因主库与备库数据库软件版本必须保持一致,所以可以采用克隆安装的方式安装备库,克隆安装时需要对主库安装文件进行TAR打包,请注意TAR打包保存路径有充足的磁盘空间。
克隆安装步骤并非必须项,可以以全新安装方式安装备库。
1、打包已安装好的数据库文件
[root@db1 product]# cd /u01 [root@db1 product]# tar -cvf app.tar app/
2、SCP传输打包的tar文件
[root@db1 product]# scp app.tar 172.16.1.20:/u01/app.tar
3、解压tar文件
[root@db2 db_home_1]# tar -xvf app.tar
4、执行安装
[oracle@db2 db_home_1]$ cd $ORACLE_HOME/clone/bin [oracle@db2 bin]$ perl clone.pl ORACLE_BASE=$ORACLE_BASE ORACLE_HOME=$ORACLE_HOME ORACLE_HOME_NAME=OraDB19Home1
5、根据提示用root用户分别执行两个root脚本
主库与备库DB_NAME需保持一致
主库需开启强制日志模式以及归档模式(未开启需要重启数据库)
主库需要保持是正常读写状态(Read write),备库需要NOMOUNT状态
数据库PDB相关SQL命令:
SQL> show pdbs #查看数据库PDB容器状态 SQL> alter pluggable database pdb open; #open某个pdb SQL> alter pluggable database pdb save state; #保存open状态,下次会自动启动
名称解释:
Oracle 12C引入了CDB与PDB的新特性,在ORACLE 12C数据库引入的多租用户环境(Multitenant Environment)中,允许一个数据库容器(CDB)承载多个可插拔数据库(PDB)。CDB全称为Container Database,中文翻译为数据库容器;PDB全称为Pluggable Database,即可插拔数据库。
以Oracle用户执行
sqlplus / as sysdba
进入SQL命令窗口;在SQL 命令窗口执行命令:
alter database force logging;
用于开启强制日志模式。
查询主库是否开启归档模式:
在SQL 命令窗口执行命令:
archive log list;
返回如下结果则表示当前库已经开启归档。如果返回结果绿色字体部分为disable则表示未开启归档。
注意:如果是在图形化安装时开启归档,可能会出现不生效的情况。会造成主库无法传送归档日志备库状态MRP0一直WAIT_FOR_LOG等待日志传送的情况。
开启归档模式的操作步骤:
创建归档保存目录并赋予权限: mkdir -p /u01/arch chown -R oracle:oinstall /u01/arch 以下命令均在SQL命令窗口执行 1、设置归档路径: alter system set log_archive_dest_1='location=/u01/arch'; 2、关闭数据库 shutdown immediate; 3、加载数据库到MOUNT状态 startup mount; 4、开启日志归档模式 alter database archivelog; 5、查询归档模式是否开启 archive log list; 6、开启数据库 alter database open;
查询归档日志文件大小: SQL> select thread#,GROUP#,BYTES ,status from v$log; THREAD# GROUP# BYTES STATUS ---------- ---------- ---------- ---------------- 1 1 209715200 INACTIVE 1 2 209715200 CURRENT 3 209715200 INACTIVE 查询Redo日志路径: SQL> select member from v$logfile; MEMBER ------------------------------------------------- /u01/app/oracle/oradata/ORCL/redo03.log /u01/app/oracle/oradata/ORCL/redo02.log /u01/app/oracle/oradata/ORCL/redo01.log 为主数据库添加"备用联机日志文件",这里要保证备用日志文件与主库联机日志文件相同大小。并且需要比原来的redo log多一组。 以下命令以;分号结尾,由于长度原因导致自动换行,建议复制到TXT文档中查看修改。本例为Group 4、5、6、7共四条命令,以下命令均在SQL命令窗口执行 alter database add standby logfile thread 1 group 4 '/u01/app/oracle/oradata/ORCL/stredo01.log' size 209715200; alter database add standby logfile thread 1 group 5 '/u01/app/oracle/oradata/ORCL/stredo02.log' size 209715200; alter database add standby logfile thread 1 group 6 '/u01/app/oracle/oradata/ORCL/stredo03.log' size 209715200; alter database add standby logfile thread 1 group 7 '/u01/app/oracle/oradata/ORCL/stredo04.log' size 209715200; 配置完成后,检查standby redo log: SQL> select THREAD#,GROUP#,BYTES from v$standby_log; THREAD# GROUP# BYTES ---------- ---------- ---------- 1 4 209715200 1 5 209715200 1 6 209715200 1 7 209715200
如果主库已经有正在运行的监听程序,则需要先停止监听再修改监听配置文件。
监听相关命令: [oracle@db admin]$ lsnrctl status #查看监听状态 [oracle@db admin]$ lsnrctl stop #停止监听 [oracle@db admin]$ lsnrctl start #启动监听 SQL> alter system register; #注册监听
监听配置文件路径:
/u01/app/oracle/product/19.3.0/db_home_1/network/admin/listener.ora
主库:
新增动态监听配置: SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (SID_NAME = PLSExtProc) (ORACLE_HOME = /u01/app/oracle/product/19.3.0/db_home_1) (PROGRAM = extproc) ) ) 以下为单机默认监听: LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 172.16.1.10)(PORT = 1521)) (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0)) ) )
备库:
新增静态监听配置: SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (GLOBAL_DBNAME = orcldg) (ORACLE_HOME = /u01/app/oracle/product/19.3.0/db_home_1) (SID_NAME = orcldg) ) ) 以下为单机默认监听: LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 172.16.1.20)(PORT = 1521)) (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0)) ) )
配置完成后启动监听服务并将数据库注册到监听。
配置文件路径:
/u01/app/oracle/product/19.3.0/db_home_1/network/admin/tnsnames.ora
主库与备库配置一致,可修改主库tnsnames.ora配置文件后以SCP方式传到备库即可。
orcl = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 172.16.1.10)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl) ) ) orcldg = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 172.16.1.20)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcldg) ) )
添加完成后,使用tnsping测试一下主库备库是否互通:
tnsping orcl #这里ping的是orcl表示刚刚添加到配置文件中的网络服务名
tnsping orcldg #这里ping的是orcldg表示刚刚添加到配置文件中的网络服务名
主库:
alter system set log_archive_config='DG_CONFIG=(orcl,orcldg)'; alter system set log_archive_dest_1='location=/u01/arch VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=orcl'; alter system set LOG_ARCHIVE_DEST_2='SERVICE=orcldg LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=orcldg'; alter system set FAL_SERVER=orcldg; alter system set FAL_CLIENT=orcl; alter system set STANDBY_FILE_MANAGEMENT=AUTO;
备库:
如果没有spfile参数文件,则需要先创建一个pfile,作为备库的参数文件
主库上执行:
SQL> create pfile from memory;
新生成的参数文件:
SCP传到备库:
参数文件路径:/u01/app/oracle/product/19.3.0/db_home_1/dbs/
参数文件:initorcl.ora (命名方式:init+数据库SID+后缀名ora)
将备库参数文件中包含目录或路径的条目删除,然后将备库启动到nomount模式
为备库创建spfile
SQL> create spfile from pfile;
再通过spfile启动:
SQL> shut abort SQL> startup nomount 先执行: alter system set DB_UNIQUE_NAME='orcldg' scope=spfile; 再重启: shutdown immediate startup nomount 重启后执行: alter system set log_archive_config='DG_CONFIG=(orcl,orcldg)'; alter system set log_archive_dest_1='location=/u01/arch VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=orcldg'; alter system set LOG_ARCHIVE_DEST_2='SERVICE=orcl LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=orcl'; alter system set FAL_SERVER=orcl; alter system set FAL_CLIENT=orcldg; alter system set standby_file_management=manual;
SQL> select member from v$logfile; SQL> select name from v$datafile;
如果主库与备库的路径不一致,需要进行转换设置:(单条执行)
主库:
alter system set db_file_name_convert='/u01/app/oracle/oradata/ORCLDG/','/u01/app/oracle/oradata/ORCL/' scope=spfile; alter system set log_file_name_convert='/u01/app/oracle/oradata/ORCLDG/','/u01/app/oracle/oradata/ORCL/' scope=spfile;
备库:
alter system set db_file_name_convert='/u01/app/oracle/oradata/ORCL/','/u01/app/oracle/oradata/ORCLDG/' scope=spfile; alter system set log_file_name_convert='/u01/app/oracle/oradata/ORCL/','/u01/app/oracle/oradata/ORCLDG/' scope=spfile;
密码文件路径:/u01/app/oracle/product/19.3.0/db_home_1/dbs/
密码文件:orapworcl (命名方式:orapw+数据库SID)
使用SCP传输密码文件至备库
scp orapworcl 172.16.1.20:/u01/app/oracle/product/19.3.0/db_home_1/dbs/orapworcldg
注意:备库需在nomount状态,如果不是nomount状态,则先shutdown immediate再startup nomount状态。
在备库执行rman:
rman target sys/password@orcl auxiliary sys/password@orcldg nocatalog
执行以下命令,将数据同步至备库:
duplicate target database for standby from active database dorecover nofilenamecheck;
拉取主库数据完成后,查询备库状态,是否MOUNTED
SQL> select open_mode from v$database; OPEN_MODE -------------------- MOUNTED
备库应用实时同步:
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT;
备库取消日志应用同步:
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
以只读模式打开 :
SQL> alter database open read only;
切换到PDB:
SQL> alter session set container=PDB;
以只读模式打开 :
SQL> alter database open read only;
切换回CDB:
SQL> alter session set container=CDB$ROOT;
备库继续日志应用同步:
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT;
配置完成后,记得为主库备库生成新的参数文件。
SQL命令:create pfile from memory;
验证:
在主库写入数据后,登录备库进行查询,验证是否成功同步。
检查同步进程:
SQL命令:select process,status,sequence# from v$managed_standby;
SQL连接: sqlplus sys@orcldg as sysdba 查询数据库日志情况: select * from v$log; 备库同步检测: ALTER SESSION SYNC WITH PRIMARY; 手动切换主库日志: ALTER SYSTEM SWITCH LOGFILE; 设置自动归档: ALTER SYSTEM SET log_archive_start=true SCOPE=spfile; 启用自动归档: ALTER SYSTEM ARCHIVE LOG START; 手动归档主库日志: alter system archive log all; 检查日志应用情况: SELECT NAME,applied FROM v$archived_log; 查看DG状态: SELECT OPEN_MODE, DATABASE_ROLE, SWITCHOVER_STATUS, FORCE_LOGGING, DATAGUARD_BROKER, GUARD_STATUS FROM V$DATABASE; 查询log_archive_dest_2 参数: show parameter log_archive_dest_2 log_archive_dest_2参数说明: 使用LGWR,有两种模式: ASYNC - 异步:redo written by LGWR to local disk---LGWR将redo写到本地LOG文件。LNS进程读取redo,传到standby服务器上。 SYNC - 同步:Redo written to standby by LGWR - LGWR将Redo信息直接写到standby数据库服务器上 同步传输对主库性能影响较大,异步传输对主库性能影响较小。
主备库切换:
ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY;
查看主库DG状态为TO STANDBY 则表示在往备库进行同步,执行主备切换后,主库将被自动关闭。
主备切换成功后,检查备库DG状态为TO PRIMARY