使用copy实现long类型转移表空间,表空间的数据文件损坏,在转移该表空间相关表时,遇到让人郁闷的long类型.不能使用ctas和move来实现转移,最后通过古老的copy来实现该项工作.

1.模拟LONG类型表

SQL> create table chf.t_long (id number,name long) tablespace ts_oracleplus;

Table created.

SQL> insert into chf.t_long  select object_id,object_name from dba_objects where rownum<10;

9 rows created.

SQL> commit;

Commit complete.

SQL> desc chf.t_long
Name Null? Type
----------------------------------------- -------- -----------------
ID NUMBER
NAME LONG

2.测试ctas和move

SQL> create table chf.t_long_bak
2 as
3 select * from chf.t_long;
select * from chf.t_long
*
ERROR at line 3:
ORA-00997: illegal use of LONG datatype SQL> alter table chf.t_long move tablespace users;
alter table chf.t_long move tablespace users
*
ERROR at line 1:
ORA-00997: illegal use of LONG datatype

3.使用copy实现LONG表跟换表空间SQL> SET LONG 1000

SQL> select dbms_metadata.get_ddl('TABLE','T_LONG','CHF') from dual;

DBMS_METADATA.GET_DDL('TABLE','T_LONG','CHF')
-------------------------------------------------------------------------------- CREATE TABLE "CHF"."T_LONG"
( "ID" NUMBER,
"NAME" LONG
) SEGMENT CREATION IMMEDIATE
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
NOCOMPRESS LOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "TS_oracleplus" SQL> CREATE TABLE "CHF"."T_LONG_BAK"
2 ( "ID" NUMBER,
3 "NAME" LONG
4 ) SEGMENT CREATION IMMEDIATE
5 PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
6 NOCOMPRESS LOGGING
7 STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
8 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
9 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
10 TABLESPACE "USERS"; Table created. SQL> copy from chf/oracleplus@ora11g_d INSERT chf.t_long_bak using select * from chf.t_long; Array fetch/bind size is 15. (arraysize is 15)
Will commit when done. (copycommit is 0)
Maximum long size is 80. (long is 80)
9 rows selected from chf@ora11g_d.
9 rows inserted into CHF.T_LONG_BAK.
9 rows committed into CHF.T_LONG_BAK at DEFAULT HOST connection. SQL> alter table t_long rename to t_long_old; Table altered. SQL> alter table t_long_bak rename to t_long; Table altered. SQL> select tablespace_name,table_name from dba_tables where table_name like 'T_LONG%'; TABLESPACE_NAME TABLE_NAME
--------------- ---------------
TS_oracleplus T_LONG_OLD
USERS T_LONG SQL> DROP TABLE T_LONG_OLD PURGE; Table dropped.

==============================================================================================

相关知识介绍

=============================================================================================

oracle中copy from的用法

1.语法及使用说明

1.1 语法

下面我们来看一下SQL*Copy Command的语法及使用说明。

在解释SQL*Plus Copy Command的语法之前,我们必须要明确SQL*Plus Copy Command不是一个方法或是函数,也不是一个SQL语句,它是一个命令(command),当然这个命令必须在SQL*Plus里运行。

SQL*Plus Copy Command的语法:

COPY {FROM database | TO database | FROM database TO database} {APPEND|CREATE|INSERT|REPLACE} destination_table [(column, column, column, ...)]

USING query

我们分部分来解释一下:

COPY – 这个不太需要解释,主命令,声明要执行COPY操作

From Database – 源数据库

To Database – 目标数据库

此处注意花括号中有三种可选的写法(以”|”隔开),如果源数据表和目标数据表在同一个Schema中,则可以只写From Database,也可以只写To Database,当然还可以是第三种写法,把From Database和To Database写全。但如果源数据表和目标数据表不在同一个Schema中,则必须用第三种写法,即把From Database和To Database都写全

From Database和To Database的格式是一样的:USERID/PASSWORD@SID,这个大家都应该很熟悉了。

{APPEND|CREATE|INSERT|REPLACE} – 声明操作数据的方式,下面分别解释一下:

Append – 向已有的目标表中追加记录,如果目标表不存在,自动创建,这种情况下和Create等效。

Create – 创建目标表并且向其中追加记录,如果目标表已经存在,则会返回错误。

Insert – 向已有的目标表中插入记录,与Append不同的是,如果目标表不存在,不自动创建而是返回错误。

Replace – 用查询出来的数据覆盖已有的目标表中的数据,如果目标表不存在,自动创建。

destination_table – 目标表的名字

[(column, column, column, ...)] – 可以指定目标表中列的名字,如果不指定,则自动使用Query中的列名。

USING query – 查询语句,交流的数据来自这儿。

备注:

1.这种方法适合小额数据的迁移,只能在SQL*PLUS中运行.

2.这种方法不能copy大对象的表,不然会抛异常"CPY0012: Object datatypes cannot be copied"

