阅读 197

ADG单实例搭建系列之 (DBCA)

一、介绍

The Database Configuration Assistant (DBCA) can also be used as a simple command-line method to create an Oracle Data Guard physical standby database.

The DBCA command qualifier used to create the physical standby database is createDuplicateDB.

dbca -createDuplicateDB      -gdbName global_database_name      -primaryDBConnectionString easy_connect_string_to_primary     -sid database_system_identifier     [-createAsStandby          [-dbUniqueName db_unique_name_for_standby]]     [-customScripts scripts_list] 复制代码

更详细参数可参考:The createDuplicateDB command creates a duplicate of an Oracle database.

Notes:

1、12.2.0.1开始支持DBCA创建物理备库

##限制: 1.主库必须是单机环境,非RAC数据库。 2.主库必须是非CDB环境。 DBCA can only be used to create standby databases for non-multitenant primary databases. In addition, this capability creates only single instance standby databases, not Oracle Real Application Clusters (Oracle RAC) databases. If required, the standby can then be converted to an Oracle RAC standby database, either manually or using Oracle Enterprise Manager Cloud Control. 复制代码

2、18c之后,以上限制已经取消,支持主库是CDB或者RAC环境。

二、环境准备 


主机名ipDB Versiondb_namedb_unique_name
主库orcl192.168.1.17219.3.0.0orclorcl
备库orcl_stby192.168.1.18019.3.0.0orclorcl_stby

Notes:

1、db_unique_name主备库不能相同。

2、db_name主备库需保持一致。

3、主备库DB版本需保持一致。

三、搭建过程

1、Oracle软件安装

主库一键安装:

./AllOracleSilent.sh -i 192.168.1.172 -d 19c -n orcl -o orcl -b /u01/app -s AL32UTF8 复制代码

备库一键安装:(备库仅安装ORACLE软件,不建库)

./AllOracleSilent.sh -i 192.168.1.180 -d 19c -w Y -n orcl_stby -o orcl -b /u01/app -s AL32UTF8 复制代码

一键安装脚本可参考:ORACLE一键安装单机11G/12C/18C/19C并建库脚本

2、环境配置

a.配置hosts文件

主库:

cat <<EOF >> /etc/hosts ##FOR DG BEGIN 192.168.1.180 orcl_stby ##FOR DG END EOF 复制代码

备库:

cat <<EOF >> /etc/hosts ##FOR DG BEGIN 192.168.1.172 orcl ##FOR DG END EOF 复制代码

b.配置静态监听和TNS

主库+备库:

##listener.ora vi /u01/app/oracle/product/19.3.0/db/network/admin/listener.ora ##添加 SID_LIST_LISTENER =   (SID_LIST =     (SID_DESC =       (GLOBAL_DBNAME = orcl)       (ORACLE_HOME = /u01/app/oracle/product/19.3.0/db)       (SID_NAME = orcl)     )   )   ##重启监听 su - oracle -c "lsnrctl stop" su - oracle -c "lsnrctl start"   ##tnsnames.ora su - oracle -c "cat <<EOF >> /u01/app/oracle/product/19.3.0/db/network/admin/tnsnames.ora ##FOR DG BEGIN ORCL =   (DESCRIPTION =     (ADDRESS_LIST =       (ADDRESS = (PROTOCOL = TCP)(HOST = orcl)(PORT = 1521))     )     (CONNECT_DATA =       (SERVICE_NAME = orcl)     )   ) ORCL_STBY =   (DESCRIPTION =     (ADDRESS_LIST =       (ADDRESS = (PROTOCOL = TCP)(HOST = orcl_stby)(PORT = 1521))     )     (CONNECT_DATA =       (SERVICE_NAME = orcl_stby)     )   ) ##FOR DG BEGIN EOF" 复制代码

c.主库配置参数

SQL> select force_logging,log_mode,cdb from gv$database; FORCE_LOGGING LOG_MODE     CDB --------------------------------------- ------------ --- YES ARCHIVELOG   YES ##开启方式 alter database force logging; shutdown immediate startup mount alter database archivelog; alter database open; alter pluggable database all open; 复制代码

d.主库添加stanby log文件

