看似简单的dual,其实深藏玄机

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介:

对于dual总是有种熟悉而陌生的感觉,我们经常使用却对它知之甚少。今天由【DBA+社群】联合发起人杨建荣老师带你一起了解dual和它深藏的那些你不知道的玄机……


目录


  • 为了存在而存在的dual

  • 一个小案例中对dual的思考

  • Dual在数据库实例启动的不同阶段的变化

  • 关于dual的改进:FAST  DUAL

  • Dual中只保留一条数据记录的验证测试

  • 关于dual破坏性测试和恢复

  • 10g,11g,12c中都存在一个关于dual的小bug


 

一、为了存在而存在的dual

 

Dual在Oracle数据库中是一个特殊存在的对象,当然用黑格尔的哲学名言“存在即合理“来解释最恰当不过了。


我对dual的感觉就是为了存在而存在,一方面是为了保证语法的完整性,还有一种场景是为了序列的递增,如果再进一步,那应该是dual中会保留一条数据。


dual是一个虚表,也常称为dummy表。通过下面的查询结果可以很容易看出来dual是一个实体表,然后通过public的同义词,对所有的用户都可以提供访

问。



我对dual的关注源于一个小小的案例,也是在一次巡检中发现了一个小问题,然后死磕,发现了dual的一些小问题,最后也做了不少的测试。


 

二、 一个小案例中对dual的思考

 

Oracle对于sys用户的审计是默认的一个操作,所以不管你开启了什么审计策略,sys的登录操作都会记录下来,可能估计Oracle也没有料到有些应用会把这个影响放大,毕竟频繁登录sys听起来也是不现实的。但是放到大批量细粒度的自动化监控中,这个影响就会放大,可能在设计上有些功能还不够严谨,确切的说应该是存在一定的问题。


比如下面的这个场景,有一天我发现在审计目录下存在着大量细小的文件,生成时间也很紧凑,可见还是有一些操作很频繁的使用了sysdba登录数据库,而且生成了意料之外的大批量审计日志文件。



不要小瞧这些细小的文件,如果积累到一定程度,就会带来不小的影响。比如命令ls支持不了



或者inode溢出。


说完审计文件,我们打开看看里面的内容,里面是通过操作系统用户认证登录以后,做了一个简单的查询,通过语句可以看出来其实是在做一个判断,即数据库实例是否可用。



这个监控的逻辑就是如果实例可访问就返回 Oracle is alive,否则就报警。可能在大批量的服务器环境中还是需要这样的使用场景,在很短的时间间隔里去判断哪些数据库实例可能存在问题。


听起来还是可以接受的,如果审计日志文件太多,也可以考虑定期清理或者设置为noaudit的方式。


那么我们回到一个根本问题,这个监控语句有没有问题呢。


我们来做一个简单的实验。我把数据库用最少的参数启动到Nomount阶段,这个时候数据库实例其实还是不可用的,我们来看看这个监控语句是否可用。


首先就是最简单的参数文件,目前就配置了两个参数。



这个时候发现 这个简单的监控语句在nomount状态下也是可用的,这个时候还没有开始初始化数据字典,但是就是可以做一些计算。



所以通过这个细小的案例还是发现,其实监控的一些方式还是需要斟酌,如果需要做数据库是否可用的检查验证,使用了select 'Oracle is alive'的方式验证,那么可能数据库还没到open阶段,通过这个语句就已经“验证”数据库服务已经OK了,这种情况还是很容易造成误导。还是需要好好注意一下。


所以一个初步结论就是使用dual来做监控还是存在一定的隐患,很可能监控会给我们带来一些误导,因为数据库实例在nomount,mount,open阶段都可以成功输出结果。


一个小小的案例结束,我的分析才刚刚开始。


 

三、 Dual在数据库实例启动的不同阶段的变化

 

如果你观察仔细,就会发现dual在数据库启动的不同的阶段,里面的字段其实还会发生一些微妙的变化。在nomount和mount阶段含有多个“字段”,而不是一个。



如果感兴趣可以仔细分析一下上面的原委,如果从实用主义的角度,可能会感觉然并卵,好吧,我们再来看一个例子:FAST DUAL。


 

四、 关于dual的改进:FAST  DUAL

 

如果追溯起来,FAST DUAL执行计划是Oracle10g中的新特性。对使用DUAL进行的计算,可以不用真正的访问表,从而快速的得到结果。


这个改变似乎并不起眼,但是实际上累计起来对于系统的影响还是很大的。


我们来简单测试一下两者的细微差别。



可以看到FAST DUAL的场景下consistents gets为0,然后再来看一下查询全表数据的情况,其实里面只有一条数据,但是还是会有额外的consistent gets。



明白了dual的一些基本使用,如果想更进一步了解dual,可以做一些小的测试。


 

