AnyBackup-Oracle 数据库备份失败,执行输出提示 ORA-12504 错误
关键字
ORA-12504
适用产品
· AnyBackup 7.0.x
· AnyBackup 6.0.x
· AnyBackup 5.0.x
· 超易备 5.0.x
问题描述
在 AnyBackup 管理控制台上,执行 Oracle 数据库备份失败,查看执行输出,显示如下错误信息:
Oracle 备份出现异常。(错误提供者:oracleBackup,错误值:e0500009,错误位置:ncOracleBackupSchedule.cpp:60)(附加信息:ORA-12504: TNS:listener was not given the SERVICE_NAME in CONNECT_DATA (错误提供者:Unknown Provider,错误值:12504,错误位置:ncOciSession.cpp:159))

问题影响
AnyBackup 无法完成 Oracle 数据库备份。
问题原因
Oracle 的 TNS(Transparent Network Substrate)配置文件 tnsnames.ora 中 SERVICES_NAME 字段缺失,导致 AnyBackup 客户端执行备份时无法通过监听连接本机数据库上的 Oracle 实例。
解决方案
为了解决此问题,请在配置文件 tnsnames.ora 中添加正确的 SERVICE_NAME 字段。以 Linux 操作系统下修改 TNS 配置为例,具体步骤如下:
1.通过 SSH 登录数据库服务器,执行以下命令,查询数据库的 service_names 参数值。
su - oracle
sqlplus / as sysdba
show parameter service_names;

2.执行命令 cat $ORACLE_HOME/network/admin/tnsnames.ora ,查看 tnsnames.ora 文件内容:
ORCL =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = oracle)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
)
)
3.执行命令 sqlplus sys/password@orcl as sysdba ,使用监听的方式连接数据库实例。

注意:上图示例中, "ORA-12504: TNS:listener was not given the SERVICE_NAME in CONNECT_DATA " 表示无法使用监听正常连接数据库实例。
4.执行命令 vi $ORACLE_HOME/network/admin/tnsnames.ora ,添加正确的 SERVICE_NAME 字段,修正后的内容如下:
ORCL =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = oracle1)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
警告:修改配置文件前,请先备份 tnsnames.ora 文件。
5.执行命令 sqlplus sys/password@orcl as sysdba ,检查使用监听的方式是否能正常连接数据库实例。

6.监听正常连接数据库实例后,在 AnyBackup 管理控制台重新发起 Oracle 数据库备份任务。
更多信息
关于 ORA-12504 错误代码具体含义,请参考 Oracle 官方文档:ORA-12504。