Oracle 11g使用DML Error Logging来避免bulk insert故障
当使用带有子查询的insert语句来加载数据时如果出现错误.系统会终止该语句并回滚整个操作.这是非常消耗时间和资源的操作.如果insert这样的语句可以使用DML Error Logging功能来避免这种情况.
为了使用DML error logging功能需要增加一个子句来指定error logging表名来记录当DML操作所遇到的错误记录.当向insert
语句增加一个error logging子句时特定类型的错误将不会被终止和回滚语句.相反每一个错误记录会被记录到表中操作语句能继续执行.在操作完成后可以对错误记录执行修正操作.
DML error logging功能可以与insert,update,merge和delete语句一起使用.
1. 为了使用DML error logging功能来插入数据,可以手工创建一个error logging表或者使用dbms_errlog包来自动创建.
2. 执行一个包含error logging子句的insert语句:
* 可以选择引用自己创建的error logging表.如果没有提供一个error logging表表名.数据库会使用一个缺省的error logging表.
* 缺省的error loggin表名为err$_后面紧接着是插入表名的前25个字符.
* 可以选择包含一个标签(一个数字或者有括号的字符串)它将添加到错误日志中来帮助你识别哪个语句产生的错误.如果标签被忽略 将使用null值
* 可以选择包含reject limit子句
这个子句指示在insert语句终止和回滚之前可以遇到的错误的最大数量.可以指定为unlimited.缺省的reject limit为0,这意味着
在遇到第一个错误时会记录错误并回滚语句.对于并行操作reject limit应用到每一个并行服务器进程.
3.查询error logging表对于产生错误的行执行修正.
error logging表的格式
一个error logging表由两部分组成:
.描述错误的一组强制列.例如一个列包含了oracle的错误代码
.包含造成错误行数据的一组可选列.这些列名与执行插入操作的表中的列名相匹配.
error logging表中的这部分的列数可以是0,1或者多个直到与DML表中的列数相等.如果在error logging表中的列与DML表中的列
有相同的名字,那么违反插入操作的行记录中的相关数据会被写入这个error logging表中的列中.如果DML表中的列在error logging表中没有与之相关的列,那么这个列将不会记录.如果error logging表包含一个与DML表不相匹配的列那么这个列会被忽略.
因为类型转换错误是一种可能出现的错误类型,在error logging表中的可选列的数据类型必须是能捕获任何值而不会丢失数据或转换错误的数据类型.(如果可选日志列与DML表列有相同的数据类型,那么记录捕获问题数据时也会有相同的数据转换问题).数据库为了记录造成转换错误的数据的有用信息做出了最大努力.如果值不能通过派生得到,对于这个列会记录null值.插入errog logging表的一个错误会导致语句终止.
表:强制错误描述列
--------------------------------------------------------------------------------------------------------------
列名 数据类型 描述
--------------------------------------------------------------------------------------------------------------
ora_err_number$ number oracle错误代码
ora_err_mesg$ varchar2(2000) oracle错误消息文本
ora_err_rowid$ rowid 错误行的rowid(对于更新和删除)
ora_err_optyp$ varchar2(2) 操作类型:insert(i),update(u),delete(d)
注意:来自merge操作的update子句和insert子句的错误通过U,I来区分
ora_err_tag$ varchar2(2000) 提供给error logging子句的标签值
--------------------------------------------------------------------------------------------------------------
表:错误日志表的列数据类型
--------------------------------------------------------------------------------------------------------------
DML表列类型 错误日志表的列类型 注意
--------------------------------------------------------------------------------------------------------------
number varchar2(4000) 能够记录转换错误
char/varchar2(n) varchar2(4000) 记录没有信息丢失的任何值
nchar/nvarchar2(n) nvarchar2(4000) 记录没有信息丢失的任何值
date/timestamp varchar2(4000) 记录没有信息丢失的任何值.使用缺省的date/time格式来转换成
字符格式
raw raw(2000) 记录没有信息丢失的任何值
rowid urowid 记录任何类型的rowid
long/lob 不支持
用户定义数据类型 不支持
--------------------------------------------------------------------------------------------------------------
创建错误日志表
可以手工创建一个错误日志表或者使用pl/sql包来自动创建
使用dbms_errlog包可以自动创建一个错误日志表.create_error_log过程将创建一个有所有强制描述错误的列加上DML表中所有列
的一个错误日志表
首先创建一个要存储数据的表test_emp
SQL> create table test_emp as select * from hr.employees where 1=2; Table created. SQL> alter table test_emp add primary key (employee_id); Table altered.
先向test_temp表中插入一条记录因为让后面的插入操作产生违反主键约束的错误
SQL> insert into test_emp select * from hr.employees where rownum<2; 1 row created. SQL> commit;
创建错误日志表
SQL> execute dbms_errlog.create_error_log('TEST_EMP','ERR_EMP');
PL/SQL procedure successfully completed.
SQL> desc err_emp
Name Null? Type
----------------------------------------- -------- ----------------------------
ORA_ERR_NUMBER$ NUMBER
ORA_ERR_MESG$ VARCHAR2(2000)
ORA_ERR_ROWID$ ROWID
ORA_ERR_OPTYP$ VARCHAR2(2)
ORA_ERR_TAG$ VARCHAR2(2000)
EMPLOYEE_ID VARCHAR2(4000)
FIRST_NAME VARCHAR2(4000)
LAST_NAME VARCHAR2(4000)
EMAIL VARCHAR2(4000)
PHONE_NUMBER VARCHAR2(4000)
HIRE_DATE VARCHAR2(4000)
JOB_ID VARCHAR2(4000)
SALARY VARCHAR2(4000)
COMMISSION_PCT VARCHAR2(4000)
MANAGER_ID VARCHAR2(4000)
DEPARTMENT_ID VARCHAR2(4000)
执行插入操作
SQL> insert into test_emp select * from hr.employees log errors into err_emp('test_load1') reject limit 40;
106 rows created.
SQL> insert into test_emp select * from hr.employees log errors into err_emp('test_load1') reject limit 1000;
0 rows created.
SQL> commit;
Commit complete.
Oracle 11g使用DML Error Logging来避免bulk insert故障的更多相关文章
- Oracle 11g 记录DML错误数据
[From] https://oracle-base.com/articles/10g/dml-error-logging-10gr2 需要记录下大量DML操作中出错的具体record,看到有两种方案 ...
- Oracle 11g Flashback_transaction_query的undo_sql为空解决办法
近日测试的时候发现 flashback_transaction_query中 undo_sql 为空,经查证这个问题是 Oracle 11g 默认把 supplemental logging 禁用了导 ...
- windows 8 安装 oracle 11g 报错:command line option syntax error,type command/? for help
windows 8 安装 oracle 11g 报错:command line option syntax error,type command/? for help 在windows8操作系统上安装 ...
- oracle 11g ORA-12541: TNS: 无监听程序 (DBD ERROR: OCIServerAttach)
From :http://www.cnblogs.com/wangyt223/archive/2012/12/11/2812931.html em无法浏览,同时监听起不来.同时他的监听服务还是正常的, ...
- ORACLE 11G R2 RAC classical install OGG12.1(LINUX) 经典抽取模式单项同步配置OGG12.1
博文结构图如下: 一.环境描述以及注意事项 1.1 环境简介 IP 系统 Oracle版本 OGG版本 源端 172.16.10.16/36 RHEL6.5 oracle11204 12.1 目标端 ...
- Oracle 11g 单实例到单实例OGG同步实施文档-EXPDP初始化
Oracle 11g 单实例到单实例OGG同步实施文档-EXPDP初始化 2018-06-07 00:446470原创GoldenGate 作者: leo 本文链接:https://www.cndba ...
- Zero Downtime Upgrade of Oracle 10g to Oracle 11g Using GoldenGate — 4
Target Side Setup Install OGG on Target Side Creates required directories for OGG [oracle@vzwc1 ggs] ...
- RHEL6.4 + Oracle 11g DG测试环境快速搭建参考
环境现状: 两台虚拟主机A和B: 1. A机器已安装ASM存储的Oracle 11g 实例 参考:http://www.cnblogs.com/jyzhao/p/4332410.html 2 ...
- Oracle 11g新特性
文章转自网络 Oracle 11g于2007年7月11日美国东部时间11时(北京时间11日22时)正式发布,11g是甲骨文公司30年来发布的最重要的数据库版本,根据用户的需求实现了信息生命周期管理(I ...
随机推荐
- Luogu 4213 【模板】杜教筛(Sum)
当作杜教筛的笔记吧. 杜教筛 要求一个积性函数$f(i)$的前缀和,现在这个东西并不是很好算,那么我们考虑让它卷上另外一个积性函数$g(i)$,使$(f * g)$的前缀和变得方便计算,然后再反推出这 ...
- python文件复制移动shutil模块
shutil.copyfile( src, dst) 从源src复制到dst中去.当然前提是目标地址是具备可写权限.抛出的异常信息为IOException. 如果当前的dst已存在的话就会被覆盖掉 s ...
- Vue.js路由组件
1.如果在创建项目中,没有自动安装vue router,那就自行安装.cnpm install vue-router --save vue-router两种模式 hash模式和history模式. 默 ...
- python3--装饰器高级学习版
__author__ = "Aaron Fan"import time #导入time模块user,passwd = 'alex','abc123' #用户名密码def auth( ...
- UCOSII在STM32F407上的移植
1.ucosii移植准备工作 1.1准备基础工程: 移植的时候需要一个基础工程,为了方便起见我们就选取跑马灯实验,作为ucossii移植的基础工程. 1.2Ucossii源码: 1)Micrium官网 ...
- Java基础语法(二)<运算符>
运算符: 下面的都是相关的练习: 1.键盘录入一个三位整数数,请分别获取该三位数上每一位的数值 import java.util.Scanner; public class Test02 { publ ...
- Visual Studio OpenCV 开发环境配置
因为VS配置OpenCV好多新手都很难一次配置成功,而且OpenCV库每新建一个项目都要配置很是麻烦,所以今天就给大家介绍一个“一劳永逸”的方法. 注:理论上只要VS和OpenCV是版本兼容的,该方法 ...
- 解决Tomcat错误信息:No 'Access-Control-Allow-Origin' header is present on the requested resource | Solving Tomcat Error: No 'Access-Control-Allow-Origin' header is present on the requested resource
最近在使用GeoServer调用Vector Tile服务时,经常会显示不出来结果.打开浏览器调试台,发现报No 'Access-Control-Allow-Origin' header is pre ...
- 关于modelsim闪退问题
电脑之前做过仿真,modelsim是可以完美调用的,但是最近莫名其妙的就出现闪退问题,不通过quartus或者ise调用,单独使用的时候也会闪退. 偶尔一次能抓到错误消息.如下图所示: 然并卵,网上根 ...
- Head First HTML与CSS、XHTML (中文版).(Elisabeth Freeman) PDF扫描版
面对那些晦涩的html书你不禁要问:“难道要成为专家之后才能读懂这些?”那么,你应该选择<head first html与css.xhtml(中文版)>真正来学习html.这本书对你来说, ...