oracle使用自治事务记录系统日志

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 在我们对表记录执行DML操作时,一方面,我们需要把错误记录到数据库的日志表中,另一方面,由于错误我们需要回滚核心事务,此时我们可以在记录日志的存储过程中使用自治事务1.

在我们对表记录执行DML操作时,一方面,我们需要把错误记录到数据库的日志表中,另一方面,由于错误我们需要回滚核心事务,此时我们可以在记录日志的存储过程中使用自治事务

1. 定义事务日志表

CREATE TABLE "SCOTT"."EXCEPTION_LOG" 
   (	"ID" NUMBER(18,0), 
	"ERROR_CODE" NUMBER(10,0), 
	"ERROR_MESSAGE" VARCHAR2(2000), 
	"CREATE_TIME" TIMESTAMP (6) DEFAULT Sysdate, //使用系统时间定义日志被创建时间
	"DESCRIPTION" VARCHAR2(500), 
	"EXCEPTION_LEVEL" VARCHAR2(30)
   )


 

2. 定义两个表USERS表各USERS_TEST表,其中业务逻辑为把USERS_TEST表中数据复制到users表中,如果users_test表中username在users中的username列不存在,则把记录插入users表中,如果存在,则把重复记录的日志记录到exception_log表中,如果有其它的异常,则回滚插入记录,但不回滚日志记录

CREATE TABLE "SCOTT"."USERS" 
   (	"USER_ID" NUMBER(10,0) NOT NULL ENABLE, 
	"USERNAME" VARCHAR2(30) NOT NULL ENABLE, 
	"PASSWORD" VARCHAR2(50) NOT NULL ENABLE, 
	 CONSTRAINT "UNIQUE_NAME" UNIQUE ("USERNAME") //定义唯一约束在此列上
)


 

CREATE TABLE "SCOTT"."USERS_TEST" 
   (	"USER_ID" NUMBER(10,0) NOT NULL ENABLE, 
	"USERNAME" VARCHAR2(30) NOT NULL ENABLE, 
	"PASSWORD" VARCHAR2(50) NOT NULL ENABLE
   )

3. 定义记录日志包

CREATE OR REPLACE PACKAGE system_log IS

  PROCEDURE exception_log(ERROR_CODE      IN NUMBER,
                          error_message   IN VARCHAR2,
                          exception_level IN VARCHAR2,
                          description     IN VARCHAR2);

END system_log;


                        

 

CREATE OR REPLACE PACKAGE BODY system_log IS

  PROCEDURE exception_log(ERROR_CODE      IN NUMBER,
                          error_message   IN VARCHAR2,
                          exception_level IN VARCHAR2,
                          description     IN VARCHAR2) IS
    PRAGMA AUTONOMOUS_TRANSACTION; //声明自治事务
  BEGIN
    INSERT INTO exception_log
      (ERROR_CODE, error_message, exception_level, description)
    VALUES
      (ERROR_CODE, error_message, exception_level, description);
      COMMIT; //提交事务,记得一定要提交,否则会报异常
  EXCEPTION
    WHEN OTHERS THEN
      dbms_output.put_line('can not insert log in exception_log table, error message is:' ||
                           dbms_utility.format_error_backtrace);
  END exception_log;

END system_log;


 

4. 定义转储users_test和users表中的数据

CREATE OR REPLACE PROCEDURE prc_unique_user(id NUMBER) IS
  CURSOR user_cursor IS
    SELECT * FROM users_test WHERE user_id > id;
BEGIN
  FOR uc IN user_cursor
  LOOP
    BEGIN
      INSERT INTO users
        (username, password)
      VALUES
        (uc.username, uc.password);
    EXCEPTION
      WHEN dup_val_on_index THEN
      
        DECLARE
          sql_code NUMBER := SQLCODE;
        BEGIN
          system_log.exception_log(sql_code,
                                   dbms_utility.format_error_stack ||
                                   ', error line:' ||
                                   dbms_utility.format_error_backtrace,
                                   'warn',
                                   '插入重复的username在users表中,username是:' ||
                                   uc.username || ',行号user_id是:' ||
                                   uc.user_id);
        END;
        dbms_output.put_line('插入重复的username在users表中,username是:' ||
                             uc.username || ',行号user_id是:' || uc.user_id);
        ROLLBACK;
    END;
  END LOOP;