set line222 col member for a60 select t2.thread#,t1.group#,t1.member,t2.bytes/1024/1024 from gv$logfile t1,gv$log t2 where t1.group#=t2.group#;      THREAD#     GROUP# MEMBER                                                       T2.BYTES/1024/1024 ---------- ---------- ------------------------------------------------------------ ------------------          1          3 /oradata/ORCL/redo03.log                                                    120          1          2 /oradata/ORCL/redo02.log                                                    120          1          1 /oradata/ORCL/redo01.log                                                    120   --需要注意: --1.stanby log日志大小与redo log日志保持一致 --2.stanby log数量:  standby logfile=(1+logfile组数)*thread=(1+3)*1=4组,需要加4组standby logfile. --3.thread要与redo log保持一致,如果是rac,需要增加多个thread对应的standby log   ALTER DATABASE ADD STANDBY LOGFILE thread 1  group 4 ('/oradata/ORCL/standby_redo04.log') SIZE 120M, group 5 ('/oradata/ORCL/standby_redo05.log') SIZE 120M, group 6 ('/oradata/ORCL/standby_redo06.log') SIZE 120M, group 7 ('/oradata/ORCL/standby_redo07.log') SIZE 120M; SQL> select t2.thread#,t1.group#,t1.member,t2.bytes/1024/1024 from gv$logfile t1,gv$standby_log t2 where t1.group#=t2.group#;    THREAD#     GROUP# MEMBER    T2.BYTES/1024/1024 ---------- ---------- ------------------------------------------------------------ ------------------  1     4 /oradata/ORCL/standby_redo04.log   120  1     5 /oradata/ORCL/standby_redo05.log   120  1     6 /oradata/ORCL/standby_redo06.log   120  1     7 /oradata/ORCL/standby_redo07.log   120 复制代码

3、 DBCA  AsStandby

dbca -silent -createDuplicateDB \ -gdbName orcl \ -sid orcl \ -sysPassword oracle \ -primaryDBConnectionString 192.168.1.172:1521/orcl \ -nodelist orcl_stby \ -databaseConfigType SINGLE \ -createAsStandby -dbUniqueName orcl_stby \ -datafileDestination '/oradata' 复制代码

4、设置主库+备库DG参数

--主库设置DG参数 ALTER SYSTEM SET LOG_ARCHIVE_CONFIG='DG_CONFIG=(ORCL,ORCL_STBY)'; ALTER SYSTEM SET LOG_ARCHIVE_DEST_1='LOCATION=/archivelog VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=ORCL'; ALTER SYSTEM SET LOG_ARCHIVE_DEST_2='SERVICE=orcl_stby ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=ORCL_STBY'; ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_2=ENABLE; ALTER SYSTEM SET LOG_ARCHIVE_FORMAT='%t_%s_%r.arc' SCOPE=SPFILE; ALTER SYSTEM SET LOG_ARCHIVE_MAX_PROCESSES=4; ALTER SYSTEM SET REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE SCOPE=SPFILE; ALTER SYSTEM SET FAL_SERVER=ORCL_STBY; ALTER SYSTEM SET FAL_CLIENT=ORCL; ALTER SYSTEM SET DB_FILE_NAME_CONVERT='/oradata/ORCL','/oradata/ORCL_STBY' SCOPE=SPFILE; ALTER SYSTEM SET LOG_FILE_NAME_CONVERT='/oradata/ORCL','/oradata/ORCL_STBY'  SCOPE=SPFILE; ALTER SYSTEM SET STANDBY_FILE_MANAGEMENT=AUTO; --备库设置DG参数 ALTER SYSTEM SET LOG_ARCHIVE_CONFIG='DG_CONFIG=(ORCL_STBY,ORCL)'; ALTER SYSTEM SET LOG_ARCHIVE_DEST_1='LOCATION=/archivelog VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=ORCL_STBY'; ALTER SYSTEM SET LOG_ARCHIVE_DEST_2='SERVICE=orcl ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=ORCL'; ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_2=ENABLE; ALTER SYSTEM SET LOG_ARCHIVE_FORMAT='%t_%s_%r.arc' SCOPE=SPFILE; ALTER SYSTEM SET LOG_ARCHIVE_MAX_PROCESSES=4; ALTER SYSTEM SET REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE SCOPE=SPFILE; ALTER SYSTEM SET FAL_SERVER=ORCL; ALTER SYSTEM SET FAL_CLIENT=ORCL_STBY; ALTER SYSTEM SET DB_FILE_NAME_CONVERT='/oradata/ORCL_STBY','/oradata/ORCL' SCOPE=SPFILE; ALTER SYSTEM SET LOG_FILE_NAME_CONVERT='/oradata/ORCL_STBY','/oradata/ORCL'  SCOPE=SPFILE; ALTER SYSTEM SET STANDBY_FILE_MANAGEMENT=AUTO; 复制代码

5、开启日志应用

