Skip to content

Oracle - 35. page

使用MDATA恢复Oracle丢失的lob数据(DELETE以及TRUNCATE通用)

lob data recover
构建包含lob数据的表

SQL> desc lobtab
Name Null? Type
----------------------------------------- -------- ----------------------------
NUMBER_CONTENT NUMBER(10)
VARCHAR2_CONTENT VARCHAR2(100)
DATE_CONTENT DATE
CLOB_CONTENT CLOB
BLOB_CONTENT BLOB

[oracle@DB01 ~]$ ls
blob_01.lob blob_02.lob clob_01.lob clob_02.lob lob_data_test.txt lobtab.sql
[oracle@DB01 ~]$ cat blob_01.lob
luda's blob data 01
[oracle@DB01 ~]$ cat blob_02.lob
luda's blob data 02
[oracle@DB01 ~]$ cat clob_02.lob
luda's clob data 02
[oracle@DB01 ~]$ cat clob_01.lob
luda's clob data 01

[oracle@DB01 ~]$ cat lobtab.ctl
LOAD DATA
INFILE 'lob_data_test.txt'
INTO TABLE lobtab
FIELDS TERMINATED BY ','
(number_content CHAR(10),
varchar2_content CHAR(100),
date_content DATE "DD-MON-YYYY" ":date_content",
clob_filename FILLER CHAR(100),
clob_content LOBFILE(clob_filename) TERMINATED BY EOF,
blob_filename FILLER CHAR(100),
blob_content LOBFILE(blob_filename) TERMINATED BY EOF)
--将lob数据导入到表中
[oracle@DB01 ~]$ sqlldr luda/luda control=lobtab.ctl log=lob_tab.log bad=lob_tab.bad

SQL*Loader: Release 10.2.0.4.0 - Production on Thu Jan 15 00:39:40 2015

Copyright (c) 1982, 2007, Oracle. All rights reserved.

Commit point reached - logical record count 2
[oracle@DB01 ~]$ sqlplus '/as sysdba'

SQL*Plus: Release 10.2.0.4.0 - Production on Thu Jan 15 00:39:48 2015

Copyright (c) 1982, 2007, Oracle. All Rights Reserved.
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
--查询lob数据
SQL> select * from luda.lobtab
2 ;
SP2-0678: Column or attribute type can not be displayed by SQL*Plus
SQL> select count(*) from luda.lobtab;

COUNT(*)
----------
2

SQL> COLUMN varchar2_content FORMAT A16
SQL> COLUMN date_content FORMAT A12
SQL> COLUMN clob_content FORMAT A20
SQL> SELECT number_content,varchar2_content,TO_CHAR(date_content, 'DD-MON-YYYY') AS date_content,clob_content,DBMS_LOB.getlength(blob_content) AS blob_length
2 FROM luda.lobtab;

NUMBER_CONTENT VARCHAR2_CONTENT DATE_CONTENT CLOB_CONTENT BLOB_LENGTH
-------------- ---------------- ------------ -------------------- -----------
1 one 01-JAN-2006 luda's clob data 01 20
2 two 02-JAN-2006 luda's clob data 02 20

模拟truncate lob数据

SQL> truncate table luda.lobtab

加载mdata

loading default config.......
load config file 'config.txt' successful
loading default asm disk file ......
start loading default control file ......
load control file 'control.txt' successful
load BOOTSTRAP$ success.
load TAB$ success.
load COL$ success.
load OBJ$ success.
load USER$ success.
load PROPS$ success.
load TABPART$ success.
load TABSUBPART$ success.
load IND$ success.

通过scan的方式扫描该表所在tablespace

MDATA>scan extent tablespace 4 datafile 4
scan extent start: Thu Jan 15 00:54:43 CST 2015
scanning extent...
scanning extent finished.
scan extent completed: Thu Jan 15 00:54:43 CST 2015

通过unload恢复出被truncate的lob数据

MDATA>unload table luda.lobtab object auto
Auto mode truncated table.
unload schema:LUDA;tab:LOBTAB
. unloading (index organized) table LOB010001e3
Preparing lob metadata from lob index
Reading LOB010001e3.dat 0 entries loaded and sorted 0 entries

. unloading (index organized) table LOB010001d3
Preparing lob metadata from lob index
Reading LOB010001d3.dat 0 entries loaded and sorted 0 entries

tabName:LUDA.LOBTAB,dic_obj:com.olm.b.H@4e94a4,getFileid:4,getBlockid:451
2 rows unloaded

切换到恢复数据的存放目录

