sql plus 抢救数据(测)

有索引

--执行plsql脚本

DECLARE

TYPE RowIDTab ISTABLE OF ROWID INDEXBY BINARY_INTEGER;

CURSORc1 IS select /*+ index(xifenfei ind_xifenfei) */ rowid

fromchf.xifenfei

whereobject_id isNOT NULL;

r RowIDTab;

rows NATURAL := 20000;

bad_rows number := 0 ;

errors number;

error_code number;

myrowid rowid;

BEGIN

OPENc1;

LOOP

FETCH c1 BULK COLLECT INTOr LIMIT rows;

EXITWHENr.count=0;

BEGIN

FORALL i INr.FIRST..r.LASTSAVE EXCEPTIONS

insertinto chf.xifenfei_new

select/*+ ROWID(A) */ *

fromchf.xifenfei A whererowid = r(i);

EXCEPTION

whenOTHERS then

BEGIN

errors := SQL%BULK_EXCEPTIONS.COUNT;

FORerr1 IN1..errors LOOP

error_code := SQL%BULK_EXCEPTIONS(err1).ERROR_CODE;

if error_code in(1410, 8103) then

myrowid := r(SQL%BULK_EXCEPTIONS(err1).ERROR_INDEX);

bad_rows := bad_rows + 1;

insertinto chf.bad_rows values(myrowid, error_code);

else

raise;

endif;

ENDLOOP;

END;

END;

commit;

ENDLOOP;

commit;

CLOSEc1;

dbms_output.put_line(‘Total Bad Rows: ‘||bad_rows);

END;

/

没有索引

--找回记录

setserveroutput on

setconcat off

DECLARE

nrows number;

rid rowid;

dobj number;

ROWSPERBLOCK number;

BEGIN

ROWSPERBLOCK:=1000; --估算最大的一个块中记录条数

nrows:=0;

selectdata_object_id  intodobj

fromdba_objects

whereowner = ‘CHF‘

andobject_name = ‘T_XIFENFEI‘

-- and subobject_name = ‘<table partition>‘  Add this condition if table is partitioned

;

fori in(selectrelative_fno, block_id, block_id+blocks-1 totblocks

fromdba_extents

whereowner = ‘CHF‘

andsegment_name = ‘T_XIFENFEI‘

-- and partition_name = ‘<table partition>‘ Add this condition if table is partitioned

-- and file_id != <OFFLINED DATAFILE> This condition is only used if a datafile needs to be skipped due to ORA-376 (A)

orderby extent_id)

loop

forbr ini.block_id..i.totblocks loop

forj in1..ROWSPERBLOCK loop

begin

rid := dbms_rowid.ROWID_CREATE(1,dobj,i.relative_fno, br , j-1);

insertinto CHF.T_XIFENFEI_NEW

select/*+ ROWID(A) */ *

fromCHF.T_XIFENFEI A

whererowid = rid;

if sql%rowcount = 1 thennrows:=nrows+1; endif;

if (mod(nrows,10000)=0) thencommit;endif;

exceptionwhenothers thennull;

end;

endloop;

endloop;

endloop;

COMMIT;

dbms_output.put_line(‘Total rows: ‘||to_char(nrows));

END;

/

两个不错的博客

http://www.xifenfei.com/4160.html(核心思想利用rowid读取块内容)

http://www.hellodba.com/reader.php?ID=216&lang=CN(核心思想,数据块替换与拷贝+查询)

sql plus 抢救数据(测)

时间: 2024-10-07 14:22:57

sql plus 抢救数据(测)的相关文章

SQL Server里面导出SQL脚本(表数据的insert语句)

转载自:http://hi.baidu.com/pigarmy/blog/item/109894c445eab0a28326ac5a.html 最近需要导出一个表的数据并生成insert语句,发现SQL Server的自带工具并米有此功能.BAIDU一下得到如下方法(亲测OK) 用这个存储过程可以实现: CREATE PROCEDURE dbo.UspOutputData @tablename sysname AS declare @column varchar(1000) declare @c

