启动Oracle 11gR2后报错:ORA-00845

本文介绍了解决Oracle11gR2启动时报ORA-00845错误的方法,通过调整tmpfs的配置避免MEMORY_TARGET设置引起的故障。

这个错误已经网上已经有很多事例了,我自己做个记录。

启动Oracle 11gR2后报错:ORA-00845

rac1:/home/oracle> sqlplus / as sysdba;

SQL*Plus: Release 11.2.0.3.0 Production onTue Feb 14 09:11:41 2012

Copyright (c) 1982, 2011, Oracle. All rights reserved.

Connected to an idle instance.

SQL> startup

ORA-00845: MEMORY_TARGET not supported onthis system

这个错误之前已经处理过,因为tmpfs的大小MEMORY_TARGET的设置,就会报这种错误。

处理

[root@localhost ~]#umount tmpfs

(这里可能回报busy,重启一下再umount)

[root@localhost ~]# mount -t tmpfs shmfs -o size=1g /dev/shm (不用重启)

[root@localhost ~]# vi /etc/fstab(这里需要重启生效)

tmpfs /dev/shm tmpfs defaults,size=1g 0 0

[root@localhost ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/VolGroup00-LogVol00
18G 15G 2.2G 87% /
/dev/sda1 99M 12M 82M 13% /boot
/dev/hdc 2.9G 2.9G 0 100% /media/RHEL_5.3 i386 DVD
shmfs 1.0G 0 1.0G 0% /dev/shm

[root@localhost ~]# su - oracle

SQL*Plus: Release 11.2.0.1.0 Production on Mon Jun 25 15:00:48 2012

Copyright (c) 1982, 2009, Oracle. All rights reserved.

Connected to an idle instance.

SQL> startup
ORACLE instance started.

Total System Global Area 422670336 bytes
Fixed Size 1336960 bytes
Variable Size 281020800 bytes
Database Buffers 134217728 bytes
Redo Buffers 6094848 bytes

<think>我们正在处理一个在Ubuntu上部署应用连接Oracle 11gR2数据库时出现的错误。错误信息包括ORA-00604和ORA-01882。 根据引用[1]中提到的错误信息,我们看到了一个ORA-600 [25027]的错误,但当前用户的问题是两个不同的错误:ORA-00604和ORA-01882。 因此,我们需要分别分析这两个错误。 首先,让我们理解这两个错误的含义: 1. ORA-00604: 这是一个一般性的错误,表示在SQL语句执行过程中出现了递归错误。它通常是由于底层的问题(如数据字典损坏、参数设置不正确、权限问题等)引起的。 2. ORA-01882: 这个错误表示时区区域未找到。这通常与时区设置有关,可能是数据库的时区文件与客户端或操作系统的时区设置不匹配,或者时区信息在数据库中不存在。 结合这两个错误,我们可能面临的问题是在应用连接数据库并执行SQL语句时,由于时区设置不正确导致的问题。 接下来,我们参考引用[2]到[5],这些引用提供了在Ubuntu上安装Oracle 11gR2的一些信息,但并没有直接提到ORA-01882错误。不过,我们可以从时区设置的角度来考虑。 解决思路: 1. 确认数据库的时区设置。 2. 确认操作系统的时区设置。 3. 确认应用的时区设置。 4. 检查数据库的时区文件版本。 步骤: 1. 检查数据库的时区设置: 我们可以通过以下SQL查询数据库的时区: ```sql SELECT DBTIMEZONE FROM DUAL; SELECT SESSIONTIMEZONE FROM DUAL; ``` 2. 检查操作系统的时区设置: 在Ubuntu上,使用命令: ```bash timedatectl ``` 或者查看/etc/timezone文件。 3. 检查应用的时区设置:确保应用使用的时区与数据库的时区设置兼容。 4. 时区文件版本:Oracle数据库使用特定的时区文件(timezone file)来支持时区信息。如果时区文件过旧,可能无法识别某些时区。Oracle 11gR2默认的时区文件版本可能比较旧(比如v11),而Ubuntu系统可能使用较新的时区数据。 如何检查数据库的时区文件版本? 可以通过以下SQL查询: ```sql SELECT * FROM v$timezone_file; ``` 或者 ```sql SELECT TZ_VERSION FROM registry$database; ``` 解决方案: 1. 更新数据库的时区文件(如果可能)。但是,更新时区文件是一个复杂的操作,需要打补丁,并且可能会影响数据库的稳定性。因此,在生产环境中需要谨慎。 2. 另一种方法是设置数据库的时区为一个已知的、受支持的时区,比如UTC或一个具体的时区(如'Asia/Shanghai'),并确保应用也使用相同的时区。 修改数据库时区(注意:修改时区需要重启数据库): 在Oracle 11gR2中,我们可以使用以下命令修改时区: ```sql ALTER DATABASE SET TIME_ZONE = 'Asia/Shanghai'; ``` 然后重启数据库。 但是,请注意:修改数据库时区只影响新创建的会话,并且只对TIMESTAMP WITH LOCAL TIME ZONE数据类型有影响。而且,这个操作需要重启数据库,可能不适合生产环境随意更改。 3. 在应用连接字符串中指定时区: 在应用的连接字符串中,可以设置时区参数,例如: ``` jdbc:oracle:thin:@host:port:sid?user=username&password=password&oracle.jdbc.timezoneAsRegion=false ``` 或者设置特定的时区,例如: ``` jdbc:oracle:thin:@host:port:sid?user=username&password=password&oracle.jdbc.timezone=Asia/Shanghai ``` 具体取决于应用使用的驱动和配置方式。 4. 检查数据库的NLS设置: 有时NLS设置也可能导致日期问题,可以检查: ```sql SELECT * FROM nls_database_parameters WHERE parameter LIKE '%TIME%'; ``` 5. 如果问题是由于时区区域未找到,可以尝试在数据库中创建时区信息(如果缺失): 但是,Oracle 11gR2默认不包含所有时区,需要手动加载。可以通过以下步骤加载: ```sql EXEC DBMS_DST.UPGRADE_DATABASE; ``` 注意:这个操作需要数据库在升级模式下运行,并且是一个长时间运行的操作,可能会锁表,因此需要在维护窗口进行。 由于具体环境不同,我们需要根据实际情况选择解决方案。 考虑到用户的环境是在Ubuntu上安装的Oracle 11gR2,并且是应用连接时出现的错误,我们建议首先检查数据库的时区设置和应用的时区设置是否一致,然后尝试在应用连接字符串中指定时区。 另外,我们注意到引用[1]中提到了一个ORA-600 [25027]的错误,但用户的问题中并没有提到这个错误,所以我们暂时不考虑它。 总结步骤: 1. 检查数据库的时区设置(DBTIMEZONE和SESSIONTIMEZONE)。 2. 检查操作系统的时区设置。 3. 在应用连接字符串中明确指定时区。 4. 如果数据库的时区文件版本过旧,考虑更新时区文件(需要打补丁)或者加载缺失的时区信息(使用DBMS_DST包)。 由于更新时区文件或加载时区信息操作复杂,我们建议先尝试简单的设置方法。 如果以上步骤不能解决问题,可能需要进一步分析具体的错误堆栈和应用程序代码。 注意:在修改数据库设置之前,请确保备份数据库。 下面,我们将按照上述步骤提供详细的解决方案。</think>### 解决Ubuntu部署应用连接Oracle 11gR2时出现ORA-00604和ORA-01882错误 #### 问题分析 这两个错误通常与**时区配置冲突**相关: 1. **ORA-00604**:递归SQL层出现错误(一般由底层配置问题引发) 2. **ORA-01882**:未找到时区区域(核心问题) 根本原因是应用与数据库的时区文件不匹配,尤其在Ubuntu系统与Oracle 11gR2的组合环境中常见[^1][^5]。 --- ### 解决方案 #### 步骤1:检查数据库时区配置 ```sql -- 查询数据库时区 SELECT DBTIMEZONE FROM DUAL; -- 查询会话时区 SELECT SESSIONTIMEZONE FROM DUAL; -- 检查时区文件版本 SELECT * FROM v$timezone_file; ``` 若返回`UNKNOWN`或版本低于31(如默认v11),需更新时区文件[^1][^3]。 --- #### 步骤2:同步操作系统时区(Ubuntu端) ```bash # 查看当前时区 timedatectl # 设置时区(示例:亚洲上海) sudo timedatectl set-timezone Asia/Shanghai # 验证Oracle环境变量 echo $TZ ``` --- #### 步骤3:更新数据库时区文件 1. **下载新版时区文件** 从Oracle支持网站下载对应版本的时区文件补丁(如`p6880880_112000_Linux-x86-64.zip`) 2. **更新时区文件** ```bash unzip p6880880_112000_Linux-x86-64.zip cd 6880880 opatch apply ``` 3. **加载时区数据** ```sql EXEC DBMS_DST.BEGIN_PREPARE; EXEC DBMS_DST.UPGRADE_DATABASE; EXEC DBMS_DST.END_PREPARE; ``` --- #### 步骤4:配置应用连接参数 在应用连接字符串中显式指定时区: ```java // JDBC示例 jdbc:oracle:thin:@//host:1521/sid?oracle.jdbc.timezoneAsRegion=true ``` 或 ```python # Python cx_Oracle dsn = cx_Oracle.makedsn("host", 1521, sid="lucifer", timezone="Asia/Shanghai") ``` --- #### 步骤5:验证修复 ```sql -- 创建测试表 CREATE TABLE tz_test (ts TIMESTAMP WITH TIME ZONE); -- 插入数据(应不再报错) INSERT INTO tz_test VALUES (CURRENT_TIMESTAMP); ``` --- ### 关键注意事项 1. **时区文件版本一致性** Ubuntu系统的`/usr/share/zoneinfo`文件需与Oracle的`$ORACLE_HOME/oracore/zoneinfo`版本匹配[^5]。 2. **NLS_LANG设置** 在应用环境变量中添加: ```bash export NLS_LANG=AMERICAN_AMERICA.AL32UTF8 ``` 3. **权限问题** 确保Oracle用户有权读取系统时区文件: ```bash sudo ln -s /usr/share/zoneinfo /home/oracle/zoneinfo chown -R oracle:oinstall /home/oracle/zoneinfo ``` > ⚠️ 操作前务必备份数据库!时区更新操作不可逆[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值