Oracle中truncate表不更新last_ddl_time列

问题描述

最近发现数据库中定时job的某张表,每天都有truncate动作,由于调整了job的interval时间,想查看last_ddl_time辅助验证job的运行情况,结果发现last_ddl_time是几天前的时间。

单单从这点上看我还以为这个job没运行过,但是从last_date字段又可以看出最近的时间是执行过的,怎么回事呢?

测试分析

由于表示临时用的表,而且是一张空表,征得相关人员许可后,测试环境中(存在同样的问题)对表手工做truncate,再次查看last_ddl_time,果然没变化。

开始mos找资料,有这样一篇文章“LAST_DDL_TIME Not Changing (Doc ID 1448241.1)”,里边这样描述:

10g and subsequent do not invalidate dependent objects unnecessarily. Therefore, since the PACKAGE BODY is not changing, the LAST_DDL_TIME does not change.

If you would change something in the package body (a line of code, not simply a comment), you will find that LAST_DDL_TIME changes.

LAST_DDL_TIME changes for CREATE OR REPLACE ...

1. When the source of the procedure changes.
... OR ...
2. The settings of following parameters change from original creation time:
plsql_optimize_level, plsql_code_type, plsql_debug, nls_length_semantics, plsql_warnings, plsql_ccflags, plsql_compiler_flags.

So, this is not a bug, but expected behavior. Last_ddl_time is only updated if the object actually changes.

虽然DOC上描述的场景和我遇到的情况不一样,不过里边有句话提醒了我。

If you would change something in the package body (a line of code, not simply a comment), you will find that LAST_DDL_TIME changes.

(如果您要更改程序包主体中的某些内容(一行代码,而不仅仅是注释),则会发现LAST_DDL_TIME发生了更改。)

So, this is not a bug, but expected behavior. Last_ddl_time is only updated if the object actually changes.

(因此,这不是错误,而是预期的行为。仅当对象实际更改时,Last_ddl_time才会更新。)

所以有可能是原表就是空表,你做truncate操作的时候,实际上就不会更新last_ddl_time这个列。

测试模拟

[oracle@oracle ~]$ sqlplus / as sysdba

SQL*Plus: Release 11.2.0.4.0 Production on Tue Apr 28 08:34:31 2020

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

Connected to an idle instance.

SYS@zkm> startup;
ORACLE instance started. Total System Global Area 784998400 bytes
Fixed Size 2257352 bytes
Variable Size 465571384 bytes
Database Buffers 314572800 bytes
Redo Buffers 2596864 bytes
Database mounted.
Database opened. SYS@zkm> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss'; Session altered. SYS@zkm> select last_ddl_time from dba_objects where object_name='TEST'; LAST_DDL_TIME
-------------------
2020-04-26 10:37:05 SYS@zkm> !date
Tue Apr 28 08:35:27 CST 2020 SYS@zkm> desc zkm.test
Name Null? Type
----------------------------------------- -------- ----------------------------
ID NUMBER SYS@zkm> delete from zkm.test; 13107200 rows deleted. SYS@zkm> commit; Commit complete. SYS@zkm> truncate table zkm.test; Table truncated. SYS@zkm> select last_ddl_time from dba_objects where object_name='TEST'; LAST_DDL_TIME
-------------------
2020-04-28 08:43:24

从这里看,我将表的数据全部delete并且commit后,truncate表竟然last_ddl_time更新了。

随后我想到truncate表实际上是换了个段,data_object_id会变,那再次truncate的话应该不会再更新last_ddl_time了。

SYS@zkm> select object_id,data_object_id from dba_objects where owner='ZKM' and object_name='TEST';

 OBJECT_ID DATA_OBJECT_ID
---------- --------------
18815 18832 SYS@zkm> truncate table zkm.test; Table truncated. SYS@zkm> select last_ddl_time from dba_objects where object_name='TEST'; LAST_DDL_TIME
-------------------
2020-04-28 08:43:24 SYS@zkm> select object_id,data_object_id from dba_objects where owner='ZKM' and object_name='TEST'; OBJECT_ID DATA_OBJECT_ID
---------- --------------
18815 18832

果然是这样,而且data_object_id也没变了。

