CodeIgniter项目使用PHP oci8_19连接Oracle Free 23.5.0-lite容器数据库失败求助
CodeIgniter项目使用PHP oci8_19连接Oracle Free 23.5.0-lite容器数据库失败求助
我来帮你排查这个问题,你遇到的ORA-12514错误本质是Oracle监听器找不到你请求的服务名,咱们一步步调整解决:
1. 修正CodeIgniter数据库配置的核心问题
你当前的hostname配置写错了——SYSDBA是数据库的系统权限,不是服务名!正确的服务名应该是你用到的PDB实例FREEPDB1,调整配置如下:
'hostname' => 'localhost:1521/FREEPDB1', 'username' => 'sys', 'password' => '12345678', 'database' => 'FREEPDB1', 'dbdriver' => 'oci8', // 单独指定SYSDBA角色 'role' => 'SYSDBA',
2. 验证OCI8扩展的环境有效性
虽然你已经启用了oci8_19,但还是要确认:
- 打开
phpinfo()页面,搜索“OCI8”,确认扩展确实加载成功,并且显示的Oracle客户端版本和你的数据库版本(23.5)兼容(建议用19c或21c客户端) - Windows环境下要确保已经安装了Oracle Instant Client,并且把客户端的bin目录添加到系统
PATH环境变量里,否则OCI8扩展无法正常和数据库通信
3. 用基础PHP脚本测试连接(排除CodeIgniter框架干扰)
先写一个简单的PHP脚本,绕开CodeIgniter直接测试OCI8连接,确认基础链路是通的:
<?php // 直接用oci8函数连接 $conn = oci_connect('sys', '12345678', 'localhost:1521/FREEPDB1', 'AL32UTF8', OCI_SYSDBA); if (!$conn) { $e = oci_error(); trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR); } else { echo "Oracle数据库连接成功!"; oci_close($conn); } ?>
如果这个脚本能成功运行,说明问题出在CodeIgniter的配置或第三方组件(比如ion_auth)上;如果还是报错,就要去排查容器的端口映射、Oracle监听器状态了。
4. 确认Oracle容器内的服务状态
进入Oracle容器内部,执行lsnrctl status命令,查看监听器是否注册了FREEPDB1服务。正常情况下应该能在Services Summary里看到FREEPDB1的条目。如果没找到,执行以下命令确保PDB处于打开状态并保存状态:
# 进入容器后执行sqlplus命令 sqlplus sys/12345678 as sysdba # 打开PDB ALTER PLUGGABLE DATABASE FREEPDB1 OPEN; # 设置重启后自动打开 ALTER PLUGGABLE DATABASE FREEPDB1 SAVE STATE;
备注:内容来源于stack exchange,提问作者Tuhan Kamu
相关产品推荐
相关产品推荐

