Oracle 环境配置最佳实践

Oracle 环境配置最佳实践

适用版本:Oracle Database 19c / 23ai 文档版本:v1.0 / 2026-07


1. 概述

Oracle 环境标准化是运维基础[1]:

内容

  • 用户与目录
  • 内核参数
  • 资源限制
  • 环境变量
  • 安全配置

详细见:Oracle 环境标准化配置


2. 用户与组

2.1 组

groupadd -g 54321 oinstall
groupadd -g 54322 dba
groupadd -g 54323 oper
groupadd -g 54324 backupdba
groupadd -g 54325 dgdba
groupadd -g 54326 kmdba
groupadd -g 54327 racdba
groupadd -g 54328 asmadmin
groupadd -g 54329 asmdba
groupadd -g 54330 asmoper

2.2 用户

useradd -u 54321 -g oinstall -G dba,oper,backupdba,dgdba,kmdba,racdba oracle
useradd -u 54331 -g oinstall -G asmadmin,asmdba,asmoper,dba grid
passwd oracle
passwd grid

3. 目录结构

3.1 OFA

/u01
└── app
    ├── oracle
    │   ├── product
    │   │   └── 19.0.0
    │   │       └── dbhome_1
    │   ├── oradata
    │   ├── fast_recovery_area
    │   ├── admin
    │   │   └── orcl
    │   │       ├── adump
    │   │       ├── bdump
    │   │       ├── cdump
    │   │       ├── udump
    │   │       └── pfile
    │   ├── cfgtoollogs
    │   ├── checkpoints
    │   └── diag
    ├── grid
    │   └── product
    │       └── 19.0.0
    │           └── grid
    └── oraInventory

3.2 创建

mkdir -p ******
mkdir -p ******
mkdir -p ******
mkdir -p ******
mkdir -p ******
chown -R oracle:oinstall /u01/app/oracle
chown -R grid:oinstall /u01/app/grid
chown -R oracle:oinstall /u01/app/oraInventory
chmod -R 775 /u01

4. 内核参数

4.1 /etc/sysctl.d/99-oracle.conf

fs.aio-max-nr = 1048576
fs.file-max = 6815744
kernel.shmall = 16777216
kernel.shmmax = 68719476736
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
kernel.panic_on_oops = 1
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
vm.swappiness = 1
vm.dirty_background_ratio = 3
vm.dirty_ratio = 15
vm.dirty_expire_centisecs = 500
vm.dirty_writeback_centisecs = 100

4.2 应用

sysctl --system

5. 资源限制

5.1 /etc/security/limits.d/99-oracle.conf

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
oracle soft core unlimited
oracle hard core unlimited

grid soft nofile 1024
grid hard nofile 65536
grid soft nproc 2047
grid hard nproc 16384
grid soft stack 10240
grid hard stack 32768
grid soft memlock unlimited
grid hard memlock unlimited

5.2 /etc/pam.d/login

session required pam_limits.so

5.3 验证

su - oracle
ulimit -a

6. HugePages

6.1 计算

# SGA 字节 / 2MB
# 16GB SGA → 8192 HugePages

6.2 配置

echo "vm.nr_hugepages = 8192" >> /etc/sysctl.d/99-oracle.conf
sysctl --system

# 验证
grep Huge /proc/meminfo

6.3 Oracle

ALTER SYSTEM SET use_large_pages = ONLY SCOPE=SPFILE;

6.4 禁用透明大页

echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag

# 持久
# /etc/default/grub
GRUB_CMDLINE_LINUX="... transparent_hugepage=never"
grub2-mkconfig -o /boot/grub2/grub.cfg

详细见:Oracle 内存管理 SGA/PGA


7. 环境变量

7.1 oracle 用户

# /home/oracle/.bash_profile

# Oracle 环境变量
ORACLE_BASE=/u01/app/oracle
ORACLE_HOME=$ORACLE_BASE/product/19.0.0/dbhome_1
ORACLE_SID=orcl
ORACLE_UNQNAME=orcl
ORACLE_TERM=xterm
PATH=$ORACLE_HOME/bin:$PATH:$HOME/bin
LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib
CLASSPATH=$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib
TMP=/tmp
TMPDIR=/tmp

export ORACLE_BASE ORACLE_HOME ORACLE_SID ORACLE_UNQNAME ORACLE_TERM
export PATH LD_LIBRARY_PATH CLASSPATH TMP TMPDIR

# NLS
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
export NLS_DATE_FORMAT="YYYY-MM-DD HH24:MI:SS"
export NLS_TIMESTAMP_FORMAT="YYYY-MM-DD HH24:MI:SS.FF"
export NLS_TIMESTAMP_TZ_FORMAT="YYYY-MM-DD HH24:MI:SS.FF TZH:TZM"

# alias
alias sqlplus='rlwrap sqlplus'
alias rman='rlwrap rman'
alias asmcmd='rlwrap asmcmd'
alias ORACLE_ENV='export ORACLE_SID=orcl'
alias PDB='sqlplus sys/Oracle123@orclpdb as sysdba'

# umask
umask 022

# PS1
PS1='[\u@\h \w]\$ '
export PS1

7.2 grid 用户

# /home/grid/.bash_profile
ORACLE_BASE=/u01/app/grid
ORACLE_HOME=/u01/app/19.0.0/grid
ORACLE_SID=+ASM
PATH=$ORACLE_HOME/bin:$PATH
export ORACLE_BASE ORACLE_HOME ORACLE_SID PATH
umask 022

8. 网络配置

8.1 主机名

hostnamectl set-hostname oradb1.example.com

8.2 /etc/hosts

127.0.0.1 localhost localhost.localdomain
::1 localhost localhost.localdomain

