此文谨以纪念我们曾经失去的青春

在节前(端午节)就收到了甲骨文的电话,说我投递的简历被选中,邀请来面试,分别是两个部门,在深圳总部打过来的全球化支持部(工作地点依然为北京)和北京总部打过来的公有云事业部,职位都是高级DBA

由于全球化支持部涉及英语口语要求较高,个人还是更倾向于公有云事业部,但是先接到了前者的面试邮件,约定618日下午去面试,在软件园里的甲骨文总部大楼~

到了软件园大门,以前熊熊一直以为东门口那个十号楼上写的Oracle甲骨文的就是甲骨文总部了,还觉得那里挺小的了,邮件中提到的是24号楼,于是进入十号楼问了保安,才知道要走很远(一开始没在意,后来才知道,真的好远)

沿着路一直往软件园深处走去,真的好远啊,沿途经过了一个中欧国际工商学院,那种别墅似风格的教学楼,不高,就2-3层,但是应该很奢华,楼下停着很多的豪车(奔驰、宝马、奥迪,都是进口高系),啥时候熊熊才能来这里学习呢,嘻嘻~

走了大约25分钟的路程,终于来到了24号楼,甲骨文北京总部所在地,真的很壮观,就像一个小型社区,在门口照了张相,把甲骨文的Logo照了进来,找到右手边的T2楼,进去到前台,说明来意,问是否预约好,回答是的。

前台保安让熊熊给联系人打个电话,这时才想起,联系人根本没有给熊熊留电话。于是在前台小姑娘那里查联系人的电话,结果因为甲骨文都是英文名字的原因,我只知道对方中文名称,无法查到,正在着急中,对方正好打电话过来,告知她已经到楼下,说稍等片刻,下来接熊熊~

见面以后,一个长相很一般的女生,气质和亲和度也不是特别赞,填好表格以后,由她领上3楼,到了一间小会议室,过不多久,进来一位30来岁的高级工程师(也许就是manager)模样的男人,面试正式开始~

也没有浪费时间让熊熊做什么简单的自我介绍,只是问了一下现在工作主要做什么,可能熊熊答的有点简单,让对方感觉是普通的运维DBA,于是针对熊熊的问题开始了深入面试

Q:你在工作中主要负责哪块业务现在

A:主要负责整体数据库的日常维护,保证数据库的稳定、可靠、高效运行

Q:那你们通常如何来巡检,有哪些工具手段?

A:因为银行方面无法使用OEM或者GCGrid Control)这种图形化工具,因此我们的日常巡检都是用AWRASHADDMRDA等一系列工具来做的,如果有具体的问题,也会通过一些动态视图来具体查看,包括查看alert日志以及抓trc进行分析等等。

Q:那你们不能使用OEM这种的话,如何保证这个监控的频度,还是说每次都必须自己手工上去生成报告看一下?

A:是这样的,有一些重要的监控指标,我们在Nagios里做了脚本进行监控,比如数据库的监听状况、RAC节点的健康状况、表空间的增长率等等,如果出现问题,通过Nagios报警会直接发送到我的手机上

Q:既然你们要进行日常监控,如果感觉数据库跑得很慢,从哪些地方能体现出来

A:这个需要具体问题具体分析,看看到底是OS层面问题,还是数据库本身问题,亦或是网络或者ASM存储的问题,如果是OS层面的问题,看看CPU的负载高不高,如果高的话,考虑是不是应用层与数据库层面的连接瓶颈(比如内存溢出等问题),如果CPU负载正常,但是I/O瓶颈比较高(这是数据库经常遇到的问题),那么有可能是SGA内存分配不合理,或者SGA内存不足,甚至是整体物理内存不足,那么需要考虑的情况有很多种,有可能是数据库的DML操作过于频繁,有可能是SQL写的不合理(比如没有使用绑定变量,共享游标等等,比如SQL写法不规范,比如没有使用索引,或者索引设定不规范导致大量全表扫描),这些可以从AWR报告里的等待事件中看到一些问题。

Q:你刚刚提到了AWR报告,那么如果是数据库比较慢,比如你说的I/O问题这种,在AWR报告中会怎么体现出来?

A:首先是各种target的指标监控(那个说实话熊熊真忘了是怎么说,但是解释一下,就是那个各项性能满分是100%那个),这里可以看到一些比如字典缓存命中率,库缓存命中率等等低不低,如果不低再看看SQL的执行重复率低不低,如果低,证明SQL设计不合理,当然,有很多比如数据文件顺序读,直接路径读/写这种,都是造成大量User I/O的原因

Q:那这个User I/O,在AWR报告中的显示是什么?

A:(挠头),额,这个我真不知道,我英语太烂了,不知道怎么说这个,但是如果AWR报告发给我,我真的可以看出来的

Q:如果AWR报告中报日志的频繁切替,是什么问题?

A:那有可能是日志组过少,然后日志组里的日志成员过多,而且日志设定的大小过小,比如就设定了20M,然后DML操作过于频繁,会造成大量的日志写入,写满了就会切替,过多的切替就会造成日志频繁写入,影响数据库性能

Q:你刚刚提到的频繁写日志,包括脏块写入到dbf中,事务没有提交的话,脏块或者日志会不会写入到相应文件中?

A:这个肯定不可以的啊,事务要遵循ACID原则,事务只能被提交或者被回滚,不能自我中断的,不过如果脏块把buffer cache写满,无论事务提交与否,都会写到datafile中,不写日志,就算脏块写到了datafile里,这时候如果数据库重启,因为日志里没写,pmon就不能还原,这样就可以理解为:因为没有commit,这个事务就不成立。

QOK,你在工作中都是单实例还是有RAC

