首页 » ORACLE 9i-23ai » sqlplus copy 跨网段迁移数据
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 慢
目前这篇文章有4条评论(Rss)评论关闭。