Oracle中truncate表不更新last_ddl_time列
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列的更多相关文章
- oracle 中删除表 drop delete truncate
oracle 中删除表 drop delete truncate 相同点,使用drop delete truncate 都会删除表中的内容 drop table 表名 delete from 表名 ...
- 【转】Oracle中dual表的用途介绍
原文:Oracle中dual表的用途介绍 [导读]dual是一个虚拟表,用来构成select的语法规则,oracle保证dual里面永远只有一条记录.我们可以用它来做很多事情. dual是一个虚拟表, ...
- Oracle 两个表之间更新的实现
Oracle 两个表之间更新的实现 来源:互联网 作者:佚名 时间:2014-04-23 21:39 Oracle中,如果跨两个表进行更新,Sql语句写成这样,Oracle 不会通过.查了资料,S ...
- 如何在Oracle中建立表和表空间?
1.建表空间 ORACLE中,表空间是数据管理的基本方法,所有用户的对象要存放在表空间中,也就是用户有空间的使用权,才能创建用户对象.否则是不充许创建对象,因为就是想创建对象,如表,索引等,也没有地方 ...
- 向oracle中的表插入数据的方法
向oracle中的表插入数据的方法有以下几种: 假设表名为User 第一种方法:select t.*,rowid from User t;-->点击钥匙那个标记就可向表中添加数据 第二种方法:s ...
- oracle中给表和列起别名
SELECT xxmc,sname as xsxm,sex,phone,address jzdz FROM student s LEFT JOIN xxjbxx x ON x.sid = s.sid ...
- Oracle中dual表的用途介绍
导读]dual是一个虚拟表,用来构成select的语法规则,oracle保证dual里面永远只有一条记录.我们可以用它来做很多事情. dual是一个虚拟表,用来构成select的语法规则,or ...
- Oracle中dual表的用途介绍-转
读]dual是一个虚拟表,用来构成select的语法规则,oracle保证dual里面永远只有一条记录.我们可以用它来做很多事情. dual是一个虚拟表,用来构成select的语法规则,oracle保 ...
- Oracle中dual表的用途
dual是一个虚拟表,用来构成select的语法规则,oracle保证dual里面永远只有一条记录.我们可以用它来做很多事情,如下: 1.查看当前用户,可以在 SQL Plus中执行下面语句 sele ...
随机推荐
- Java实现 神犇的悲惨一生
[问题描述] 传说中有位神犇,因其一贯低调,所以人们连他活了多少岁都不知道. 好在XXXX文献上有段关于他生平细节的文字:神犇一生中, 幼年占了1/6,又过了1/12的青春期,又谈了1/6的恋爱后结婚 ...
- Java实现凸包问题
1 问题描述 给定一个平面上n个点的集合,它的凸包就是包含所有这些点的最小凸多边形,求取满足此条件的所有点. 另外,形象生动的描述: (1)我们可以把这个问题看作如何用长度最短的栅栏把n头熟睡的老虎围 ...
- java实现还款计算
标题: 还款计算 银行贷款的等额本息还款方法是: 每月还固定的金额,在约定的期数内正好还完(最后一个月可能会有微小的零头出入). 比如说小明在银行贷款1万元.贷款年化利率为5%,贷款期限为24个月. ...
- Java实现第八届蓝桥杯最大公共子串
最大公共子串 最大公共子串长度问题就是: 求两个串的所有子串中能够匹配上的最大长度是多少. 比如:"abcdkkk" 和 "baabcdadabc", 可以找到 ...
- 第一章01-正常情况下Activity的生命周期
一.Android下能见到的界面 Window Dialog Toast Activity 二.Activity的生命周期分析 典型情况下的生命周期 是指在有用户参与的情况下,Activity所经过 ...
- 开发者大赛 | aelf轻型DApp开发训练大赛结果公布!
6月9日,由aelf基金会发起的轻型DApp开发训练大赛圆满收官.本次训练赛基于aelf公开测试网展开,主要针对轻型DApp,旨在激励更多的开发者参与到aelf生态中来. 活动于4月21日上线后,ae ...
- JS中的各类运算符
2020-04-15 JS中的各类运算符 // 假设有如下代码,那么a(10)的返回结果是?( ) function a(a) { a^=(1<<4)-1; return a; } // ...
- 手写网页扫雷之js部分(vue)
var vm = new Vue({ el:"#ui", data(){ return{ num:0, saoleiStyle:{ width: "0px", ...
- (四)log4j同配置下多个进程写日志
原文链接:https://blog.csdn.net/voiceofwind/article/details/51966361 由于起了两个不同的任务,log4j中用的是一套配置,写入的是同一个路径, ...
- Spark如何与深度学习框架协作,处理非结构化数据
随着大数据和AI业务的不断融合,大数据分析和处理过程中,通过深度学习技术对非结构化数据(如图片.音频.文本)进行大数据处理的业务场景越来越多.本文会介绍Spark如何与深度学习框架进行协同工作,在大数 ...