审计信息清理及审计表迁移时遇到的坑

晚上十点三十五分左右,客户的业务无法访问数据库,至于报错是什么,忘记询问了。这是个坏习惯,应该一开始就询问,这样子可以最快找到解决问题的方案。

一开始客户联系我,让我帮忙检查一下数据库的状态,我首先查询了监听服务(lsnctl status),因为我所接触的大部分故障都是由于监听问题导致的。此处,监听服务正常。

查看alert日志,发现system表空间无法扩展,一般而言,system表空间会自动管理,不会需要太多空间(此处尚需要进行研究)。首先将system表空间数据文件的扩展方式修改可自动的。

接下来联想到数据库是否开启审计,通过以下命令确认

show parameter audit

发现audit_trail为DB(即将audit trail记录在数据库的审计相关表中,如aud$,审计的结果只有连接信息),即已经开启审计,查询aud$表,发现有5亿条数据(select count(*) from sys.aud$;),保留了一年多的数据

占据空间大约50G(select bytes/1024/1024/1024 from dba_segments where segment_name=‘AUD$‘;)

建议客户删除审计信息,客户决定保留半年,并配置清除审计信息的job。

决定使用DBMS_AUDIT_MGMT设置定期清理任务,首先需要初始化

BEGIN
DBMS_AUDIT_MGMT.INIT_CLEANUP(
              audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_ALL,
      default_cleanup_interval => 12 /* hours */);
END;
/

初始化的时候,如果aud$没有进行迁移的话,会默认迁移到SYSAUX上,由于空间不足,报错。

尝试手动迁移:

alter table sys.aud$ move tablespace SYSAUX;
alter table sys.aud$ move lob(sqlbind) store as (tablespace SYSAUX);
alter table sys.aud$ move lob(sqltext) store as (tablespace SYSAUX);
alter index sys.I_AUD1 rebuild tablespace SYSAUX;

坑来了,以上脚本从boss的文档而来,手动迁移的时候,业务无法访问,同时导致system表空间数据文件出现碎片,无法回收,并且产生了大量的归档,把磁盘挤爆了,心跳加速系列,赶紧删已备份的归档,空间仍旧不足,移动归档到emc上面,移动失败,由于emc是通过网络连接的。

但是move完表sys.aud$,movelob字段的时候也花费了很多时间。客户联系我,备份已经跑起来,带宽基本被耗尽,是无法移动归档的,除非停止备份。

建议客户删除aud$,毕竟aud$只记录了记录登录信息,无法审计违法操作。客户认同方案。

此时alter table sys.aud$ move lob(sqltext) store as (tablespace SYSAUX);的操作被我中断,直接TRUNCATE TABLE AUD$;这个过程很快,基本不产生redo。

然后回收高水位,清理空间

alter table sys.aud$ enable row movement;
alter table sys.aud$ shrink space cascade;
alter table sys.aud$ disable row movement;

再次手动迁移,这次很快,这时已经接近凌晨三点,由此可见,50G大小的表aud$迁移耗时相当长,同时产生了巨量归档,平时一天三四十G的归档,当晚产生了300多G的归档,不知道是否触发bug,此处需要对alter table XX move tablespace XX进行研究,这个过程到底发生了什么?

alter table sys.aud$ move tablespace SYSAUX;
alter table sys.aud$ move lob(sqlbind) store as (tablespace SYSAUX);
alter table sys.aud$ move lob(sqltext) store as (tablespace SYSAUX);
alter index sys.I_AUD1 rebuild tablespace SYSAUX;

  此次今晚告一段落,暂不进行aud$清理job设置,整理了一下迁移的最佳步骤具体步骤,应该如下:

#1.建议客户删除aud$,如果有需要,expdp导出保留,不然可能遇到以上问题
expdp USERID = \"/ as sysdba\" table=’SYS.AUD$’ log=expdp_aud_20190107.log dumpfile=expdp_aud_20190107.dmp

#删除aud$表
TRUNCATE TABLE AUD$;

#收缩HVM,清理空间
alter table sys.aud$ enable row movement;
alter table sys.aud$ shrink space cascade;
alter table sys.aud$ disable row movement;

