在Redhat7.9系统中可以通过RPM的方式安装Oracle 19C,但是这种方式安装的数据库默认是容器数据库。我需要安装非容器数据库,且需要安装在/data目录下(组RAID的分区挂载在/data目录)。
系统信息:Redhat7.9+4G内存+60G的硬盘
1.系统检查与依赖安装
bash
###检查系统版本
cat /etc/redhat-release
###安装依赖包(可跳过)
yum install -y bc binutils compat-libcap1 compat-libstdc++-33 gcc gcc-c++ glibc glibc-devel ksh libaio libaio-devel libX11 libXau libXi libXtst libgcc libstdc++ libstdc++-devel make sysstat unixODBC unixODBC-devel
###下载并安装Oracle预安装包(会自动创建用户和配置内核参数)
wget https://yum.oracle.com/repo/OracleLinux/OL7/latest/x86_64/getPackage/oracle-database-preinstall-19c-1.0-1.el7.x86_64.rpm
yum localinstall -y oracle-database-preinstall-19c-1.0-1.el7.x86_64.rpm


2.创建专用目录结构
bash
# 创建/data目录结构(替代默认的/u01)
mkdir -p /data/oracle #创建xxx/oracle,正常是/u01/oracle,以此类推
mkdir -p /data/oracle/oradata #创建xxx/oracle/oradata
mkdir -p /data/oracle/fast_recovery_area #创建xxx/oracle/fast_recovery_area
mkdir -p /data/oracle/admin/ORCL19C/adump #创建xxx/oracle/admin/ORCL19C/adump
# 设置所有权(Oracle预安装包已创建oracle用户和oinstall组)
chown -R oracle:oinstall /data/oracle #xxx/oracle
chmod -R 775 /data/oracle
# 创建产品清单目录 #创建xxx/oracle/oraInventory
mkdir -p /data/oracle/oraInventory
chown oracle:oinstall /data/oracle/oraInventory

3.配置Oracle用户环境变量
bash
su - oracle #切到oracle配置环境变量
# 编辑环境变量
cat >> ~/.bash_profile << 'EOF'
# Oracle 19c Environment
export ORACLE_BASE=/data/oracle
export ORACLE_HOME=/opt/oracle/product/19c/dbhome_1
export ORACLE_SID=ORCL19C
export PATH=$ORACLE_HOME/bin:$PATH
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/usr/lib
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
EOF
source ~/.bash_profile # 使环境变量生效
exit # 返回root用户

4.安装Oracle 19c数据库软件
bash
# 下载RPM预安装包
wget https://download.oracle.com/otn/linux/oracle19c/190000/oracle-database-ee-19c-1.0-1.x86_64.rpm?AuthParam=1766817578_807d48575aacb66c351e06db04a89f88
或者到Oracle官网下载Oracle 19C的RPM包,再上传到服务器

bash
# 安装Oracle 19c企业版RPM包
yum localinstall -y oracle-database-ee-19c-1.0-1.x86_64.rpm
# 验证安装
rpm -qa | grep oracle-database-ee-19c

5.创建数据库
正常情况下,数据库软件安装后运行/etc/init.d/oracledb_ORCLCDB-19c configure,再根据提示设置密码就可以创建容器数据库。由于我需要安装非容器数据库,且要把数据库安装在/data目录下,所以需要手动创建数据库
bash
# 执行以下命令,部分参数按需修改
su - oracle << 'EOF'
export ORACLE_HOME=/opt/oracle/product/19c/dbhome_1
export PATH=$ORACLE_HOME/bin:$PATH
dbca -silent -createDatabase \
-templateName General_Purpose.dbc \
-gdbname ORCL19C \
-sid ORCL19C \
-characterSet AL32UTF8 \
-sysPassword Hbjkj@#123 \ #设置sys密码
-systemPassword Hbjkj@#123 \ #设置system密码
-dbsnmpPassword Hbjkj@#123 \ #设置snmp密码
-createAsContainerDatabase false \
-databaseType MULTIPURPOSE \
-automaticMemoryManagement false \
-totalMemory 2048 \
-initParams sga_target=1500M,sga_max_size=1500M,pga_aggregate_target=500M,memory_target=0,processes=100,db_create_file_dest='/data/oracle/oradata' \
-storageType FS \
-datafileDestination /data/oracle/oradata \
-redoLogFileSize 100 \
-recoveryAreaDestination /data/oracle/fast_recovery_area \
-recoveryAreaSize 4096 \
-emConfiguration NONE \
-ignorePreReqs
EOF

