20万DBA都在关注的11个问题(超有料)

2020-02-14 10:57:25 浏览数 (1)

1、_cursor_obsolete_threshold参数建议值

描述: 目前一个12.2的库,数据库种有大量course: mutex X和course: mutex S等待事件,请问_cursor_obsolete_threshold这个参数有没有一个建议值,我查了最佳实践里好像没有,现在值默认是8192,11.2默认值为1024。

解答: 参数设置成100就可以了,12.2默认值太大了,参考High Version Counts For SQL Statements (>1024) Post Upgrade To 12.2 and Above Causing Database Slow Performance。

2、MySQL WHERE条件无匹配值为何还有排序消耗

描述: tab_t 数据库20w,b=0无结果,表上无索引。SQL频繁执行,show processlist看到执行时间为0,但是state:creating sort index。explain Extra : filesort,通过profile看到creating sort index耗时最长,请问下 b=0 并无匹配值为何还有排序消耗,难道order by在where之前执行吗?

解答: 顺序应该是:where->order by->limit,消耗是在order by 上用 file sorting 部分。查看sqlfilresort.cc源码,没有判断rowcount=0值的情况下停止处理的部分,点击标题查看详情。

3、alert日志时不时有Global Enqueue Services Deadlock提示

描述: Global Enqueue Services Deadlock detected. More info in file //oracle/diag/rdbms///trace/_lmd0_17544.trc。之前有看过一个类型的mos文档,说是bug,由于当前环境没那么快可以安排出停机计划,想知道是否是真的bug引起的,还是应用写的有问题。

解答: 首先从trace中可以看出是LB类型的死锁,也就是Library Cache Lock,再查看大多数都是j00X进程在RECOMPILE_INVALID_PROCEDURE时候遇到(181个),其中主要是两个LB-635C12F2-486D1193和LB-58F64EF2-64524922两个resource的锁。1、请先检查trace中这些对象是否存在外部表,如果存在尝试禁用外部表的统计信息;2、检查job中调用的对象是否失效,如果失效手工编译是否可行;3、RAC中LB的死锁大多数还是bug,如果1和2无法解决问题,建议GRID和DB都安装最新的补丁。

4、导入数据时报错IMP-00064 Definition of LOB was truncated

描述: ORACLE导入数据时报错IMP-00064,这是以前的一个老文件,现在没有源服务器数据,当时用户没有管理员权限,不能使用expdp。

解答: 加 commit=yes 参数,保证把完好数据导入,其他有问题的数据就没有办法了。

5、集群将ctss改成使用ntp服务同步时间

描述: 我有一套oracle 11g集群环境,之前使用的ctss服务同步时间,后来我改成ntp服务同步时间了,但是ntp服务在节点上配置这视乎有点问题,我强制同步了一次时间之后,在节点上启动了ntp服务,但是定时任务写同步就不行了,我想请教一下我这ntp服务在集群节点上具体应该怎么配置啊,我有单独的ntp服务。

解答: 在Oracle RAC数据库中,节点间的时间同步非常重要。而在部分企业环境中,数据库之间、应用服务器和数据库之间的时间同步是必须的。在这种情况下,使用NTP进行时间同步就成了必然的选择。点击标题查看详细配置过程。

6、Oracle 18c 用户unlimited tablespace权限

描述: Oracle18c中,给用户赋connect, resource权限,用户可以建表,但是插入数据报权限不足。单独赋unlimited tablespace后可正常使用。是否在18c中这个权限需要单独赋予?

解答: 12c 版本开始,就把 unlimited tablespace 权限从 resoruce 剥离出去了。可以为用户单独设置空间适用限额,比如限制 500M,1000M。也可以设置无限制。

7、PLSQL中执行 “execute immediate sql ” 没显示

描述: serveroutput 已设置为 on 。execute immediate 后面的sql语句如下所示:select * from table(dbms_xplan.display_cursor(sql_id=>v_sqlid));变量v_sqlid 已正确赋值。PLSQL 正确执行,没有报错。但是,execute immediate 执行后没有结果显示,为什么?如何才能显示结果?

解答: 如果是 PL/SQL 代码,你需要在代码里调用 dbms_output 去输出结果。

8、有一个列内容需要两千个汉字,应用什么字符类型

描述: 有一个列内容需要两千个汉字,应用什么字符类型,long可以吗?

解答: 首先不要使用long字段早已被clob字段替代,不要去用long字段,操作起来极其麻烦。话说回来,应该根据业务需求来确定字符集的选择,中国的应用,数据库通常都用GBK或UTF8,一旦确定,应用程序就要按定好的字符集来设计开发。 对于Oracle来说,在11g或更早的版本,varchar2的话,用GBK正好最大能存下2000汉字,如果是UTF8,那么varchar2列是不够的。但到了12c,无论你采用什么字符集,varchar2列设定6000的长度,可以存下以UTF8编码的2000汉字。但是如果是LOB字段,那么无所谓新老版本的Oracle,都能存下2000汉字,一点问题都没有。

9、Oracle数据库里的 q00 进程是什么?有什么作用?

描述: 在 Oracle 数据库里,经常看到 q00 编号的进程,请问这个进程是什么?有什么作用?能终止吗?

解答: QMNC和Qnnn:高级队列,Qnnn进程对于QMNC进程就相当于Jnnn进程与CJQ0进程的关系。QMNC进程要通知Qnnn进程需要完成什么工作,Qnnn进程则会处理这些工作。

10、12c多租户数据库个别节点单个pdb起不来

描述: 12c多租户数据库修改sga参数文件,三个节点的集群数据库,一共有实例30个,节点一的pdb重启后都是读写状态,节点二,节点三重启cdb后29个实例为读写状态,只有最后一个为mounted

解答: 诊断发现是有人把数据文件创建在节点1的本地,导致节点2,3识别不了,把没有起来的pdb在本地的文件,通过rman 复制到共享存储上,问题解决。

11、4个关于redo,undo的问题疑问

描述: 老师好,因为听到过这么一个故事,某dba在检修升级快结束时发现一个超大事物操作错了,需要rollback,如果此时rollback时间肯定来不及,于是该dba直接shutdown abort了。于此产生一些疑问:1、超大事物commit前,是否一定不写入redo日志;2、insert,update,delete哪种操作在rollback时用时最少,为什么;3、insert,update,delete,在rollback一半宕机,恢复数据库时,数据库是什么状态,数据库在恢复时具体做了什么操作;4、故事中的操作在极端情况下是否可行。

解答: 1、commit前,也是有可能写入redo的,这个可以参考重做日志缓冲区中的内容写到redo的几个条件;2、insert,update和delete的Rollback时间,时间和事务的大小有关,相比起来,insert产生的undo确实是要少一些的,因为update和delete都是保存数据修改前的映象的,所以生成的undo会多一些,rollback的时间上也会相应的长一点;3、Rollback一半宕机,open的时候数据库会继续回滚;4、故事中的这个场景,虽然是可行的,但是在数据库重新启动的时候数据库就会进行一系列的前滚以及回滚操作。但是abort还是不建议用,这样可能会导致数据库无法启动等问题。

0 人点赞