#2.使用DBMS_AUDIT_MGMT迁移aud$表到sysaux,不影响业务,手动时业务无法访问
BEGIN
DBMS_AUDIT_MGMT.SET_AUDIT_TRAIL_LOCATION(audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_DB_STD,
audit_trail_location_value => ‘SYSAUX‘);
END;
/

#3.初始化
BEGIN
      sys.DBMS_AUDIT_MGMT.init_cleanup(
      audit_trail_type         => sys.DBMS_AUDIT_MGMT.AUDIT_TRAIL_ALL,
      default_cleanup_interval => 24);
END;
/

#4.验证是否初始化
SET SERVEROUTPUT ON
BEGIN
  IF DBMS_AUDIT_MGMT.is_cleanup_initialized(DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD) THEN
    DBMS_OUTPUT.put_line(‘YES‘);
  ELSE
    DBMS_OUTPUT.put_line(‘NO‘);
  END IF;
END;
/

#5.设置定时清理job
BEGIN
DBMS_AUDIT_MGMT.SET_LAST_ARCHIVE_TIMESTAMP(
   audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD,
   last_archive_time => systimestamp-30,	                 --保留最近30天审计日志
   rac_instance_number => 1);					 --对于保存在DB中的审计或者单实例审计,rac_instance_number可忽视
END;
/

#6.创建定时清理job
BEGIN
DBMS_AUDIT_MGMT.CREATE_PURGE_JOB(
  audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD,	--此次是假设审计日志保存在DB中。如果是保存在OS中,应该是audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_OS(12c默认audit_sys_operations为true,sys的审计会存放在audit_file_dest)
  audit_trail_purge_interval => 24 /* hours */,  		--每24小时运行一次
  audit_trail_purge_name => ‘Purge_AUD$‘,
  use_last_arch_timestamp => TRUE);				--使用前面设置的last_archive_time保存策略,FALSE则为删除全部审计日志
END;
/

#7.运行定时清理任务
exec DBMS_SCHEDULER.RUN_JOB(job_name => ‘SYS.Purge_AUD$‘);

总结:

  1. 不要手动迁移aud$,影响业务
  2. aud$最好删除,不然迁移很慢,还会出现大量归档,如果要保留,使用expdp导出
  3. 备份过程不要用mv移动归档,会导致备份失败,mv是先cp后rm,cp失败后,仍旧rm,出现了归档丢失,备份失败,后期客户决定删除归档。

原文地址:https://www.cnblogs.com/dc-chen/p/10234638.html

时间: 2024-07-29 17:43:54

审计信息清理及审计表迁移时遇到的坑的相关文章

网站云服务器迁移时遇到的坑

本文主要讲网站程序在云服务器迁移时遇到的问题,和各家云服务的比较选择. 之前用laravel 5.1开发了一个社区交流的程序,放在亚马逊的EC2实例上,是一个AIM 亚马逊自家构建的linux服务器,不能不说亚马逊的服务是一流的,基本没有多少坑给你踩,但是自从发现 linode, DigitalOcean, Rackspace之后,比较了一下性价比,就有了迁移的想法,毕竟便宜了一半. linode.com比较有历史,而且套餐是2G内存,24G SSD硬盘,10美金一个月怎么样都比亚马逊要来得实惠

【转】在使用实体框架(Entity Framework)的应用中加入审计信息(Audit trail)跟踪数据的变动

在一些比较重要的业务系统中,通常会要求系统跟踪数据记录的变动情况.系统要记录什么时间,什么人,对那些信息进行了变动. 比较简单的实现方式是在每个表中加入两个字段CreatedBy和CreatedAt,见图1.CreatedBy用来存是谁进行了这次更改.CreatedAt用来存什么时间进行了这次更改.但是这种方式只能保存最后一次进行改动的人和时间.中间的改动历史都不能保留.改动前的值也不能保留. 图 1 对于关键的信息系统,例如银行系统,电商系统,公安系统,我们需要保存数据完整的变动信息和历史.这

把数据保存到数据库附加表 `dede_addonarticle` 时出错,请把相关信息提交给DedeCms