五、 Dual中只保留一条数据记录的验证测试

 

我们再来看看dual的表结构,只有一个字段,里面也只有一条纪录。



那么我们可以不可以自己新建一个dual表呢,答案是当然可以。


不过这个使用下面的语句查看,会查不出结果。


SQL> select 4*5 from dual2;

no rows selected


这个时候肯定不行,主要原因就在于dual2中没有记录,而dual中始终保持一条记录。


这句话听起来很简单易懂,怎么实践呢。


在测试了10g,11g,12c中的dual的情况后,测试结果都是一致的。


我们给dual中插入一条记录。



这个时候查看dual表的数据,发现还是只有一条。



查看条数也只有1行。



那么还可以怎么玩呢。我们尝试删除。


SQL> delete from dual;

1 row deleted.


然后查看,刚刚插入的y这个时候又看到了。如果你继续delete还是会显示X


通过这个例子可以看出oracle对于dual的处理也是苦心积虑,需要dual里面始终保持一条记录。当然里面的值就是一个dummy值,没有其它实际的含义。


六、 关于dual破坏性测试和恢复

 

关于dual表的破坏性测试,既然是破坏性测试,首先严正声明,这个测试仅限于测试或者个人学习所用,可能有些sql看似极为简单,但是一旦运行就会导致业务系统崩溃。


比如说我们拿dual表开刀,因为这个表是一个dummy表,里面的内容没有特定的意义,就是为了存在而存在。但是一旦这个表出现问题,所有相关的基础操作都会受到影响,后果可不敢想象。
 

我们来简单模拟一下,在个人的机器上开始做下面的尝试,drop 表dual



--如果没有尝试重启数据库的情况下,完全可以采用如下的方式来解决,我们可以完全重建表dual,插入dummy的数据。



这个时候可以查看相关的sys下的失效对象,会发现大量的object都是INVALID状态,这个时候还是需要重新编译一下,使用utlrp.sql 或者手工编译即可。


如果不幸的是我们在出现问题的时候尝试重启数据库,就会发现数据库就起不来了。



alert日志中的相关内容如下:



日志中提到的trace 文件的内容如下:



如果确实知道问题的原因就轻车熟路的解决了,要不还需要费一番周折诊断,开启一些更为详尽的trace来排查。
 

这个错误和数据库参数replication_dependency_tracking有关,默认是TRUE,我们需要暂时绕过这个校验,先把库启动起来,然后重建表dual就可以了。在修复以后,重启数据库然后恢复replication_dependency_tracking的默认值TRUE



重启后需要创建dual表。然后把replication_dependency_tracking再置为默认值true,重新编译失效对象,这个问题的解决就告一段落了。


当然对于这个问题,MOS也有一篇文章去介绍如何修复,步骤也是大同小异。


How to Recreate Dual Table (Doc ID 1163714.1)


七、10g,11g,12c中都存在一个关于dual的小bug


对于这些细节如果多探索一些,就会发现一些奇怪而又意思的小问题,这个问题我在10g,11g,12c中都测试过,都可以复现,应该是一个未发布的bug。


不过过程也还是蛮有意思。


在12c中简单复现一下。



SQL> desc dual   --这一步操作就是这么微妙,但是select * from dual就是有结果的。



当然解决方法也很简单,就是退出当前的session重新登录重启即可。


当然对于这个问题也可以开启更多的诊断事件去做分析。


可以看到一个看起来非常平淡的dual,其实还是有很多值得注意的地方。


最后说一句知乎中抄来的名言,平淡其实是很奢侈的,那意味着有许多爱你的人在为你付出,而在这里就是我们可爱的DBA们。


作者介绍:杨建荣

 

  • 【DBA+社群】联合发起人

  • Oracle ACE-A,YEP成员,现就职于搜狐畅游,拥有6年以上的数据库开发和运维经验,曾任amdocs DBA,负责亚太电信运营商的数据业务支持,擅长电信数据业务,数据库迁移和性能调优。

  • 拥有Oracle 10g OCP,OCM, MySQL OCP认证,对shell,java有一定的功底,曾在2015年数据库大会进行关于数据迁移和升级的主题分享,现在每天仍在孜孜不倦的进行技术分享,每天通过微信,技术博客共享,已连续坚持550多天。

