概述

此实验申请地址在这里,时间为4小时。

实验手册在这里

在整个实验中,会创建主备数据库系统,都在OCI上创建。主数据库系统即On-Premises端,备数据库系统即云端,共同组成混合云架构。随后我们会构建主备数据库系统间的ADG。

此实验对于手工搭建ADG很有帮助。

实验 1: 创建主数据库系统

任务1-4:通过Resource Manager创建实例

打包的 terraform 主数据库实例创建脚本 db19c-primary-num.zip

此脚本会创建VCN和一个Shape为VM.Standard2.1的计算实例,名为primary。VCN的Security List中已添加规则,允许ingress到1521的访问。

创建完成后记录其公网IP地址:XXX.XXX.XXX.XXX

主数据库系统也可以直接用OCI中的数据库模板创建,使用的VCN是公网就行。因为为了简便,最终主备数据库系统是通过公网地址通讯的。

任务5:确认数据库已启动

登录计算实例,查看数据库创建日志:

$ tail -f /u01/ocidb/buildsingle.log

INFO (node:primary): Current Single Instance state (11:16:52)...
oracle   13570     1  0 10:46 ?        00:00:00 /u01/app/oracle/product/19c/dbhome_1/bin/tnslsnr LISTENER -inherit
oracle   18631     1  0 11:16 ?        00:00:00 ora_dbw0_ORCL

INFO (node:primary): Single Instance running (see output above)

2022-01-21 11:16:52:[singlestate:Time :primary] Completed successfully in 0 seconds (0h:00m:00s)
2022-01-21 11:16:52:[buildsingle:Done :primary] Building 19c Single Instance
2022-01-21 11:16:52:[buildsingle:Time :primary] Completed successfully in 1856 seconds (0h:30m:56s)

确认数据库和监听均已启动:

ps -ef | grep ORCL
ps -ef | grep tns

确认数据库可以登录:

sudo su - oracle
sqlplus system/Ora_DB4U@localhost:1521/orclpdb

记录数据库名和版本:

SQL> select banner_full from v$version;

BANNER_FULL
--------------------------------------------------------------------------------
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.11.0.0.0

SQL> select NAME from v$database;

NAME
---------
ORCL

实验2: 准备主数据库系统

以下均在主数据库系统操作。

任务1: Open the 1521 Port for the on-premise Database

在VCN设置中,1521端口已开放。此处是指在操作系统一级开放:

sudo firewall-cmd --zone=public --add-port=1521/tcp --permanent
sudo firewall-cmd --reload
sudo firewall-cmd --list-all | grep 1521

任务2: Enable ssh Connect for the Oracle User

其实这一步可以不做,因为用户默认就是可以ssh的,但这一步的目的主要是为了安全,也就是只允许oracle和opc用户ssh。

sudo vi /etc/ssh/sshd_config
# 加入以下
AllowUsers oracle opc
sudo systemctl restart sshd.service

任务3: Enable TDE

Oracle MAA 最佳实践建议使用 Oracle 透明数据加密 (TDE) 来加密主数据库和备用数据库,以确保所有数据都是静态加密的。 数据可以在迁移过程中转换,但强烈建议在迁移之前转换为 TDE,以提供最安全的 Data Guard 环境。

sudo su - oracle
mkdir -p /u01/app/oracle/admin/ORCL/wallet

在文件$ORACLE_HOME/network/admin/sqlnet.ora中添加以下:

ENCRYPTION_WALLET_LOCATION =
   (SOURCE = (METHOD = FILE)
     (METHOD_DATA =
      (DIRECTORY = /u01/app/oracle/admin/ORCL/wallet)
     )
   )

在数据库中创建,打开keystore,创建master key:

connect / as sysdba

-- create keystore
administer key management create keystore '/u01/app/oracle/admin/ORCL/wallet' identified by "Ora_DB4U";

-- open keystore
administer key management set keystore open identified by "Ora_DB4U" container=all;

-- create master key
administer key management set key identified by "Ora_DB4U" with backup using 'backup' container=all;

-- Make keystore autologin
administer key management create auto_login keystore from keystore '/u01/app/oracle/admin/ORCL/wallet' identified by "Ora_DB4U";

-- Reset wallet from PASSWORD to AUTOLOGIN mode.
administer key management set keystore close identified by "Ora_DB4U" container=all;

查看keystore状态:

WRL_TYPE   WRL_PARAMETER                            STATUS     WALLET_TYP WALLET_OR KEYSTORE FULLY_BAC     CON_ID
---------- ---------------------------------------- ---------- ---------- --------- -------- --------- ----------
FILE       /u01/app/oracle/admin/ORCL/wallet/       OPEN       AUTOLOGIN  SINGLE    NONE     NO                 1
FILE                                                OPEN       AUTOLOGIN  SINGLE    UNITED   NO                 2
FILE                                                OPEN       AUTOLOGIN  SINGLE    UNITED   NO                 3

任务4: Encrypt the Data Files

本例仅加密PDB中的USERS表空间。

先确认其未加密:

SQL> alter session set container=orclpdb;

Session altered.

SQL> select tablespace_name, encrypted from dba_tablespaces;

TABLESPACE_NAME                ENC
------------------------------ ---
SYSTEM                         NO
SYSAUX                         NO
UNDOTBS1                       NO
TEMP                           NO
USERS                          NO

加密USERS表空间:

SQL> alter tablespace users encryption online encrypt;

Tablespace altered.

SQL> select tablespace_name, encrypted from dba_tablespaces;

TABLESPACE_NAME                ENC
------------------------------ ---
SYSTEM                         NO
SYSAUX                         NO
UNDOTBS1                       NO
TEMP                           NO
USERS                          YES

任务5: Enable the Network Encryption

对于未由 TDE 加密的任何其他数据库有效负载(例如数据文件或重做标头),也需要通过VPN 连接或 Oracle Net 加密。 在本实验中,您使用公共 Internet 连接本地和云端,因此您需要启用网络加密。

检查网络服务:

connect / as sysdba
set linesize 120
col network_service_banner for a85
select i.network_service_banner from v$session_connect_info i, v$session s where s.sid=i.sid and s.serial# = i.serial# and s.username = 'SYS';

NETWORK_SERVICE_BANNER
-------------------------------------------------------------------------------------
Oracle Bequeath NT Protocol Adapter for Linux: Version 19.0.0.0.0 - Production
Authentication service for Linux: Version 19.0.0.0.0 - Production
Encryption service for Linux: Version 19.0.0.0.0 - Production
Crypto-checksumming service for Linux: Version 19.0.0.0.0 - Production

$ORACLE_HOME/network/admin/sqlnet.ora文件中添加以下:

SQLNET.ENCRYPTION_SERVER=REQUIRED
SQLNET.CRYPTO_CHECKSUM_SERVER=REQUIRED
SQLNET.ENCRYPTION_TYPES_SERVER=(AES256,AES192,AES128)
SQLNET.CRYPTO_CHECKSUM_TYPES_SERVER=(SHA1)
SQLNET.ENCRYPTION_CLIENT=REQUIRED
SQLNET.CRYPTO_CHECKSUM_CLIENT=REQUIRED
SQLNET.ENCRYPTION_TYPES_CLIENT=(AES256,AES192,AES128)
SQLNET.CRYPTO_CHECKSUM_TYPES_CLIENT=(SHA1)