把数据保存到数据库附加表 `dede_addonarticle` 时出错,请把相关信息提交给DedeCms官方.Duplicate entry '2′ for key 'PRIMARY' 你的主键是不可重复的,现在重复插入值为3的主键了.可以去掉主键唯一,或是设成自增加.就不会出现这种情况了. 具体操作: 进入后台,"系统" - "系统设置" - "SQL命令行工具" 运行SQL命令行: alter table dede_addonarticle

把数据保存到数据库附加表 `dede_addonarticle` 时出错,请把相关信息提交给DedeCms官方。Duplicate entry

把数据保存到数据库附加表 `dede_addonarticle` 时出错,请把相关信息提交给DedeCms官方.Duplicate entry ’3′ for key ‘PRIMARY’ 你的主键是不可重复的,现在重复插入值为3的主键了.可以去掉主键唯一,或是设成自增加.就不会出现这种情况了. 具体操作:进入后台,“系统” - “系统设置” - “SQL命令行工具” 运行SQL命令行: alter table dede_addonarticle drop primary key 运行上面的代码就

表迁移

在做报表的时候,通常需要把额外几张服务器中的表导入到一个数据库中,这时候就需要表迁移! 利用mysqldump方式导入表 使用INNODB表空间的方式迁移表 使用select ...into file的方式迁移表 mysqldump方式导入表 这种方式适合用于表数据不是太大时候,这是一种逻辑导入与导出,导出的文件时sql语句,然后把导出的sql语句在另一台服务器上执行即可! 1:先备份要导出的那个表 #备份出需要迁移的表 mysqldump -utest -p123456 --single-tr

面试官:如何做到不停机分库分表迁移?

需求说明 类似订单表,用户表这种未来规模上亿甚至上十亿百亿的海量数据表,在项目初期为了快速上线,一般只是单表设计,不需要考虑分库分表.随着业务的发展,单表容量超过千万甚至达到亿级别以上,这时候就需要考虑分库分表这个问题了,而不停机分库分表迁移,这应该是分库分表最基本的需求,毕竟互联网项目不可能挂个广告牌"今晚10:00~次日10:00系统停机维护",这得多low呀,以后跳槽面试,你跟面试官说这个迁移方案,面试官怎么想呀? 借鉴codis 笔者正好曾经碰到过这个问题,并借鉴了codis一

vertica从其他表迁移数据到新表(insert into 语句用法实例)

前面一篇开始学习solr的时候,做了个入门的示例http://blog.csdn.net/zjc/article/details/24414271 .虽然可以检索出内容,但总和想象的结果有差异--比如,检索"天龙"两个字,按常规理解,就应该只出来<天龙八部>才对,可是竟然也会把<倚天屠龙记>检出来.后来研究了一下,发现系统是这样处理的:无论是抽索引时还是分析检索词时,都把所有文字按单字拆开.这样,刚好<倚天屠龙记>里包含"天"和&

SQL Server中多表连接时驱动顺序对性能的影响

原文:SQL Server中多表连接时驱动顺序对性能的影响 本文出处:http://www.cnblogs.com/wy123/p/7106861.html (保留出处并非什么原创作品权利,本人拙作还远远达不到,仅仅是为了链接到原文,因为后续对可能存在的一些错误进行修正或补充,无他) 最近在SQL Server中多次遇到开发人员提交过来的有性能问题的SQL,其表面的原因是表之间去的驱动顺序造成的性能问题,具体表现在(已排除其他因素影响的情况下),存储过程偶发性的执行时间超出预期,甚至在调试的时候

关于更新表结构时碰到的DDL锁导致数据库无法连接

记一次更新表结构时语句一直处于等待无法执行的解决办法 我们在更新数据库表结构的时候,当数据库有连接正在进行中的事务时,那么你的更新请求会处于一个等待的状态,一直等待到当前未提交的事务完成之后才会进行更新操作,但是这个未提交的事务会需要多久时间完成对我们来讲是一个未知数,(自己第一次碰到这个情况的时候,竟然以为是数据记录太多需要等待更新,等了半个小时... 愚蠢)在这个等待期间,所有的后续连接请求都会被挂起,等待事务提交完成后更新操作完成才会执行,逻辑是这样的:有个事务1在查询表a,一直占着不释放