相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
目录
相关文章
|
存储 关系型数据库 数据库
聊多版本并发控制(MVCC)
MVCC是数据库并发控制技术,用于减少读写冲突。它维护数据的多个版本,使事务能读旧数据而写新数据,无需锁定记录。当前读获取最新版本,加锁防止修改;快照读不加锁,根据读取时的读视图(readview)决定读哪个版本。InnoDB通过隐藏字段(DB_TRX_ID, DB_ROLL_PTR)和undo log存储版本,readview记录活跃事务ID。读已提交每次读取都创建新视图,可重复读则在整个事务中复用一个视图,确保一致性。MVCC通过undo log版本链和readview规则决定事务可见性,实现了非阻塞并发读。
844 5
聊多版本并发控制(MVCC)
|
9月前
|
存储 人工智能 自然语言处理
AI 剧本生成与动画创作解决方案评测
用了阿里云的 AI 剧本生成与动画创作解决方案后,我感觉 AI 在内容创作领域真的很有潜力。这个方案不仅简化了动画创作流程,降低了技术门槛,还提高了内容生产的速度和质量。虽然在内容多样性和交互体验上还有提升空间,但总体来说,它是个实用又高效的解决方案,能满足实际生产需求,给创作者带来全新的体验。
302 5
|
10月前
|
人工智能 边缘计算 安全
《探秘鸿蒙NEXT中的人工智能核心架构》
华为HarmonyOS NEXT将AI与操作系统深度融合,开启智能新时代。其核心架构包括:1) 基础层的全栈硬件和云端协同算力系统,提供强大动力支持;2) 模型层的盘古大模型,赋予小艺智能助手超强能力;3) 框架层的鸿蒙原生智能框架与意图框架,实现多模态个性化场景体验;4) 应用层的开放API和控件,支持第三方应用集成;5) 安全隐私层的星盾安全架构,保障数据安全。各层协同工作,为用户带来智能、便捷、安全的体验,并推动智能生态发展。
756 14
|
10月前
|
存储 运维 Kubernetes
正式开源,Doris Operator 支持高效 Kubernetes 容器化部署方案
飞轮科技推出了 Doris 的 Kubernetes Operator 开源项目(简称:Doris Operator),并捐赠给 Apache 基金会。该工具集成了原生 Kubernetes 资源的复杂管理能力,并融合了 Doris 组件间的分布式协同、用户集群形态的按需定制等经验,为用户提供了一个更简洁、高效、易用的容器化部署方案。
465 16
正式开源,Doris Operator 支持高效 Kubernetes 容器化部署方案
|
9月前
|
机器学习/深度学习 人工智能 算法
DeepSeek技术报告解析:为什么DeepSeek-R1 可以用低成本训练出高效的模型
DeepSeek-R1 通过创新的训练策略实现了显著的成本降低,同时保持了卓越的模型性能。本文将详细分析其核心训练方法。
1105 11
DeepSeek技术报告解析:为什么DeepSeek-R1 可以用低成本训练出高效的模型
|
10月前
|
人工智能 自然语言处理
联通元景:中国联通开源中文原生的文生图模型,优化对中文长文本和成语语义等理解
联通元景(UniT2IXL)是中国联通AI推出的中文原生文生图模型,基于国产昇腾AI平台,优化中文语义理解,支持高质量图像生成。
637 20
联通元景:中国联通开源中文原生的文生图模型,优化对中文长文本和成语语义等理解
|
9月前
|
机器学习/深度学习 人工智能 安全
企业AI采用:董事会成员的视角与策略
企业AI采用:董事会成员的视角与策略
|
9月前
|
人工智能 IDE Java
一文彻底拿捏DevEco Studio的实用技巧
本文介绍DevEco Studio 5.0.0的安装与特性,助力高效开发HarmonyOS应用。涵盖快捷键、中文设置、文件注释模板及组件API文档查阅等内容,助你快速上手鸿蒙开发。君志所向,一往无前!
446 0
一文彻底拿捏DevEco Studio的实用技巧
|
10月前
|
存储 供应链 数据建模
供应链场景使用ClickHouse最佳实践
在供应链管理中,ClickHouse凭借其高性能查询、高压缩比和实时数据处理能力,能够显著提升数据处理和分析的效率。通过合理的数据建模、优化实践和性能调优,可以充分发挥ClickHouse的优势,为供应链管理提供强有力的支持。
229 12
|
11月前
|
机器学习/深度学习 人工智能 算法
AI框架的赢者法则:生态繁荣的昇思MindSpore,成为大模型时代的新选择
2024年被视为大模型应用的元年。昇思MindSpore AI框架凭借其强大的开源社区和技术创新,在全球范围内迅速崛起。截至2024年11月,该框架的下载量已超过1100万次,覆盖130多个国家和地区的2400多个城市,拥有3.7万名贡献者。昇思MindSpore不仅在人才培养和社区治理方面表现出色,还在大模型的开发、训练和应用中发挥了关键作用,支持了50多个主流大模型,覆盖15个行业。随着其市场份额预计达到30%,昇思MindSpore正逐步成为行业共识,推动大模型在各领域的广泛应用。
347 12

热门文章

最新文章