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实现 计蒜客 1251 仙岛求药
仙岛求药 少年李逍遥的婶婶病了,王小虎介绍他去一趟仙灵岛,向仙女姐姐要仙丹救婶婶.叛逆但孝顺的李逍遥闯进了仙灵岛,克服了千险万难来到岛的中心,发现仙药摆在了迷阵的深处.迷阵由 M \times NM× ...
- Java实现第八届蓝桥杯青蛙跳杯子
青蛙跳杯子 题目描述 X星球的流行宠物是青蛙,一般有两种颜色:白色和黑色. X星球的居民喜欢把它们放在一排茶杯里,这样可以观察它们跳来跳去. 如下图,有一排杯子,左边的一个是空着的,右边的杯子,每个里 ...
- Go语言圣经[中文版]
近期整理了一篇Go语言圣经[中文版]在线版本,排版比较适合手机以及PC阅读. Go语言圣经[中文版本]
- 高效开发(James)
1.对自己的要求 定位自己Level,清晰自己的目标. 学一个点,明确自己通过学习,需要达到的程度 怎么学一门技术 比如: Spring Cloud 它为什么出现? 它解决了什么问题? 它是怎么解决的 ...
- RabbitMQ系列之【设置RabbitMQ远程ip登录】
由于账号guest具有所有的操作权限,并且又是默认账号,出于安全因素的考虑,guest用户只能通过localhost登陆使用,并建议修改guest用户的密码以及新建其他账号管理使用rabbitmq. ...
- MySQL示例数据库导入_1
做个测试需要有适当量的数据库,于是找到了下面这个MySQL(超过30w记录), 1)先Git clone https://github.com/datacharmer/test_db ...
- WPF入门(2)——依赖属性
今天我们说说依赖属性 什么是依赖属性? 当然,学术定义依旧Please Baidu:https://baike.baidu.com/item/%E4%BE%9D%E8%B5%96%E5%B1%9E%E ...
- selenium(5)-解读强制等待,隐式等待,显式等待的区别
背景 为什么要设置元素等待 因为,目前大多数Web应用程序都是使用Ajax和Javascript开发的:每次加载一个网页,就会加载各种HTML标签.JS文件 但是,加载肯定有加载顺序,大型网站很难说一 ...
- 【K8s学习笔记】K8s是如何部署应用的?
本文内容 本文致力于介绍K8s一些基础概念与串联部署应用的主体流程,使用Minikube实操 基础架构概念回顾 温故而知新,上一节[K8S学习笔记]初识K8S 及架构组件 我们学习了K8s的发展历史. ...
- Appium查看应用包名
方式一没有apk 如果应用已经安装在手机上了(例如应用商城下载).可以直接打开手机上该应用, 进入到要操作的界面然后执行: adb shell dumpsys activity recents | f ...