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
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部分的错误记录及数据转换成功与否的查看!
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