****************************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系统权限。
物理DG以WR方式打开 - 测试COPY功能后 恢复 standby应用日志。(二)
最新推荐文章于 2024-07-23 20:43:01 发布