6.成功创建数据库

这里由于我的系统可分配的内存比较小,所以安装完后会有警告,但不影响使用。正常完美安装后如下图:

7.配置监听
bash
su - oracle << 'EOF'
export ORACLE_HOME=/opt/oracle/product/19c/dbhome_1
export PATH=$ORACLE_HOME/bin:$PATH
# 创建监听器配置
cat > $ORACLE_HOME/network/admin/listener.ora << 'LISTENER_EOF'
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.8.3)(PORT = 1521)) # 改为系统的IP
)
)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = ORCL19C)
(ORACLE_HOME = /opt/oracle/product/19c/dbhome_1)
(SID_NAME = ORCL19C)
)
)
LISTENER_EOF
# 启动监听器
lsnrctl start
EOF


8.查看监听状态
bash
su - oracle -c "source ~/.bash_profile && lsnrctl status"

9.测试连接
bash
# 关闭防火墙,生产环境开放端口
systemctl stop firewalld
setenforce 0
我这里使用dbeaver测试连接数据库。打开软件,新建数据库连接,填写数据库信息后,点击测试连接,出现已连接后,表示数据库可以正常连接使用


10.设置开机自启
创建systemd文件
bash
cat > /etc/systemd/system/oracle.service << 'EOF'
[Unit]
Description=Oracle 19c Database and Listener
After=network.target
[Service]
Type=simple
User=oracle
Group=oinstall
# 启动脚本
ExecStart=/bin/bash -c "ORACLE_HOME=/opt/oracle/product/19c/dbhome_1; ORACLE_SID=ORCL19C; PATH=\$ORACLE_HOME/bin:/usr/local/bin:/usr/bin:/bin; export PATH; \$ORACLE_HOME/bin/dbstart \$ORACLE_HOME; if ! \$ORACLE_HOME/bin/lsnrctl status >/dev/null 2>&1; then \$ORACLE_HOME/bin/lsnrctl start; fi; while true; do /bin/sleep 3600; done"
# 停止脚本
ExecStop=/bin/bash -c "ORACLE_HOME=/opt/oracle/product/19c/dbhome_1; ORACLE_SID=ORCL19C; PATH=\$ORACLE_HOME/bin:/usr/local/bin:/usr/bin:/bin; export PATH; \$ORACLE_HOME/bin/lsnrctl stop 2>/dev/null || true; \$ORACLE_HOME/bin/dbshut \$ORACLE_HOME 2>/dev/null || true"
TimeoutStartSec=300
TimeoutStopSec=300
[Install]
WantedBy=multi-user.target
EOF

创建检查状态文件
bash
cat > /usr/local/bin/oracle-status << 'EOF'
#!/bin/bash
echo "=== Oracle真实状态 ==="
echo "systemd服务: $(systemctl is-active oracle 2>/dev/null || echo 'unknown')"
if ps -ef | grep -q tnslsnr; then
echo "监听器: 运行中"
else
echo "监听器: 停止"
fi
if ps -ef | grep -q "ora_pmon_ORCL19C"; then
echo "数据库: 运行中"
else
echo "数据库: 停止"
fi
EOF
bash
# 设置权限
chmod +x /usr/local/bin/oracle-status

启用并测试systemd服务
bash
# 重新加载systemd配置
systemctl daemon-reload
# 启用Oracle服务自启动
systemctl enable oracle
# 启动服务
systemctl start oracle
# 检查状态
systemctl status oracle
oracle-status
