Liquibase连接Oracle 12c报ORA-12514错误,咨询tnsnames.ora配置
我正在尝试基于Oracle 12c数据库创建新的Liquibase项目,Oracle数据库部署在远程服务器上。我的项目变更日志文件dbchangelog.xml保存在运行Liquibase的本地机器上,内容如下:
<?xml version="1.0" encoding="UTF-8"?> <databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.8.xsd"> <changeSet id="1" author="bob"> <createTable tableName="department"> <column name="id" type="int"> <constraints primaryKey="true" nullable="false"/> </column> <column name="name" type="varchar(50)"> <constraints nullable="false"/> </column> <column name="active" type="boolean" defaultValueBoolean="true"/> </createTable> </changeSet> </databaseChangeLog>
我的liquibase.properties文件配置如下:
changeLogFile: /home/dbchangelog.xml url : jdbc:oracle:thin:@<oracle_db_ip>:1521/ORCLDB username : <user> password : <password> driver: oracle.jdbc.OracleDriver classpath: /home/ojdbc6.jar
执行liquibase update时出现错误:ORA-12514, TNS:listener does not currently know of service requested in connect descriptor。请问我是否需要在运行Liquibase的机器上放置tnsnames.ora文件?如果需要,应该放在哪个位置?
首先明确:你当前用的是Oracle Thin模式的JDBC直连URL,这种方式本身不需要tnsnames.ora文件。你遇到的ORA-12514错误,核心原因是远程监听无法识别你指定的服务名ORCLDB,而非缺少TNS配置文件。下面分两种情况给出解决方案:
情况1:继续使用Thin直连模式(无需tnsnames.ora)
先排查几个关键问题:
- 确认服务名正确性:联系远程DBA,或者在Oracle服务器上执行
lsnrctl status命令,查看监听中注册的服务名列表,确保你URL里的ORCLDB是实际存在的服务名(注意区分服务名和SID,12c推荐用服务名)。 - 测试端口连通性:在本地执行
telnet <oracle_db_ip> 1521或nc -zv <oracle_db_ip> 1521,确认1521端口能正常访问,避免防火墙拦截。 - 检查驱动版本:你用的
ojdbc6.jar是Oracle 11g的驱动,12c建议换成ojdbc7.jar或ojdbc8.jar,版本不匹配也可能引发连接异常。
情况2:想用tnsnames.ora统一管理连接
如果希望多个项目共用连接配置,可以配置tnsnames.ora,步骤如下:
创建
tnsnames.ora文件,内容示例:ORCLDB = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = <oracle_db_ip>)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = ORCLDB) ) )替换
<oracle_db_ip>为实际数据库IP,SERVICE_NAME要和远程数据库的真实服务名一致。指定文件存放位置:
- 如果本地装了Oracle客户端,默认路径是:
- Linux:
$ORACLE_HOME/network/admin - Windows:
%ORACLE_HOME%\network\admin
- Linux:
- 如果没装Oracle客户端,必须设置
TNS_ADMIN环境变量指向文件所在目录:- Linux/macOS:执行
export TNS_ADMIN=/path/to/your/tns/folder(可加到bashrc/zshrc永久生效) - Windows:在系统环境变量中添加
TNS_ADMIN,值为文件所在目录的绝对路径。
- Linux/macOS:执行
- 如果本地装了Oracle客户端,默认路径是:
修改Liquibase配置:
在liquibase.properties中将URL改为TNS别名形式:url : jdbc:oracle:thin:@ORCLDB
最后提醒:无论用哪种方式,都要确保你的数据库用户拥有创建表的权限,否则即使连接成功,执行update时也会报错。
内容的提问来源于stack exchange,提问作者Pratheesh

