Oracle 19c 自动化安装脚本
Oracle 19c 自动化安装脚本
适用版本:Oracle Database 19c 文档版本:v1.0 / 2026-07
1. 概述
自动化安装脚本实现一键部署[1]:
内容:
- OS 配置
- 软件安装
- 数据库创建
- 验证
详细见:Oracle 数据库静默安装详解。
2. 脚本结构
oracle-install/
├── 01_setup_os.sh # OS 配置
├── 02_install_grid.sh # GI 安装
├── 03_install_db.sh # DB 软件安装
├── 04_create_db.sh # 建库
├── 05_post_install.sh # 后续配置
├── 06_verify.sh # 验证
├── config/
│ ├── db_install.rsp # DB 响应
│ ├── grid_install.rsp # GI 响应
│ └── dbca.rsp # DBCA 响应
├── scripts/
│ ├── init.sql # 初始化
│ └── stats.sql # 统计
└── main.sh # 主入口
3. OS 配置脚本
#!/bin/bash
# 01_setup_os.sh
set -e
echo "=== 1. 安装预安装包 ==="
dnf install -y oracle-database-preinstall-19c
echo "=== 2. 创建用户 ==="
groupadd -g 54321 oinstall 2>/dev/null || true
groupadd -g 54322 dba 2>/dev/null || true
groupadd -g 54323 oper 2>/dev/null || true
id oracle 2>/dev/null || useradd -u 54321 -g oinstall -G dba,oper oracle
echo "Oracle123" | passwd --stdin oracle
echo "=== 3. 创建目录 ==="
mkdir -p ******
mkdir -p ******
mkdir -p ******
mkdir -p ******
mkdir -p ******
chown -R oracle:oinstall /u01
chmod -R 775 /u01
echo "=== 4. 内核参数 ==="
cat > /etc/sysctl.d/99-oracle.conf << 'EOF'
fs.aio-max-nr = 1048576
fs.file-max = 6815744
kernel.shmall = 16777216
kernel.shmmax = 68719476736
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
net.ipv4.ip_local_port_range = 9000 65500
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048576
EOF
sysctl --system
echo "=== 5. 资源限制 ==="
cat > /etc/security/limits.d/99-oracle.conf << 'EOF'
oracle soft nofile 1024
oracle hard nofile 65536
oracle soft nproc 2047
oracle hard nproc 16384
oracle soft stack 10240
oracle hard stack 32768
oracle soft memlock unlimited
oracle hard memlock unlimited
EOF
echo "=== 6. 禁用透明大页 ==="
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
# 持久化
if grep -q "transparent_hugepage" /etc/default/grub; then
sed -i 's/transparent_hugepage=[a-z]*/transparent_hugepage=never/' /etc/default/grub
else
sed -i 's/GRUB_CMDLINE_LINUX="/GRUB_CMDLINE_LINUX="transparent_hugepage=never /' /etc/default/grub
fi
grub2-mkconfig -o /boot/grub2/grub.cfg
echo "=== 7. 防火墙 ==="
systemctl stop firewalld
systemctl disable firewalld
echo "=== 8. SELinux ==="
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=permissive/' /etc/selinux/config
echo "=== 9. NTP ==="
dnf install -y chrony
systemctl enable chronyd
systemctl start chronyd
echo "=== 10. 环境变量 ==="
cat > /home/oracle/.bash_profile << 'EOF'
ORACLE_BASE=/u01/app/oracle
ORACLE_HOME=$ORACLE_BASE/product/19.0.0/dbhome_1
ORACLE_SID=orcl
PATH=$ORACLE_HOME/bin:$PATH
export ORACLE_BASE ORACLE_HOME ORACLE_SID PATH
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
umask 022
EOF
chown oracle:oinstall /home/oracle/.bash_profile
echo "=== OS 配置完成 ==="
4. DB 软件安装
#!/bin/bash
# 03_install_db.sh
set -e
su - oracle << 'EOF'
cd $ORACLE_HOME
unzip /tmp/LINUX.X64_193000_db_home.zip
# 应用 RU(如有)
if [ -d /tmp/ru ]; then
./runInstaller -silent -responseFile /tmp/config/db_install.rsp -applyRU /tmp/ru
else
./runInstaller -silent -responseFile /tmp/config/db_install.rsp
fi
EOF
echo "=== root 脚本 ==="
/u01/app/oraInventory/orainstRoot.sh
/u01/app/oracle/product/19.0.0/dbhome_1/root.sh
echo "=== DB 软件安装完成 ==="
5. 响应文件
5.1 db_install.rsp
oracle.install.responseFileVersion=/oracle/install/rspfmt_dbinstall_response_schema_v19.0.0
oracle.install.option=INSTALL_DB_SWONLY
UNIX_GROUP_NAME=oinstall
INVENTORY_LOCATION=/u01/app/oraInventory
ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1
ORACLE_BASE=/u01/app/oracle
oracle.install.db.InstallEdition=EE
oracle.install.db.OSDBA_GROUP=dba
oracle.install.db.OSOPER_GROUP=oper
oracle.install.db.OSBACKUPDBA_GROUP=backupdba
oracle.install.db.OSDGDBA_GROUP=dgdba
oracle.install.db.OSKMDBA_GROUP=kmdba
oracle.install.db.OSRACDBA_GROUP=racdba
oracle.install.db.root.config.executeRootScript=false
5.2 dbca.rsp
templateName=General_Purpose.dbc
gdbName=orcl
sid=orcl
createAsContainerDatabase=true
numberOfPDBs=1
pdbName=orclpdb
pdbAdminPassword=******
sysPassword=******
systemPassword=******
storageType=FS
datafileDestination=/u01/app/oracle/oradata
recoveryAreaDestination=/u01/app/oracle/fast_recovery_area
recoveryAreaSize=10240
characterSet=AL32UTF8
nationalCharacterSet=AL16UTF16
listeners=LISTENER
totalMemory=4096
databaseType=OLTP
emConfiguration=NONE
6. 建库
#!/bin/bash
# 04_create_db.sh
set -e
su - oracle << 'EOF'
dbca -silent -createDatabase -responseFile /tmp/config/dbca.rsp
EOF
echo "=== 建库完成 ==="
7. 后续配置
#!/bin/bash
# 05_post_install.sh
set -e
echo "=== 1. 监听器 ==="
su - oracle -c "netca -silent -responseFile $ORACLE_HOME/assistants/netca/netca.rsp"
su - oracle -c "lsnrctl start"
echo "=== 2. 归档模式 ==="
su - oracle << 'EOF'
sqlplus / as sysdba << EOSQL
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER DATABASE ARCHIVELOG;
ALTER DATABASE OPEN;
ALTER SYSTEM SET db_recovery_file_dest_size = 50G SCOPE=BOTH;
ALTER SYSTEM SET db_recovery_file_dest = '/u01/app/oracle/fast_recovery_area' SCOPE=BOTH;
EXIT;
EOSQL
EOF
echo "=== 3. Flashback ==="
su - oracle << 'EOF'
sqlplus / as sysdba << EOSQL
ALTER DATABASE FLASHBACK ON;
ALTER SYSTEM SET db_flashback_retention_target = 4320 SCOPE=BOTH;
EXIT;
EOSQL
EOF
echo "=== 4. AWR ==="
su - oracle << 'EOF'
sqlplus / as sysdba << EOSQL
EXEC DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS(retention => 43200, interval => 30);
EXIT;
EOSQL
EOF
echo "=== 5. Profile ==="
su - oracle << 'EOF'
sqlplus / as sysdba << EOSQL
ALTER PROFILE DEFAULT LIMIT
FAILED_LOGIN_ATTEMPTS 5
PASSWORD_LIFE_TIME 90
PASSWORD_REUSE_TIME 365
PASSWORD_LOCK_TIME 1;
EXIT;
EOSQL
EOF
echo "=== 6. RMAN 配置 ==="
su - oracle << 'EOF'
rman target / << EORMAN
CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS;
CONFIGURE CONTROLFILE AUTOBACKUP ON;
CONFIGURE BACKUP OPTIMIZATION ON;
CONFIGURE DEVICE TYPE DISK PARALLELISM 4;
EORMAN
EOF
echo "=== 后续配置完成 ==="
8. 验证
#!/bin/bash
# 06_verify.sh
set -e
echo "=== 1. 数据库状态 ==="
su - oracle -c "sqlplus -S / as sysdba" << 'EOF'
SET LINESIZE 200
SELECT name, open_mode, log_mode FROM v$database;
SELECT instance_name, status FROM v$instance;
SELECT name, open_mode FROM v$pdbs;
SELECT * FROM v$version WHERE ROWNUM <= 1;
EXIT;
EOF
echo "=== 2. 监听器 ==="
su - oracle -c "lsnrctl status"
echo "=== 3. 监听器服务 ==="
su - oracle -c "lsnrctl services"
echo "=== 4. ORACLE_HOME ==="
su - oracle -c "echo \$ORACLE_HOME"
$ORACLE_HOME/OPatch/opatch lsinventory
echo "=== 5. AWR ==="
su - oracle -c "sqlplus -S / as sysdba" << 'EOF'
SELECT snap_id, begin_time, end_time FROM dba_hist_snapshot ORDER BY snap_id DESC FETCH FIRST 5 ROWS ONLY;
EXIT;
EOF
echo "=== 6. 字符集 ==="
su - oracle -c "sqlplus -S / as sysdba" << 'EOF'
SELECT * FROM nls_database_parameters WHERE parameter LIKE '%CHARACTERSET';
EXIT;
EOF
echo "=== 验证完成 ==="
9. 主入口
#!/bin/bash
# main.sh
set -e
ORACLE_ZIP=/tmp/LINUX.X64_193000_db_home.zip
RU_DIR=/tmp/ru
INSTALL_DIR=$(dirname $0)
cd $INSTALL_DIR
echo "===== Oracle 19c 自动化安装 ====="
echo "开始时间: $(date)"
# 检查
if [ ! -f $ORACLE_ZIP ]; then
echo "错误:Oracle 软件包不存在"
exit 1
fi
# 1. OS 配置
echo "===== 步骤 1:OS 配置 ====="
bash 01_setup_os.sh
# 2. 解压软件
echo "===== 步骤 2:解压软件 ====="
su - oracle -c "cd \$ORACLE_HOME && unzip -o $ORACLE_ZIP"
# 3. 安装 DB 软件
echo "===== 步骤 3:安装 DB 软件 ====="
bash 03_install_db.sh
# 4. 建库
echo "===== 步骤 4:建库 ====="
bash 04_create_db.sh
# 5. 后续配置
echo "===== 步骤 5:后续配置 ====="
bash 05_post_install.sh
# 6. 验证
echo "===== 步骤 6:验证 ====="
bash 06_verify.sh
echo "===== Oracle 19c 安装完成 ====="
echo "完成时间: $(date)"
10. RAC 自动化
#!/bin/bash
# rac_install.sh
# 节点列表
NODES="rac1 rac2"
# 1. SSH 互信
./sshUserSetup.sh -user oracle -hosts "$NODES" -noPromptPassphrase
./sshUserSetup.sh -user grid -hosts "$NODES" -noPromptPassphrase
# 2. 同步配置
for node in $NODES; do
scp 01_setup_os.sh $node:/tmp/
ssh $node bash /tmp/01_setup_os.sh
done
# 3. GI 静默安装
su - grid -c "$GI_HOME/gridSetup.sh -silent -responseFile /tmp/grid_install.rsp"
# 4. root 脚本(每个节点)
for node in $NODES; do
ssh $node /u01/app/oraInventory/orainstRoot.sh
ssh $node /u01/app/19.0.0/grid/root.sh
done
# 5. DB 软件
su - oracle -c "$ORACLE_HOME/runInstaller -silent -responseFile /tmp/db_install.rsp"
# 6. DBCA
su - oracle -c "dbca -silent -createDatabase -responseFile /tmp/dbca.rsp"
详细见:Oracle RAC 19c 部署详解。
11. Ansible Playbook
11.1 inventory
[oracle]
oradb1 ansible_host=192.168.1.10
oradb2 ansible_host=192.168.1.11
[oracle:vars]
ansible_user=root
11.2 playbook
- name: Install Oracle 19c
hosts: oracle
tasks:
- name: Install preinstall
dnf:
name: oracle-database-preinstall-19c
state: present
- name: Configure kernel
copy:
src: files/99-oracle.conf
dest: /etc/sysctl.d/99-oracle.conf
notify: sysctl
- name: Create directories
file:
path: "{{ item }}"
state: directory
owner: oracle
group: oinstall
mode: 0775
loop:
- /u01/app/oracle/product/19.0.0/dbhome_1
- /u01/app/oracle/oradata
- name: Unzip software
unarchive:
src: /tmp/LINUX.X64_193000_db_home.zip
dest: /u01/app/oracle/product/19.0.0/dbhome_1
owner: oracle
group: oinstall
- name: Install DB
command: ./runInstaller -silent -responseFile /tmp/db_install.rsp
args:
chdir: /u01/app/oracle/product/19.0.0/dbhome_1
become: yes
become_user: oracle
- name: Run root.sh
command: /u01/app/oracle/product/19.0.0/dbhome_1/root.sh
- name: Create database
command: dbca -silent -createDatabase -responseFile /tmp/dbca.rsp
become: yes
become_user: oracle
handlers:
- name: sysctl
command: sysctl --system
12. 日志
12.1 日志目录
# 安装日志
/u01/app/oraInventory/logs/
# DBCA
/u01/app/oracle/cfgtoollogs/dbca/
# 自动化
/var/log/oracle_install.log
12.2 记录
exec > >(tee /var/log/oracle_install.log) 2>&1
13. 常见坑与排错
13.1 用户权限
- root 执行 OS 配置
- oracle 执行 DB
13.2 路径错误
- 环境变量
- 验证
13.3 响应文件
- 路径正确
- 参数完整
14. 最佳实践
- 预安装包:简化
- 脚本化:自动化
- 响应文件:版本控制
- 错误检查:set -e
- 日志:完整
- 验证:确认
- Ansible:高级
- 测试:可行
- 文档化:流程
- 复用:模板
15. 参考资料
[1] Oracle Database Installation Guide 19c, “Installing Oracle Database Using Response Files” https://docs.oracle.com/en/database/oracle/oracle-database/19/ladbi/