1. 项目概述
在Linux 7系统上安装Oracle 11.2.0.4数据库是一个经典的企业级数据库部署场景。作为一款成熟稳定的数据库版本,Oracle 11.2.0.4至今仍被广泛应用于金融、电信等行业的核心业务系统。不同于Windows平台的图形化安装,Linux环境下的Oracle安装需要处理更多系统级配置,这也是许多DBA在实际工作中遇到的第一个技术挑战。
我曾在多个生产环境中部署过这个版本的Oracle,发现即便是经验丰富的管理员,也容易在以下几个关键环节出现问题:内核参数调整、用户环境变量配置、依赖包安装以及最后的数据库创建阶段。本文将基于CentOS 7/RHEL 7系统,详细拆解每个安装步骤的技术要点,并分享我在实际部署中积累的实用技巧。
2. 环境准备
2.1 系统要求核查
在开始安装前,必须确保系统满足Oracle 11.2.0.4的最低要求。以下是经过验证的配置标准:
- 内存:物理内存至少2GB(生产环境建议8GB以上)
- 交换空间:遵循Oracle官方公式计算:
- 内存1-2GB时,交换空间为内存的1.5倍
- 内存2-16GB时,交换空间等于内存大小
- 内存超过16GB时,交换空间保持16GB
- 磁盘空间:
- /tmp目录至少1GB空闲
- Oracle软件安装需要4.5GB
- 数据库文件根据业务需求规划(建议至少20GB)
- 操作系统:RHEL 7/CentOS 7的64位版本
提示:使用
free -m检查内存和交换空间,df -h检查磁盘空间。我曾遇到过/tmp空间不足导致安装失败的案例,建议提前清理或扩展。
2.2 依赖包安装
Oracle 11.2.0.4对系统依赖包有严格要求,缺少任一包都可能导致安装失败。以下是必须安装的软件包列表:
yum install -y binutils compat-libcap1 compat-libstdc++-33 gcc gcc-c++ glibc glibc-devel ksh libaio libaio-devel libgcc libstdc++ libstdc++-devel libXi libXtst make sysstat unixODBC unixODBC-devel对于中文环境,还需要额外安装:
yum groupinstall -y "Chinese Support"经验表明,32位兼容库(如compat-libstdc++-33.i686)经常被忽略,但在某些Oracle组件中仍是必需的。如果遇到链接错误,可以尝试补充安装:
yum install -y compat-libstdc++-33.i686 libstdc++.i6862.3 内核参数调整
Oracle数据库对Linux内核参数有特殊要求,需要修改/etc/sysctl.conf文件。以下是经过生产验证的参数配置:
fs.aio-max-nr = 1048576 fs.file-max = 6815744 kernel.shmall = 2097152 kernel.shmmax = 536870912 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应用修改后执行:
sysctl -p注意:shmmax参数不应超过物理内存的50%。我曾在一个64GB内存的服务器上错误设置为接近物理内存大小,导致系统不稳定。
2.4 用户与环境配置
Oracle不建议使用root用户直接安装,需要创建专用的oracle用户和oinstall/dba组:
groupadd oinstall groupadd dba useradd -g oinstall -G dba oracle passwd oracle设置oracle用户的环境变量(~oracle/.bash_profile):
export ORACLE_BASE=/u01/app/oracle export ORACLE_HOME=$ORACLE_BASE/product/11.2.0/dbhome_1 export ORACLE_SID=orcl export PATH=$PATH:$ORACLE_HOME/bin export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/usr/lib umask 022目录权限设置:
mkdir -p /u01/app/oracle chown -R oracle:oinstall /u01 chmod -R 775 /u013. Oracle软件安装
3.1 安装包准备
Oracle 11.2.0.4的安装包通常包含两个zip文件:
- linux.x64_11gR2_database_1of2.zip
- linux.x64_11gR2_database_2of2.zip
解压到同一目录:
unzip linux.x64_11gR2_database_1of2.zip -d /tmp/oracle unzip linux.x64_11gR2_database_2of2.zip -d /tmp/oracle技巧:如果通过Xmanager等工具远程安装,建议先在本机解压再上传完整目录。我遇到过因网络传输中断导致zip文件损坏的情况。
3.2 运行安装程序
切换到oracle用户启动安装:
su - oracle cd /tmp/oracle/database ./runInstaller安装过程中需要关注以下几个关键界面:
- 配置选项:选择"仅安装数据库软件"
- 安装类型:企业版(根据许可证选择)
- 安装位置:确认ORACLE_HOME路径
- 先决条件检查:必须全部通过(可忽略swap空间警告)
3.3 执行root脚本
安装完成后会提示运行两个root脚本:
/u01/app/oraInventory/orainstRoot.sh /u01/app/oracle/product/11.2.0/dbhome_1/root.sh常见问题处理:
- 如果root.sh执行报错"Unknown host",在/etc/hosts中添加主机名解析
- 遇到"permission denied"时,检查/tmp目录权限(chmod 1777 /tmp)
4. 数据库创建
4.1 使用DBCA创建数据库
通过oracle用户运行数据库配置助手:
dbca关键配置步骤:
- 创建数据库→ 一般用途或事务处理
- 全局数据库名:orcl.yourdomain.com
- 管理选项:不配置Enterprise Manager(11.2.0.4的OEM已过时)
- 数据库身份证明:为所有账户使用同一管理口令
- 存储类型:文件系统
- 数据库文件位置:使用模板中的默认位置
- 恢复配置:启用归档模式(生产环境必须)
- 示例方案:根据需求选择是否安装
经验:在资源受限的环境,取消"示例方案"可节省约500MB空间。我曾在一个虚拟机环境中因此避免了空间不足的问题。
4.2 关键参数调整
创建完成后,建议修改以下参数(通过sqlplus连接后执行):
ALTER SYSTEM SET processes=300 SCOPE=spfile; ALTER SYSTEM SET sessions=335 SCOPE=spfile; ALTER SYSTEM SET open_cursors=300 SCOPE=spfile; ALTER SYSTEM SET pga_aggregate_target=1G SCOPE=spfile; ALTER SYSTEM SET sga_target=3G SCOPE=spfile;重启数据库使参数生效:
SHUTDOWN IMMEDIATE; STARTUP;5. 安装后配置
5.1 网络服务配置
修改listener.ora和tnsnames.ora(位于$ORACLE_HOME/network/admin):
# listener.ora SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (SID_NAME = orcl) (ORACLE_HOME = /u01/app/oracle/product/11.2.0/dbhome_1) ) ) LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = your_hostname)(PORT = 1521)) ) )# tnsnames.ora ORCL = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = your_hostname)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl) ) )启动监听:
lsnrctl start5.2 自动启动配置
创建/etc/init.d/oracle启动脚本:
#!/bin/sh # chkconfig: 345 99 10 case "$1" in 'start') su - oracle -c "$ORACLE_HOME/bin/dbstart $ORACLE_HOME" su - oracle -c "$ORACLE_HOME/bin/lsnrctl start" ;; 'stop') su - oracle -c "$ORACLE_HOME/bin/dbshut $ORACLE_HOME" su - oracle -c "$ORACLE_HOME/bin/lsnrctl stop" ;; esac exit 0设置开机启动:
chmod 750 /etc/init.d/oracle chkconfig --add oracle6. 常见问题解决
6.1 ORA-00845错误
启动数据库时报错:
ORA-00845: MEMORY_TARGET not supported on this system解决方法:
umount /dev/shm mount -t tmpfs shmfs -o size=7g /dev/shm将挂载命令添加到/etc/fstab实现持久化:
tmpfs /dev/shm tmpfs defaults,size=7g 0 06.2 ORA-01078错误
ORA-01078: failure in processing system parameters LRM-00109: could not open parameter file原因:spfile未正确创建。解决方案:
CREATE SPFILE FROM PFILE; STARTUP;6.3 图形界面启动失败
如果runInstaller无法启动图形界面:
- 确保已安装libXp:
yum install -y libXp- 使用oracle用户设置DISPLAY:
export DISPLAY=your_ip:0.0 xhost +- 如仍失败,可尝试静默安装:
./runInstaller -silent -responseFile /path/to/response.rsp7. 性能优化建议
7.1 ASM磁盘配置
对于生产环境,建议使用ASM存储:
- 安装ASM支持包:
yum install -y oracleasm-support oracleasmlib oracleasm-`uname -r`- 配置ASM磁盘:
/etc/init.d/oracleasm configure /etc/init.d/oracleasm createdisk VOL1 /dev/sdb1- 在DBCA中选择ASM存储类型
7.2 内存自动管理
对于11.2.0.4版本,建议使用自动内存管理:
ALTER SYSTEM SET memory_target=4G SCOPE=spfile; ALTER SYSTEM SET memory_max_target=4G SCOPE=spfile;7.3 关键性能视图监控
配置以下定时任务收集性能数据:
BEGIN DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT(); END; / -- 查询ASH报告 SELECT * FROM TABLE(DBMS_WORKLOAD_REPOSITORY.ASH_REPORT_TEXT( l_dbid => (SELECT dbid FROM v$database), l_inst_num => 1, l_btime => SYSDATE-1/24, l_etime => SYSDATE));8. 安全加固措施
8.1 密码策略修改
ALTER PROFILE DEFAULT LIMIT FAILED_LOGIN_ATTEMPTS 5 PASSWORD_LIFE_TIME 90 PASSWORD_REUSE_TIME 365 PASSWORD_REUSE_MAX 10 PASSWORD_LOCK_TIME 1;8.2 审计配置
启用标准审计:
AUDIT CREATE SESSION; AUDIT SELECT TABLE, UPDATE TABLE, INSERT TABLE, DELETE TABLE BY ACCESS;8.3 网络加密
配置sqlnet.ora启用加密:
SQLNET.ENCRYPTION_SERVER = required SQLNET.ENCRYPTION_TYPES_SERVER = (AES256) SQLNET.CRYPTO_CHECKSUM_SERVER = required SQLNET.CRYPTO_CHECKSUM_TYPES_SERVER = (SHA1)9. 备份与恢复方案
9.1 RMAN基础配置
创建RMAN目录数据库:
CREATE TABLESPACE rman_ts DATAFILE '/u01/app/oracle/oradata/orcl/rman01.dbf' SIZE 1G; CREATE USER rman IDENTIFIED BY rman_pass DEFAULT TABLESPACE rman_ts TEMPORARY TABLESPACE temp QUOTA UNLIMITED ON rman_ts; GRANT RECOVERY_CATALOG_OWNER TO rman;注册数据库到RMAN目录:
rman CATALOG rman/rman_pass@rman_catalog RMAN> REGISTER DATABASE;9.2 自动化备份脚本
创建备份脚本/usr/local/bin/oracle_backup.sh:
#!/bin/bash export ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1 export PATH=$PATH:$ORACLE_HOME/bin rman target / catalog rman/rman_pass@rman_catalog <<EOF RUN { ALLOCATE CHANNEL ch1 DEVICE TYPE DISK FORMAT '/backup/orcl_%U.bak'; BACKUP DATABASE PLUS ARCHIVELOG; DELETE NOPROMPT OBSOLETE; CROSSCHECK BACKUP; REPORT OBSOLETE; } EOF设置定时任务:
0 2 * * * /usr/local/bin/oracle_backup.sh > /var/log/oracle_backup.log 2>&110. 日常维护命令
10.1 空间监控
-- 表空间使用情况 SELECT tablespace_name, round(SUM(bytes)/1024/1024,2) total_mb, round(SUM(bytes)/1024/1024 - NVL(SUM(free_bytes)/1024/1024,0),2) used_mb, round(NVL(SUM(free_bytes)/1024/1024,0),2) free_mb, round((SUM(bytes)/1024/1024 - NVL(SUM(free_bytes)/1024/1024,0))/(SUM(bytes)/1024/1024)*100,2) pct_used FROM (SELECT tablespace_name, file_id, SUM(bytes) bytes FROM dba_data_files GROUP BY tablespace_name, file_id) df, (SELECT tablespace_name, file_id, SUM(bytes) free_bytes FROM dba_free_space GROUP BY tablespace_name, file_id) fs WHERE df.tablespace_name = fs.tablespace_name(+) AND df.file_id = fs.file_id(+) GROUP BY tablespace_name;10.2 会话管理
-- 查看活跃会话 SELECT s.sid, s.serial#, s.username, s.status, s.machine, s.program, s.sql_id, sq.sql_text FROM v$session s, v$sql sq WHERE s.sql_id = sq.sql_id(+) AND s.status = 'ACTIVE';10.3 统计信息收集
-- 手动收集统计信息 EXEC DBMS_STATS.GATHER_SCHEMA_STATS('SCOTT', estimate_percent=>30, cascade=>TRUE);11. 升级与补丁管理
11.1 应用PSU补丁
Oracle 11.2.0.4的最新PSU补丁安装步骤:
- 下载补丁文件并解压
- 关闭数据库和监听
- 运行OPatch工具:
cd /path/to/patch opatch apply- 更新数据库字典:
STARTUP UPGRADE @?/rdbms/admin/catbundle.sql psu apply SHUTDOWN IMMEDIATE STARTUP11.2 版本回滚
如果补丁导致问题,可以回滚:
opatch rollback -id <patch_id>12. 高可用配置
12.1 Data Guard物理备库
主库配置:
ALTER DATABASE FORCE LOGGING; ALTER SYSTEM SET LOG_ARCHIVE_CONFIG='DG_CONFIG=(orcl,orcl_stby)' SCOPE=spfile; ALTER SYSTEM SET LOG_ARCHIVE_DEST_2='SERVICE=orcl_stby LGWR SYNC AFFIRM VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=orcl_stby' SCOPE=spfile; ALTER SYSTEM SET FAL_SERVER=orcl_stby SCOPE=spfile; ALTER SYSTEM SET STANDBY_FILE_MANAGEMENT=AUTO SCOPE=spfile;12.2 RAC集群配置
安装GI(Grid Infrastructure)后,使用DBCA创建RAC数据库:
- 选择"Oracle Real Application Clusters database"
- 配置所有节点信息
- 指定共享存储(ASM或集群文件系统)
13. 迁移策略
13.1 使用Data Pump迁移
导出源数据库:
expdp system/password FULL=Y DIRECTORY=DATA_PUMP_DIR DUMPFILE=full.dmp LOGFILE=expdp.log导入到目标库:
impdp system/password FULL=Y DIRECTORY=DATA_PUMP_DIR DUMPFILE=full.dmp LOGFILE=impdp.log13.2 表空间传输
适用于大数据量迁移:
-- 源库 ALTER TABLESPACE users READ ONLY; HOST expdp system/password TRANSPORT_TABLESPACES=users DIRECTORY=DATA_PUMP_DIR DUMPFILE=tts.dmp LOGFILE=tts.log ALTER TABLESPACE users READ WRITE; -- 目标库 HOST impdp system/password TRANSPORT_DATAFILES='/path/to/users01.dbf' DIRECTORY=DATA_PUMP_DIR DUMPFILE=tts.dmp LOGFILE=tts_imp.log ALTER TABLESPACE users READ WRITE;14. 监控与警报
14.1 自定义监控脚本
创建表空间监控脚本/usr/local/bin/check_tablespace.sh:
#!/bin/bash result=$(sqlplus -s / as sysdba <<EOF SET PAGESIZE 0 FEEDBACK OFF VERIFY OFF HEADING OFF ECHO OFF SELECT tablespace_name FROM ( SELECT tablespace_name, SUM(bytes)/1024/1024 total_mb, SUM(bytes)/1024/1024 - NVL(SUM(free_bytes)/1024/1024,0) used_mb, (SUM(bytes)/1024/1024 - NVL(SUM(free_bytes)/1024/1024,0))/(SUM(bytes)/1024/1024)*100 pct_used FROM (SELECT tablespace_name, file_id, SUM(bytes) bytes FROM dba_data_files GROUP BY tablespace_name, file_id) df, (SELECT tablespace_name, file_id, SUM(bytes) free_bytes FROM dba_free_space GROUP BY tablespace_name, file_id) fs WHERE df.tablespace_name = fs.tablespace_name(+) AND df.file_id = fs.file_id(+) GROUP BY tablespace_name) WHERE pct_used > 90; EOF) if [ -n "$result" ]; then echo "以下表空间使用率超过90%:$result" | mail -s "Oracle表空间警报" dba@example.com fi14.2 AWR报告自动化
配置定期生成AWR报告:
BEGIN DBMS_WORKLOAD_REPOSITORY.modify_snapshot_settings( interval => 60, retention => 43200); END; /15. 性能调优实战
15.1 SQL调优案例
分析执行计划:
EXPLAIN PLAN FOR SELECT * FROM large_table WHERE status = 'ACTIVE'; SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);创建优化索引:
CREATE INDEX idx_large_table_status ON large_table(status) TABLESPACE users COMPUTE STATISTICS;15.2 内存调整
检查内存分配:
SELECT component, current_size/1024/1024 size_mb FROM v$memory_dynamic_components;调整PGA:
ALTER SYSTEM SET pga_aggregate_target=2G SCOPE=BOTH;16. 故障诊断技巧
16.1 日志分析
关键日志文件位置:
- 告警日志:$ORACLE_BASE/diag/rdbms/$ORACLE_SID/trace/alert_$ORACLE_SID.log
- 跟踪文件:$ORACLE_BASE/diag/rdbms/$ORACLE_SID/trace/
常用分析命令:
# 监控最新错误 tail -f $ORACLE_BASE/diag/rdbms/$ORACLE_SID/trace/alert_$ORACLE_SID.log | grep -i error # 查找ORA-00600错误 grep "ORA-00600" $ORACLE_BASE/diag/rdbms/$ORACLE_SID/trace/alert_$ORACLE_SID.log16.2 挂起会话处理
查找阻塞会话:
SELECT blocking_session, sid, serial#, wait_class, seconds_in_wait FROM v$session WHERE blocking_session IS NOT NULL;终止问题会话:
ALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE;17. 实用脚本集锦
17.1 对象编译检查
SELECT owner, object_type, object_name, status FROM dba_objects WHERE status = 'INVALID' ORDER BY owner, object_type;重新编译无效对象:
@?/rdbms/admin/utlrp.sql17.2 权限审计
SELECT grantee, privilege, admin_option FROM dba_sys_privs WHERE grantee IN ('SCOTT', 'HR') ORDER BY grantee;18. 扩展功能配置
18.1 Oracle Text安装
CONNECT / AS SYSDBA @?/ctx/admin/catctx.sql change_on_install SYSAUX TEMP NOLOCK @?/ctx/admin/defaults/dr0defin.sql "AMERICAN" GRANT EXECUTE ON CTXSYS.CTX_CLS TO PUBLIC; GRANT EXECUTE ON CTXSYS.CTX_DDL TO PUBLIC; GRANT EXECUTE ON CTXSYS.CTX_DOC TO PUBLIC; GRANT EXECUTE ON CTXSYS.CTX_OUTPUT TO PUBLIC; GRANT EXECUTE ON CTXSYS.CTX_QUERY TO PUBLIC; GRANT EXECUTE ON CTXSYS.CTX_REPORT TO PUBLIC; GRANT EXECUTE ON CTXSYS.CTX_THES TO PUBLIC; GRANT EXECUTE ON CTXSYS.CTX_ULEXER TO PUBLIC;18.2 分区表创建
CREATE TABLE sales ( sale_id NUMBER, sale_date DATE, customer_id NUMBER, amount NUMBER ) PARTITION BY RANGE (sale_date) ( PARTITION sales_q1 VALUES LESS THAN (TO_DATE('01-APR-2023','DD-MON-YYYY')), PARTITION sales_q2 VALUES LESS THAN (TO_DATE('01-JUL-2023','DD-MON-YYYY')), PARTITION sales_q3 VALUES LESS THAN (TO_DATE('01-OCT-2023','DD-MON-YYYY')), PARTITION sales_q4 VALUES LESS THAN (TO_DATE('01-JAN-2024','DD-MON-YYYY')) );19. 安全审计配置
19.1 细粒度审计
BEGIN DBMS_FGA.ADD_POLICY( object_schema => 'HR', object_name => 'EMPLOYEES', policy_name => 'SALARY_ACCESS', audit_condition => 'SALARY > 10000', audit_column => 'SALARY', handler_schema => NULL, handler_module => NULL, enable => TRUE, statement_types => 'SELECT'); END; /19.2 标准审计
AUDIT SELECT TABLE, INSERT TABLE, UPDATE TABLE, DELETE TABLE BY ACCESS WHENEVER SUCCESSFUL;20. 备份恢复实战
20.1 表级时间点恢复
-- 创建恢复表空间 CREATE TABLESPACE recovery_ts DATAFILE '/u01/app/oracle/oradata/orcl/recovery01.dbf' SIZE 1G; -- 执行恢复 RUN { SET UNTIL TIME "TO_DATE('2023-07-15 14:00:00', 'YYYY-MM-DD HH24:MI:SS')"; RECOVER TABLE scott.employees AUXILIARY DESTINATION '/u01/app/oracle/recovery' TABLESPACE recovery_ts; }20.2 控制文件重建
-- 生成控制文件创建脚本 ALTER DATABASE BACKUP CONTROLFILE TO TRACE; -- 从跟踪文件中找到创建语句,修改后执行 STARTUP NOMOUNT CREATE CONTROLFILE REUSE DATABASE "ORCL" RESETLOGS MAXLOGFILES 16 MAXLOGMEMBERS 3 MAXDATAFILES 100 MAXINSTANCES 8 MAXLOGHISTORY 292 LOGFILE GROUP 1 '/u01/app/oracle/oradata/orcl/redo01.log' SIZE 50M, GROUP 2 '/u01/app/oracle/oradata/orcl/redo02.log' SIZE 50M, GROUP 3 '/u01/app/oracle/oradata/orcl/redo03.log' SIZE 50M DATAFILE '/u01/app/oracle/oradata/orcl/system01.dbf', '/u01/app/oracle/oradata/orcl/sysaux01.dbf', '/u01/app/oracle/oradata/orcl/undotbs01.dbf', '/u01/app/oracle/oradata/orcl/users01.dbf' CHARACTER SET AL32UTF8;