sqlplus copy 跨网段迁移数据

 

工作难免有这种需求,从生产库取一张表或一个查询结果集到本地测试库中,而且生产库与测试库没有在同一个网段,那就不再考虑dblink,不用exp,expdp,有没有其它方法呢?当然如果用的电脑客户端有两个网络连接可以同时分别连接生产库、测试库,那你可以用到sqlplus 的copy 功能

copy 功能对数据类型有一部份限制,目前只支持

CHAR
DATE
LONG
NUMBER
VARCHAR2
显然没有支持lob类型

下面我对copy 功能做了个小小演示
环境:
从3.234库中的anbob方案下copy一张表到3.229库的同样是anbob方案下,注意可以不用方案,并不同表名
整个操作是在我的xp客户端3.133上进行(3.234 tnsname is mytest,3.229 tnsname is d3229),注意如果在上面两台上进行,就可以省略from 或者 to,你懂的..

实验开始

3.234 server1 >>>>>>>>>>>>>
sys@ORCL> conn anbob/anbob
Connected.

anbob@ORCL> create table testcopy(id int,name varchar2(20));
Table created.

anbob@ORCL> insert into testcopy values(1,'anbob.com');
1 row created.

anbob@ORCL> commit;
Commit complete.

3.133 client>>>>>>>>>>>>>
SQL> conn anbob/anbob@mytest
已连接。
SQL> conn anbob/anbob@d3229
已连接。
--确认都可以连接

SQL> set arraysize 500
SQL> copy  from anbob/anbob@mytest to anbob/anbob@d3229  create newcopy using se
lect * from testcopy;

数组提取/绑定大小为 500。(数组大小为 500)
将在完成时提交。(提交的副本为 0)
最大 long 大小为 80。(long 为 80)
表 NEWCOPY 已创建。

1 行选自 anbob@mytest。
   1 行已插入 NEWCOPY。
   1 行已提交至 NEWCOPY (位于 anbob@d3229)。

3.229 server2 >>>>>>>>>>>>>
--开始并没有newcopy这张表
SQL> conn anbob/anbob
Connected.
SQL> select * from newcopy;

        ID NAME
---------- --------------------
         1 anbob.com

3.234 server1 >>>>>>>>>>>>>
anbob@ORCL> insert into testcopy values (2,'weejar.com');

1 row created.

anbob@ORCL> commit;

Commit complete.

3.133 client>>>>>>>>>>>>>
SQL> copy  from anbob/anbob@mytest to anbob/anbob@d3229  append newcopy using se
lect * from testcopy;

数组提取/绑定大小为 500。(数组大小为 500)
将在完成时提交。(提交的副本为 0)
最大 long 大小为 80。(long 为 80)
2 行选自 anbob@mytest。
   2 行已插入 NEWCOPY。
   2 行已提交至 NEWCOPY (位于 anbob@d3229)。

3.229 server2 >>>>>>>>>>>>>
SQL> select * from newcopy;

        ID NAME
---------- --------------------
         1 anbob.com
         2 weejar.com
         1 anbob.com
3.234 server1 >>>>>>>>>>>>>
anbob@ORCL> update testcopy set id=100 where id=1;
1 row updated.
anbob@ORCL> select * from testcopy;

        ID NAME
---------- --------------------
       100 anbob.com
         2 weejar.com

anbob@ORCL> commit;
Commit complete.

3.133 client>>>>>>>>>>>>>
SQL> copy  from anbob/anbob@mytest to anbob/anbob@d3229  insert newcopy using se
lect * from testcopy;

数组提取/绑定大小为 500。(数组大小为 500)
将在完成时提交。(提交的副本为 0)
最大 long 大小为 80。(long 为 80)
2 行选自 anbob@mytest。
   2 行已插入 NEWCOPY。
   2 行已提交至 NEWCOPY (位于 anbob@d3229)。

3.229 server2 >>>>>>>>>>>>>
SQL> select * from newcopy;

        ID NAME
---------- --------------------
         1 anbob.com
         2 weejar.com
       100 anbob.com
         2 weejar.com
         1 anbob.com

3.234 server1 >>>>>>>>>>>>>
anbob@ORCL> select * from testcopy;

        ID NAME
---------- --------------------
       100 anbob.com
         2 weejar.com
3.133 client>>>>>>>>>>>>>
SQL> copy  from anbob/anbob@mytest to anbob/anbob@d3229  replace newcopy using s
elect * from testcopy;

数组提取/绑定大小为 500。(数组大小为 500)
将在完成时提交。(提交的副本为 0)
最大 long 大小为 80。(long 为 80)
表 NEWCOPY 已删除。

表 NEWCOPY 已创建。

2 行选自 anbob@mytest。
   2 行已插入 NEWCOPY。
   2 行已提交至 NEWCOPY (位于 anbob@d3229)。         

3.229 server2 >>>>>>>>>>>>>

SQL> select * from newcopy;
        ID NAME
---------- --------------------
       100 anbob.com
         2 weejar.com

--当然你要问insert 与append  有什么区别呢,看下面的例子
3.229 server2 >>>>>>>>>>>>>

SQL> drop table newcopy purge;

Table dropped.

3.133 client>>>>>>>>>>>>>
SQL> copy  from anbob/anbob@mytest to anbob/anbob@d3229  insert newcopy using se
lect * from testcopy;

数组提取/绑定大小为 500。(数组大小为 500)
将在完成时提交。(提交的副本为 0)
最大 long 大小为 80。(long 为 80)

ERROR:
ORA-00942: table or view does not exist

SQL> copy  from anbob/anbob@mytest to anbob/anbob@d3229  append newcopy using se
lect * from testcopy;

数组提取/绑定大小为 500。(数组大小为 500)
将在完成时提交。(提交的副本为 0)
最大 long 大小为 80。(long 为 80)
表 NEWCOPY 已创建。

2 行选自 anbob@mytest。
   2 行已插入 NEWCOPY。
   2 行已提交至 NEWCOPY (位于 anbob@d3229)。

note:

copy 命令是sqlplus的功能而非数据库,
copy 可以利用中间client转移两个跨网段的数据库表或是子查询结果集,
copy 不支持SYSDBA or SYSOPER权限连接
copy 几乎不生成undo,但生成redo , 导说比insert into select 快,但比create table xx as select 慢

 

转自:https://www.anbob.com/archives/1115.html

posted @   悠游~~~  阅读(136)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示