SQL> select open_mode,database_role from v$database; OPEN_MODE      DATABASE_ROLE -------------------- ---------------- READ ONLY      PHYSICAL STANDBY SQL> show pdbs     CON_ID CON_NAME   OPEN MODE  RESTRICTED ---------- ------------------------------ ---------- ----------  2 PDB$SEED   READ ONLY  NO  3 PDB01   READ ONLY  NO --开启日志应用 alter database recover managed standby database using current logfile disconnect; SQL> select database_role,open_mode from v$database; DATABASE_ROLE  OPEN_MODE ---------------- -------------------- PHYSICAL STANDBY READ ONLY WITH APPLY SQL> SELECT protection_mode FROM v$database; PROTECTION_MODE -------------------- MAXIMUM PERFORMANCE 复制代码

6、测试同步情况

set line222 col member for a60   --查看是否存在RFS和MRP进程 select process,group#,thread#,sequence# from gv$managed_standby; SQL>   --查看standby日志status是否存在active select t1.group#,t1.thread#,t1.bytes/1024/1024,t1.status,t2.member from gv$standby_log t1,gv$logfile t2 where t1.group#=t2.group#; PROCESS   GROUP#       THREAD#  SEQUENCE# --------- ---------------------------------------- ---------- ---------- DGRD   N/A     0        0 DGRD   N/A     0        0 ARCH   N/A     0        0 ARCH   N/A     0        0 ARCH   N/A     0        0 ARCH   N/A     0        0 RFS       N/A     1        0 RFS       1         1       28 MRP0   N/A     1       28 DGRD   N/A     0        0 10 rows selected. SQL> SQL> SQL>      GROUP#    THREAD# T1.BYTES/1024/1024 STATUS     MEMBER ---------- ---------- ------------------ ---------- ------------------------------------------------------------  4     1      120 ACTIVE     /oradata/ORCL_STBY/standby_redo04.log  5     1      120 UNASSIGNED /oradata/ORCL_STBY/standby_redo05.log  6     1      120 UNASSIGNED /oradata/ORCL_STBY/standby_redo06.log  7     1      120 UNASSIGNED /oradata/ORCL_STBY/standby_redo07.log SQL> show pdbs     CON_ID CON_NAME   OPEN MODE  RESTRICTED ---------- ------------------------------ ---------- ----------  2 PDB$SEED   READ ONLY  NO  3 PDB01   READ ONLY  NO --主库插入数据 sqlplus test/test@pdb01 insert into test values (999); commit; --备库查询 SQL> alter session set container=pdb01; SQL> select * from test.test; ID ----------  1  2      999 --备库已同步 复制代码

四、Database Switchover

--是否存在GAP select thread#,low_sequence#,high_sequence# from v$archive_gap; --主库确认可切换角色 select open_mode,database_role,protection_mode,protection_level,switchover_status from v$database; OPEN_MODE            DATABASE_ROLE    PROTECTION_MODE      PROTECTION_LEVEL     SWITCHOVER_STATUS -------------------- ---------------- -------------------- -------------------- -------------------- READ WRITE           PRIMARY          MAXIMUM PERFORMANCE  MAXIMUM PERFORMANCE  TO STANDBY --备库确认可切换角色 select open_mode,database_role,protection_mode,protection_level,switchover_status from v$database; OPEN_MODE            DATABASE_ROLE    PROTECTION_MODE      PROTECTION_LEVEL     SWITCHOVER_STATUS -------------------- ---------------- -------------------- -------------------- -------------------- READ ONLY WITH APPLY PHYSICAL STANDBY MAXIMUM PERFORMANCE  MAXIMUM PERFORMANCE  NOT ALLOWED NOTES: A 如果switchover_status为TO_STANDBY说明可以直接转换 alter database commit to switchover to physical standby; B 如果switchover_status为SESSIONS ACTIVE 则关闭会话 alter database commit to switchover to physical standby with session shutdown; 复制代码

主库:

ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY; SHUTDOWN IMMEDIATE; STARTUP NOMOUNT; ALTER DATABASE MOUNT STANDBY DATABASE; ALTER DATABASE OPEN READ ONLY; ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION; SQL> select open_mode,database_role,protection_mode,protection_level,switchover_status from v$database; OPEN_MODE            DATABASE_ROLE    PROTECTION_MODE      PROTECTION_LEVEL     SWITCHOVER_STATUS -------------------- ---------------- -------------------- -------------------- -------------------- READ ONLY WITH APPLY PHYSICAL STANDBY MAXIMUM PERFORMANCE  MAXIMUM PERFORMANCE  TO PRIMARY 复制代码

备库:

