使用SQLPLUS/Shell跨Oracle数据库复制数据遇ORA-02019等错误求助
问题根因分析
- ORA-02019报错根因:你SQL语句中使用的
@oprdb、@AISPRD是Oracle的**数据库链接(Database Link)**标识,既不是本地tns配置的服务名,也不是单独通过conn命令连接过就会自动生效。跨库查询依赖的dblink必须在你当前执行SQL的会话连接的数据库实例上提前创建,没有对应dblink配置就会触发连接描述未找到的报错。 - 两次
conn操作无效的根因:conn是SQL*Plus的会话切换命令,执行第二次conn时前一次连接会被直接覆盖,完全无法实现同一个会话下访问两个数据库实例的效果,跨库关联操作必须依赖dblink实现。 - CPY-0012报错根因:Oracle的COPY命令本身支持的数据类型非常有限,只要待复制的表存在LONG、CLOB、BLOB、XMLType、自定义类型等特殊字段,就会触发该报错,且该命令已经被Oracle标记为废弃功能,不建议使用。
解决方案
方案一:通过dblink实现跨库插入(最常用)
- 先确认你当前操作的会话连接的是目标库(即你要存入数据的本地oprdb库),在该库上用有创建dblink权限的用户执行如下命令,创建指向远程AISPRD库的dblink:
-- 私有dblink,仅创建用户可使用 CREATE DATABASE LINK AISPRD CONNECT TO 远程AISPRD库的用户名 IDENTIFIED BY 远程AISPRD库的密码 USING '远程AISPRD库的连接串,格式为主机IP:端口/服务名'; -- 如果需要所有用户都能使用该dblink,可以创建公共dblink CREATE PUBLIC DATABASE LINK AISPRD CONNECT TO 远程AISPRD库的用户名 IDENTIFIED BY 远程AISPRD库的密码 USING '远程AISPRD库的连接串';
- 创建完成后先测试dblink可用性:
select count(*) from view_on_remote@AISPRD where rownum < 2;
- 测试通过后直接执行插入语句即可,因为你已经连了本地oprdb库,目标表不需要再加
@oprdb标识:
insert into table_here select * from view_on_remote@AISPRD where rownum < 10; commit;
方案二:可视化工具中转(适合存在特殊字段的场景)
如果表中存在不支持跨库插入的特殊字段,可以用DBeaver、Navicat、PL/SQL Developer等数据库可视化工具操作:
- 分别在工具中配置本地oprdb库和远程AISPRD库的连接
- 直接选中远程库的视图,选择「复制到其他库」功能,指定本地目标表即可,工具会自动处理字段类型兼容问题。
内容的提问来源于stack exchange,提问作者curious_nustian
相关产品推荐
相关产品推荐