[oracle@DB01 data]$ pwd
/oracle/mdata/data

通过sqlload加载恢复出的数据

[oracle@DB01 data]$ sqlldr luda/luda control=LUDA.LOBTAB.ctl log=LUDA.LOBTAB.log

SQL*Loader: Release 10.2.0.4.0 - Production on Thu Jan 15 00:57:15 2015

Copyright (c) 1982, 2007, Oracle. All rights reserved.

Commit point reached - logical record count 2

加载完成后验证恢复后的lob数据

SQL> select count(*) from luda.lobtab;

COUNT(*)
----------
2
SQL> COLUMN varchar2_content FORMAT A16
SQL> COLUMN date_content FORMAT A12
SQL> COLUMN clob_content FORMAT A20
SQL> SELECT number_content,varchar2_content,TO_CHAR(date_content, 'DD-MON-YYYY') AS date_content,clob_content,DBMS_LOB.getlength(blob_content) AS blob_length
2 FROM luda.lobtab;

NUMBER_CONTENT VARCHAR2_CONTENT DATE_CONTENT CLOB_CONTENT BLOB_LENGTH
-------------- ---------------- ------------ -------------------- -----------
1 one 01-JAN-2006 luda's clob data 01 20
2 two 02-JAN-2006 luda's clob data 02 20

恢复lob的关键在于lob index所在的块的保存,如果lob index有坏块则会造成恢复失败,需要额外处理。

11g Dataguard error ORA-16191

报错信息:

Error 1017 received logging on to the standby
------------------------------------------------------------
Check that the primary and standby are using a password file
and remote_login_passwordfile is set to SHARED or EXCLUSIVE,
and that the SYS password is same in the password files.
returning error ORA-16191

产生情况是这样的,一套rac的dataguard,在搭建完成后开启standby seesion后主备库都在不断报ORA-16191,这个错误出现时候也没有发现伴随错误,而且三个实例的password是一样的,只是orapw文件是每个实例单独生成.
根据错误描述,是怀疑此DG的pri和std的密码文件密码不一致导致,逐用统一命令重建实例1和STD的密码文件,报错依旧.节点2重建密码文件,报错依旧.
其次对节点1的密码文件拷贝到std中,并修改orapw对应的实例名,重启standby session,rac节点1和standby的实例不再报错ora-16191,而实例二依然再报ora-16191,将节点1的密码文件拷贝至节点2,并修改对应实例名,报错消失,至此日志传输以及应用恢复正常.

 

相关Metalink文档排障思路参考文档:

Troubleshooting – Heartbeat failed to connect to standby (文档 ID 1432367.1)

使用DBMS_AUDIT_MGMT定期PURGE部分AUD$以及FGA_LOG$审计记录

还是AUD$的问题,昨晚又测了dbms_audit_mgmt过程包给用户设置定时PURGE一段时间前AUD$和FGA_LOG$中的审计记录,该包是专门针对oracle 审计记录进行管理的过程包.该包发布于10203之后的版本,然后在在10203版本需要打上patch 6996030才可以使用该包,在10204版本中需要打上patch 6989148才可以使用.这里使用的是dbms_audit_mgmt的purge以及archived功能

The DBMS_AUDIT_MGMT subprograms enable you to perform cleanup operations on all audit trail types. Audit trail records can be deleted based on their last archive timestamp. The last archive timestamp indicates when the audit records were last archived.

关于该包的使用我就不科普了,到这里dbms_audit_mgmt查找到相关使用信息,做事情需要未雨绸缪,使用前除了了解该包的语法功能点外,还需要注意该包的一些可能问题,该包可能碰到的一些问题可以登陆到OTN查阅 Known Issues When Using: DBMS_AUDIT_MGMT (Doc ID 804624.1)

 

在下面的步骤前,先了解下这些选项的含义,由于我设置额db_extended所以在过程中我需要选择清除的对象为AUDIT_TRAIL_AUD_STD.

 

Constant Type Value Description
AUDIT_TRAIL_ALL PLS_INTEGER 15 All audit trail types. This includes the standard database audit trail (SYS.AUD$ and SYS.FGA_LOG$ tables), operating system (OS) audit trail, and XML audit trail.
AUDIT_TRAIL_AUD_STD PLS_INTEGER 1 Standard database audit records in the SYS.AUD$ table
AUDIT_TRAIL_DB_STD PLS_INTEGER 3 Both standard audit (SYS.AUD$) and FGA audit(SYS.FGA_LOG$) records
AUDIT_TRAIL_FGA_STD PLS_INTEGER 2 Standard database fine-grained auditing (FGA) records in the SYS.FGA_LOG$ table
AUDIT_TRAIL_FILES PLS_INTEGER 12 Both operating system (OS) and XML audit trails
AUDIT_TRAIL_OS PLS_INTEGER 4 Operating system audit trail. This refers to the audit records stored in operating system files.
AUDIT_TRAIL_XML PLS_INTEGER 8 XML audit trail. This refers to the audit records stored in XML files.

 