C# &amp; SQL Server大数据量插入方式对比

以下内容大部分来自: http://blog.csdn.net/tjvictor/article/details/4360030 部分内容出自互联网,实验结果为亲测. 最近自己开发一个向数据库中插入大量历史数据的函数库,需要解决一个大数据量插入的效率问题.不用分析,我知道如果采取逐条数据插入的方式,那么效率肯定很低,光是那么多循环就知道很慢了.于是乎,我找到了上篇博客,知道了BulkCopy和TVPs方式.为了更好的了解其效率,我自己动手亲测了一下效果,测试的数据库位于本机. (1)方式1:循环

Oracle 和SQL server中数据备份与恢复

Oracle 侧 创建一个表,将现有表数据导入其中. create Table  TB_NYU_TENDERTBL_BAK   as  select *  from  TB_NYU_TENDERTBL  where  1=1 删除原来表内容. DELETE  FROM TB_NYU_TENDERTBL 恢复表的内容 insert  into TB_NYU_TENDERTBL  select  * from  TB_NYU_TENDERTBL_BAK SQL server侧 select  * i

SQL Server 批量数据导入

1. 由于Bulk Insert通常配合格式化文件批量导入数据更方便,所以这里先介绍bcp工具导出格式化文件的方法. bcp是SQL Server提供的命令行实用工具提供了数据的导出.导入.格式文件导出等功能,导出格式化文件的语法如下: bcp 数据库名.用户名.表名 format nul -- 这里的nul必须存在,用于不是导出和导入数据的情况下 -f 输出的格式化文件名 [-x] -c -- -x参数指定输出的格式文件为xml格式(默认非xml格式); -c参数指定数据存储方式为字符,并默认

AMDU恢复ASM磁盘组数据(测)

--umount ASMCMD> umoung -a asmdg commands: md_backup, md_restor lsattr, setattr cd, cp, du, find, help, ls, lsct, lsdg, lsof, mkalias mkdir, pwd, rm, rmalias chdg, chkdg, dropdg, iostat, lsdsk, lsod, mkdg, mount offline, online, rebal, remap, umount

将SQL Server 2000数据导入到MySQL 5.5的方法

一.安装MySQL 5.5(可以与SQL Server不在同一台服务器上),并新建一个空的数据库(一般用utf-8编码),用于接收导入的数据. 二.在SQL Server的服务器上安装mysql-connector-odbc-5.3.2-win32. 三.在SQL Server的服务器上运行"管理工具"->"数据源(ODBC)",切换到"系统DSN"面板,添加"MySQL ODBC 5.3 Unicode Driver"

sql - 批量插入数据

直接构造 insert into t (c1, c2, c3) values (1, 1, 1), (2, 2, 2) 使用UNION insert into t (c1, c2, c3) (select a1, a2, a3) union all (select b1, b2, b3) 利用查询结果 insert into t (c1, c2, c3) (select a1, a2, a3 from t2) sql - 批量插入数据,布布扣,bubuko.com

SQL SERVER大数据分页

select * from (select rownum r, a.* from (select * from  table_name order by ndatetime desc ) a where rownum <= currentPage * pageSize ) where r > (currentPage - 1) * pageSizeSQL SERVER大数据分页,布布扣,bubuko.com

SQL Server 大数据搬迁之文件组备份还原实战

原文:SQL Server 大数据搬迁之文件组备份还原实战 一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 解决方案(Solution) 搬迁步骤(Procedure) 搬迁脚本(SQL Codes) 注意事项(Attention) 疑问(Questions) 参考文献(References) 二.背景(Contexts) 有一个数据库大概在700G左右,需要从服务器A搬迁到服务器B,两台服务器网络传输速度可以达到8MB/s,怎么做才能更