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. 最佳实践

  1. 预安装包:简化
  2. 脚本化:自动化
  3. 响应文件:版本控制
  4. 错误检查:set -e
  5. 日志:完整
  6. 验证:确认
  7. Ansible:高级
  8. 测试:可行
  9. 文档化:流程
  10. 复用:模板

15. 参考资料

[1] Oracle Database Installation Guide 19c, “Installing Oracle Database Using Response Files” https://docs.oracle.com/en/database/oracle/oracle-database/19/ladbi/