ORA-01855: AM/A.M. or PM/P.M. required错误解决

本文解决了一个在SQL*Plus中插入包含特定日期时间格式错误的问题,通过调整NLS_DATE_LANGUAGE设置来适应不同语言环境。同时,提供了一种在会话级别修改设置的方法,并探讨了不同设置下时间格式的差异。

环境:CentOS5.x,Oracle10R2

在SQL*Plus中插入时间类型数据时报了下面这个错:

insert into t(typeid,typename,uptime) values(52,'登录问题',to_date('04/22/2010 10:30:44 上午','mm/dd/yyyy hh:mi:ss am'));

ERROR at line 1:

ORA-01855: AM/A.M. or PM/P.M. required

 

这个应该是和NLS_DATE_LANGUAGE的设置有关,在我设置的NLS_DATE_LANGUAGE指定的语言中并不支持“上午”这样的表示方法,也就是说不同国家地区用来表示“上午/下午”的方式并不一样。

查看当前我的NLS_DATE_LANGUAGE的设置:

SQL> select * from v$nls_parameters;

PARAMETER                                                        VALUE

---------------------------------------------------------------- -----------------------------

NLS_LANGUAGE                                                     AMERICAN

NLS_TERRITORY                                                    AMERICA

NLS_CURRENCY                                                     $

NLS_ISO_CURRENCY                                                 AMERICA

NLS_NUMERIC_CHARACTERS                                           .,

NLS_CALENDAR                                                     GREGORIAN

NLS_DATE_FORMAT                                                  YYYY-MM-DD HH24:MI:SS

NLS_DATE_LANGUAGE                                                AMERICAN

NLS_CHARACTERSET                                                 ZHS16GBK

NLS_SORT                                                         BINARY

NLS_TIME_FORMAT                                                  HH.MI.SSXFF AM

NLS_TIMESTAMP_FORMAT                                             DD-MON-RR HH.MI.SSXFF AM

NLS_TIME_TZ_FORMAT                                               HH.MI.SSXFF AM TZR

NLS_TIMESTAMP_TZ_FORMAT                                          DD-MON-RR HH.MI.SSXFF AM TZR

NLS_DUAL_CURRENCY                                                $

NLS_NCHAR_CHARACTERSET                                           UTF8

NLS_COMP                                                         BINARY

NLS_LENGTH_SEMANTICS                                             BYTE

NLS_NCHAR_CONV_EXCP                                              FALSE

 

19 rows selected.

可以看到我的设置为AMERICAN,所以应该把时间中“上午”改为“AM”,以适应其语言定义要求,如果为“SIMPLIFIED CHINESE”,就可以使用“上午”这样的表示方式了。

上面是一种解决方式,也是我采用的,不过还有另一种方法,就是在session级别修改NLS_DATE_LANGUAGE的定义:

SQL> alter session set NLS_DATE_LANGUAGE='SIMPLIFIED CHINESE';

Session altered.

SQL> insert into t(typeid,typename,uptime) values(52,'登录问题',to_date('04/22/2010 10:30:44 上午','mm/dd/yyyy hh:mi:ss am'));

1 row created.

 

数据是通过Toad导出之后插入同一个库,不知为什么时间的格式会不一样,难道是toad设置或是windows的影响,有知道的可以告诉我一声。