Java代码

在数据表间复制数据是Oracle DBA经常面对的任务之一,Oracle为这一任务提供了多种解决方案,SQL*Plus Copy 命令便是其中之一。SQL*Plus Copy 命令通过SQL*Net在不同的表(同一服务器或是不同服务器)之间复制数据或移动数据。

 在实际运行环境中若能恰当地选择使用SQL*Plus Copy 命令可以有效地提高数据复制的性能。

 下面将简要介绍SQL*Plus Copy 命令使用,并在性能方面与其他两种方案进行对比,力求能提供一个使用Copy 命令的方案参考。

1.语法及使用说明

1.1 语法

下面我们来看一下SQL*Copy 命令的语法及使用说明。

在解释SQL*Plus Copy 命令的语法之前,我们必须要明确SQL*Plus Copy 命令不是一个方法或是函数,也不是一个SQL语句,它是一个命令(command),当然这个命令必须在SQL*Plus里运行。

SQL*Plus Copy 命令的语法:

COPY {FROM database | TO database | FROM database TO database} {APPEND|CREATE|INSERT|REPLACE} destination_table [(column, column, column, ...)]

USING query

我们分部分来解释一下:

COPY – 这个不太需要解释,主命令,声明要执行COPY操作

From Database – 源数据库

To Database – 目标数据库

 此处注意花括号中有三种可选的写法(以”|”隔开),如果源数据表和目标数据表在同一个Schema中,则可以只写From Database,也可以只写To Database,当然还可以是第三种写法,把From Database和To Database写全。但如果源数据表和目标数据表不在同一个Schema中,则必须用第三种写法,即把From Database和To Database都写全

 From Database和To Database的格式是一样的:USERID/PASSWORD@SID,这个大家都应该很熟悉了。

{APPEND|CREATE|INSERT|REPLACE} – 声明操作数据的方式,下面分别解释一下:

Append – 向已有的目标表中追加记录,如果目标表不存在,自动创建,这种情况下和Create等效。

Create – 创建目标表并且向其中追加记录,如果目标表已经存在,则会返回错误。

Insert – 向已有的目标表中插入记录,与Append不同的是,如果目标表不存在,不自动创建而是返回错误。

Replace – 用查询出来的数据覆盖已有的目标表中的数据,如果目标表不存在,自动创建。

destination_table – 目标表的名字

[(column, column, column, ...)] – 可以指定目标表中列的名字,如果不指定,则自动使用Query中的列名。

USING query – 查询语句,交流的数据来自这儿。

1.2 使用范例

下面我们通过几个例子来看一下SQL*Plus Copy 命令的使用:

1.2.1 在同一个服务器的同一个Schema中复制数据:

同时指定From database和To database

SQL> copy from scott/tiger@lsj to scott/tiger@lsj create dept1 using select * from dept;

只指定From Database

SQL> copy from scott/tiger@lsj create dept2 using select * from dept;

只指定To Database

SQL> copy to scott/tiger@lsj create dept3 using select * from dept;

1.2.2 在同一个服务器的不同Schema中复制数据:

这种情况下必须同时指定From Database和To Database

SQL> copy from scott/tiger@lsj to lsjdemo/lsjdemo@lsj create dept using select * from dept;

注意这种情况下,using select * from dept 中并不需要使用scott.demp的形式。

1.2.3 在不同的服务器间复制数据:

SQL> conn lsj/lsj@sunserve

已连接。

SQL> copy from scott/tiger@lsj to lsj/lsj@sunserve create dept using select * from dept;

2.4 性能实验结果

实验数据:

记录数:5,082,500

数据量:504M

实验结果

方案------------------------执行时间(秒) ---------Undo(M) ------Redo(M)

Copy command -------------520.51----------------------0 ---------------- 592

Insert into…select …---- 631.64 ------------------345 -------------1720

Create Table…------------- 244.79 --------------------0 ----------------515

2.总结

 Create Table…as select…是最快的,而且生成的Undo和Redo信息最少,所以只要可能,请尽量使用这种方案。但这种方案有一定的限制,即目标表必须是不存在的,不能用它向已有的目标表中追加记录。

 Insert into … select … 是最慢的,而且生成最多的Undo和Redo信息,对I/O的压力最大,优势在于大家对它比较熟悉,使用起来比较简单,适合于处理少量的数据,若要处理大量的数据,不推荐使用这种方案。

 Copy Command可以处理Create Table不能处理的情况,即向已有的数据表中追加记录,相对于insert来说,效率更高一些,生成更少的Redo信息,不生成Undo信息,所以在执行大量的数据追加时,推荐使用Copy Command命令。