192.168.1.10 oradb1.example.com oradb1
192.168.1.11 oradb2.example.com oradb2
192.168.1.12 oradb1-vip.example.com oradb1-vip
192.168.1.13 oradb2-vip.example.com oradb2-vip
10.0.0.10 oradb1-priv.example.com oradb1-priv
10.0.0.11 oradb2-priv.example.com oradb2-priv
192.168.1.20 oradb-scan.example.com oradb-scan

8.3 NTP

dnf install -y chrony
systemctl enable chronyd
systemctl start chronyd
chronyc tracking

详细见:Oracle-Linux8 配置详解


9. SSH 互信

9.1 单实例

ssh-keygen -t rsa -b 4096

9.2 RAC

# 手动
su - oracle
ssh-keygen -t rsa
ssh-copy-id rac1
ssh-copy-id rac2

# sshUserSetup
$ORACLE_HOME/oui/prov/resources/scripts/sshUserSetup.sh \
  -user oracle -hosts "rac1 rac2" -noPromptPassphrase

10. /etc/oratab

orcl:/u01/app/oracle/product/19.0.0/dbhome_1:Y
orclpdb:/u01/app/oracle/product/19.0.0/dbhome_1:Y
+ASM:/u01/app/19.0.0/grid:N

10.1 dbhome

. oraenv
# 或
dbhome

11. 监听器配置

11.1 listener.ora

# $ORACLE_HOME/network/admin/listener.ora
LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = oradb1)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
  )

ADR_BASE_LISTENER = /u01/app/oracle

11.2 tnsnames.ora

# $ORACLE_HOME/network/admin/tnsnames.ora
ORCL =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = oradb1)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)
    )
  )

ORCLPDB =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = oradb1)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orclpdb)
    )
  )

11.3 sqlnet.ora

# $ORACLE_HOME/network/admin/sqlnet.ora
NAMES.DIRECTORY_PATH = (TNSNAMES, EZCONNECT)
SQLNET.INBOUND_CONNECT_TIMEOUT = 60
SQLNET.AUTHENTICATION_SERVICES = (NTS)

详细见:Oracle 网络配置与监听器


12. 安全配置

12.1 密码

-- Profile
ALTER PROFILE DEFAULT LIMIT
  FAILED_LOGIN_ATTEMPTS 5
  PASSWORD_LIFE_TIME 90
  PASSWORD_REUSE_TIME 365
  PASSWORD_REUSE_MAX 5
  PASSWORD_LOCK_TIME 1
  PASSWORD_GRACE_TIME 7;

12.2 审计

-- Unified Audit(12c+)
ALTER SYSTEM SET audit_trail = 'DB' SCOPE=SPFILE;

-- 启用
EXEC DBMS_AUDIT_MGMT.ENABLE_UNIFIED_AUDIT;

12.3 加密

-- TDE
ALTER SYSTEM SET wallet_root = '/u01/app/oracle/admin/orcl/wallet' SCOPE=SPFILE;
ALTER SYSTEM SET tde_configuration = 'KEYSTORE_CONFIG=FILE' SCOPE=SPFILE;

ADMINISTER KEY MANAGEMENT CREATE KEYSTORE ... IDENTIFIED BY ******
ADMINISTER KEY MANAGEMENT SET KEY ...;

详细见:Oracle 安全深度解析


13. 监控配置

13.1 EM Express

EXEC DBMS_XDB_CONFIG.SETHTTPSPORT(5500);
ALTER SYSTEM SET dispatchers = '(PROTOCOL=TCP)(SERVICE=orclXDB)';

13.2 AWR

EXEC DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS(
  retention => 43200,  -- 分钟(30 天)
  interval => 30       -- 分钟
);

详细见:Oracle AWR 报告详解


14. 备份配置

14.1 RMAN

RMAN> CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS;
RMAN> CONFIGURE CONTROLFILE AUTOBACKUP ON;
RMAN> CONFIGURE BACKUP OPTIMIZATION ON;
RMAN> CONFIGURE DEVICE TYPE DISK PARALLELISM 4;

详细见:Oracle RMAN 备份恢复


15. 常用脚本

15.1 启停

# start_db.sh
sqlplus / as sysdba << EOF
STARTUP;
EXIT;
EOF
lsnrctl start

# stop_db.sh
lsnrctl stop
sqlplus / as sysdba << EOF
SHUTDOWN IMMEDIATE;
EXIT;
EOF

15.2 监控

# check_db.sh
sqlplus -S / as sysdba << EOF
SET LINESIZE 200
SELECT name, open_mode, log_mode FROM v\$database;
SELECT instance_name, status FROM v\$instance;
EXIT;
EOF

16. 验证

16.1 系统

uname -a
cat /etc/oracle-release
free -h
df -h
ulimit -a
sysctl -a | grep -E 'shmall|shmmax|sem'

16.2 Oracle

sqlplus / as sysdba
SQL> SELECT name, open_mode FROM v$database;
SQL> SELECT * FROM v$version;
SQL> SHOW PARAMETER name
SQL> SHOW PARAMETER sga

17. 常见坑与排错

17.1 ORA-27154

- sem 不足
- 内核参数

17.2 ORA-01078

- 参数文件
- ORACLE_SID

17.3 ORA-00845

- /dev/shm 不足
- tmpfs 调整

18. 最佳实践

  1. OFA 标准:目录
  2. 预安装包:简化
  3. 内核参数:性能
  4. HugePages:大内存
  5. 资源限制:足够
  6. 环境变量:标准
  7. 网络规范:稳定
  8. SSH 互信:RAC
  9. 安全配置:防护
  10. 文档化:维护

19. 参考资料

[1] Oracle Database Administrator’s Guide 19c https://docs.oracle.com/en/database/oracle/oracle-database/19/admin/