<think> 我们正在解决在Rocky Linux虚拟机中安装Oracle AI Database Free版后出现的以下错误- ORA-12154: TNS:could not resolve the connect identifier specified - SP2-0306: Invalid option(无效选项,通常发生在SQL*Plus中命令输入错误- ORA-01017: invalid username/password; logon denied(无效的用户名/密码) - SP2-0157: cannot CONNECT to ORACLE after 3 attempts, exiting SQL*Plus(无法连接到Oracle,尝试3次后退出) 这些错误可能由多种原因引起,包括TNS配置问题、用户名/密码错误、监听器未启动、环境变量设置不正确等。以下将逐步排查并解决。 ### 步骤1: 检查监听器状态 ORA-12154通常表示客户端无法解析连接标识符(即TNS别名)。首先确保监听器已启动并正常运行。 ```bash # 切换到oracle用户 sudo su - oracle # 检查监听器状态 lsnrctl status ``` 如果监听器未启动,启动它: ```bash lsnrctl start ``` ### 步骤2: 验证TNS配置 检查`tnsnames.ora`文件中的配置,确保连接字符串正确。文件通常位于`$ORACLE_HOME/network/admin/tnsnames.ora`。 ```bash cat $ORACLE_HOME/network/admin/tnsnames.ora ``` 示例配置: ``` ORCL = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = ORCL) ) ) ``` 如果文件不存在或配置不正确,请创建或修改它。确保`HOST`设置为正确的主机名(或IP),端口为1521。 ### 步骤3: 检查环境变量 确保`ORACLE_HOME`和`ORACLE_SID`环境变量设置正确。在oracle用户下: ```bash echo $ORACLE_HOME echo $ORACLE_SID ``` 正常输出应类似: ``` /opt/oracle/product/26ai/dbhome_1 ORCL ``` 如果未设置,请编辑oracle用户的`~/.bash_profile`,添加: ```bash export ORACLE_HOME=/opt/oracle/product/26ai/dbhome_1 export ORACLE_SID=ORCL export PATH=$ORACLE_HOME/bin:$PATH ``` 然后执行`source ~/.bash_profile`。 ### 步骤4: 验证数据库实例状态 确保数据库实例已启动: ```bash sqlplus / as sysdba <<EOF SELECT status FROM v$instance; EXIT; EOF ``` 如果实例未启动,启动它: ```bash sqlplus / as sysdba <<EOF STARTUP; EXIT; EOF ``` ### 步骤5: 检查用户名和密码 ORA-01017错误表示用户名或密码错误。请确认: - 使用正确的用户名(如SYSTEM, SYS等)和密码。 - 密码区分大小写(默认安装可能未启用大小写敏感,但最好确认)。 尝试以SYS用户通过操作系统认证登录(无需密码): ```bash sqlplus / as sysdba ``` 如果成功,可以修改SYSTEM用户的密码: ```SQL ALTER USER SYSTEM IDENTIFIED BY 新密码; ``` ### 步骤6: 测试连接 使用完整的TNS别名连接: ```bash sqlplus system/密码@ORCL ``` 如果仍然出现ORA-12154,尝试使用Easy Connect方式(不依赖tnsnames.ora): ```bash sqlplus system/密码@localhost:1521/ORCL ``` 如果Easy Connect可以连接,则问题在tnsnames.ora配置。 ### 步骤7: 检查监听器配置文件 查看`listener.ora`(位于`$ORACLE_HOME/network/admin`): ```bash cat $ORACLE_HOME/network/admin/listener.ora ``` 确保监听器配置了正确的SID: ``` LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 0.0.0.0)(PORT = 1521)) (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521)) ) ) SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (GLOBAL_DBNAME = ORCL) (SID_NAME = ORCL) (ORACLE_HOME = /opt/oracle/product/26ai/dbhome_1) ) ) ``` 修改后重启监听器: ```bash lsnrctl stop lsnrctl start ``` ### 步骤8: 处理SP2-0306和SP2-0157 这两个错误通常是前续错误(如连接失败)导致的SQL*Plus退出。解决上述连接问题后,这些错误将消失。 ### 总结解决方案 1. 启动监听器和数据库实例。 2. 正确配置`tnsnames.ora`和`listener.ora`。 3. 设置正确的环境变量(ORACLE_HOME, ORACLE_SID)。 4. 使用正确的用户名和密码。 5. 测试连接时,可先用Easy Connect方式排除TNS问题。 如果问题依旧,检查日志: - 监听器日志:`$ORACLE_HOME/network/log/listener.log` - 数据库告警日志:`$ORACLE_HOME/diag/rdbms/<sid>/<sid>/trace/alert_<sid>.log` 通过以上步骤,大部分连接问题都可以解决[^1]。 ### 相关问题 1. 如何重置Oracle数据库的SYS和SYSTEM用户密码? 2. 在Rocky Linux中如何配置Oracle数据库的自动启动? 3. 如何诊断Oracle监听器的连接问题? 4. Oracle数据库常见的网络配置错误有哪些? 希望这些步骤能帮助你解决问题。 </think>以下是针对在Rocky Linux虚拟机安装Oracle AI Database Free后出现的ORA-12154、SP2-0306、ORA-01017和SP2-0157错误的完整解决方案: ### 错误原因综合分析 这些错误通常由配置问题引起: 1. **ORA-12154**:TNS无法解析连接标识符(网络配置错误) 2. **SP2-0306**:SQL*Plus命令无效(环境变量或语法错误) 3. **ORA-01017**:无效的用户名/密码(认证问题) 4. **SP2-0157**:SQL*Plus连接失败(综合前序错误导致) --- ### 逐步解决方案 #### 步骤1: 验证监听器状态(解决ORA-12154) ```bash # 切换到oracle用户 sudo su - oracle # 检查监听器状态 lsnrctl status # 若未运行则启动 lsnrctl start ``` #### 步骤2: 检查TNS配置(解决ORA-12154) ```bash # 检查tnsnames.ora配置 cat $ORACLE_HOME/network/admin/tnsnames.ora # 应有类似配置: ORCL = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = ORCL) ) ) ``` #### 步骤3: 验证环境变量(解决SP2-0306) ```bash # 检查关键环境变量 echo $ORACLE_HOME echo $ORACLE_SID echo $PATH # 在oracle用户下设置(编辑~/.bash_profile) export ORACLE_HOME=/opt/oracle/product/26ai/dbhome_1 export ORACLE_SID=ORCL export PATH=$ORACLE_HOME/bin:$PATH source ~/.bash_profile ``` #### 步骤4: 重置密码(解决ORA-01017) ```bash # 使用sysdba权限登录 sqlplus / as sysdba # 重置SYSTEM用户密码 ALTER USER SYSTEM IDENTIFIED BY 新密码; ``` #### 步骤5: 测试不同连接方式 ```sql /* 方式1:使用完整连接字符串 */ CONNECT system/密码@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=ORCL))) /* 方式2:使用Easy Connect语法 */ CONNECT system/密码@localhost:1521/ORCL ``` #### 步骤6: 检查监听器日志 ```bash # 查看监听器日志 tail -f $ORACLE_HOME/network/log/listener.log # 常见错误排查: # 1. 确认HOST=localhost能解析(或改用IP) # 2. 检查防火墙是否开放1521端口 sudo firewall-cmd --list-ports sudo firewall-cmd --add-port=1521/tcp --permanent sudo firewall-cmd --reload ``` #### 步骤7: 重新配置数据库(终极方案) ```bash # 停止所有服务 sudo systemctl stop oracle-database-26ai # 移除现有配置 sudo rm -rf /opt/oracle/oradata/ORCL/* # 重新初始化 sudo /etc/init.d/oracle-database-setup-26ai free # 启动服务 sudo systemctl start oracle-database-26ai ``` --- ### 关键配置检查表 | 配置文件 | 路径 | 检查要点 | |---------|------|---------| | `tnsnames.ora` | `$ORACLE_HOME/network/admin` | HOST值应为localhost或实际IP | | `listener.ora` | `$ORACLE_HOME/network/admin` | SID_NAME应与ORACLE_SID一致 | | `.bash_profile` | `/home/oracle/` | ORACLE_HOME/ORACLE_SID/PATH正确 | | `password` | - | 密码中避免特殊字符@/$ | --- ### 预防措施 1. **安装后立即测试**:在完成安装后运行基本连接测试 ```bash sqlplus system/安装时设置的密码@ORCL ``` 2. **使用连接测试脚本**: ```bash #!/bin/bash tnsping ORCL sqlplus -L system/密码@ORCL <<EOF SELECT * FROM dual; EXIT; EOF ``` 3. **启用自动启动**: ```bash sudo systemctl enable oracle-database-26ai ``` > **故障恢复提示**:若所有方案无效,可尝试重建虚拟机并严格遵循安装流程[^1]。Oracle日志位于`$ORACLE_BASE/diag/rdbms/`目录下,包含详细错误信息。 ### 相关问题 1. 如何监控Oracle数据库的网络连接状态? 2. Rocky Linux中如何配置Oracle防火墙规则? 3. Oracle数据库密码策略的最佳实践是什么? 4. 如何备份和恢复Oracle AI Database的TNS配置? 5. 虚拟机环境下Oracle性能优化的关键参数有哪些?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值