我的测试是在11gR2上执行.我的审计设置为db_extended,AUD$在表空间LUDATOU上.前期准备工作如下:

SQL> alter system set audit_trail=db_extended scope=spfile;

System altered.

SQL> create tablespace ludatou datafile '/u01/oracle/luda01.dbf' size 50m;

Tablespace created.

SQL> BEGIN
2 DBMS_AUDIT_MGMT.SET_AUDIT_TRAIL_LOCATION(audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD,
3 audit_trail_location_value => 'LUDATOU');
4 END;
5 /

PL/SQL procedure successfully completed.

 

SQL> select segment_name,tablespace_name from dba_segments where segment_name='AUD$';

SEGMENT_NAME TABLESPACE_NAME
-------------------- ------------------------------
AUD$            LUDATOU


update dam_config_param$ set string_value='LUDATOU' where audit_trail_type#=1 and param_id=22;
commit;

SQL> select * from dam_config_param$;

  PARAM_ID AUDIT_TRAIL_TYPE# NUMBER_VALUE STRING_VALUE
---------- ----------------- ------------ ----------------------------------------
        22                 1              LUDATOU
        22                 2              SYSAUX
        21                 1           12

第一步针对AUDIT_TRAIL_AUD_STD设置init_cleanup每24小时执行一次.

SQL> BEGIN
  2  IF NOT DBMS_AUDIT_MGMT.IS_CLEANUP_INITIALIZED
  3  (DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD)
  4  THEN
  5  dbms_output.put_line('Calling DBMS_AUDIT_MGMT.INIT_CLEANUP');
  6  DBMS_AUDIT_MGMT.INIT_CLEANUP(
  7  audit_trail_type => dbms_audit_mgmt.AUDIT_TRAIL_AUD_STD,
  8  default_cleanup_interval => 24);
  9  else
 10  dbms_output.put_line('Cleanup for STD was already initialized');
 11  end if;
 12  end;
 13  /

PL/SQL procedure successfully completed.

SQL>

第二步 设置为超过14天审计记录标记时间戳.
这里的时间戳需要注意,如果 AUDIT_TRAIL_TYPE为OS或者XML格式,则需要使用本地系统时间的格式,其他2种格式为UTC.

SQL> begin
  2  DBMS_AUDIT_MGMT.SET_LAST_ARCHIVE_TIMESTAMP(
  3  audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD,
  4  last_archive_time => sysdate - 14);
  5  end;
  6  /

PL/SQL procedure successfully completed.

第三步 设置DBMS_AUDIT_MGMT过程中的purge_job

SQL> BEGIN
  2  DBMS_AUDIT_MGMT.CREATE_PURGE_JOB (
  3  AUDIT_TRAIL_TYPE => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD,
  4  AUDIT_TRAIL_PURGE_INTERVAL => 24,
  5  AUDIT_TRAIL_PURGE_NAME => 'AUD_PURGE',
  6  USE_LAST_ARCH_TIMESTAMP => TRUE );
  7  END;
  8  /

PL/SQL procedure successfully completed.

第四步创建DBMS_AUDIT_MGMT.SET_LAST_ARCHIVE_TIMESTAMP定期推进审计记录的归档时间戳的存储过程.

create or replace procedure set_archive_timestamp (retention in number default 14) as
begin
DBMS_AUDIT_MGMT.SET_LAST_ARCHIVE_TIMESTAMP(audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD,last_archive_time => sysdate – retention);
end;
/

第五步 创建schedul,设置每6小时执行一次存储过程set_archive_timestamp

SQL> BEGIN
  2  DBMS_SCHEDULER.create_job (
  3  job_name => 'PUSH_AUD_ARCH_TSTAMP',
  4  job_type => 'STORED_PROCEDURE',
  5  job_action => 'SET_ARCHIVE_TIMESTAMP',
  6  number_of_arguments => 1,
  7  start_date => SYSDATE,
  8  repeat_interval => 'freq=hourly;interval=6',
  9  enabled => false,
 10  auto_drop => FALSE);
 11  End;
 12  /