再次检查网络服务,增加了AES256和SHA1两行,表明网络加密已生效:

NETWORK_SERVICE_BANNER
-------------------------------------------------------------------------------------
Oracle Bequeath NT Protocol Adapter for Linux: Version 19.0.0.0.0 - Production
Authentication service for Linux: Version 19.0.0.0.0 - Production
Encryption service for Linux: Version 19.0.0.0.0 - Production
AES256 Encryption service adapter for Linux: Version 19.0.0.0.0 - Production
Crypto-checksumming service for Linux: Version 19.0.0.0.0 - Production
SHA1 Crypto-checksumming service adapter for Linux: Version 19.0.0.0.0 - Production

6 rows selected.

任务6: Enable Achivelog and Flashback

默认未开启归档:

SQL> archive log list
Database log mode              No Archive Mode
Automatic archival             Disabled
Archive destination            /u01/app/oracle/product/19c/dbhome_1/dbs/arch
Oldest online log sequence     15
Current log sequence           17

开启归档和Flashback:

shutdown immediate
startup mount
alter database archivelog;

!mkdir -p /u01/app/oracle/fra/ORCL
ALTER SYSTEM SET DB_RECOVERY_FILE_DEST_SIZE = 10G SCOPE=BOTH SID='*';
ALTER SYSTEM SET DB_RECOVERY_FILE_DEST = '/u01/app/oracle/fra/ORCL' SCOPE=BOTH SID='*';
alter database flashback on;

alter database open;

确认均已开启:

SQL> archive log list
Database log mode              Archive Mode
Automatic archival             Enabled
Archive destination            USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence     15
Next log sequence to archive   17
Current log sequence           17

SQL> select flashback_on from v$database;

FLASHBACK_ON
------------------
YES

任务7: Change Redo Log Size and Create Standby Log

查看redo log group,大小为200M。而最佳建议为1G:

SQL> select group#, bytes, status from v$log;

    GROUP#      BYTES STATUS
---------- ---------- ----------------
         1  209715200 INACTIVE
         2  209715200 CURRENT
         3  209715200 INACTIVE

添加3个1G大小的redo log group:

alter database add logfile group 4 '/u01/app/oracle/oradata/ORCL/redo04.log' size 1024M; 
alter database add logfile group 5 '/u01/app/oracle/oradata/ORCL/redo05.log' size 1024M; 
alter database add logfile group 6 '/u01/app/oracle/oradata/ORCL/redo06.log' size 1024M;

执行多次log switch,直到3个老的200MB的log group变为INACTIVE,然后删除它们:

alter system switch logfile;
alter system checkpoint;

SQL> select group#, bytes, status from v$log;

    GROUP#      BYTES STATUS
---------- ---------- ----------------
         1  209715200 INACTIVE
         2  209715200 INACTIVE
         3  209715200 INACTIVE
         4 1073741824 INACTIVE
         5 1073741824 CURRENT
         6 1073741824 UNUSED

6 rows selected.

alter database drop logfile group 1; 
alter database drop logfile group 2; 
alter database drop logfile group 3; 

现在我们有了3个1G的redo log group。

按照最佳建议,我们需要创建4个4 standby log group,srl表示standby redo log:

alter database add standby logfile thread 1 '/u01/app/oracle/oradata/ORCL/srl_redo01.log' size 1024M;
alter database add standby logfile thread 1 '/u01/app/oracle/oradata/ORCL/srl_redo02.log' size 1024M;
alter database add standby logfile thread 1 '/u01/app/oracle/oradata/ORCL/srl_redo03.log' size 1024M;
alter database add standby logfile thread 1 '/u01/app/oracle/oradata/ORCL/srl_redo04.log' size 1024M;

查看状态:

SQL> select group#,thread#,bytes from v$standby_log;

    GROUP#    THREAD#      BYTES
---------- ---------- ----------
         1          1 1073741824
         2          1 1073741824
         3          1 1073741824
         7          1 1073741824

任务8: Modify the Init Parameters for Best Practice

alter system set STANDBY_FILE_MANAGEMENT=AUTO scope=both;
alter system set DB_LOST_WRITE_PROTECT=TYPICAL scope=both;
alter system set FAST_START_MTTR_TARGET=300 scope=both;

实验3: 创建备数据库系统

在OCI中通过VCN Wizrad创建一个VCN,启用公网连接。名字无所谓,使用默认参数。

在Default Security List中。添加规则,允许ingress到1521的TCP/IP访问。

创建Shape为VM.Stanard2.1的单实例VM DBCS数据库系统,参数如下:

  • 数据库系统名:dbstandby
  • 软件版本:EE-EP
  • storage management software:Logical Volume Manager
  • Hostname prefix: dbstby 最多16字节,为避免重复,建议加个日期或时间
  • 数据库名:ORCL,必须与源数据库一致
  • 数据库版本:19.11.0.0,必须与源数据库一致
  • PDB name: orclpdb
  • Database unique name suffix:stby 强烈建议填写,这样名字可以固定下来
  • 网络:具有公网的子网

数据库系统建立完毕后,记录数据库信息:

  • Database Unique Name:ORCL_lin1dq
  • 公网IP:129.152.2.194

实验4:设置主备数据库系统间的连接

在 Data Guard 配置中,信息在主数据库和备用数据库之间双向传输。 这需要在主数据库和备用数据库上进行基本配置、网络调整和开放端口。

任务1: 配置主机名解析

在主数据库系统的/etc/hosts中,添加备数据库系统的主机名解析:

129.152.2.194	dbstby

在备数据库系统的/etc/hosts中,添加主数据库系统的主机名解析:

129.152.12.48	primary	primary.subnet1.primaryvcn.oraclevcn.com

任务2: Prompt-less SSH configure

配置主数据库系统到备数据库系统的oracle用户无口令SSH访问。

在主数据库系统,oracle用户下,生成秘钥对,拷贝公钥:

$ ssh-keygen -t rsa

$ ls -l ~/.ssh
total 8
-rw-------. 1 oracle oinstall 1679 Jan 21 15:18 id_rsa
-rw-r--r--. 1 oracle oinstall  396 Jan 21 15:18 id_rsa.pub

$ cat .ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDF6icBzKzUj8PmdmWLVSyF5QoNEt+wqYV7OXoyEPi4eKlZtD3+PcdyT+rtUd+WFGXpn78YO7zpskhzWuXRUBJNHJ3PgQdicT/0l2IR0/SE/LRLIxSTV3X9O42JvKes+XebXBQdBayqeeAClqh0FzDQQJtGu0/g8w56NahadCw8hEphFsuDzbwq2V/i/4hLNQEhupcbEJHgsNN+tC9C8xH68e8SfnudmCpZ8lhk3GUgBA5MGd3LwGzjCQHRnVh2s2UmmyVEbp3cIz774q6DyvlR6KJ2/AAUiBjo5IDJK/XleIyS+q724X4/eLEeLxYsU7XPmTde8+4mdEl9LdnOTAxN oracle@primary

将公钥追加到备数据库系统,oracle用户下的~/.ssh/authorized_keys文件中。