Oracle中truncate表不更新last_ddl_time列的更多相关文章

  1. oracle 中删除表 drop delete truncate

    oracle 中删除表 drop delete truncate   相同点,使用drop delete truncate 都会删除表中的内容 drop table 表名 delete from 表名 ...

  2. 【转】Oracle中dual表的用途介绍

    原文:Oracle中dual表的用途介绍 [导读]dual是一个虚拟表,用来构成select的语法规则,oracle保证dual里面永远只有一条记录.我们可以用它来做很多事情. dual是一个虚拟表, ...

  3. Oracle 两个表之间更新的实现

    Oracle 两个表之间更新的实现   来源:互联网 作者:佚名 时间:2014-04-23 21:39 Oracle中,如果跨两个表进行更新,Sql语句写成这样,Oracle 不会通过.查了资料,S ...

  4. 如何在Oracle中建立表和表空间?

    1.建表空间 ORACLE中,表空间是数据管理的基本方法,所有用户的对象要存放在表空间中,也就是用户有空间的使用权,才能创建用户对象.否则是不充许创建对象,因为就是想创建对象,如表,索引等,也没有地方 ...

  5. 向oracle中的表插入数据的方法

    向oracle中的表插入数据的方法有以下几种: 假设表名为User 第一种方法:select t.*,rowid from User t;-->点击钥匙那个标记就可向表中添加数据 第二种方法:s ...

  6. oracle中给表和列起别名

    SELECT xxmc,sname as xsxm,sex,phone,address jzdz FROM student s LEFT JOIN xxjbxx x ON x.sid = s.sid ...

  7. Oracle中dual表的用途介绍

    导读]dual是一个虚拟表,用来构成select的语法规则,oracle保证dual里面永远只有一条记录.我们可以用它来做很多事情.     dual是一个虚拟表,用来构成select的语法规则,or ...

  8. Oracle中dual表的用途介绍-转

    读]dual是一个虚拟表,用来构成select的语法规则,oracle保证dual里面永远只有一条记录.我们可以用它来做很多事情. dual是一个虚拟表,用来构成select的语法规则,oracle保 ...

  9. Oracle中dual表的用途

    dual是一个虚拟表,用来构成select的语法规则,oracle保证dual里面永远只有一条记录.我们可以用它来做很多事情,如下: 1.查看当前用户,可以在 SQL Plus中执行下面语句 sele ...

随机推荐

  1. Java实现蓝桥杯VIP 算法训练 P0501

    试题 算法训练 P0501 资源限制 时间限制:1.0s 内存限制:256.0MB 输入两个无符号整数x, y, 用位操作实现无符号整数的乘法运算.不用考虑整数的溢出. 输入: 235 657 输出: ...

  2. Java实现 LeetCode 18 四数之和

    18. 四数之和 给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target ...

  3. Javascript实现万年历(日历表)

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  4. Java实现表达式计算求值

    问题描述 输入一个只包含加减乖除和括号的合法表达式,求表达式的值.其中除表示整除. 输入格式 输入一行,包含一个表达式. 输出格式 输出这个表达式的值. 样例输入 1-2+3*(4-5) 样例输出 - ...

  5. @Transactional 事务的底层原理

    最近同事发现一个业务状态部分更新的bug,这个bug会导致两张表的数据一致性问题.花了些时间去查问题的原因,现在总结下里面遇到的知识点原理. 问题一:事务没生效 我们先看一段实例代码,来说明下问题: ...

  6. 数据结构与算法-python描述-双向链表

    # coding:utf-8 # 双向链表的相关操作: # is_empty() 链表是否为空 # length() 链表长度 # travel() 遍历链表 # add(item) 链表头部添加 # ...

  7. 小程序scroll-view实现回到顶部

    一.wxml页面:catchtap阻止冒泡事件. <view class="gotop" hidden='{{!cangotop}}'catchtap="goTop ...

  8. ArrayList、LinkedList、Vector、Array和HashMap、HashTable

    就 ArrayList 与 Vector 主要从二方面来说. 一.同步性:Vector 是线程安全的,也就是说是同步的,而ArrayList 是线程序不安全的,不是同步的 二.数据增长:当需要增长时, ...

  9. Memory layout

    Text Segment       Text Segment,通常也被称为代码段. 为了防止 heap 或是 stack 的溢出,text 段常被安排在 heap 或是 stack 之后. Text ...

  10. @atcoder - AGC024F@ Simple Subsequence Problem

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定由若干长度 <= N 的 01 字符串组成的集合 S. ...