EXCEPTION
  WHEN OTHERS THEN
    ROLLBACK;
    dbms_output.put_line('插入user表中出现了其它异常' ||
                         dbms_utility.format_error_backtrace);
END prc_unique_user;


 

 


 

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
1月前
|
SQL Oracle 关系型数据库
【赵渝强老师】Oracle的控制文件与归档日志文件
本文介绍了Oracle数据库中的控制文件和归档日志文件。控制文件记录了数据库的物理结构信息,如数据库名、数据文件和联机日志文件的位置等。为了保护数据库,通常会进行控制文件的多路复用。归档日志文件是联机重做日志文件的副本,用于记录数据库的变更历史。文章还提供了相关SQL语句,帮助查看和设置数据库的日志模式。
【赵渝强老师】Oracle的控制文件与归档日志文件
|
27天前
|
存储 监控 安全
什么是事件日志管理系统?事件日志管理系统有哪些用处?
事件日志管理系统是IT安全的重要工具,用于集中收集、分析和解释来自组织IT基础设施各组件的事件日志,如防火墙、路由器、交换机等,帮助提升网络安全、实现主动威胁检测和促进合规性。系统支持多种日志类型,包括Windows事件日志、Syslog日志和应用程序日志,通过实时监测、告警及可视化分析,为企业提供强大的安全保障。然而,实施过程中也面临数据量大、日志管理和分析复杂等挑战。EventLog Analyzer作为一款高效工具,不仅提供实时监测与告警、可视化分析和报告功能,还支持多种合规性报告,帮助企业克服挑战,提升网络安全水平。
|
1月前
|
Oracle 关系型数据库 数据库
【赵渝强老师】Oracle的参数文件与告警日志文件
本文介绍了Oracle数据库的参数文件和告警日志文件。参数文件分为初始化参数文件(PFile)和服务器端参数文件(SPFile),在数据库启动时读取并分配资源。告警日志文件记录了数据库的重要活动、错误和警告信息,帮助诊断问题。文中还提供了相关视频讲解和示例代码。
|
1月前
|
存储 Linux Docker
centos系统清理docker日志文件
通过以上方法,可以有效清理和管理CentOS系统中的Docker日志文件,防止日志文件占用过多磁盘空间。选择合适的方法取决于具体的应用场景和需求,可以结合手动清理、logrotate和调整日志驱动等多种方式,确保系统的高效运行。
109 2
|
2月前
|
存储 缓存 关系型数据库
MySQL事务日志-Redo Log工作原理分析
事务的隔离性和原子性分别通过锁和事务日志实现,而持久性则依赖于事务日志中的`Redo Log`。在MySQL中,`Redo Log`确保已提交事务的数据能持久保存,即使系统崩溃也能通过重做日志恢复数据。其工作原理是记录数据在内存中的更改,待事务提交时写入磁盘。此外,`Redo Log`采用简单的物理日志格式和高效的顺序IO,确保快速提交。通过不同的落盘策略,可在性能和安全性之间做出权衡。
1712 14
|
2月前
|
XML JSON 监控
告别简陋:Java日志系统的最佳实践
【10月更文挑战第19天】 在Java开发中,`System.out.println()` 是最基本的输出方法,但它在实际项目中往往被认为是不专业和不足够的。本文将探讨为什么在现代Java应用中应该避免使用 `System.out.println()`,并介绍几种更先进的日志解决方案。
65 1
|
2月前
|
监控 网络协议 安全
Linux系统日志管理
Linux系统日志管理
64 3
|
1月前
|
SQL Oracle 关系型数据库
【赵渝强老师】Oracle的联机重做日志文件与数据写入过程
在Oracle数据库中,联机重做日志文件记录了数据库的变化,用于实例恢复。每个数据库有多组联机重做日志,每组建议至少有两个成员。通过SQL语句可查看日志文件信息。视频讲解和示意图进一步解释了这一过程。
|
2月前
|
监控 应用服务中间件 网络安全
#637481#基于django和neo4j的日志分析系统
#637481#基于django和neo4j的日志分析系统
42 4
|
2月前
|
监控 Linux 测试技术
Linux系统命令与网络,磁盘和日志监控总结
Linux系统命令与网络,磁盘和日志监控总结
70 0

推荐镜像

更多