A:是这样的,我们有一个小机,上面跑了五个单实例的库,另外还有两套RAC环境

Q:你们的RAC是两个节点的?

A:是的,以前也做过4个节点的

Q:那么你如何来查看RAC的状态?

A:通过crs命令就可以查看了

Q:具体命令是什么呢?

Acrs_stat –t就可以查看到节点状态

Q:那么你如何知道RAC中有几个节点呢?

A:使用刚才那个命令其实就可以看到有几个节点了

Q:你说的这是所有节点正常启动的情况,如果不是呢?

A:是这样,有一个比较笨的方法,我使用DBCA命令中的instancemanager来看我的节点信息,只要节点的OCR信息没有被破坏,那么都可以看到的

Q:你刚才提到OCR信息被破坏,那么如果OCR信息被破坏了,该怎么做?

A:我们可以通过重建OCR来修复

Q:具体怎么做呢?

A:通过修改ocr.locparamfile.crs文件进行设置,然后通过命令进行重建

Q:什么命令?

A:额,那个,唉,想不起来了,不过如果做的话,我知道该如何做的,除了重建OCR,我们也可以删除节点的OCR信息再添加,效果是一样的,只是OCR重建更方便些

Q:你们装RAC用的是ASM吗?

A:是的

QASM里有个au_size参数,你知道吗?

A:这个真没接触过(回来以后熊熊仔细看了这个参数,Oracle 10g是默认的1m大小,不能修改,11g以后可以手工修改,所以熊熊不知道)

Q:如果单实例变成RAC,有什么方法吗?

A:可以使用DGstandby复制出一个节点,然后添加节点的OCR信息等,用rman克隆应该也可以的

Q:你提到DG,你有没有做过DG

A:这个是有的

Q:那你说说DG都需要配置哪些?

A:首先在主库开启归档和辅助日志,然后设置一些参数,比如log_archive_dest里添加主库和备库的信息,fal的两个参数要设置(fal_clientfal_server),然后如果有文件转换需要设置convert(包括dblog),将主库的spfile转化成pfile,传送pfile和密码文件到从库机器上修改相应参数,主库可以通过RMAN做一个全备,然后可以使用RMAN的辅助数据库功能在从库进行恢复,10g的物理DG只能是mount模式,11g可以是open read only模式,这样可以将此库设置为只读查询库,来实现读写分离

Q:你们工作中有没有用到DG

A:我们用到的是GGGoldenGate

Q:你能简单说一下GG的设置吗

A:先在两个节点上(主备库)分别按照ogg软件,设置mgr进程,然后在主库上设置抽取进程和采集进程,在备库上设置采集进程,像我们上次迁移新查询库,首先用rman进行全库备份,然后使用克隆技术克隆出一个库,再通过GG将增量数据抽取过来,就可以了,为了安全起见,禁用了GGDDL同步功能,如果要是双向复制,就需要在备库再创建一个抽取进程和采集进程,相应在主库在添加一个采集进程即可。

Q:像RMAN在执行中会占用到SGAlarge pool,那么GG在运行中是自己独立的进程,还是也会占用Oracle的进程

Adata pump的话应该会占用到Oracle的进程吧,感觉GG应该是也会占用large_pool,但是具体的没有研究过那么深,所以不知道对错

Q:如果是一个SQL产生了死锁,有什么方法能看出来?在OS层面

A:是这样的,首先可以使用top来看一下CPU和内存的情况(根据每个进程),并且结合ps –ef | grep ora命令来查找,如果真的是死锁的话,那么通过v$session中的lockwait显示出来的sidOS上的pid是会对应的。

Q:死锁有什么解决办法?只能人工杀死吗?

A:具体问题具体分析,如果是latch,不需要管他,他是抢占式的,如果是lock,那么要看到底是事务占用了(比如排他锁会产生排队),还是真的死锁(比如应用层断开连接或者没响应了),如果是排队,那么将死掉的事务提交或者回滚,剩下与其排队的死锁会自动解开,如果是失去响应了,就需要手工干预了

QOS层面除了top,还有啥可以查看系统或者数据库性能状况的命令,从系统级

Aiostatvmstatsaruptime等等,还有很多了

Q:如果查看系统的内核版本用哪个命令

Auname-a或者-r都可以

Q:如果查看系统版本号怎么办?

A:查看/ect/redhat-release文件即可

Q:如何查看一个服务器上有多少个实例

A:这个用查监听状况应该可以

Q:如果service用的其他名字或者用其他端口呢,这都不确定的

A:如果查/etc/oratab文件也是可以的其实,当然,有可能里面没有写,那么查ORACLE_HOME/dbs/initSID.ora或者spfileSID.ora是可以的。

Q:嗯,你英文不太好是吧

A:额,是啊,很烂,丢人

Q:那你能用英文做个简单的自我介绍吗?

A:对不起,这个真的没有准备(不是第二轮才英文面试吗,郁闷)

Q:哦,那你看还有啥需要问我们的?

A:(自己又问了一些技术问题,主要是12C新技术方面和Oracle未来发展方向的,那个人很耐心的给熊熊解答了,感觉很好)

Q:还有吗?

A:没有了,非常感谢

Q:好的,我们会再通知你

A:好的,谢谢

今天的面试就结束了,那个女生把熊熊送下楼的时候提到因为面试结果要呈报美国的那个manager审核,由他来决定是否可以进入第二轮面试,同时她也提到,这个部门对英语还是很看重,所以这点还是很重要的。

总结一点,基本上技术大方向还是能答出来,但是细节和深度还是不够,有些问题应该是很清晰的,面试时候还是有些紧张了,总体来说,此次面试受益匪浅,就算失败,也是一次很有意义的经历,感谢甲骨文给出的这次机会,会让我非常受用~