[oracle@dbstby ~]$ cat ~/.ssh/authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDF6icBzKzUj8PmdmWLVSyF5QoNEt+wqYV7OXoyEPi4eKlZtD3+PcdyT+rtUd+WFGXpn78YO7zpskhzWuXRUBJNHJ3PgQdicT/0l2IR0/SE/LRLIxSTV3X9O42JvKes+XebXBQdBayqeeAClqh0FzDQQJtGu0/g8w56NahadCw8hEphFsuDzbwq2V/i/4hLNQEhupcbEJHgsNN+tC9C8xH68e8SfnudmCpZ8lhk3GUgBA5MGd3LwGzjCQHRnVh2s2UmmyVEbp3cIz774q6DyvlR6KJ2/AAUiBjo5IDJK/XleIyS+q724X4/eLEeLxYsU7XPmTde8+4mdEl9LdnOTAxN oracle@primary

确认主数据库系统的oracle用户可以无口令ssh登录备数据库系统。

$ ssh oracle@dbstby echo Test success

模仿以上过程,配置备数据库系统到主数据库系统的oracle用户无口令SSH访问,此略。测试语句如下:

ssh oracle@primary echo Test success

实验5A:Deploy Active Data Guard with LVM

任务 1: Manually Delete the Standby Database Created by Tooling

登录备数据库:

SQL> select DB_UNIQUE_NAME from v$database;

DB_UNIQUE_NAME
------------------------------
ORCL_lin1dq

根据上一步输出的DB_UNIQUE_NAME,形成以下脚本并运行:

connect / as sysdba
set heading off linesize 999 pagesize 0 feedback off trimspool on
spool /tmp/files.lst
select 'rm '||name from v$datafile union all select 'rm '||name from v$tempfile union all select 'rm '||member from v$logfile;
spool off
create pfile='/tmp/ORCL_lin1dq.pfile' from spfile;

关闭数据库:

connect / as sysdba
shutdown immediate

运行通过spool生成的脚本文件,删除数据和日志文件:

chmod a+x /tmp/files.lst
vi /tmp/files.lst,删除第1行和最后1行
. /tmp/files.lst

任务 2: Copy the Password File to the Cloud Host

在备数据库系统,拷贝主数据库系统的口令文件:

# 以oracle用户运行
scp oracle@primary:/u01/app/oracle/product/19c/dbhome_1/dbs/orapwORCL $ORACLE_HOME/dbs

任务 3: Copying the Wallet File to the Cloud Host

在备数据库系统:

export DB_UNIQUE_NAME=ORCL_lin1dq
scp oracle@primary:/u01/app/oracle/admin/ORCL/wallet/ewallet.p12 /opt/oracle/dcs/commonstore/wallets/tde/$DB_UNIQUE_NAME
scp oracle@primary:/u01/app/oracle/admin/ORCL/wallet/cwallet.sso /opt/oracle/dcs/commonstore/wallets/tde/$DB_UNIQUE_NAME
chmod 600 /opt/oracle/dcs/commonstore/wallets/tde/$DB_UNIQUE_NAME/*wallet*

任务 4: Configure Static Listeners

A static listener is needed for initial instantiation of a standby database. The static listener enables remote connection to an instance while the database is down in order to start a given instance. See MOS 1387859.1 for additional details. A static listener for Data Guard Broker is optional.

在主数据库系统的$ORACLE_HOME/network/admin/listener.ora文件中添加以下:

SID_LIST_LISTENER=
(SID_LIST=
   (SID_DESC=
   (GLOBAL_DBNAME=ORCL)
   (ORACLE_HOME=/u01/app/oracle/product/19c/dbhome_1)
   (SID_NAME=ORCL)
   )
   (SID_DESC=
   (GLOBAL_DBNAME=ORCL_DGMGRL)
   (ORACLE_HOME=/u01/app/oracle/product/19c/dbhome_1)
   (SID_NAME=ORCL)
   )
)

然后reload 监听:

lsnrctl reload

在备数据库系统的$ORACLE_HOME/network/admin/listener.ora文件中添加以下,注意GLOBAL_DBNAME需与DB_UNIQUE_NAME一致

SID_LIST_LISTENER=
(SID_LIST=
   (SID_DESC=
   (GLOBAL_DBNAME=ORCL_lin1dq)
   (ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1)
   (SID_NAME=ORCL)
   )
   (SID_DESC=
   (GLOBAL_DBNAME=ORCL_lin1dq_DGMGRL)
   (ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1)
   (SID_NAME=ORCL)
   )
)

然后reload 监听:

lsnrctl reload

mount备数据库,虽然之前删除了所有数据文件,但是mount还是没问题的:

$ sqlplus /nolog

SQL*Plus: Release 19.0.0.0.0 - Production on Sat Jan 22 01:53:28 2022
Version 19.11.0.0.0

Copyright (c) 1982, 2020, Oracle.  All rights reserved.

SQL> connect / as sysdba
Connected to an idle instance.
SQL> startup mount
ORACLE instance started.

Total System Global Area 6442449464 bytes
Fixed Size                  9148984 bytes
Variable Size            1090519040 bytes
Database Buffers         5318377472 bytes
Redo Buffers               24403968 bytes
Database mounted.
SQL> exit
Disconnected from Oracle Database 19c EE Extreme Perf Release 19.0.0.0.0 - Production
Version 19.11.0.0.0

任务 5: TNS Entries for Redo Transport

在主数据库端的tnsnames.ora文件中,添加以下net service name,用于传输redo:

# $ORACLE_HOME/network/admin/tnsnames.ora

ORCL_lin1dq =
(DESCRIPTION =
   (SDU=65536)
   (RECV_BUF_SIZE=134217728)
   (SEND_BUF_SIZE=134217728)
   (ADDRESS_LIST =
   (ADDRESS = (PROTOCOL = TCP)(HOST = dbstby)(PORT = 1521))
   )
   (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = ORCL_lin1dq)
      (UR=A)
   )
)

当前,备数据库端的tnsnames.ora文件如下:

# $ORACLE_HOME/network/admin/tnsnames.ora
ORCL_LIN1DQ =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = dbstby.sub01211258140.myvcn.oraclevcn.com)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = ORCL_lin1dq.sub01211258140.myvcn.oraclevcn.com)
    )
  )

改为如下:

## 以下为修改的,改动为去除HOST和SERVICE_NAME中的域名
## 不同的数据库域名在做DML重定向时会报错。
ORCL_LIN1DQ =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = dbstby)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = ORCL_lin1dq)
    )
  )

## 以下为新增的
ORCL =
(DESCRIPTION =
   (SDU=65536)
   (RECV_BUF_SIZE=134217728)
   (SEND_BUF_SIZE=134217728)
   (ADDRESS_LIST =
   (ADDRESS = (PROTOCOL = TCP)(HOST = primary)(PORT = 1521))
   )
   (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = ORCL)
      (UR=A)
   )
)

接下来需要设置TCP socket size为128M(134217728)。备数据库系统已经设置好了:

# /sbin/sysctl -p | grep net.core.*max
net.core.rmem_max = 134217728
net.core.wmem_max = 134217728

我们只需设置主数据库系统,在/etc/sysctl.conf中修改以下:

net.core.rmem_max = 134217728 
net.core.wmem_max = 134217728

使其生效并确认:

# sudo /sbin/sysctl -p

# sudo /sbin/sysctl -a | egrep net.core.[w,r]mem_max
net.core.rmem_max = 134217728
net.core.wmem_max = 134217728

任务 6: Instantiate the Standby Database

在备数据库系统,以oracle用户,首先建立目录:

export DB_UNIQUE_NAME=ORCL_lin1dq
mkdir -p /u02/app/oracle/oradata/$DB_UNIQUE_NAME/pdbseed
mkdir -p /u02/app/oracle/oradata/$DB_UNIQUE_NAME/orclpdb
mkdir -p /u03/app/oracle/redo/$DB_UNIQUE_NAME/onlinelog

以sysdba运行以下SQL(此时数据库处于MOUNTED状态):

alter system set db_file_name_convert='/u01/app/oracle/oradata/ORCL','/u02/app/oracle/oradata/ORCL_lin1dq' scope=spfile;
alter system set db_create_online_log_dest_1='/u03/app/oracle/redo/ORCL_lin1dq/onlinelog' scope=spfile;
alter system set log_file_name_convert='/u01/app/oracle/oradata/ORCL','/u03/app/oracle/redo/ORCL_lin1dq/onlinelog' scope=spfile;
alter system set db_domain='' scope=spfile;

关闭数据库:

shutdown immediate

用RMAN将数据库启动到nomount状态:

[oracle@dbstby ~]$ rman target /

Recovery Manager: Release 19.0.0.0.0 - Production on Sat Jan 22 03:48:57 2022
Version 19.11.0.0.0

Copyright (c) 1982, 2019, Oracle and/or its affiliates.  All rights reserved.

connected to target database (not started)

RMAN> startup nomount

Oracle instance started

Total System Global Area    6442449464 bytes

Fixed Size                     9148984 bytes
Variable Size               1090519040 bytes
Database Buffers            5318377472 bytes
Redo Buffers                  24403968 bytes

执行恢复:

-- 从主数据库系统恢复controlfile
RMAN> restore standby controlfile from service 'ORCL';

Starting restore at 22-JAN-22
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=179 device type=DISK

channel ORA_DISK_1: starting datafile backup set restore
channel ORA_DISK_1: using network backup set from service ORCL
channel ORA_DISK_1: restoring control file
channel ORA_DISK_1: restore complete, elapsed time: 00:00:02
output file name=/u02/app/oracle/oradata/ORCL_lin1dq/control01.ctl
output file name=/u03/app/oracle/fast_recovery_area/ORCL_LIN1DQ/control02.ctl
Finished restore at 22-JAN-22

-- mount数据库
RMAN> alter database mount;

released channel: ORA_DISK_1
Statement processed

-- 恢复数据库,需要一些时间
RMAN> restore database from service 'ORCL' section size 5G;

-- 关闭数据库
RMAN> shutdown immediate

使用SQL Plus再次mount数据库:

$ sqlplus / as sysdba
SQL> startup mount
ORACLE instance started.

Total System Global Area 6442449464 bytes
Fixed Size                  9148984 bytes
Variable Size            1090519040 bytes
Database Buffers         5318377472 bytes
Redo Buffers               24403968 bytes
Database mounted.

任务 7: Clear All Online and Standby Redo Logs

在备数据库端,运行以下SQL生成并运行脚本:

set pagesize 0 feedback off linesize 120 trimspool on
spool /tmp/clearlogs.sql
select distinct 'alter database clear logfile group '||group#||';' from v$logfile;
spool off
@/tmp/clearlogs.sql

clear logfile group相当于重新初始化logfile。

任务 8: Configure Data Guard Broker

在备数据库系统运行以下命令:

show parameter dg_broker_config_file;
show parameter dg_broker_start;
alter system set dg_broker_start=true;
select pname from v$process where pname like 'DMON%';

输出如下:

SQL> show parameter dg_broker_config_file;
dg_broker_config_file1               string      /u01/app/oracle/product/19.0.0
                                                 /dbhome_1/dbs/dr1ORCL_lin1dq.d
                                                 at
dg_broker_config_file2               string      /u01/app/oracle/product/19.0.0
                                                 /dbhome_1/dbs/dr2ORCL_lin1dq.d
                                                 at

SQL> show parameter dg_broker_start;
dg_broker_start                      boolean     FALSE

SQL> alter system set dg_broker_start=true;

SQL> select pname from v$process where pname like 'DMON%';
DMON

DMON是Data Guard Broker Monitor Process,作用如下,详情参考这里

Manages and monitors a database that is part of a Data Guard broker configuration

在主数据库系统,运行同样的命令:

[oracle@primary ~]$ sqlplus / as sysdba

SQL*Plus: Release 19.0.0.0.0 - Production on Sat Jan 22 04:37:38 2022
Version 19.11.0.0.0

Copyright (c) 1982, 2020, Oracle.  All rights reserved.


Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.11.0.0.0

SQL> show parameter dg_broker_config_file;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
dg_broker_config_file1               string      /u01/app/oracle/product/19c/db
                                                 home_1/dbs/dr1ORCL.dat
dg_broker_config_file2               string      /u01/app/oracle/product/19c/db
                                                 home_1/dbs/dr2ORCL.dat
SQL> show parameter dg_broker_start

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
dg_broker_start                      boolean     FALSE
SQL> alter system set dg_broker_start=true;

System altered.

SQL> select pname from v$process where pname like 'DMON%';

PNAME
-----
DMON

在DGMGRL中注册数据库:

$ dgmgrl sys/Ora_DB4U@ORCL

CREATE CONFIGURATION adgconfig AS PRIMARY DATABASE IS ORCL CONNECT IDENTIFIER IS ORCL;
ADD DATABASE ORCL_lin1dq AS CONNECT IDENTIFIER IS ORCL_lin1dq MAINTAINED AS PHYSICAL;
enable configuration;

查看配置状态:

DGMGRL> SHOW CONFIGURATION;

Configuration - adgconfig

  Protection Mode: MaxPerformance
  Members:
  orcl        - Primary database
    orcl_lin1dq - Physical standby database
      Warning: ORA-16854: apply lag could not be determined

Fast-Start Failover:  Disabled

Configuration Status:
WARNING   (status updated 24 seconds ago)

有一个警告,等一会就好了:

DGMGRL> SHOW CONFIGURATION;

Configuration - adgconfig

  Protection Mode: MaxPerformance
  Members:
  orcl        - Primary database
    orcl_lin1dq - Physical standby database

Fast-Start Failover:  Disabled

Configuration Status:
SUCCESS   (status updated 47 seconds ago)

if there is a warning message, Warning: ORA-16809: multiple warnings detected for the member, or Warning: ORA-16854: apply lag could not be determined. You can wait several minutes and show configuration again.

实验 5B: Deploy Active Data Guard with ASM

以下步骤是针对在 Lab5 中使用 ASM 进行存储管理的云数据库。 如果您选择 LVM 作为存储,请使用实验5B。

任务1: Manually Delete the standby Database Created by Tooling

获取数据库的DB_UNIQUE_NAME:

$ sudo su - oracle
$ srvctl config database
ORCL_stby

运行以下SQL以生成脚本:

set heading off linesize 999 pagesize 0 feedback off trimspool on
spool /tmp/files.lst
select 'asmcmd rm '||name from v$datafile union all select 'asmcmd rm '||name from v$tempfile union all select 'asmcmd rm '||member from v$logfile;
spool off
create pfile='/tmp/ORCL_stby.pfile' from spfile;
exit;

赋予脚本执行权限,并删除文件的第1和最后1行:

chmod a+x /tmp/files.lst

保持数据库配置,然后关闭数据库:

srvctl config database -d ORCL_stby > /tmp/ORCL_nrt1d4.config
srvctl stop database -d ORCL_stby -o immediate

输出如下:

$ cat /tmp/ORCL_nrt1d4.config
Database unique name: ORCL_stby
Database name: ORCL
Oracle home: /u01/app/oracle/product/19.0.0.0/dbhome_1
Oracle user: oracle
Spfile: +DATA/ORCL_STBY/PARAMETERFILE/spfile.269.1094644865
Password file:
Domain: sub01211258140.myvcn.oraclevcn.com
Start options: open
Stop options: immediate
Database role: PRIMARY
Management policy: AUTOMATIC
Server pools:
Disk Groups: RECO,DATA
Mount point paths:
Services:
Type: SINGLE
OSDBA group: dba
OSOPER group: dbaoper
Database instance: ORCL
Configured nodes: dbstby0707
CSS critical: no
CPU count: 0
Memory target: 0
Maximum memory: 0
Default network number for database services:
Database is administrator managed

删除数据库文件,需以grid用户运行:

sudo su - grid
. /tmp/files.lst

任务2: Copy the Password File to the Cloud Host

本小节均在备数据库系统操作。

以oracle用户运行:

scp oracle@primary:/u01/app/oracle/product/19c/dbhome_1/dbs/orapwORCL /tmp
chmod 777 /tmp/orapwORCL

切换到grid用户:

$ sudo su - grid
$ asmcmd pwcopy --dbuniquename ORCL_stby -f /tmp/orapwORCL +DATA/ORCL_STBY/orapwORCL_stby
copying /tmp/orapwORCL -> +DATA/ORCL_STBY/orapwORCL_stby
ASMCMD-9453: failed to register password file as a CRS resource

报错了,需以oracle用户运行以下:

srvctl modify database -db ORCL_stby -pwfile '+DATA/ORCL_STBY/orapwORCL_stby'

确认口令文件已成功注册,注意Password file一行:

$ srvctl config database -d ORCL_stby
Database unique name: ORCL_stby
Database name: ORCL
Oracle home: /u01/app/oracle/product/19.0.0.0/dbhome_1
Oracle user: oracle
Spfile: +DATA/ORCL_STBY/PARAMETERFILE/spfile.269.1094644865
Password file: +DATA/ORCL_STBY/orapwORCL_stby
Domain: sub01211258140.myvcn.oraclevcn.com
Start options: open
Stop options: immediate
Database role: PRIMARY
Management policy: AUTOMATIC
Server pools:
Disk Groups: RECO,DATA
Mount point paths:
Services:
Type: SINGLE
OSDBA group: dba
OSOPER group: dbaoper
Database instance: ORCL
Configured nodes: dbstby0707
CSS critical: no
CPU count: 0
Memory target: 0
Maximum memory: 0
Default network number for database services:
Database is administrator managed

任务3: Copying the Wallet File to the Cloud Host

查看$ORACLE_HOME/network/admin/sqlnet.ora文件。
主数据库系统应包含以下内容:

ENCRYPTION_WALLET_LOCATION =
   (SOURCE = (METHOD = FILE)
     (METHOD_DATA =
      (DIRECTORY = /u01/app/oracle/admin/ORCL/wallet)
     )
   )

备数据库系统应包含以下内容:

ENCRYPTION_WALLET_LOCATION=(SOURCE=(METHOD=FILE)(METHOD_DATA=(DIRECTORY=/opt/oracle/dcs/commonstore/wallets/tde/$ORACLE_UNQNAME)))

在备数据库系统,运行以下:

scp oracle@primary:/u01/app/oracle/admin/ORCL/wallet/ewallet.p12 /opt/oracle/dcs/commonstore/wallets/tde/ORCL_stby
scp oracle@primary:/u01/app/oracle/admin/ORCL/wallet/cwallet.sso /opt/oracle/dcs/commonstore/wallets/tde/ORCL_stby
chmod 600 /opt/oracle/dcs/commonstore/wallets/tde/ORCL_stby/*wallet*

任务4: Configure Static Listeners

在主数据库系统的$ORACLE_HOME/network/admin/listener.ora文件中添加以下:

SID_LIST_LISTENER=
(SID_LIST=
   (SID_DESC=
   (GLOBAL_DBNAME=ORCL)
   (ORACLE_HOME=/u01/app/oracle/product/19c/dbhome_1)
   (SID_NAME=ORCL)
   )
   (SID_DESC=
   (GLOBAL_DBNAME=ORCL_DGMGRL)
   (ORACLE_HOME=/u01/app/oracle/product/19c/dbhome_1)
   (SID_NAME=ORCL)
   )
)

然后reload 监听:

lsnrctl reload

在备数据库系统的$ORACLE_HOME/network/admin/listener.ora文件中添加以下(需以grid用户查看),注意GLOBAL_DBNAME需与DB_UNIQUE_NAME一致

SID_LIST_LISTENER=
  (SID_LIST=
    (SID_DESC=
    (GLOBAL_DBNAME=ORCL_stby)
    (ORACLE_HOME=/u01/app/19.0.0.0/grid)
    (SID_NAME=ORCL)
    )
    (SID_DESC=
    (GLOBAL_DBNAME=ORCL_stby_DGMGRL)
    (ORACLE_HOME=/u01/app/19.0.0.0/grid)
    (SID_NAME=ORCL)
    )
  )

然后reload 监听:

lsnrctl reload

重启数据库到mount状态:

srvctl start database -db ORCL_stby -startoption mount

任务5: TNS Entries for Redo Transport

在主数据库端的tnsnames.ora文件中,添加以下net service name,用于传输redo:

# $ORACLE_HOME/network/admin/tnsnames.ora
ORCL_stby =
  (DESCRIPTION =
  (SDU=65536)
  (RECV_BUF_SIZE=134217728)
  (SEND_BUF_SIZE=134217728)
  (ADDRESS_LIST =
    (ADDRESS = (PROTOCOL = TCP)(HOST = dbstby)(PORT = 1521))
  )
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = ORCL_stby)
      (UR=A)
    )
  )

在从数据库的tnsnames.ora文件中,添加以下内容:

ORCL_STBY =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = dbstby)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = ORCL_stby)
    )
  )

ORCL =
  (DESCRIPTION =
  (SDU=65536)
  (RECV_BUF_SIZE=134217728)
  (SEND_BUF_SIZE=134217728)
  (ADDRESS_LIST =
    (ADDRESS = (PROTOCOL = TCP)(HOST = primary)(PORT = 1521))
  )
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = ORCL)
      (UR=A)
    )
  )

接下来设置TCP/IP socket size部分,参考实验5A任务5。最后用以下命令确认:

# sudo /sbin/sysctl -a | egrep net.core.[w,r]mem_max
net.core.rmem_max = 134217728
net.core.wmem_max = 134217728

任务6: Instantiate the Standby Database

本小节均在备数据库系统上操作。

以grid用户运行:

asmcmd mkdir DATA/ORCL_STBY/pdbseed
asmcmd mkdir DATA/ORCL_STBY/orclpdb
asmcmd mkdir RECO/ORCL_STBY/ONLINELOG

在备数据库系统,以oracle用户运行:

ALTER SYSTEM SET db_file_name_convert='/u01/app/oracle/oradata/ORCL','+DATA/ORCL_STBY' scope=spfile;
ALTER SYSTEM SET db_create_online_log_dest_1='+RECO' scope=spfile;
ALTER SYSTEM SET log_file_name_convert='/u01/app/oracle/oradata/ORCL','+RECO/ORCL_STBY/ONLINELOG' scope=spfile;
ALTER SYSTEM SET db_domain='' scope=spfile;
exit;

关闭数据库:

srvctl stop database -d ORCL_stby -o immediate

然后运行RMAN将数据库启动到nomount状态:

$ rman target /
RMAN> startup nomount

Oracle instance started

Total System Global Area    6442449464 bytes

Fixed Size                     9148984 bytes
Variable Size               1140850688 bytes
Database Buffers            5268045824 bytes
Redo Buffers                  24403968 bytes

RMAN> restore standby controlfile from service 'ORCL';

Starting restore at 23-JAN-22
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=27 device type=DISK

channel ORA_DISK_1: starting datafile backup set restore
channel ORA_DISK_1: using network backup set from service ORCL
channel ORA_DISK_1: restoring control file
channel ORA_DISK_1: restore complete, elapsed time: 00:00:03
output file name=+RECO/ORCL_STBY/CONTROLFILE/current.256.1094644361
Finished restore at 23-JAN-22

RMAN> alter database mount;

released channel: ORA_DISK_1
Statement processed

RMAN> restore database from service 'ORCL' section size 5G;
...
channel ORA_DISK_1: restore complete, elapsed time: 00:00:04
Finished restore at 23-JAN-22

RMAN> shutdown immediate

database dismounted
Oracle instance shut down

RMAN> exit

启动数据库到mount状态:

srvctl start database -d ORCL_stby -o mount

任务7: Clear All Online and Standby Redo Logs

在备数据库系统,运行以下SQL生成脚本。

set pagesize 0 feedback off linesize 120 trimspool on
spool /tmp/clearlogs.sql
select distinct 'alter database clear logfile group '||group#||';' from v$logfile;
spool off
@/tmp/clearlogs.sql

任务8: Configure Data Guard Broker

在主备数据库系统均运行以下命令:

show parameter dg_broker_config_file;
show parameter dg_broker_start;
alter system set dg_broker_start=true;
select pname from v$process where pname like 'DMON%';

主数据库系统输出略,可参考实验5A任务8。

备数据库系统输出为:

SQL> show parameter dg_broker_config_file;
dg_broker_config_file1               string      /u01/app/oracle/product/19.0.0
                                                 .0/dbhome_1/dbs/dr1ORCL_stby.d
                                                 at
dg_broker_config_file2               string      /u01/app/oracle/product/19.0.0
                                                 .0/dbhome_1/dbs/dr2ORCL_stby.d
                                                 at

SQL> show parameter dg_broker_start;
dg_broker_start                      boolean     FALSE

SQL> alter system set dg_broker_start=true;
SQL> select pname from v$process where pname like 'DMON%';
DMON

在DGMGRL中注册数据库:

$ dgmgrl sys/Ora_DB4U@ORCL

CREATE CONFIGURATION adgconfig AS PRIMARY DATABASE IS ORCL CONNECT IDENTIFIER IS ORCL;
ADD DATABASE ORCL_stby AS CONNECT IDENTIFIER IS ORCL_stby MAINTAINED AS PHYSICAL;
enable configuration;

查看配置状态:

DGMGRL> SHOW CONFIGURATION;

Configuration - adgconfig

  Protection Mode: MaxPerformance
  Members:
  orcl        - Primary database
    orcl_lin1dq - Physical standby database
      Warning: ORA-16854: apply lag could not be determined

Fast-Start Failover:  Disabled

Configuration Status:
WARNING   (status updated 24 seconds ago)

有一个警告,等一会就好了:

DGMGRL> SHOW CONFIGURATION;

Configuration - adgconfig

  Protection Mode: MaxPerformance
  Members:
  orcl        - Primary database
    orcl_lin1dq - Physical standby database

Fast-Start Failover:  Disabled

Configuration Status:
SUCCESS   (status updated 47 seconds ago)

if there is a warning message, Warning: ORA-16809: multiple warnings detected for the member, or Warning: ORA-16854: apply lag could not be determined. You can wait several minutes and show configuration again.

实验6:测试Active Data Guard

测试DML重定向和switchover。

任务1: Test Transaction Replication

在主数据库系统,创建测试用户并授权:

connect / as sysdba
alter pluggable database all open;
alter session set container=orclpdb;
create user testuser identified by testuser;
grant connect,resource to testuser;
alter user testuser quota unlimited on users;

以测试用户登录,创建测试表和测试数据:

connect testuser/testuser@primary:1521/orclpdb
create table test(a number,b varchar2(20));
insert into test values(1,'line1');
commit;

在备数据库系统,打开数据库:

connect / as sysdba
select open_mode,database_role from v$database;

OPEN_MODE            DATABASE_ROLE
-------------------- ----------------
MOUNTED              PHYSICAL STANDBY

alter database open;
alter pluggable database orclpdb open;
show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 ORCLPDB                        READ ONLY  NO

select open_mode,database_role from v$database;

OPEN_MODE            DATABASE_ROLE
-------------------- ----------------
READ ONLY WITH APPLY PHYSICAL STANDBY

若OPEN_MODE为READ ONLY而非READ ONLY WITH APPLY,则运行以下SQL:

alter database recover managed standby database cancel;
alter database recover managed standby database using current logfile disconnect;
select open_mode,database_role from v$database;

在备数据库系统,以测试用户验证:

connect testuser/testuser@dbstby:1521/orclpdb
select * from test;

         A B
---------- --------------------
         1 line1

任务2: Check Lag between the Primary and Standby

在主数据库系统,准备测试脚本:

wget https://objectstorage.us-ashburn-1.oraclecloud.com/p/Bq05Vhib-p_vraOu-wFpTEmyydA4d8qekXWXcb6W6M3pL43LVSAS2eFwKpYvAVxQ/n/c4u04/b/data-management-library-files/o/workload.sh
wget https://objectstorage.us-ashburn-1.oraclecloud.com/p/KNpGKB2VdoBWC5VWOHvD5vHg9P1OO5mqBJUxNonwY9LzaMaZ8Kcu7w3wBq9xgebW/n/c4u04/b/data-management-library-files/o/scn.sql
chmod a+x workload.sh

这两个脚本内容如下:

$ cat scn.sql
conn system/Ora_DB4U@orclpdb
select current_scn, to_char(sysdate, 'YYYYMMDD-HH12MISS') time from v$database;

$ cat workload.sh
echo ""
echo "  NOTE:"
echo "  To break out of this batch"
echo "  job, please issue CTL-C "
echo ""
echo "...sleeping 5 seconds"
echo ""
sleep 5

  sqlplus -S /nolog << EOF
  connect testuser/testuser@orclpdb;
  drop table sale_orders;
  create table sale_orders(ORDER_ID number, ORDER_DATE varchar2(9), CUSTOMER_ID number);
EOF

c=1
while [ $c -le 1000 ]
do
  sqlplus -S /nolog  << EOF
  connect testuser/testuser@orclpdb;
  insert all
    into sale_orders (ORDER_ID, ORDER_DATE, CUSTOMER_ID) VALUES (3041,'10-MAY-20', 13287)
    into sale_orders (ORDER_ID, ORDER_DATE, CUSTOMER_ID) VALUES (3041,'10-MAY-20', 13287)
    into sale_orders (ORDER_ID, ORDER_DATE, CUSTOMER_ID) VALUES (3041,'10-MAY-20', 13287)
    into sale_orders (ORDER_ID, ORDER_DATE, CUSTOMER_ID) VALUES (3041,'10-MAY-20', 13287)
    into sale_orders (ORDER_ID, ORDER_DATE, CUSTOMER_ID) VALUES (3041,'10-MAY-20', 13287)
    into sale_orders (ORDER_ID, ORDER_DATE, CUSTOMER_ID) VALUES (3041,'10-MAY-20', 13287)
    into sale_orders (ORDER_ID, ORDER_DATE, CUSTOMER_ID) VALUES (3041,'10-MAY-20', 13287)
    into sale_orders (ORDER_ID, ORDER_DATE, CUSTOMER_ID) VALUES (3035,'10-MAY-20', 13287)
    into sale_orders (ORDER_ID, ORDER_DATE, CUSTOMER_ID) VALUES (3041,'10-MAY-20', 13287)
    into sale_orders (ORDER_ID, ORDER_DATE, CUSTOMER_ID) VALUES (3041,'10-MAY-20', 13287)
  select 1 from dual;
  commit;
  select count(*) from sale_orders;
  @scn.sql
EOF
sleep 1
(( c++))
done

运行脚本,保持终端打开:

. ./workload.sh

在备数据库系统,以测试用户登录:

connect testuser/testuser@dbstby:1521/orclpdb
select count(*) from sale_orders;

  COUNT(*)
----------
       330

select count(*) from sale_orders;

  COUNT(*)
----------
       340

在备数据库系统,以SYS用户登录:

connect / as sysdba

SQL> SELECT current_scn FROM v$database;

CURRENT_SCN
-----------
    2923866

SQL> SELECT current_scn FROM v$database;

CURRENT_SCN
-----------
    2923911

set linesize 120;
column name format a25;
column value format a20;
column time_computed format a20;
column datum_time format a20;
select name, value, time_computed, datum_time from v$dataguard_stats;

NAME                      VALUE                TIME_COMPUTED        DATUM_TIME
------------------------- -------------------- -------------------- --------------------
transport lag             +00 00:00:00         01/23/2022 04:33:13  01/23/2022 04:33:12
apply lag                 +00 00:00:00         01/23/2022 04:33:13  01/23/2022 04:33:12
apply finish time         +00 00:00:00.000     01/23/2022 04:33:13
estimated startup time    9                    01/23/2022 04:33:13

用DGMGRL检查延迟:

$ dgmgrl sys/Ora_DB4U@orcl
DGMGRL> show database ORCL_stby

Database - orcl_stby

  Role:               PHYSICAL STANDBY
  Intended State:     APPLY-ON
  Transport Lag:      0 seconds (computed 1 second ago)
  Apply Lag:          0 seconds (computed 1 second ago)
  Average Apply Rate: 1.00 KByte/s
  Real Time Query:    ON
  Instance(s):
    ORCL

Database Status:
SUCCESS

任务3: Test DML Redirection

19c开始,支持DML重定向。

以下操作均在备数据库系统执行。

在DML重定向打开之前,插入会报错。

connect testuser/testuser@dbstby:1521/orclpdb
insert into test values(2,'line2');
ERROR at line 1:
ORA-16000: database or pluggable database open for read-only access

开启就运行正常了:

ALTER SESSION ENABLE ADG_REDIRECT_DML;
insert into test values(2,'line2');

1 row created.
commit;

select * from test;

         A B
---------- --------------------
         2 line2
         1 line1

DML重定向性能上会慢些:

You may encounter the performance issue when using the DML redirection. This is because each of the DML is issued on a standby database will be passed to the primary database where it is executed. The default Data Guard protection mode is Maximum Performance and the redo transport mode is ASYNC. The session waits until the corresponding changes are shipped to and applied to the standby. In order to improve performance of the DML redirection, you need to switch the redo logfile more frequently on the primary side, or you can change the protection mode to Maximum Availability and the redo transport mode to SYNC - This protection mode provides the highest level of data protection, but it’s need the high throughput and low latency network, you can use FastConnect or deploy the Data Guard in different ADs within the same region.

用DGMGRL查看protection mode和redo transport mode:

$ dgmgrl sys/Ora_DB4U@orcl
DGMGRL for Linux: Release 19.0.0.0.0 - Production on Sun Jan 23 04:41:32 2022
Version 19.11.0.0.0

Copyright (c) 1982, 2019, Oracle and/or its affiliates.  All rights reserved.

Welcome to DGMGRL, type "help" for information.
Connected to "ORCL"
Connected as SYSDBA.
DGMGRL> show configuration

Configuration - adgconfig

  Protection Mode: MaxPerformance
  Members:
  orcl      - Primary database
    orcl_stby - Physical standby database

Fast-Start Failover:  Disabled

Configuration Status:
SUCCESS   (status updated 19 seconds ago)

DGMGRL> show database orcl LogXptMode
  LogXptMode = 'ASYNC'

DGMGRL> show database orcl_stby LogXptMode
  LogXptMode = 'ASYNC'

修改protection mode为最大可用,redo transport mode为同步:

DGMGRL> EDIT DATABASE orcl SET PROPERTY LogXptMode='SYNC';
Property "logxptmode" updated
DGMGRL> EDIT DATABASE orcl_stby SET PROPERTY LogXptMode='SYNC';
Property "logxptmode" updated
DGMGRL> EDIT CONFIGURATION SET PROTECTION MODE AS MAXAVAILABILITY;
Succeeded.
DGMGRL> show configuration

Configuration - adgconfig

  Protection Mode: MaxAvailability
  Members:
  orcl      - Primary database
    orcl_stby - Physical standby database

Fast-Start Failover:  Disabled

Configuration Status:
SUCCESS   (status updated 27 seconds ago)

再次插入数据,性能应有所提升(似乎不明显):

SQL> insert into test values(3,'line3');

1 row created.

Elapsed: 00:00:00.49
SQL> commit;

Commit complete.

Elapsed: 00:00:00.15

备数据库改为默认保护模式:

$ dgmgrl sys/Ora_DB4U@orcl
EDIT CONFIGURATION SET PROTECTION MODE AS MAXPERFORMANCE;
EDIT DATABASE orcl_stby SET PROPERTY LogXptMode='ASYNC';
EDIT DATABASE orcl SET PROPERTY LogXptMode='ASYNC';
show configuration

任务4: Switchover to the Cloud

$ dgmgrl sys/Ora_DB4U@orcl
DGMGRL for Linux: Release 19.0.0.0.0 - Production on Sun Jan 23 04:53:39 2022
Version 19.11.0.0.0

Copyright (c) 1982, 2019, Oracle and/or its affiliates.  All rights reserved.

Welcome to DGMGRL, type "help" for information.
Connected to "ORCL"
Connected as SYSDBA.

DGMGRL> validate database ORCL_stby

  Database Role:     Physical standby database
  Primary Database:  orcl

  Ready for Switchover:  Yes
  Ready for Failover:    Yes (Primary Running)

  Flashback Database Status:
    orcl     :  On
    orcl_stby:  Off

  Managed by Clusterware:
    orcl     :  NO
    orcl_stby:  YES
    Validating static connect identifier for the primary database orcl...
    The static connect identifier allows for a connection to database "orcl".

DGMGRL> switchover to orcl_stby
Performing switchover NOW, please wait...
Operation requires a connection to database "orcl_stby"
Connecting ...
Connected to "ORCL_stby"
Connected as SYSDBA.
New primary database "orcl_stby" is opening...
Operation requires start up of instance "ORCL" on database "orcl"
Starting instance "ORCL"...
Connected to an idle instance.
ORACLE instance started.
Connected to "ORCL"
Database mounted.
Database opened.
Connected to "ORCL"
Switchover succeeded, new primary is "orcl_stby"

切换倒是正常,但之前在主数据库系统运行的工作负载脚本失败了:

SP2-0640: Not connected
ERROR:
ORA-12514: TNS:listener does not currently know of service requested in connect
descriptor


SP2-0640: Not connected
SP2-0640: Not connected
SP2-0640: Not connected

主备数据库系统的角色互换了:

-- 备数据库
SQL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 ORCLPDB                        READ WRITE NO
SQL> select open_mode,database_role from v$database;

OPEN_MODE            DATABASE_ROLE
-------------------- ----------------
READ WRITE           PRIMARY
-- 主数据库
SQL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 ORCLPDB                        READ ONLY  NO
SQL> select open_mode,database_role from v$database;

OPEN_MODE            DATABASE_ROLE
-------------------- ----------------
READ ONLY WITH APPLY PHYSICAL STANDBY

实验7:Failover and Reinstate

故障转移是假定主数据库完全失效的计划外事件。 备用数据库立即转换为主数据库。 当您使用最高性能保护模式时,故障转移可能会导致数据丢失。 故障转移后,必须将旧的主数据库恢复为物理备用数据库,通过启用闪回数据库和 Data Guard 代理可使过程变得简单。

任务1: Setup the Current Primary Database Flashback

在上一个实验中,执行了failover,因此本地数据库变为备库,云端数据库变为主库。
在云端数据库,执行以下,可以看到flashback没有打开:

SQL> select open_mode,database_role,flashback_on from v$database;

OPEN_MODE            DATABASE_ROLE    FLASHBACK_ON
-------------------- ---------------- ------------------
READ WRITE           PRIMARY          NO

开启flashback:

shutdown immediate
startup mount
alter database flashback on;
alter database open;
alter pluggable database all open;

select open_mode,database_role,flashback_on from v$database;
OPEN_MODE            DATABASE_ROLE    FLASHBACK_ON
-------------------- ---------------- ------------------
READ WRITE           PRIMARY          YES

任务2: Failover

$ dgmgrl sys/Ora_DB4U@orcl
DGMGRL for Linux: Release 19.0.0.0.0 - Production on Sun Jan 23 05:08:38 2022
Version 19.11.0.0.0

Copyright (c) 1982, 2019, Oracle and/or its affiliates.  All rights reserved.

Welcome to DGMGRL, type "help" for information.
Connected to "ORCL"
Connected as SYSDBA.

DGMGRL> show configuration

Configuration - adgconfig

  Protection Mode: MaxPerformance
  Members:
  orcl_stby - Primary database
    orcl      - Physical standby database

Fast-Start Failover:  Disabled

Configuration Status:
SUCCESS   (status updated 58 seconds ago)

DGMGRL> validate database orcl_stby

  Database Role:    Primary database

  Ready for Switchover:  Yes

  Managed by Clusterware:
    orcl_stby:  YES

DGMGRL> validate database orcl


  Database Role:     Physical standby database
  Primary Database:  orcl_stby

  Ready for Switchover:  Yes
  Ready for Failover:    Yes (Primary Running)

  Managed by Clusterware:
    orcl_stby:  YES
    orcl     :  NO

DGMGRL> failover to orcl
Performing failover NOW, please wait...
Failover succeeded, new primary is "orcl"

现在,主数据库是本地数据库,备用数据库被禁用,需要恢复。

任务3: Reinstate the Previous Primary Database

# Reinstate 前
DGMGRL> show configuration

Configuration - adgconfig

  Protection Mode: MaxPerformance
  Members:
  orcl      - Primary database
    orcl_stby - Physical standby database (disabled)
      ORA-16661: the standby database needs to be reinstated

Fast-Start Failover:  Disabled

Configuration Status:
SUCCESS   (status updated 35 seconds ago)

# Reinstate (时间有点长)
connect sys/Ora_DB4U@orcl_stby
shutdown immediate
startup mount
connect sys/Ora_DB4U@orcl
reinstate database orcl_stby

Reinstating database "orcl_stby", please wait...
Reinstatement of database "orcl_stby" succeeded

# Reinstate 后
DGMGRL> show configuration

Configuration - adgconfig

  Protection Mode: MaxPerformance
  Members:
  orcl      - Primary database
    orcl_stby - Physical standby database

Fast-Start Failover:  Disabled

Configuration Status:
SUCCESS   (status updated 53 seconds ago)

检查备库状态:

SQL> select open_mode,database_role,flashback_on from v$database;

OPEN_MODE            DATABASE_ROLE    FLASHBACK_ON
-------------------- ---------------- ------------------
READ ONLY WITH APPLY PHYSICAL STANDBY YES

实验8:拆除ADG关系

本节参考How to Remove One Standby Database from a Data Guard Configuration (Doc ID 2196935.1)。

DGMGRL配置中删除备库:

$ dgmgrl sys/Ora_DB4U@ORCL

disable database orcl_lin1dq
remove database orcl_lin1dq
remove configuration

在主数据库系统,清空以下参数:

alter system set log_archive_dest_n='' scope=both; 

确保log_archive_config中不包括备库:

SQL> show parameter log_archive_config

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
log_archive_config                   string      dg_config=(ORCL)

补充一点,我感觉配置DG Broker时会自动设置log_archive_config:

SQL> show parameter log_archive_config

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
log_archive_config                   string      dg_config=(ORCL_stby,orcl)

删除DG Broker配置文件:

-- 主库
SQL>  show parameter dg_broker_config
NAME                   TYPE   VALUE
---------------------- ------ ----------------------------------------------------
dg_broker_config_file1 string /u01/app/oracle/product/19c/dbhome_1/dbs/dr1ORCL.dat
dg_broker_config_file2 string /u01/app/oracle/product/19c/dbhome_1/dbs/dr2ORCL.dat

-- 备库
SQL> show parameter dg_broker_config
NAME                   TYPE   VALUE
---------------------- ------ --------------------------------------------------------------
dg_broker_config_file1 string /u01/app/oracle/product/19.0.0/dbhome_1/dbs/dr1ORCL_lin1dq.dat
dg_broker_config_file2 string /u01/app/oracle/product/19.0.0/dbhome_1/dbs/dr2ORCL_lin1dq.dat
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