PL/SQL procedure successfully completed.

SQL> BEGIN
  2  dbms_scheduler.set_job_argument_value
  3  (job_name =>'PUSH_AUD_ARCH_TSTAMP',
  4  argument_position =>1,
  5  argument_value => 7);
  6  DBMS_SCHEDULER.ENABLE('PUSH_AUD_ARCH_TSTAMP');
  7  End;
  8  /

PL/SQL procedure successfully completed.

设置完成,执行一次.

SQL> BEGIN
  2  DBMS_SCHEDULER.run_job (job_name => 'PUSH_AUD_ARCH_TSTAMP',
  3  use_current_session => FALSE);
  4  END;
  5  /

PL/SQL procedure successfully completed.

到此为止一个定期purge清除aud$下的审计记录的job就设置好了.中间涉及到DBMS_AUDIT_MGMT过程包的各个知识,在做之前参考前面写的,可能会碰到和引起的问题.该过程主要的作用还是(标准以及细粒度审计)管理审计记录的,不管审计记录是哪种类型,存放在何处,为管理审计提供了便捷,但是在10g同时也带来了一些问题,11gr2版本后审计记录的记录方式发生变化后,各方面功能相对比较稳定完善.

AUD$的Shrink问题

最近遇到这个case的问题比较多,不知道是不是碰到去年国家要求信息安全啥的,很多数据库都被加上了审计,在积累了一段时间后,问题在最近集中的爆发了.

其实最主要的问题主要集中在AUD$表过大的问题,而且默认设置时候是放在system tablespace中,即使用定期的清除策略,但是大家知道最终AUD$的高水位是没法降低的.除了常见的truncate这张表降低高水位提高可用空间外,而shrink在system表空间的对象是无法使用的,因为system 表空间是属于字典管理的嘛~其实也可以通过将AUD$表设置到其他本地管理的表空间,再配合shrink执行.设置过程也简单,借用DBMS_AUDIT_MGMT.SET_AUDIT_TRAIL_LOCATION函数,

The DBMS_AUDIT_MGMT package provides a subprogram that allows you to move the database audit trail tables out of the SYSTEM tablespace. This improves overall database performance. It also allows you to dedicate an optimized tablespace for audit records.

通过类似如下的命令即可:

 

BEGIN
DBMS_AUDIT_MGMT.SET_AUDIT_TRAIL_LOCATION(audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_DB_STD,
audit_trail_location_value => 'LUDATOU');
END;
/

 

然后在后续的回收AUD$空间时候就可以配合定期删除策略采用alter table sys.aud$ shrink cascade来执行,但是在移到新表空间后需要将表aud$的rowmoment的属性打开.

alter table sys.aud$ enable row movement;

 

移回system表空间的语法类似,

BEGIN
DBMS_AUDIT_MGMT.SET_AUDIT_TRAIL_LOCATION(audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_DB_STD,
audit_trail_location_value => 'SYSTEM');
END;
/

Oracle各版本数据库停止更新时间表

版本 结束日期 特例*
12.1.0.1 2015年7月22日
11.2.0.4 2018年1月31日
HP-UX Itanium: 停止提供补丁日期为2020年12月。 从2018年2月1日起只提供严重程度为1级的修复(不会再发布新的 PSU 和 CPU) 。
11.2.0.3 2015年8月27日
11.2.0.2 2013年10月31日
结束日期比正常晚
11.2.0.1 2011年9月13日
对于 Exadata 结束日期为2012年4月30日
11.1.0.7 2015年8月31日7
HP-UX Itanium – 结束日期为2015年12月。从2015年9月1日起只提供严重程度为1级的修复(不会再发布新的 PSU 和 CPU)。
11.1.0.6 2009年9月18日
10.2.0.5 2015年7月31日7
所有平台  – 标准 Extended Support 在2013年7月31日结束。在2013年8月至2015年7月间,提供有限支持的 Extended Support,日起只提供严重程度为1级的修复(不会再发布新的 PSU 和 CPU)。详见 Oracle Software Technical Support Policies.
HP-UX, Linux, 和 Windows Itanium – 结束日期为2015年12月。从2013年8月1日起只提供严重程度为1级的修复(不会再发布新的 PSU 和CPU)。
10.2.0.4 2011年7月31日5
10.2.0.3 2009年2月22日
IBM Linux on Power
2009年4月9日
IBM Linux on System z
2009年5月16日
Microsoft Windows Itanium (64-bit)
2009年5月2日
HP Tru64 UNIX
2009年5月20日
10.1.0.4 2007年1月30日