大家好,这里是 DBA学习之路,专注于提升数据库运维效率。
目录
前言
自从今年开源了 Oracle一键安装脚本 之后,很多朋友用了之后都是好评连连。
Oracle 一键安装脚本已经部分开源(单机):https://gitee.com/luciferlpc/OracleShellInstall
有部分人咨询是否可以用脚本一键安装 DataGuard?
其实是可以的,但是需要一些小技巧,可以很方便的使用脚本快速搭建 DataGuard。
本文就演示一下如何使用脚本快速搭建 DataGuard。
环境信息
环境信息:
|角色|IP|数据库版本|DB_NAME|DB_UNIQUE_NAME|SERVICES_NAME|TNS_NAME|
|–|–|–|–|–|–|–|–|
|主|192.168.6.191|19C|orcl|orcl|orcl|ORCL_PRI|
|备|192.168.6.121|19C|orcl|orcldg|orcldg|ORCL_STB|
Oracle 一键安装
实战环境使用开源脚本 https://gitee.com/luciferlpc/OracleShellInstall 进行一键安装。
脚本具体试用方式不做详细介绍,请参考文章:
《2025 年宣布一件大事,Oracle 一键安装脚本开源了!》https://www.modb.pro/db/1878623781711785984
主库环境
新建一个主库环境(如果已有主库环境则直接跳过这一步):
[root@lucifer soft]# ./OracleShellInstall -lf ens33 `# 主机网卡名称`\
-n lucifer `# 主机名`\
-op oracle `# 主机 oracle 用户密码`\
-d /u01 `# Oracle 软件安装基础目录`\
-ord /oradata `# 数据库文件存放目录`\
-o orcl `# 数据库名称`\
-dp oracle `# sys/system 用户密码`\
-ds AL32UTF8 `# 数据库字符集`\
-ns AL16UTF16 `# 国家字符集`\
-redo 100 `# 在线重做日志大小(M)`\
-opd Y `# 是否优化数据库`
███████ ██ ████████ ██ ██ ██ ██ ██ ██ ██
██░░░░░██ ░██ ██░░░░░░ ░██ ░██ ░██░██ ░██ ░██ ░██
██ ░░██ ██████ ██████ █████ ░██ █████ ░██ ░██ █████ ░██ ░██░██ ███████ ██████ ██████ ██████ ░██ ░██
░██ ░██░░██░░█ ░░░░░░██ ██░░░██ ░██ ██░░░██░█████████░██████ ██░░░██ ░██ ░██░██░░██░░░██ ██░░░░ ░░░██░ ░░░░░░██ ░██ ░██
░██ ░██ ░██ ░ ███████ ░██ ░░ ░██░███████░░░░░░░░██░██░░░██░███████ ░██ ░██░██ ░██ ░██░░█████ ░██ ███████ ░██ ░██
░░██ ██ ░██ ██░░░░██ ░██ ██ ░██░██░░░░ ░██░██ ░██░██░░░░ ░██ ░██░██ ░██ ░██ ░░░░░██ ░██ ██░░░░██ ░██ ░██
░░███████ ░███ ░░████████░░█████ ███░░██████ ████████ ░██ ░██░░██████ ███ ███░██ ███ ░██ ██████ ░░██ ░░████████ ███ ███
░░░░░░░ ░░░ ░░░░░░░░ ░░░░░ ░░░ ░░░░░░ ░░░░░░░░ ░░ ░░ ░░░░░░ ░░░ ░░░ ░░ ░░░ ░░ ░░░░░░ ░░ ░░░░░░░░ ░░░ ░░░
注意:本脚本仅用于新服务器上实施部署数据库使用,严禁在已运行数据库的主机上执行,以免发生数据丢失或者损坏,造成不可挽回的损失!!!
请选择安装模式 [单机(si)/单机ASM(sa)] : si
数据库安装模式: single
请选择数据库版本 [11|12|19|21|23] : 19
数据库版本: 19
OracleShellInstall 开始安装,详细安装过程可查看日志: tail -2000f /soft/print_shell_install_20250421101635.log
正在进行安装前检查,请稍等......
正在检测安装包 /soft/LINUX.X64_193000_db_home.zip 的 MD5 值是否正确,请稍等......
正在配置本地软件源......已完成 (耗时: 0 秒)
正在获取操作系统信息......已完成 (耗时: 1 秒)
正在安装依赖包......已完成 (耗时: 100 秒)
正在禁用防火墙......已完成 (耗时: 1 秒)
正在禁用 selinux......已完成 (耗时: 1 秒)
正在配置 nsyctl......已完成 (耗时: 0 秒)
正在配置主机名和 hosts 文件......已完成 (耗时: 0 秒)
正在创建用户和组......已完成 (耗时: 1 秒)
正在创建安装目录......已完成 (耗时: 0 秒)
正在配置 Avahi-daemon 服务......已完成 (耗时: 1 秒)
正在配置透明大页 && NUMA && 磁盘 IO 调度器......已完成 (耗时: 2 秒)
正在配置操作系统参数 sysctl......已完成 (耗时: 1 秒)
正在配置 RemoveIPC......已完成 (耗时: 1 秒)
正在配置用户限制 limit......已完成 (耗时: 0 秒)
正在配置 shm 目录......已完成 (耗时: 2 秒)
正在安装 rlwrap 插件......已完成 (耗时: 11 秒)
正在配置用户环境变量......已完成 (耗时: 1 秒)
正在解压 Oracle 安装包......已完成 (耗时: 63 秒)
正在安装 Oracle 软件......已完成 (耗时: 83 秒)
正在创建监听......已完成 (耗时: 2 秒)
正在创建数据库......已完成 (耗时: 447 秒)
正在优化数据库......已完成 (耗时: 22 秒)
恭喜!Oracle 一键安装执行完成 (耗时: 748 秒),现在是否重启主机:[Y/N] Y
正在重启当前节点主机......
安装计时是 748s,也就是说一套单机 19C 从安装到建库结束只需要 12 分钟。
备库环境
备库只需要安装 Oracle 软件即可:
[root@luciferdg soft]# ./OracleShellInstall -lf ens33 `# 主机网卡名称`\
-n luciferdg `# 主机名`\
-op oracle `# 主机 oracle 用户密码`\
-d /u01 `# Oracle 软件安装基础目录`\
-ord /oradata `# 数据库文件存放目录`\
-o orcl `# 数据库名称`\
-ud Y `# 安装到 Oracle 软件结束`
███████ ██ ████████ ██ ██ ██ ██ ██ ██ ██
██░░░░░██ ░██ ██░░░░░░ ░██ ░██ ░██░██ ░██ ░██ ░██
██ ░░██ ██████ ██████ █████ ░██ █████ ░██ ░██ █████ ░██ ░██░██ ███████ ██████ ██████ ██████ ░██ ░██
░██ ░██░░██░░█ ░░░░░░██ ██░░░██ ░██ ██░░░██░█████████░██████ ██░░░██ ░██ ░██░██░░██░░░██ ██░░░░ ░░░██░ ░░░░░░██ ░██ ░██
░██ ░██ ░██ ░ ███████ ░██ ░░ ░██░███████░░░░░░░░██░██░░░██░███████ ░██ ░██░██ ░██ ░██░░█████ ░██ ███████ ░██ ░██
░░██ ██ ░██ ██░░░░██ ░██ ██ ░██░██░░░░ ░██░██ ░██░██░░░░ ░██ ░██░██ ░██ ░██ ░░░░░██ ░██ ██░░░░██ ░██ ░██
░░███████ ░███ ░░████████░░█████ ███░░██████ ████████ ░██ ░██░░██████ ███ ███░██ ███ ░██ ██████ ░░██ ░░████████ ███ ███
░░░░░░░ ░░░ ░░░░░░░░ ░░░░░ ░░░ ░░░░░░ ░░░░░░░░ ░░ ░░ ░░░░░░ ░░░ ░░░ ░░ ░░░ ░░ ░░░░░░ ░░ ░░░░░░░░ ░░░ ░░░
注意:本脚本仅用于新服务器上实施部署数据库使用,严禁在已运行数据库的主机上执行,以免发生数据丢失或者损坏,造成不可挽回的损失!!!
请选择安装模式 [单机(si)/单机ASM(sa)] : si
数据库安装模式: single
请选择数据库版本 [11|12|19|21|23] : 19
数据库版本: 19
OracleShellInstall 开始安装,详细安装过程可查看日志: tail -2000f /soft/print_shell_install_20250421103706.log
正在进行安装前检查,请稍等......
正在检测安装包 /soft/LINUX.X64_193000_db_home.zip 的 MD5 值是否正确,请稍等......
正在配置本地软件源......已完成 (耗时: 0 秒)
正在获取操作系统信息......已完成 (耗时: 1 秒)
正在安装依赖包......已完成 (耗时: 101 秒)
正在禁用防火墙......已完成 (耗时: 1 秒)
正在禁用 selinux......已完成 (耗时: 1 秒)
正在配置 nsyctl......已完成 (耗时: 0 秒)
正在配置主机名和 hosts 文件......已完成 (耗时: 0 秒)
正在创建用户和组......已完成 (耗时: 1 秒)
正在创建安装目录......已完成 (耗时: 0 秒)
正在配置 Avahi-daemon 服务......已完成 (耗时: 1 秒)
正在配置透明大页 && NUMA && 磁盘 IO 调度器......已完成 (耗时: 2 秒)
正在配置操作系统参数 sysctl......已完成 (耗时: 0 秒)
正在配置 RemoveIPC......已完成 (耗时: 1 秒)
正在配置用户限制 limit......已完成 (耗时: 0 秒)
正在配置 shm 目录......已完成 (耗时: 1 秒)
正在安装 rlwrap 插件......已完成 (耗时: 10 秒)
正在配置用户环境变量......已完成 (耗时: 1 秒)
正在解压 Oracle 安装包......已完成 (耗时: 62 秒)
正在安装 Oracle 软件......已完成 (耗时: 80 秒)
正在创建监听......已完成 (耗时: 2 秒)
恭喜!Oracle 一键安装执行完成 (耗时: 271 秒),现在是否重启主机:[Y/N] Y
正在重启当前节点主机......
至此,测试环境安装完成。
ADG 快速搭建
本文使用 DBCA 一键搭建 DG,方便快捷。
主库开启归档和强制日志
搭建 DataGuard 必须要开启归档模式和强制日志模式:
SYS@orcl SQL> alter database force logging;
Database altered.
SYS@orcl SQL> select log_mode,force_logging from v$database;
LOG_MODE FORCE_LOGGING
------------ ---------------------------------------
ARCHIVELOG YES
主库增加 standby redo 日志
查看主库的在线日志数量以及大小:
-- 主库的在线日志组数为 8 组
set line222
set pagesize1000
col member for a60
select t2.thread#,t1.group#,t1.member,t2.bytes/1024/1024 from v$logfile t1,v$log t2 where t1.group#=t2.group# order by 1,2;
THREAD# GROUP# MEMBER T2.BYTES/1024/1024
---------- ---------- ------------------------------------------------------------ ------------------
1 1 /oradata/ORCL/redo01.log 100
1 2 /oradata/ORCL/redo02.log 100
1 3 /oradata/ORCL/redo03.log 100
1 4 /oradata/ORCL/redo04.log 100
1 5 /oradata/ORCL/redo05.log 100
1 6 /oradata/ORCL/redo06.log 100
1 7 /oradata/ORCL/redo07.log 100
1 8 /oradata/ORCL/redo08.log 100
直接在主库增加 n+1
组 standby redo log,rman duplicate 复制之后,备库也会同步创建:
-- 创建 9 组 standby 日志组
ALTER DATABASE ADD STANDBY LOGFILE
group 20 SIZE 100M,
group 21 SIZE 100M,
group 22 SIZE 100M,
group 23 SIZE 100M,
group 24 SIZE 100M,
group 25 SIZE 100M,
group 26 SIZE 100M,
group 27 SIZE 100M,
group 28 SIZE 100M;
Database altered.
配置 hosts
## 主
[root@lucifer:/root]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
# OracleBegin
# Public IP
192.168.6.191 lucifer
192.168.6.121 luciferdg
## 备
[root@luciferdg:/root]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
# OracleBegin
# Public IP
192.168.6.121 luciferdg
192.168.6.191 lucifer
配置 TNS
主备均需配置 TNS:
## oracle 用户执行
cat<<-\EOF>>$TNS_ADMIN/tnsnames.ora
ORCL_PRI =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.6.191)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
ORCL_STB =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.6.121)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcldg)
(UR=A)
)
)
EOF
打开备库监听:
[oracle@luciferdg:/home/oracle]$ lsnrctl start
LSNRCTL for Linux: Version 19.0.0.0.0 - Production on 21-APR-2025 11:20:53
Copyright (c) 1991, 2019, Oracle. All rights reserved.
Starting /u01/app/oracle/product/19.3.0/db/bin/tnslsnr: please wait...
TNSLSNR for Linux: Version 19.0.0.0.0 - Production
System parameter file is /u01/app/oracle/product/19.3.0/db/network/admin/listener.ora
Log messages written to /u01/app/oracle/diag/tnslsnr/luciferdg/listener/alert/log.xml
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=luciferdg)(PORT=1521)))
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=luciferdg)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Linux: Version 19.0.0.0.0 - Production
Start Date 21-APR-2025 11:20:55
Uptime 0 days 0 hr. 0 min. 0 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /u01/app/oracle/product/19.3.0/db/network/admin/listener.ora
Listener Log File /u01/app/oracle/diag/tnslsnr/luciferdg/listener/alert/log.xml
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=luciferdg)(PORT=1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
The listener supports no services
The command completed successfully
DBCA 搭建 ADG
在备库执行一键 DBCA:
[oracle@luciferdg:~]$ dbca -silent -createDuplicateDB \
-gdbName orcl \
-sid orcl \
-sysPassword oracle \
-primaryDBConnectionString 192.168.6.191:1521/orcl \
-nodelist luciferdg \
-databaseConfigType SINGLE \
-createAsStandby -dbUniqueName orcldg \
-datafileDestination '/oradata'
Prepare for db operation
22% complete
Listener config step
44% complete
Auxiliary instance creation
67% complete
RMAN duplicate
89% complete
Post duplicate database operations
100% complete
Look at the log file "/u01/app/oracle/cfgtoollogs/dbca/orcldg/orcldg5.log" for further details.
创建过程十分便捷,等待完成即可。
题外话,这里如果创建报错,可以执行以下命令删除对应的 DB 即可:
dbca -deleteDatabase -sourceDB orcl -silent
然后重新执行。
主库设置 ADG 参数
SQL> alter system set log_archive_config='DG_CONFIG=(ORCL,ORCLDG)';
alter system set log_archive_dest_1='LOCATION=/oradata/archivelog VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=ORCL';
alter system set log_archive_dest_2='SERVICE=ORCL_STB VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=ORCLDG';
alter system set fal_client='ORCL_PRI';
alter system set fal_server='ORCL_STB';
alter system set log_archive_dest_state_2=enable;
备库设置 ADG 参数
SQL> alter system set fal_client='ORCL_STB';
alter system set fal_server='ORCL_PRI';
alter system set log_archive_config='dg_config=(ORCL,ORCLDG)';
alter system set log_archive_dest_1='LOCATION=/oradata/archivelog VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=ORCLDG';
alter system set log_archive_dest_2='SERVICE=ORCL_PRI VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=ORCL';
alter system set standby_file_management='AUTO';
📢 注意: 如果主库设置了 db_create_file_dest
参数,备库 DBCA 创建后默认会设置 db_create_file_dest
参数,此时主备库不需要设置 convert
参数。
备库开启日志应用
SQL> recover managed standby database using current logfile disconnect from session;
Database altered.
检查同步情况
-- 主库
SQL> set line2222 pages1000
col status for a10
col type for a10
col error for a20
col gap_status for a20
col synchronization_status for a30
col recovery_mode for a60
select inst_id,status,DEST_ID,TYPE,ERROR,GAP_STATUS,SYNCHRONIZED,SYNCHRONIZATION_STATUS,RECOVERY_MODE from GV$ARCHIVE_DEST_STATUS where STatus <> 'INACTIVE' and type = 'PHYSICAL';
INST_ID STATUS DEST_ID TYPE ERROR GAP_STATUS SYN SYNCHRONIZATION_STATUS RECOVERY_MODE
---------- ---------- ---------- ---------- -------------------- -------------------- --- ------------------------------ ------------------------------------------------------------
1 VALID 2 PHYSICAL NO GAP NO CHECK CONFIGURATION MANAGED REAL TIME APPLY WITH QUERY
-- 备库
set line2222 pages1000
select process,thread#,group#,sequence#,status from gv$managed_standby;
PROCESS THREAD# GROUP# SEQUENCE# STATUS
--------- ---------- ---------------------------------------- ---------- ------------
ARCH 0 N/A 0 CONNECTED
DGRD 0 N/A 0 ALLOCATED
DGRD 0 N/A 0 ALLOCATED
ARCH 0 N/A 0 CONNECTED
ARCH 0 N/A 0 CONNECTED
ARCH 0 N/A 0 CONNECTED
RFS 1 N/A 0 IDLE
RFS 1 1 18 IDLE
RFS 0 N/A 0 IDLE
MRP0 1 N/A 18 APPLYING_LOG
SQL> select t2.thread#,t1.group#,t1.member,t2.STATUS,t2.ARCHIVED,t2.bytes/1024/1024 from v$logfile t1,v$standby_log t2 where t1.group#=t2.group# order by 1,2;
THREAD# GROUP# MEMBER STATUS ARC T2.BYTES/1024/1024
---------- ---------- ------------------------------------------------------------ ---------- --- ------------------
0 21 /oradata/ORCLDG/onlinelog/o1_mf_21_n0chq3f2_.log UNASSIGNED YES 100
0 22 /oradata/ORCLDG/onlinelog/o1_mf_22_n0chq3ow_.log UNASSIGNED YES 100
0 23 /oradata/ORCLDG/onlinelog/o1_mf_23_n0chq3xj_.log UNASSIGNED YES 100
0 24 /oradata/ORCLDG/onlinelog/o1_mf_24_n0chq45k_.log UNASSIGNED YES 100
0 25 /oradata/ORCLDG/onlinelog/o1_mf_25_n0chq4gf_.log UNASSIGNED YES 100
0 26 /oradata/ORCLDG/onlinelog/o1_mf_26_n0chq4pn_.log UNASSIGNED YES 100
0 27 /oradata/ORCLDG/onlinelog/o1_mf_27_n0chq4z6_.log UNASSIGNED YES 100
0 28 /oradata/ORCLDG/onlinelog/o1_mf_28_n0chq57g_.log UNASSIGNED YES 100
1 20 /oradata/ORCLDG/onlinelog/o1_mf_20_n0chq34m_.log ACTIVE YES 100
至此,ADG 搭建完成,备库可用于报表查询。