文章目录
正文
说实话,Oracle数据库的安装看起来复杂,但只要按步骤来,其实没那么难。这篇指南会带你从零开始,完整地安装一个Oracle 19c单实例数据库。
1. 安装前的准备工作
1.1 硬件和系统要求
在开始之前,咱们先确认一下服务器是否满足Oracle的基本要求:
项目 | 最低要求 | 推荐配置 |
---|---|---|
内存 | 2GB | 8GB+ |
磁盘空间 | 15GB | 50GB+ |
CPU | 1核 | 4核+ |
操作系统 | RHEL/CentOS 7.6+ | RHEL/CentOS 8.x |
1.2 检查系统环境
#!/bin/bash
# 系统环境检查脚本
echo "=== Oracle安装前环境检查 ==="
# 检查操作系统
echo "操作系统信息:"
cat /etc/redhat-release
uname -a
# 检查内存
echo -e "\n内存信息:"
free -h
total_mem=$(free | grep '^Mem:' | awk '{print $2}')
if [ $total_mem -gt 2097152 ]; then
echo "✅ 内存满足要求"
else
echo "❌ 内存不足,需要至少2GB"
fi
# 检查磁盘空间
echo -e "\n磁盘空间:"
df -h
root_space=$(df / | tail -1 | awk '{print $4}' | sed 's/G//')
if [ ${root_space%.*} -gt 15 ]; then
echo "✅ 磁盘空间满足要求"
else
echo "❌ 磁盘空间不足,需要至少15GB"
fi
# 检查hostname
echo -e "\n主机名配置:"
hostname
echo "请确保主机名已正确配置在/etc/hosts中"
1.3 下载Oracle软件
从Oracle官网下载Oracle Database 19c:
- 文件名:
LINUX.X64_193000_db_home.zip
- 大小:约2.8GB
- 下载地址:https://www.oracle.com/database/technologies/oracle19c-linux-downloads.html
2. 系统配置
2.1 创建Oracle用户和组
#!/bin/bash
# 创建Oracle安装所需的用户和组
echo "创建Oracle用户和组..."
# 创建系统组
groupadd -g 54321 oinstall # Oracle库存组
groupadd -g 54322 dba # DBA组
groupadd -g 54323 oper # 操作员组
groupadd -g 54324 backupdba # 备份DBA组
groupadd -g 54325 dgdba # Data Guard DBA组
groupadd -g 54326 kmdba # 密钥管理DBA组
groupadd -g 54327 racdba # RAC DBA组
# 创建oracle用户
useradd -u 54321 -g oinstall \
-G dba,oper,backupdba,dgdba,kmdba,racdba \
-m -d /home/oracle \
-s /bin/bash \
oracle
# 设置oracle用户密码
echo "请为oracle用户设置密码:"
passwd oracle
echo "用户和组创建完成!"
id oracle
2.2 配置内核参数
#!/bin/bash
# 配置Oracle所需的内核参数
echo "配置内核参数..."
# 备份原始配置
cp /etc/sysctl.conf /etc/sysctl.conf.backup
# 添加Oracle推荐的内核参数
cat >> /etc/sysctl.conf << 'EOF'
# Oracle 19c kernel parameters
fs.file-max = 6815744
kernel.sem = 250 32000 100 128
kernel.shmmni = 4096
kernel.shmall = 1073741824
kernel.shmmax = 4398046511104
kernel.panic_on_oops = 1
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048576
fs.aio-max-nr = 1048576
net.ipv4.ip_local_port_range = 9000 65500
EOF
# 使参数生效
sysctl -p
echo "内核参数配置完成!"
2.3 配置用户资源限制
#!/bin/bash
# 配置oracle用户的资源限制
echo "配置用户资源限制..."
# 备份配置文件
cp /etc/security/limits.conf /etc/security/limits.conf.backup
# 添加oracle用户限制
cat >> /etc/security/limits.conf << 'EOF'
# Oracle user limits
oracle soft nofile 1024
oracle hard nofile 65536
oracle soft nproc 16384
oracle hard nproc 16384
oracle soft stack 10240
oracle hard stack 32768
oracle hard memlock 134217728
oracle soft memlock 134217728
EOF
# 配置PAM
if ! grep -q "pam_limits.so" /etc/pam.d/login; then
echo "session required pam_limits.so" >> /etc/pam.d/login
fi
echo "用户资源限制配置完成!"
2.4 安装必要的软件包
#!/bin/bash
# 安装Oracle依赖的软件包
echo "安装Oracle依赖包..."
# RHEL/CentOS 7
if grep -q "release 7" /etc/redhat-release; then
yum install -y \
binutils \
compat-libcap1 \
compat-libstdc++-33 \
glibc \
glibc-devel \
ksh \
libaio \
libaio-devel \
libX11 \
libXau \
libXi \
libXtst \
libgcc \
libstdc++ \
libstdc++-devel \
libxcb \
make \
smartmontools \
sysstat \
unzip
# RHEL/CentOS 8
elif grep -q "release 8" /etc/redhat-release; then
dnf install -y \
bc \
binutils \
glibc \
glibc-devel \
ksh \
libaio \
libaio-devel \
libX11 \
libXau \
libXi \
libXtst \
libgcc \
libstdc++ \
libstdc++-devel \
libxcb \
make \
smartmontools \
sysstat \
unzip
fi
echo "依赖包安装完成!"
3. 目录结构和环境变量
3.1 创建Oracle目录结构
#!/bin/bash
# 创建Oracle安装目录结构
echo "创建Oracle目录结构..."
# 创建基础目录
mkdir -p /u01/app/oracle/product/19.0.0/dbhome_1 # Oracle软件目录
mkdir -p /u01/app/oraInventory # Oracle库存目录
mkdir -p /u01/oradata # 数据文件目录
mkdir -p /u01/fast_recovery_area # 快速恢复区
mkdir -p /u01/scripts # 脚本目录
# 设置目录权限
chown -R oracle:oinstall /u01
chmod -R 755 /u01
echo "目录结构创建完成!"
tree /u01 -L 3
3.2 配置Oracle环境变量
#!/bin/bash
# 配置oracle用户环境变量
echo "配置Oracle环境变量..."
# 创建oracle用户的环境配置文件
cat > /home/oracle/.bash_profile << 'EOF'
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# Oracle Environment Variables
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/19.0.0/dbhome_1
export ORACLE_SID=orcl
export TNS_ADMIN=$ORACLE_HOME/network/admin
export PATH=$ORACLE_HOME/bin:$PATH
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib
export CLASSPATH=$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib
# Oracle客户端设置
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
export NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS'
# 设置别名
alias ll='ls -la'
alias sqlplus='rlwrap sqlplus'
alias rman='rlwrap rman'
# 设置umask
umask 022
# 自定义提示符
export PS1='[\u@\h \W]$ '
echo "Oracle环境已加载 - SID: $ORACLE_SID"
EOF
# 设置文件权限
chown oracle:oinstall /home/oracle/.bash_profile
chmod 644 /home/oracle/.bash_profile
echo "环境变量配置完成!"
echo "请使用 'su - oracle' 切换到oracle用户测试环境"
4. Oracle软件安装
4.1 解压Oracle安装包
#!/bin/bash
# 解压Oracle安装包
echo "解压Oracle安装包..."
# 切换到oracle用户执行
su - oracle << 'EOF'
# 检查安装包
if [ ! -f "/tmp/LINUX.X64_193000_db_home.zip" ]; then
echo "❌ 找不到安装包,请将文件放在/tmp目录下"
exit 1
fi
# 进入Oracle Home目录
cd $ORACLE_HOME
# 解压安装包(这可能需要几分钟)
echo "正在解压,请稍候..."
unzip -q /tmp/LINUX.X64_193000_db_home.zip
# 检查解压结果
if [ -f "$ORACLE_HOME/runInstaller" ]; then
echo "✅ 解压成功!"
ls -la $ORACLE_HOME | head -10
else
echo "❌ 解压失败"
exit 1
fi
EOF
echo "Oracle软件包解压完成!"
4.2 创建静默安装响应文件
#!/bin/bash
# 创建Oracle静默安装响应文件
echo "创建静默安装响应文件..."
cat > /tmp/db_install.rsp << 'EOF'
####################################################################
## Oracle Database 19c Silent Installation Response File
####################################################################
# 安装选项 - 仅安装软件
oracle.install.option=INSTALL_DB_SWONLY
# 主机名
ORACLE_HOSTNAME=localhost.localdomain
# Oracle Inventory组
UNIX_GROUP_NAME=oinstall
# Oracle Inventory目录
INVENTORY_LOCATION=/u01/app/oraInventory
# Oracle Home目录
ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1
# Oracle Base目录
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
# 关闭安全更新
SECURITY_UPDATES_VIA_MYORACLESUPPORT=false
DECLINE_SECURITY_UPDATES=true
EOF
# 设置文件权限
chown oracle:oinstall /tmp/db_install.rsp
chmod 600 /tmp/db_install.rsp
echo "响应文件创建完成:/tmp/db_install.rsp"
4.3 执行静默安装
#!/bin/bash
# 执行Oracle软件静默安装
echo "开始Oracle软件安装..."
# 切换到oracle用户执行安装
su - oracle << 'EOF'
echo "执行静默安装,这将需要10-20分钟..."
# 进入Oracle Home目录
cd $ORACLE_HOME
# 执行安装程序
./runInstaller -silent \
-responseFile /tmp/db_install.rsp \
-waitforcompletion \
-ignorePrereq
# 检查安装结果
if [ $? -eq 0 ]; then
echo "✅ Oracle软件安装完成"
else
echo "❌ 安装可能有问题,请检查日志"
find /u01/app/oraInventory/logs -name "*.log" -type f
fi
EOF
echo ""
echo "⚠️ 现在需要以root用户执行以下脚本:"
echo "1. /u01/app/oraInventory/orainstRoot.sh"
echo "2. /u01/app/oracle/product/19.0.0/dbhome_1/root.sh"
read -p "是否现在执行?(y/n): " execute_root
if [ "$execute_root" = "y" ]; then
echo "执行root脚本..."
/u01/app/oraInventory/orainstRoot.sh
/u01/app/oracle/product/19.0.0/dbhome_1/root.sh
echo "✅ root脚本执行完成"
fi
4.4 验证软件安装
#!/bin/bash
# 验证Oracle软件安装
echo "验证Oracle软件安装..."
su - oracle << 'EOF'
echo "1. 检查Oracle版本:"
$ORACLE_HOME/bin/sqlplus -v
echo -e "\n2. 检查OPatch版本:"
$ORACLE_HOME/OPatch/opatch version
echo -e "\n3. 列出已安装组件:"
$ORACLE_HOME/OPatch/opatch lsinventory -summary
echo -e "\n4. 检查监听器:"
$ORACLE_HOME/bin/lsnrctl version
EOF
echo "Oracle软件安装验证完成!"
5. 创建数据库
5.1 使用DBCA创建数据库
图形界面方式
#!/bin/bash
# 启动DBCA图形界面
echo "启动DBCA创建数据库..."
su - oracle << 'EOF'
# 检查是否支持图形界面
if [ -z "$DISPLAY" ]; then
echo "警告:未设置DISPLAY变量"
echo "如果是远程连接,请使用: ssh -X oracle@hostname"
fi
# 启动DBCA
echo "启动DBCA..."
$ORACLE_HOME/bin/dbca
EOF
静默方式创建
#!/bin/bash
# 创建DBCA静默响应文件
cat > /tmp/dbca_create.rsp << 'EOF'
####################################################################
## DBCA Silent Database Creation Response File
####################################################################
# 全局数据库名称
gdbName=orcl.localdomain
# SID名称
sid=orcl
# 数据库配置类型
databaseConfigType=SI
# 创建为容器数据库
createAsContainerDatabase=false
# 存储类型
storageType=FS
# 数据文件位置
datafileDestination=/u01/oradata
# 快速恢复区
recoveryAreaDestination=/u01/fast_recovery_area
recoveryAreaSize=4096
# 内存设置(单位:MB)
totalMemory=2048
automaticMemoryManagement=true
# 字符集
characterSet=AL32UTF8
nationalCharacterSet=AL16UTF16
# 数据库密码(生产环境请使用复杂密码)
sysPassword=Oracle123
systemPassword=Oracle123
# 不安装示例Schema
sampleSchema=false
# 不配置自动备份
automaticBackup=false
# 数据库选项
dbOptions=JSERVER:true,ORACLE_TEXT:true,IMEDIA:false,CWMLITE:true,SPATIAL:true,OMS:false,APEX:false,DV:false
# 监听器
listeners=LISTENER
EOF
# 设置权限
chown oracle:oinstall /tmp/dbca_create.rsp
chmod 600 /tmp/dbca_create.rsp
echo "DBCA响应文件创建完成"
执行数据库创建:
#!/bin/bash
# 执行静默数据库创建
echo "开始创建Oracle数据库,这可能需要30-60分钟..."
su - oracle << 'EOF'
# 执行DBCA静默创建
$ORACLE_HOME/bin/dbca -silent \
-createDatabase \
-responseFile /tmp/dbca_create.rsp
if [ $? -eq 0 ]; then
echo "✅ 数据库创建成功!"
# 验证数据库
sqlplus -s / as sysdba << SQL
SELECT name, open_mode FROM v\$database;
SELECT instance_name, status FROM v\$instance;
SQL
else
echo "❌ 数据库创建失败"
echo "检查日志:"
find $ORACLE_BASE/cfgtoollogs/dbca -name "*.log" -type f
fi
EOF
5.2 手工创建数据库(高级)
如果需要完全自定义,可以手工创建:
-- 手工创建数据库脚本
-- create_db_manual.sql
-- 1. 创建参数文件
CREATE SPFILE FROM PFILE='/tmp/initorcl.ora';
-- 2. 启动到NOMOUNT状态
STARTUP NOMOUNT;
-- 3. 创建数据库
CREATE DATABASE orcl
USER SYS IDENTIFIED BY Oracle123
USER SYSTEM IDENTIFIED BY Oracle123
LOGFILE
GROUP 1 ('/u01/oradata/orcl/redo01.log') SIZE 100M,
GROUP 2 ('/u01/oradata/orcl/redo02.log') SIZE 100M,
GROUP 3 ('/u01/oradata/orcl/redo03.log') SIZE 100M
MAXLOGFILES 16
MAXLOGMEMBERS 3
DATAFILE '/u01/oradata/orcl/system01.dbf' SIZE 700M AUTOEXTEND ON
SYSAUX DATAFILE '/u01/oradata/orcl/sysaux01.dbf' SIZE 550M AUTOEXTEND ON
DEFAULT TABLESPACE users
DATAFILE '/u01/oradata/orcl/users01.dbf' SIZE 500M AUTOEXTEND ON
DEFAULT TEMPORARY TABLESPACE temp
TEMPFILE '/u01/oradata/orcl/temp01.dbf' SIZE 100M AUTOEXTEND ON
UNDO TABLESPACE undotbs1
DATAFILE '/u01/oradata/orcl/undotbs01.dbf' SIZE 200M AUTOEXTEND ON
CHARACTER SET AL32UTF8
NATIONAL CHARACTER SET AL16UTF16;
-- 4. 运行数据字典脚本
@?/rdbms/admin/catalog.sql
@?/rdbms/admin/catproc.sql
6. 网络配置
6.1 配置监听器
#!/bin/bash
# 配置Oracle监听器
echo "配置Oracle监听器..."
su - oracle << 'EOF'
# 创建网络配置目录
mkdir -p $ORACLE_HOME/network/admin
# 创建listener.ora
cat > $ORACLE_HOME/network/admin/listener.ora << 'LISTENER_EOF'
# Oracle Net Listener Configuration
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = orcl)
(ORACLE_HOME = /u01/app/oracle/product/19.0.0/dbhome_1)
)
)
ADR_BASE_LISTENER = /u01/app/oracle
LISTENER_EOF
# 创建tnsnames.ora
cat > $ORACLE_HOME/network/admin/tnsnames.ora << 'TNS_EOF'
# Oracle Net Service Names
ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
TNS_EOF
echo "网络配置文件创建完成"
EOF
6.2 启动监听器
#!/bin/bash
# 启动并测试监听器
echo "启动Oracle监听器..."
su - oracle << 'EOF'
# 启动监听器
lsnrctl start
# 检查监听器状态
echo -e "\n监听器状态:"
lsnrctl status
# 测试连接
echo -e "\n测试连接:"
tnsping orcl
EOF
7. 数据库配置和优化
7.1 基础配置
-- 数据库基础配置脚本
-- basic_config.sql
-- 连接数据库
CONNECT / AS SYSDBA
-- 设置归档模式
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER DATABASE ARCHIVELOG;
ALTER DATABASE OPEN;
-- 创建用户表空间
CREATE TABLESPACE app_data
DATAFILE '/u01/oradata/orcl/app_data01.dbf'
SIZE 1G AUTOEXTEND ON;
-- 配置自动统计信息收集
BEGIN
DBMS_SCHEDULER.ENABLE('SYS.GATHER_STATS_JOB');
END;
/
-- 设置密码策略
ALTER PROFILE DEFAULT LIMIT
PASSWORD_LIFE_TIME 90
PASSWORD_GRACE_TIME 7
FAILED_LOGIN_ATTEMPTS 5
PASSWORD_LOCK_TIME 1/24;
-- 启用审计
ALTER SYSTEM SET AUDIT_TRAIL=DB SCOPE=SPFILE;
-- 查看配置
SELECT name, value FROM v$parameter
WHERE name IN ('db_name', 'log_mode', 'memory_target');
EXIT;
7.2 创建应用用户
-- 创建应用用户脚本
-- create_app_user.sql
CONNECT / AS SYSDBA
-- 创建应用用户
CREATE USER appuser IDENTIFIED BY App123
DEFAULT TABLESPACE app_data
TEMPORARY TABLESPACE temp
QUOTA UNLIMITED ON app_data;
-- 授权
GRANT CONNECT, RESOURCE TO appuser;
GRANT CREATE VIEW, CREATE SYNONYM TO appuser;
-- 验证用户
SELECT username, default_tablespace, account_status
FROM dba_users
WHERE username = 'APPUSER';
EXIT;
8. 自动启动配置
8.1 创建启停脚本
#!/bin/bash
# Oracle数据库启停脚本
cat > /u01/scripts/oracle_service.sh << 'EOF'
#!/bin/bash
# Oracle数据库服务管理脚本
# 设置环境变量
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/19.0.0/dbhome_1
export ORACLE_SID=orcl
export PATH=$ORACLE_HOME/bin:$PATH
# 启动数据库
start_oracle() {
echo "启动Oracle监听器..."
lsnrctl start
echo "启动Oracle数据库..."
sqlplus -s / as sysdba << SQL
STARTUP;
EXIT;
SQL
echo "Oracle数据库启动完成"
}
# 停止数据库
stop_oracle() {
echo "停止Oracle数据库..."
sqlplus -s / as sysdba << SQL
SHUTDOWN IMMEDIATE;
EXIT;
SQL
echo "停止Oracle监听器..."
lsnrctl stop
echo "Oracle数据库停止完成"
}
# 检查状态
status_oracle() {
echo "=== Oracle状态检查 ==="
echo "监听器状态:"
lsnrctl status
echo -e "\n数据库状态:"
sqlplus -s / as sysdba << SQL
SELECT instance_name, status FROM v\$instance;
SELECT name, open_mode FROM v\$database;
EXIT;
SQL
}
# 主程序
case "$1" in
start)
start_oracle
;;
stop)
stop_oracle
;;
restart)
stop_oracle
sleep 5
start_oracle
;;
status)
status_oracle
;;
*)
echo "用法: $0 {start|stop|restart|status}"
exit 1
;;
esac
EOF
# 设置权限
chown oracle:oinstall /u01/scripts/oracle_service.sh
chmod 755 /u01/scripts/oracle_service.sh
echo "Oracle服务脚本创建完成"
8.2 配置系统服务
#!/bin/bash
# 创建Oracle系统服务
cat > /etc/systemd/system/oracle.service << 'EOF'
[Unit]
Description=Oracle Database
After=network.target
[Service]
Type=oneshot
User=oracle
Group=oinstall
ExecStart=/u01/scripts/oracle_service.sh start
ExecStop=/u01/scripts/oracle_service.sh stop
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
EOF
# 重新载入systemd
systemctl daemon-reload
# 启用服务
systemctl enable oracle.service
echo "Oracle系统服务配置完成"
echo "使用命令:"
echo " systemctl start oracle # 启动"
echo " systemctl stop oracle # 停止"
echo " systemctl status oracle # 状态"
9. 安装验证
9.1 完整验证脚本
#!/bin/bash
# Oracle安装完整验证
echo "=== Oracle 19c 安装验证 ==="
su - oracle << 'EOF'
echo "1. 环境变量检查:"
echo " ORACLE_BASE: $ORACLE_BASE"
echo " ORACLE_HOME: $ORACLE_HOME"
echo " ORACLE_SID: $ORACLE_SID"
echo -e "\n2. Oracle软件版本:"
$ORACLE_HOME/bin/sqlplus -v
echo -e "\n3. 数据库连接测试:"
sqlplus -s / as sysdba << SQL
SELECT 'Database: ' || name || ' Status: ' || open_mode FROM v\$database;
SELECT 'Instance: ' || instance_name || ' Status: ' || status FROM v\$instance;
SELECT 'Started: ' || TO_CHAR(startup_time, 'YYYY-MM-DD HH24:MI:SS') FROM v\$instance;
EXIT;
SQL
echo -e "\n4. 监听器状态:"
lsnrctl status | grep -E "(Listening|Service)"
echo -e "\n5. 表空间检查:"
sqlplus -s / as sysdba << SQL
COL TABLESPACE_NAME FORMAT A15
COL SIZE_MB FORMAT 999,999
SELECT tablespace_name,
ROUND(SUM(bytes)/1024/1024) AS size_mb
FROM dba_data_files
GROUP BY tablespace_name;
EXIT;
SQL
EOF
echo -e "\n6. 系统进程:"
ps -ef | grep -E "(ora_|tnslsnr)" | grep -v grep | wc -l | \
awk '{print " Oracle进程数: " $1}'
echo -e "\n7. 端口监听:"
netstat -tuln | grep :1521 > /dev/null && \
echo " ✅ 1521端口监听正常" || \
echo " ❌ 1521端口未监听"
echo -e "\n=== 验证完成 ==="
9.2 性能测试
#!/bin/bash
# 简单性能测试
echo "执行Oracle性能测试..."
su - oracle << 'EOF'
sqlplus / as sysdba << SQL
-- 创建测试表
CREATE TABLE test_performance (
id NUMBER PRIMARY KEY,
name VARCHAR2(100),
created_date DATE DEFAULT SYSDATE
);
-- 插入测试数据
BEGIN
FOR i IN 1..1000 LOOP
INSERT INTO test_performance (id, name)
VALUES (i, 'Test Record ' || i);
END LOOP;
COMMIT;
END;
/
-- 查询测试
SET TIMING ON
SELECT COUNT(*) FROM test_performance;
SELECT * FROM test_performance WHERE id BETWEEN 100 AND 200;
SET TIMING OFF
-- 清理测试数据
DROP TABLE test_performance;
EXIT;
SQL
EOF
echo "性能测试完成"
10. 常见问题解决
10.1 权限问题
#!/bin/bash
# 修复常见权限问题
echo "修复Oracle权限问题..."
# 修复目录权限
chown -R oracle:oinstall /u01
find /u01/app/oracle -type d -exec chmod 755 {} \;
find /u01/app/oracle -type f -exec chmod 644 {} \;
# 修复可执行文件权限
chmod 755 /u01/app/oracle/product/19.0.0/dbhome_1/bin/*
chmod 6751 /u01/app/oracle/product/19.0.0/dbhome_1/bin/oracle
echo "权限修复完成"
10.2 内存优化
#!/bin/bash
# Oracle内存优化配置
su - oracle << 'EOF'
sqlplus / as sysdba << SQL
-- 检查当前内存设置
SELECT name, value FROM v$parameter
WHERE name LIKE '%memory%' OR name LIKE '%sga%' OR name LIKE '%pga%';
-- 优化内存设置(根据服务器内存调整)
-- 假设服务器有8GB内存
ALTER SYSTEM SET MEMORY_TARGET=4G SCOPE=SPFILE;
ALTER SYSTEM SET MEMORY_MAX_TARGET=6G SCOPE=SPFILE;
-- 重启数据库使参数生效
SHUTDOWN IMMEDIATE;
STARTUP;
-- 验证设置
SHOW PARAMETER MEMORY;
EXIT;
SQL
EOF
11. 日常维护
11.1 日常维护脚本
#!/bin/bash
# Oracle日常维护脚本
cat > /u01/scripts/daily_maintenance.sh << 'EOF'
#!/bin/bash
# Oracle数据库日常维护
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/19.0.0/dbhome_1
export ORACLE_SID=orcl
export PATH=$ORACLE_HOME/bin:$PATH
MAINT_LOG="/u01/scripts/maintenance_$(date +%Y%m%d).log"
echo "=== Oracle日常维护 $(date) ===" >> $MAINT_LOG
# 检查数据库状态
echo "1. 数据库状态检查:" >> $MAINT_LOG
sqlplus -s / as sysdba << SQL >> $MAINT_LOG
SELECT 'Database: ' || name || ' Mode: ' || open_mode FROM v\$database;
SELECT 'Instance: ' || instance_name || ' Status: ' || status FROM v\$instance;
EXIT;
SQL
# 检查表空间使用率
echo "2. 表空间使用率:" >> $MAINT_LOG
sqlplus -s / as sysdba << SQL >> $MAINT_LOG
SELECT tablespace_name,
ROUND(used_percent, 1) AS used_pct
FROM dba_tablespace_usage_metrics
WHERE used_percent > 80;
EXIT;
SQL
# 收集统计信息
echo "3. 收集统计信息:" >> $MAINT_LOG
sqlplus -s / as sysdba << SQL >> $MAINT_LOG
EXEC DBMS_STATS.GATHER_DATABASE_STATS(estimate_percent=>10, cascade=>TRUE);
EXIT;
SQL
echo "维护完成" >> $MAINT_LOG
EOF
chmod 755 /u01/scripts/daily_maintenance.sh
chown oracle:oinstall /u01/scripts/daily_maintenance.sh
# 添加到crontab(每天凌晨2点执行)
(crontab -u oracle -l 2>/dev/null; echo "0 2 * * * /u01/scripts/daily_maintenance.sh") | crontab -u oracle -
echo "日常维护脚本配置完成"
结语
感谢您的阅读!期待您的一键三连!欢迎指正!