oracle数据恢复的问题-oracle是否有相关的日志记录?

oracle插入数据时,出现异常没有操作成功,这时oracle是否有相关的日志记录?能否找回未插入成功的数据信息?我知道redo能找回操作成功的sql语句。

作者: liu4535   发布时间: 2011-09-07

怎么样查看,主要还是看里面有没有错误信息了。

ORACLE的异常日志,一般在ORACLE_BASE/admin/SID/bdump/alert_<SID>.ora(win).如果是linux是ORACLE_BASE/admin/SID/bdump/alert<SID>.ora

作者: 恋上一只猪   发布时间: 2011-09-07

网上找了一下,不知道这个代码能不能帮到楼主


1、建立错误日志记录表:
--ETL加载详细日志表
CREATE TABLE EDW.ETL_LOG_DETAIL
(
ETL_DATE         VARCHAR2(10),
START_TIME       TIMESTAMP(6),
END_TIME         TIMESTAMP(6),
PROC_NAME        VARCHAR2(50 BYTE),
TABLE_NAME       VARCHAR2(50 BYTE),
ETL_RECORD_NUM   INTEGER,
ETL_STATUS       VARCHAR2(1 BYTE),
ERR_MSG          VARCHAR2(1000 BYTE),
ERR_SQL          VARCHAR2(2000 BYTE),
ETL_MEMO         VARCHAR2(100 BYTE)
)
LOGGING
NOCOMPRESS
NOCACHE
NOPARALLEL
MONITORING;
COMMENT ON COLUMN EDW.ETL_LOG_DETAIL.ETL_DATE IS 'ETL日期';
COMMENT ON COLUMN EDW.ETL_LOG_DETAIL.START_TIME IS '开始日期时间';
COMMENT ON COLUMN EDW.ETL_LOG_DETAIL.END_TIME IS '结束日期时间';
COMMENT ON COLUMN EDW.ETL_LOG_DETAIL.PROC_NAME IS '存储过程名称';
COMMENT ON COLUMN EDW.ETL_LOG_DETAIL.TABLE_NAME IS '目标表名称';
COMMENT ON COLUMN EDW.ETL_LOG_DETAIL.ETL_RECORD_NUM IS '加载记录数';
COMMENT ON COLUMN EDW.ETL_LOG_DETAIL.ETL_STATUS IS 'ETL状态';
COMMENT ON COLUMN EDW.ETL_LOG_DETAIL.ERR_MSG IS '出错信息';
COMMENT ON COLUMN EDW.ETL_LOG_DETAIL.ERR_SQL IS '出错语句';
COMMENT ON COLUMN EDW.ETL_LOG_DETAIL.ETL_MEMO IS 'ETL执行结果描述';
2、记录日志及错误的存储过程模板
CREATE OR REPLACE PROCEDURE 存储过程名称(
p_etldate VARCHAR2,            --日期参数
O_RUNSTATUS OUT   NUMBER,      --执行结果
O_MSG       OUT   VARCHAR2)    --错误返回
AS
--Author        :第一作者及时间
--Update_Author :修改人以及时间
--Script File   :文件名
/*******************************************************/
/*Soucetable :                                       */
/*源库名.表名   表中文名                               */
/*desttable :                                       */
/*源库名.表名   表中文名                               */
/*******************************************************/
    --定义存储过程信息
    v_sqlText    VARCHAR2(10000);--SQL 语句
    v_start_time TIMESTAMP; --加载开始时间
    v_end_time   TIMESTAMP; --加载结束时间
    v_proc_name VARCHAR2(50) :='存储过程名称'; --存储过程名称
    v_table_name VARCHAR2(50):='目的表名'; --加载目标表
    v_status     VARCHAR2(1); --加载状态 值为0表示执行成功,值为1表示执行失败
    v_record_number INTEGER;   --记录数
    --定义错误代码,错误状态
    v_sqlerrm    VARCHAR2(1000); --异常信息
    v_err_sql    VARCHAR2(1000); --出错位置
    v_err_msg    VARCHAR2(1000) := ' ';
    BEGIN
      O_RUNSTATUS:= 0;
      v_status:='1';
      SELECT SYSDATE INTO v_start_time FROM dual;
      --**************************************************
      --****处理过程****
      v_err_sql :='insert ino ......';
      EXECUTE IMMEDIATE v_sqlText;
      --**************************************************
      --正常处理
      v_record_number:=SQL%ROWCOUNT;
      SELECT SYSDATE INTO v_end_time FROM dual;
      v_status:='0';
      INSERT INTO EDW.ETL_LOG_DETAIL
      VALUES (p_etldate,v_start_time,v_end_time,v_proc_name,v_table_name,v_record_number,v_status,' ',' ','成功');
      COMMIT;
      --异常处理
      EXCEPTION WHEN OTHERS THEN v_err_msg := '系统错误:SQLCODE='||SQLCODE||',SQLSTATE='||SQLERRM||' 数据日期:'||p_etldate;
      BEGIN
          ROLLBACK;
          O_RUNSTATUS:=1;
          v_sqlerrm:= SQLERRM;
          IF v_status<>'0' THEN
              v_status:='1';
             INSERT INTO EDW.ETL_LOG_DETAIL
             VALUES (p_etldate,v_start_time,v_end_time,v_proc_name,v_table_name,0,v_status,v_sqlerrm,v_err_sql,'失败');
          END IF;
          O_RUNSTATUS := 1;
          O_MSG := 'PROGRAMMING ERROR HAPPENED'||v_err_msg;
          COMMIT;
      END;
END 存储过程名称;
3、通过此日志表及存储过程就可以实现在数据仓库建设中,ETL部分的错误记录及数据转换成功与否的查看!

作者: 小火车   发布时间: 2011-09-07