copy from insert using 语句迁移数据的更多相关文章

  1. 数据库 使用DML语句更改数据

    使用DML语句更改数据 添加新数据: 插入单行语句: Insert into 表名(列名)values(‘值’); 插入多行:insert into 表名(列名,…..) Values(‘值’,’值’ ...

  2. mysql之workbench如何只导出(insert语句)数据

    https://www.jianshu.com/p/a5cd14bc5499 1. 说明: 出发点: 由于特殊原因,我们只想导出数据库中的数据(insert into语句格式的),但是在网上找到的资源 ...

  3. sql server迁移数据(文件组之间的互相迁移与 文件组内文件的互相迁移)

    转自:https://www.cnblogs.com/lyhabc/p/3504380.html?utm_source=tuicool SQLSERVER将数据移到另一个文件组之后清空文件组并删除文件 ...

  4. 部署owncloud连接ladp迁移数据

    定期 清理日志 echo '' > /var/www/html/data/owncloud.log 查询 用户 的 ldap 语句 (|(objectclass=inetOrgPerson)(o ...

  5. SQL INSERT INTO 语句

    SQL Order By SQL update INSERT INTO 语句 INSERT INTO 语句用于向表格中插入新的行. 语法 INSERT INTO 表名称 VALUES (值1, 值2, ...

  6. PHP如何通过SQL语句将数据写入MySQL数据库呢?

    1,php和MySQL建立连接关系 2,打开 3,接受页面数据,PHP录入到指定的表中 1.2两步可直接使用一个数据库链接文件即可:conn.php <?phpmysql_connect(&qu ...

  7. ACCESS的System.Data.OleDb.OleDbException: INSERT INTO 语句的语法错误

    一直用的是SQL 数据库,突然改用Access了,使用起来就是没有SQL 顺畅,老是出来些意想不到的错误.今天用Access做的网站程序进行添加数据,调试了一下午,总是异常…… 提示ACCESS的Sy ...

  8. Bulk Insert 高效快速插入数据

    BULK INSERT以用户指定的格式复制一个数据文件至数据库表或视图中. 语法: BULK INSERT [ [ 'database_name'.][ 'owner' ].]{ 'table_nam ...

  9. 使用“bulk insert ”进行批量插入数据

    本文转自csdn中文章,再次感谢他给我们分享. Bulk Insert命令详细 BULK INSERT以用户指定的格式复制一个数据文件至数据库表或视图中.语法: BULK INSERT [ [ 'da ...

随机推荐

  1. 通过css改变svg img的颜色

    需求如下图,hover的时候改变图标颜色,图标为引入的svg img 一般的解决办法有:1.字体图标改变css的color属性:2.js在hover事件中切换图片:3.老一点的方案是hover切换背景 ...

  2. Activiti实现流程自由跳转

    import org.activiti.engine.ProcessEngine; import org.activiti.engine.TaskService; import org.activit ...

  3. IDEA 代码格式化,快捷键

    一键格式化代碼: Ctrl+Alt+L 全局搜索替换:ctrl+shift+r 强大的搜索功能,shift+shift (无论您想要搜啥都能找到) ctrl+shift+R==搜索类   CTRL+N ...

  4. Physical Plausible Shading

    问所有人一个简单的问题,为什么我们做片子,CG生产的效果,就是不如论文中样图结果.难道是论文中用了某些神奇的黑科技?或者是依赖PS伪造的图?你当然不可能怀疑Cornell.Stanford这些一流机构 ...

  5. C#字典Dictionay多线程读是否是安全的

    答案:是线程安全的,只读不写多线程下,完全不需要加锁! 测试代码: using System; using System.Diagnostics; using System.Threading; us ...

  6. django rest framework 与 Vue 整合遇到的坑

    前提是已经有了Django项目与前端Vue打包好的dist文件 好,开始整合!!! 当然还是先设置Django的setting.py 1设置模板路径 2 设置静态文件路径 TEMPLATES = [ ...

  7. [Java]Socket和ServerSocket学习笔记

    对于即时类应用或者即时类的游戏,HTTP协议很多时候无法满足于我们的需求.这会,Socket对于我们来说就非常实用了.下面是本次学习的笔记.主要分异常类型.交互原理.Socket.ServerSock ...

  8. spring boot 基础 2018年5月3日

    主包下运行类@SpringBootApplication  此注解是核心注解,源码如下 @Target({ElementType.TYPE}) @Retention(RetentionPolicy.R ...

  9. 闭包,jQuery插件的写法:图片预加载

    最近做的一些网页,单个网页图片量都比较大,网络不好的情况下,特别卡,这个图片预加载的方法可以牺牲一些时间换来网页的浏览顺畅,还是值得的. //闭包的写法,它内部的变量都是局部的,不会和外部巳有的变量进 ...

  10. Spark GraphX快速入门

    GraphX是Spark用于图形并行计算的新组件.在较高的层次上,GraphX通过引入一个新的Graph抽象来扩展Spark RDD:一个定向的多图,其属性附加到每个定点和边.为了支持图计算,Grap ...