alter system set log_archive_dest_state_2=DEFER; ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY; SHUTDOWN IMMEDIATE; STARTUP; alter system set log_archive_dest_state_2=ENABLE; SQL> select open_mode,database_role,protection_mode,protection_level,switchover_status from v$database; OPEN_MODE            DATABASE_ROLE    PROTECTION_MODE      PROTECTION_LEVEL     SWITCHOVER_STATUS -------------------- ---------------- -------------------- -------------------- -------------------- READ WRITE           PRIMARY          MAXIMUM PERFORMANCE  MAXIMUM PERFORMANCE  TO STANDBY 复制代码

五、Failover

Failover后,原主库将从DG配置中删除,如果原主库启用了Flashback,则在修复故障后,故障的数据库可恢复为新的standby数据库。

ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH; ALTER DATABASE ACTIVATE STANDBY DATABASE; 复制代码

测试Failover

1、主库开启闪回,防止Failover后无法再次切回备库

alter database flashback on; alter system set db_recovery_file_dest='/u01/app/oracle/fast_recovery_area' scope=spfile; alter system set db_recovery_file_dest_size=5G scope=spfile; shutdown immediate startup 复制代码

2、备库进行Failover

ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH; ALTER DATABASE ACTIVATE STANDBY DATABASE; ALTER DATABASE OPEN; --切换成功 select database_role,open_mode from v$database; DATABASE_ROLE    OPEN_MODE ---------------- -------------------- PRIMARY          READ WRITE 复制代码

3、将原主库闪回,切换回备库

--查询新主库的scn号 SQL> select to_char(standby_became_primary_scn) from v$database; TO_CHAR(STANDBY_BECAME_PRIMARY_SCN) ---------------------------------------- 1022650 --原主库闪回到scn 1022650 SQL> flashback database to scn 1022650; Flashback complete. --切换到physical standby SQL> alter database convert to physical standby; Database altered. shutdown immediate startup --开启日志应用 alter database recover managed standby database using current logfile disconnect from session; --原主库已恢复为备库 SQL> select open_mode,database_role from v$database; OPEN_MODE            DATABASE_ROLE -------------------- ---------------- READ ONLY WITH APPLY PHYSICAL STANDBY SQL> select flashback_on from v$database; FLASHBACK_ON ------------------ YES 复制代码

六、Snapshot Standby

Snapshot standby database是ORACLE 11g的新特性。允许Physical standby短时间的使用read write模式。

1、切换为Snapshot Standby

--记录表test状态 SQL> select * from test.test;         ID ----------          1          2          3 --关闭备库 SHUTDOWN IMMEDIATE; STARTUP MOUNT; --取消日志应用 ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL; --查看闪回状态 SELECT flashback_on FROM v$database; FLASHBACK_ON ------------------ NO --切换为snapshot standby ALTER DATABASE CONVERT TO SNAPSHOT STANDBY; --打开数据库到读写状态 ALTER DATABASE OPEN; SELECT flashback_on FROM v$database; FLASHBACK_ON ------------------ RESTORE POINT ONLY --You can now do treat the standby like any read-write database. --主库插入数据,测试之后切换回physical standby是否能同步 insert into test.test values (9999); commit; --备库尝试插入数据,drop表 SQL> insert into test.test values (777); 1 row created. SQL> commit; Commit complete. SQL> select * from test.test;         ID ----------          1          2          3        777 SQL> drop table test.test; Table dropped. 复制代码

2、切换回PHYSICAL STANDBY

--关闭数据库 SHUTDOWN IMMEDIATE; --开启到mount STARTUP MOUNT; --切换回PHYSICAL STANDBY ALTER DATABASE CONVERT TO PHYSICAL STANDBY; --关闭数据库 SHUTDOWN IMMEDIATE; --开启数据库,并开启到read only STARTUP NOMOUNT; ALTER DATABASE MOUNT STANDBY DATABASE; ALTER DATABASE OPEN READ ONLY; --开启日志应用 ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION; SELECT flashback_on FROM v$database; FLASHBACK_ON ------------------ NO --已恢复到PHYSICAL STANDBY,查看表是否正常,期间主库的操作是否同步 SQL> select * from test.test;         ID ----------          1          2          3       9999 复制代码

**注意:**一旦snapshot standby被激活的时间超出了primary 的最大负载时间,再次的本地更新操作将会产生额外的异常。

七、开启FLASHBACK(备库)

--取消日志应用 ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;  --开启闪回 ALTER DATABASE FLASHBACK ON;  --配置闪回参数 alter system set db_recovery_file_dest='/u01/app/oracle/fast_recovery_area' scope=spfile; alter system set db_recovery_file_dest_size=5G scope=spfile; --开启数据库到read only shutdown immediate startup mount alter database open read only; --开启日志应用 ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FRO


作者:Lucifer三思而后行
链接:https://juejin.cn/post/7031943973128110093


文章分类
代码人生
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