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 抢救数据(測)的更多相关文章
- SQL SERVER导入数据到ORACLE的方法总结
我们偶尔会有将数据从SQL SERVER导入到ORACLE当中的这种需求,那么这种跨数据库导数有那些方法呢?这些方法又有那些利弊呢? 下面比较肤浅的总结了一些可行的方法. 1:生成SQL脚本然后去OR ...
- SQL Server 变更数据捕获(CDC)监控表数据
一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 实现过程(Realization) 补充说明(Addon) 参考文献(References) ...
- SQL Server定时自动抓取耗时SQL并归档数据发邮件脚本分享
SQL Server定时自动抓取耗时SQL并归档数据发邮件脚本分享 第一步建库和建表 USE [master] GO CREATE DATABASE [MonitorElapsedHighSQL] G ...
- SQL Server 迁移数据到MySQL
一.背景 由于项目开始时候使用的数据库是SQL Server,后来把存储的数据库调整为MySQL,所以需要把SQL Server的数据转移到MySQL:由于涉及的表比较多,所以想在MySQL中生成对应 ...
- 在SQL Server中将数据导出为XML和Json
有时候需要一次性将SQL Server中的数据导出给其他部门的也许进行关联或分析,这种需求对于SSIS来说当然是非常简单,但很多时候仅仅需要一次性导出这些数据而建立一个SSIS包就显得小题大做 ...
- PHP如何通过SQL语句将数据写入MySQL数据库呢?
1,php和MySQL建立连接关系 2,打开 3,接受页面数据,PHP录入到指定的表中 1.2两步可直接使用一个数据库链接文件即可:conn.php <?phpmysql_connect(&qu ...
- 《SQL Server企业级平台管理实践》读书笔记——SQL Server中数据文件空间使用与管理
1.表和索引存储结构 在SQL Server2005以前,一个表格是以一个B树或者一个堆(heap)存放的.每个B树或者堆,在sysindexes里面都有一条记录相对应.SQL Server2005以 ...
- 通过Sql语句导数据
在通过SQL Server向导中的SQL语句导数据时,默认情况下源表中的nvarchar字段类型会变成202,解决此问题的方法是,要重新选择一下对应的数据接收表.
- 如何使用 SQL Developer 导出数据
完成此方法文档后,您应该能够了解: 如何使用 SQL Developer 将数据导出为各种文件格式 如何导出模式中的对象定义 目录 1. 简介 2. 软件要求 3. 导出数据 4. 导出对象定义 5. ...
随机推荐
- Java 获取到配置文件信息
Java程序将数据库或者服务器IP写入到代码中,难免缺少灵活性. 如果写入到配置文件,部署到不通服务器上,只需要修改配置文 件即可. Java怎么读取配置文件 /** * 获取到配置文件信息 * @p ...
- javascript iframe 视频解码
function confirmVdo(){ var videoVal = $(".video_src").val(); if(videoVal){ videoVal = vide ...
- linux命令:rm
删文件要一个个回答y,谁有好办法自动删除? rm -rf 用rm递归删除目录下面的所有.o文件: find . -name "*.o" | xargs rm -f :
- Java内部类——成员内部类
成员内部类的意思就是,一个外层类里面包含着一个非static的class,举例如下: class OuterClass { //变量,函数定义... class InnerClass { //变量,函 ...
- Jenkins快速搭建持续集成
基于Jenkins快速搭建持续集成环境 Jenkins+tortoisesvn+MSBuild做到持续集成 附Jenkins的使用:http://www.infoq.com/cn/articles/M ...
- Qt显示调用vs中的dll
网上看到很多文章写调用vc的dll,但我尝试了总是出问题,下面结合参考别人的文章,实现了Qt显示调用vs中c接口的dll. 具体直接上代码: vs中的代码: TMax.h: #ifdef TMAX # ...
- timesetevent与timekillevent的用法
unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs ...
- 基于visual Studio2013解决C语言竞赛题之1084完全平方数
题目 解决代码及点评 /************************************************************************/ /* ...
- Swift - 使用ALAssetsLibrary获取相簿里所有图片,视频(附样例)
1,ALAssetsLibrary介绍 (1)通过创建ALAssetsLibrary的实例可以访问系统Photos里的图片与视频.这里图片不仅包括相机拍摄的照片,还包括从iTunes导入的和从其他设备 ...
- Eequal sum sets
Let us consider sets of positive integers less than or equal to n. Note that all elements of a set a ...