物理DG以WR方式打开 - 测试COPY功能后 恢复 standby应用日志。(二)

****************************Part One:试验copy from to 功能***************************
一.简介:
COPY是SQLPLUS下的命令,功能很强,语法如下:


COPY FROM user/password@dbname TO user/password@dbname CREATE/APPEND/INSERT/REPLACE TABLE_NAME (COLUMN_NAME, ……) USING SELECT ……


简单描述一下语法:


FROM和TO语句分别描述从哪个数据库COPY到哪个数据库。这两个语句中连接数据库的格式和CONNECT语句后面的连接格式是一致的。FROM或TO指向当前数据库时,可以忽略,但不能同时忽略FROM和TO。


CREATE/APPEND/INSERT/REPLACE:COPY命令的四个选项,功能分别为创建表并插入数据、在已经存在的表的记录后面插入新数据、在空表中插入数据、删除表然后重建新表并插入新数据。


后面是表名和列名,如果列名列表省略的话,则会根据查询语句来确定列的名称。


USING查询,将查询的结果按照指定方法写入表中。




COPY命令的优点很多,这里列举我认为最重要的三条:


支持LONG类型:由于CREATE TABLE AS和INSERT INTO SELECT都不支持LONG类型。这就导致了对LONG类型数据的处理十分麻烦,而使用存储过程的方法相对比较麻烦,利用EXP和IMP则有很多的限制条件。相对来说使用COPY是最简单快速的方法。


不需要建立数据库链,只要本地的TNSNAMES.ORA中配置了远端数据库就可以直接访问。操作方便快捷。而且也支持本数据库到本数据库的COPY。


语法灵活,支持目标表名列名与查询语句中不相符,而且还有多种数据处理方式。




总的来说COPY命令是一个相当好用的命令,下面是一个简单的例子。


二.primary 库建 表test_copy , 进行 copy 操作。
1. primary 库 建立 long 型字段 的 表 Test_copy(id long ,name varchar2)


SQL> show user;
USER is "KARL"




SQL> create table test_copy (id long,name varchar2(10));


Table created.


SQL> desc test_seq
ERROR:
ORA-04043: object test_seq does not exist




SQL> create sequence test_seq;


Sequence created.


SQL> insert into test_copy values (test_seq.nextval,'karl');


1 row created.


SQL> /


1 row created.
SQL> commit;


Commit complete.


SQL> select count(*) from test_copy;


  COUNT(*)
----------
         3


SQL> select * from tab;


TNAME                          TABTYPE  CLUSTERID
------------------------------ ------- ----------
TEST_APPLY2                    TABLE
TEST_STANDBY_APPLY             TABLE
TEST_COPY                      TABLE		 






2. tnsnames.ora 信息
===========================================================
karldb.STANDBY =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.121.129)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SID = karldb)
    )
  )
 
karldb.PRIMARY =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.121.128)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SID = karldb)
    )
  )
===========================================================






3. 设置Copy参数
其中每次读取数据数组大小有SET的ARRAYSIZE参数决定。每次提交的数据量由SET的COPYCOMMIT参数控制。
COPY是否进行类型检查由SET的COPYTYPECHECK参数控制。COPY执行时LONG类型截取长度由SET的LONG参数控制。
如果不希望LONG类型被截断,则保证LONG的值超过表中LONG类型的最长值。


SQL> set arraysize 1000
SQL> set copycommit 1000
SQL> set copytypecheck off
SQL> set long 100000


数组读取/结合的大小为1000。(数组大小为1000)
将在每1000个数组结合之后提交。(提交的复本为1000)
最长为100000。(长度为100000)




  




4.执行copy ,此时 standby 库以R/W模式打开。
SQL> copy from karl/karldb@karldb.primary to karl/karldb@karldb.standby create test_standby_copy using select * from test_copy;


Array fetch/bind size is 1000. (arraysize is 1000)
Will commit after every 1000 array binds. (copycommit is 1000)
Maximum long size is 100000. (long is 100000)
Table TEST_STANDBY_COPY created.


   3 rows selected from karl@karldb.primary.
   3 rows inserted into TEST_STANDBY_COPY.
   3 rows committed into TEST_STANDBY_COPY at karl@karldb.standby.










5. 检验copy 是否成功。
standby 库中查询如下:


SQL> conn karl/karldb ;
Connected.
SQL> select * from tab;


TNAME                          TABTYPE  CLUSTERID
------------------------------ ------- ----------
TEST_APPLY2                    TABLE
TEST_STANDBY_APPLY             TABLE
TEST_STANDBY_COPY              TABLE				//就是它!




SQL> select count(*) from test_standby_copy;


  COUNT(*)
----------
         3




6. 注意:
在使用COPY命令时,尽量只对用户自己的表进行操作。
如果需要对其他用户下的表执行REPLACE操作时,仅仅拥有这个表的INSERT、DELETE权限是没有任何作用的,
必须拥有CREATE ANY TABLE、DROP ANY TABLE和INSERT ANY TABLE系统权限。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值