重磅推荐
【编辑推荐】
ACE成员 一线资深DBA 搜狐畅游数据库专家多年运维经验凝聚成简。以工作笔记形式凝练近800天原创技术博客精华,全面再现DBA工作场景以及运维故障解决思路,透彻理解Oracle运维、数据迁移和性能调优。
【内容简介】
本书是来自一线Oracle DBA的实践工作笔记,凝结作者多年数据库管理运维心得;全书从运维、数据迁移和优化三个层面娓娓道来,精心筛选作者在实际工作中总结的技巧、对常见问题的高效处理方法,以及大量融入完善解决方案的诊断案例;尤其对数据库的宕机、容灾、监控管理、外部表迁移方案、系统调优、SQL优化等重点内容的讲解更是细致入微。
【作者简介】
杨建荣DBA一枚,Oracle ACE,DBAplus社群联合发起人,YEP成员(Young Expert Program),现就职于搜狐畅游,曾负责亚太电信运营商的数据业务支持,主要负责完成数据业务升级、数据迁移和性能调优。拥有Oracle 10g OCM,MySQL OCP认证,在数据库大会和Oracle嘉年华做过主题分享。除数据库技术之外,对shell,Java也有一定的功底,平时喜好写技术博客,每天坚持一篇,现已经坚持800多天(公众号 jianrong-notes)。
【目录】

第1篇 数据库运维篇

第1章 数据库安装配置

1.1 安装前的准备 1

1.2 安装数据库软件 5

1.2.1 方法1:OUI安装 6

1.2.2 方法2:静默安装 8

1.2.3 方法3:克隆安装 11

1.2.4 诊断案例:克隆安装后无法登录的问题 13

1.3 创建/删除数据库 16

1.3.1 方法1:DBCA图形建库 16

1.3.2 方法2:手工建库 18

1.3.3 方法3:DBCA静默建库 22

1.3.4 方法4:OMF建库 22

1.3.5 诊断案例:create database语句在10g、11g中的不同 23

1.3.6 创建数据库后的补充工作 26

1.3.7 删除数据库的步骤 29

1.4 关于SYSDBA、SYSOPER、DBA的区别和联系 29

第2章 常用工具和问题分析

2.1 SQL*Plus使用及常见问题 34

2.1.1 SQL*Plus使用细则 34

2.1.2 SQL*Plus无法启动的常见原因 41

特殊问题:乱码导致的SQL*Plus无法启动的问题 43

特殊问题:使用strace诊断奇怪的SQL*Plus登录问题 44

2.2 解析exp/imp及常见问题 47

2.2.1 exp/imp使用场景及示例 47

2.2.2 exp/imp使用常见问题 50

诊断案例:生产系统exp无法使用的紧急诊断和修复 55

诊断案例:外部表的导入导出问题 57

诊断案例:IMP-00013 问题及解决方法 58

诊断案例:使用strace分析exp中buffer设置的奇怪问题 60

经验分享:你可能不了解的dump文件 63

2.3 解析Datapump及常见问题 66

2.3.1 Datapump使用场景及示例 66

2.3.3 只言片语分析Datapump的工作原理 68

诊断案例:impdp异常中断导致的问题 70

诊断案例:使用impdp选项不当导致的数据丢失 73

第3章 服务连接配置

3.1 监听配置与客户端配置简介 76

3.2 网络服务配置 78

3.2.1 网络配置细则与实践 78

诊断案例:Session跟踪失效的问题和原因 82

3.2.2 监听配置文件格式探究——一个空格的威力 84

3.2.3 RAC中的TAF的配置 88

3.2.4 RAC中的SCAN的配置 90

3.2.5 通过单例模式模拟RAC连接 93

3.3 监听器无法启动的几个原因 94

诊断案例:使用strace分析TNS-12543的案例 96

第4章 数据库启/停和宕机问题

4.1 数据库启停的问题分析 99

4.2 数据库无法启动案例 100

诊断案例:数据库参数设置不当导致无法启动的问题 100

诊断案例:服务器增加内存后无法重启数据库的问题及解决方案 102

诊断案例:数据库shutdown之后无法启动的问题 103

诊断案例:RAC节点无法启动的ORA-29702问题及分析 105

诊断案例:连续出现的RAC节点问题 108

4.3 数据库无法登录问题分析 110

4.4 数据库无法登录案例 111

诊断案例:归档空间不足导致的数据库无法登录问题 111

诊断案例:Session Leak导致的数据库无法登录问题 115

诊断案例:undo缺失导致的数据库无法登录问题 118

4.5 数据库宕机问题和原因分析 119

4.6 数据库宕机问题案例 119

诊断案例:一条SQL语句导致的数据库宕机问题及分析 119

诊断案例:存储导致的数据库宕机问题及分析 121

诊断案例:I/O问题导致的数据库突然宕机的问题及分析 124

诊断案例:数据库导致突然宕机的问题及解决 126

第5章 容灾与备份恢复

5.1 备份恢复应用及实践 132

5.1.1 归档模式下的四种完全恢复场景 132

5.1.2 RMAN中三个不完全恢复场景 137

实验1:使用句柄实现特定场景的无备份恢复 141

实验2:关于DUAL表的破坏性测试 145

5.2 闪回应用及实践 149

5.2.1 关于delete、drop、truncate异同和无备份恢复场景 149

5.2.2 使用闪回查询备份数据 152

5.2.3 使用Flashback Query巧妙抽取指定数据 154

实战案例:巧用Flashback Database实现灵活的数据回滚 155

实战案例:巧用Flashback Database实现灵活的数据切换 156

5.3 Data Guard搭建与应用 160

5.3.1 常见的Data Guard隐患 161

5.3.2 11g Data Guard搭建实践 163

5.3.3 论Oracle备库的设计方案 169

5.3.4 实用至上的 Snapshot Standby特性 171

实践案例:Data Guard备库中的几个数据文件问题 175

实践案例:Data Guard备库的数据文件的迁移实战 179

诊断案例:由Drop Datafile导致的Oracle Bug 182

诊断案例:一个Oracle bug的手工修复 185

诊断案例:11g备库无法开启ADG的原因分析 188

第6章 监控管理和故障处理

6.1 Zabbix、Orabbix简介 191

6.2 Zabbix Agent部署 191

6.3 Orabbix的部署 194

6.4 浅谈Zabbix和Grid Control的优劣 197

6.5 Orabbix定制监控Oracle的简单配置 198

实践案例:Orabbix结合Python发送图形报表 200

实践案例:Zabbix中配置Data Guard的监控 205

6.6 两条腿走路更稳当——硬件监控很有必要 207

6.7 运维平台的建设思考——元数据管理 209

6.8 监控盲点与诊断案例 210

监控盲点:由DUAL导致的一个潜在的监控问题 210

诊断案例:备库CPU使用异常优化 213

诊断案例:两条报警信息结合分析DG问题 216

诊断案例:监控反被监控误——一则Orabbix报警的分析 222

诊断案例:自定义监控项快速定位问题 224

诊断案例:CPU报警信息的分析 226

第2篇 数据迁移篇

第7章 数据库升级

7.1 数据库升级常用方法与准备工作 230

7.2 Oracle10g升级至11g完整呈现 231

7.2.1 准备流程图 231

7.2.2 10g升级至11g需要考虑的参数优化 232

7.2.3 Oracle10g升级至11g准备工作详细步骤 233

7.2.4 升级流程示意图 236

7.2.5 升级后需要考虑的补充工作 237

7.2.6 实战汇总:Oracle 10g 升级 11g过程中常见问题及解决方案 238

7.3 升级后常见问题与解决方案 243

7.3.1 问题分析:关于Oracle Invalid Components问题的解决 243

7.3.2 问题分析:10g升级至11g后数据库无法启动的问题 246

7.3.3 问题分析:10g升级至11g后exp启用consistent=y的问题 248

7.3.4 问题分析:查询user_synonyms超时的问题 254

7.3.5 问题分析:impdp 10g/11g问题解决 255

7.3.6 问题分析:升级后数据库日志里的外部表错误 257

第8章 数据迁移及问题处理

8.1 数据迁移工具和使用场景分析 261

8.2 利用SQL*Loader进行数据迁移 263

8.2.1 关于SQL*Loader-805问题的解决 263

8.2.2 SQL*Loader加载性能问题的排查 265

8.2.3 Excel文件内容导入数据库的问题及解决 267

诊断案例:生产环境SQL*Loader加载性能问题及分析 269

8.3 传输表空间 275

8.4 分区表迁移相关 277

8.4.1 分区表的水平、垂直切分 278

8.4.2 关于分区表的move操作 279

8.4.3 批量转换分区表为普通表 281

8.5 外部表 282

8.5.1 外部表简单总结 282

诊断案例:巧用外部表避免大量的insert 284

诊断案例:巧用外部表备份历史数据 286

诊断案例:通过外部表改进一个烦琐的大查询 289

8.6 其他迁移方式 292

8.6.1 数据库文件的迁移 292

8.6.2 Data Guard环境中的数据文件迁移方式对比 295

8.6.3 关于move tablespace的问题总结 298

第9章 数据迁移之外部表实战

9.1 失败的经验总结:数据迁移问题汇总 300

9.1.1 非空约束导致的数据加载失败 301

9.1.2 外键数据差异导致的约束无法启用 301

9.1.3 网络问题导致数据加载中断 301

9.1.4 约束问题导致Datapump加载回滚 302

9.1.5 undo不足的困扰 302

9.1.6 冲突数据不易展现 302

9.1.7 sequence冲突检查 303

9.1.8 加载LOB数据的假并行 303

9.1.9 数据乱码的影响 303

9.1.10 数据转储文件不可读/不易读 303

9.1.11 大分区表的加载性能问题 304

9.2 外部表方案的产生 304

9.2.1 SQL*Loader和ORACLE_DATAPUMP性能大比拼 304

9.2.2 海量数据迁移之通过shell脚本估算数据量 305

9.2.3 数据迁移前的数据库检查和建议 308

9.2.4 数据迁移前的系统检查 313

小技巧:怎样突破表名30个字符的限制 315

小技巧:使用shell生成状态报表 317

9.3 数据抽取 318

9.3.1 外部表切分原理 319

9.3.2 抽取方式1:使用utl_file做选择性数据导出 321

9.3.3 抽取方式2:海量数据迁移之外部表并行抽取 324

9.3.4 抽取方式3:海量数据迁移之分区并行抽取 327

9.3.5 抽取方式4:海量数据迁移之分区并行切分 331

9.3.6 抽取方式5:海量数据迁移之通过rowid切分大表 332

小技巧:海量数据迁移之使用shell启用多个动态并行 336

9.4 数据预检查 338

9.4.1 海量数据迁移之冲突数据筛查 339

9.4.2 数据迁移判断非空约束 340

小技巧:使用shell进行日志分析 342

小技巧:使用shell脚本巧妙统计文件 344

9.5 数据加载 345

9.5.1 海量数据迁移之外部表加载 345

9.5.2 巧用Parallel极速提升数据加载速度 348

9.5.3 海量数据迁移之使用分区并行切分导入 350

9.5.4 海量数据迁移之分区表批量insert性能改进 352

9.6 可能碰到的数据修复问题 352

9.6.1 使用错误日志修复数据的利弊 353

诊断案例:数据紧急修复之启用错误日志 355

9.6.2 人为操作失误的分析和应对 356

9.7 数据迁移经验总结 358

9.7.1 海量数据迁移之误操作和防范建议 358

9.7.2 数据迁移需要考虑的问题 360

第3篇 数据库优化篇

第10章 优化工具简介和定制

10.1 AWR简介 362

10.1.1 AWR的常用功能 363

10.1.2 解析AWR中的CPU信息 367

10.1.3 使用shell定制AWR脚本 370

10.1.4 强大的AWR Format 373

小技巧:使用AWR来分析Session Leak问题 375

实例分析:一份AWR报告分析的思路 376

10.2 ASH 380

10.2.1 ASH中的数据字典基表 380

10.2.2 通过shell定制ASH脚本 383

10.3 ADDM 385

10.3.1 使用shell定制ADDM脚本 385

诊断案例 通过ADDM明确I/O问题 387

10.4 SQL Profile简介 389

10.4.1 SQL Profile的使用功能 389

10.4.2 使用SQLT手工创建SQL Profile 393

10.4.4 性能下降的不定时炸弹——过旧的SQL Profile 400

10.5 SQL Monitor的功劳 401

10.5.1 SQL Monitor的使用功能 401

10.5.2 OSM的改进点和简单定制 403

10.6 数据字典 405

10.6.1 数据字典管理 405

实例诊断:数据字典中的细节问题 406

诊断案例:关于dba_data_files无法访问一个小问题 409

10.7 自定义脚本 410

10.7.1 关于Session Leak的问题分析 410

诊断案例:关于ORA-00020问题的反思 413

10.7.2 高级开发语言定制,量力而行 414

第11章 数据库实例调优

11.1 调整数据库参数 417

诊断案例:关于修改数据库参数的测试 417

11.2 内存组件调整 421

诊断案例:关于纠结的RECYCLE Pool的设置 426

诊断案例:分区表放入KEEP Pool、RECYCLE Pool的问题及解析 427

11.3 等待事件分析 430

诊断案例:关于等待事件“read by other session” 431

诊断案例:关于enq:TX - allocate ITL entry的问题分析 434

11.4 日志分析调优 437

诊断案例:由一条日志警告所做的调优分析 437

诊断案例:ORA-17500 ODM err的问题排查 440

诊断案例:alert日志中一条ORA警告信息的分析 441

11.5 分区表优化 443

诊断案例:通过分区键值发现性能问题 443

经验分享:修改分区表的问题总结 445

11.6 需要重视的并发 447

第12章 系统调优

12.1 I/O问题诊断 451

12.1.1 Orion的简单部署和测试 452

诊断案例:启用ODM极速调优I/O 455

诊断案例:一次数据库响应缓慢的问题排查 459

12.2 通过Linux命令诊断性能问题 460

12.2.1 那些极度危险的Linux命令 461

12.2.2 一些“简单”的Linux命令 464

诊断案例:Crontab导致CPU异常的问题分析及处理 471

诊断案例:服务器进程异常的原因分析 474

12.3 内核参数优化诊断 477

诊断案例:Linux Kernel引发的数据库连接问题 478

诊断案例:Linux Kernel引发的Data Guard问题 481

第13章 SQL优化前奏和SQL审核

13.1 SQL优化前奏 487

13.1.1 SQL的查询转换 487

13.1.2 通过错误的SQL来测试推理SQL的解析过程 494

诊断


【前言】

DBA前途光明且任重道远

Oracle作为全球的软件企业之一,它的发展历程也见证了IT行业的兴衰与成长。

从关系型数据库、分布式系统、服务器、互联网计算到云计算,Oracle的目标是让客户和合作伙伴更快地适应并采纳这些新技术,将风险和成本降至。尽管这些年去IOE的风潮依旧,但是毫无疑问Oracle依然是RDBMS的王者,而且在技术和战略上,Oracle仍然在一路高歌猛进,并且全面引领行业迈入了云时代。

据Gartner的权威报告分析,全球公有云服务市场规模2016年有望达到2 040亿美元;较2015年的1 750亿美元增长16.5%,而且云服务呈现出的这种强劲发展势头有望在未来的5~7年内仍然保持下去。在国内,2015年中国云计算产业规模约为1500亿元,年增长率超过30%,产业结构不断优化,是全球增速快的市场之一。

Oracle在云上的研发和产品创新投资极高,据早期的官方数据显示,12c历经5年多的开发,包含500多种新特性,投入了2 500多人/年的开发,每天100多万次特性测试,120多万小时的压力测试,而且12cR2也即将在2016年正式发布。

数据库技术就是在这样的大环境下不断地创新、改进和发展,在海量数据的高性能和分布式扩展,一体化软件与硬件集成,应用开发简化,IT架构的统一融合,业务响应的快速提升和IT成本的控制,这些大部分企业亟待解决的需求也会得到持续稳定的落地实现。

而作为一个Oracle DBA,依旧任重道远,因为行业里面水涨船高,我们可能会面对来自行业和工作的压力,需要始终保持学习的动力,这样才足以应对更多更复杂的问题挑战。在工作中碰到了一些问题,有些可以根据经验马上得以解决,有些需要借助专业网站(比如MetaLink)、社区、论坛或者博客来得到一些相关指点,有些问题暂时没有解决,可能就会搁置下来,这也许就是我们工作的基本态度。如果你只是抱着把工作完成即可的态度,一定要静下心来想想了。

写书的缘起

我是一个坚持写技术博客的人,开始的博客是零零散散地记录日常工作,记录问题和解决方法,勤则几天更新一次,慢则几周更新一次。

我也知道任何事都贵在坚持,道理我也懂,但是有时候感觉还是缺乏执行力,听说一个行为坚持多少天就会成为习惯,于是在2014年2月的一天,我下定决心挑战一下自己,我想看看我到底能够坚持多久,能不能成为一个习惯,当时暗下决心坚持每天写一篇博客,这一路竟然坚持了下来,截止到2016年4月,我已经坚持了近800天,当然我还会继续坚持下去,就如同我开始给自己的目标一样。

开始是满腔热情,但是到后来,发现还是遇到了一些瓶颈。我每天都有要放弃的念头,但是都是一边说服自己,一边继续在晚上睡觉之前逼着自己完成博客。

随着博客的内容量越来越多,有些网友在博客和我的互动也越来越多,突然我发现原本是利己的事情慢慢变得利人了。我也感受到了坚持的价值所在,但是我慢慢地发现同样一个问题总是会有各种不同的可能性,当被一个看似很简单的问题折腾得精疲力尽的时候,后发现可能解决问题的方式很简单,甚至很让人唏嘘无奈。问题经常会重复出现,但是不是简单的重复,因为很多问题都是在特定的场景中发生的,原因也是五花八门,很多看似诡异的问题其实明白了其中的原委就会感觉很简单,因为它本身并不神秘。

而另外一方面,尽管对很多问题都写了博客总结,但是有些问题当时没有保留更多的日志和处理过程记录,在碰到问题分析时就会有一些弯路甚至错误,所以这件原本利己利人的事情也让我会有一些压力。博客写的内容多了,技术扩展得少;技术问题解决得多了,技术思想总结得却少,这些都是我需要改变提升的地方。如果能把自己的工作经验形成一套相对完整的知识体系,并加入个人的独门见解干货,很多问题的处理就会得心应手。

就这样在我继续坚持写博客的某一天,一个偶然的机会,接到了中国铁道出版社荆波编辑的邀请,我决定把自己的工作内容以书的形式整理出来,系统性地呈现给大家,而书中也需要保留工作实战的味道。

古人云:“若起不得法,则杂乱浮泛”。虽然写书的想法是好的,但是对自己思绪的整理和对众多材料的截取,如果把所有知识点都一股脑儿罗列出来,这样的话,弊大于利,读者在阅读的过程也会容易抓不住重点,无章法可循。

因为Oracle相关的技术图书已然非常丰富,所以我选择了数据库运维、数据迁移、性能优化这三个方面。一方面能够突出工作笔记的特色,另一方面也避免写出过多重复经验的内容,而且个人认为这三个方面也是DBA的一个进阶层次,因为我在这些方面投入了大量的时间和精力,也是这么一路走过来的。

本书适合的读者对象

? Oracle DBA或者开发人员。

? 有一定的Oracle基础,并且期望能够提升自我的读者。

给读者的一些建议

(1)时代在变,一专多能;现在的技术发展更新很快,学习不要拘泥于某一项具体的技术,要不断扩展学习,对比学习,一专多能有两个层面,一个是横向扩展,比如在数据库方面有一定的经验和建树,可以同时根据工作需要扩展、开发、中间件、系统层面等。另一个就是纵向扩展,即目前是以Oracle为主要工作内容和方向,那么也可以扩展学习其他关系型数据库,NoSQL数据库或者NewSQL数据库,总之要拥抱变化。

(2)很多问题不是问出来的,而是实践出来的;我收到了很多网友的提问,绝大多数情况下我都会做回复,在这个过程中其实自己也学习了不少知识,当然也有很多的感悟和见解,我始终认为问题不是问出来的,而是实践出来的,就如同本书的内容一样,如果你抱着看完本书就能够掌握所有的技巧和技能,可能要让你失望了,学习有法,而无定法,贵在得法,书中我想要表达的也是这个意思。

(3)多参加社区、社群的活动和技术交流问答;对于参加社区、社群活动,自己也是深有感触,可能技术圈子的人性格相对比较内敛,在技术上态度还是开放的。多参加一些社区、社群的交流,可以让自己从不同的视野来看待同一件事物,对于日常技术交流可能自己一个耐心地解答就会帮助到网络里无助的新手,可能自己不能解决的技术难题,在社群交流中就会发现别人已经有了实践。学习是相互的,帮助也是相互的,而不是靠几个人就能够完成这些,都需要一点一滴地投入和积累,此外还有一个优点就是能够认识很多朋友。

(4)勤于总结;在这方面自己也是深有感触,学习的过程是一个不断积累的过程,戒骄戒躁,不要猴子掰包谷式的学习,就如同我们刚入行就希望公司给我们核心系统的权限,这个可能性不大,我们需要不断地努力来赢得同事和领导的信任,而通过这些努力的过程也积累了经验,这些经验如果不加以系统的整理和归纳,要么被遗忘,要么成偏门秘籍,Oracle数据库发展至今已经30多个年头,可能很多旧版本中的功能特性就是工作中的痛点,在新版本中很可能就会改进,而一味墨守成规,不总结积累,你的知识库就得不到更新,还在使用过时的方法处理新的问题。

本书内容预览

本书会以工作笔记的形式循序渐进地讲解DBA工作中的一些常见问题和处理方法。

全书共分为三篇,共14章,全面介绍数据库运维、数据迁移、数据库优化的工作内容,在这些知识点中也穿插了大量实例。篇(第1~6章)详细介绍了数据库安装配置、常用工具和服务连接配置,对数据库启停和宕机问题也着重进行了解读, 此外还包括容灾与备份恢复, 监控管理和故障处理的内容;第二篇(第7~9章)介绍了数据库升级,对数据迁移的常用方式和问题进行了详细说明,因为自己对数据迁移使用外部表深有感触,所以也自成一章娓娓道来其中的苦与痛;第三篇(第10~14章)介绍了优化工具简介和定制,调优内容涵盖实例调优、系统调优、SQL优化的前奏和SQL需求审核,后介绍SQL优化的技巧,深入浅出地对一些优化问题进行了总结。

感谢

写书的过程还是很痛苦的,因为里面的各种细节都需要考虑,出版方面自己也是门外汉,在这个过程中难免犯了很多低级错误和失误。书中的技术术语是否得当、举例和比喻是否恰当等,在书的结构和内容的考量上,我和本书策划编辑荆波老师也反复进行了讨论和校正。在工作忙碌之余,坚持写技术博客,同时又花费不少时间来编排图书内容,着实是一件很辛苦的事情,但还是坚持了下来,想到读者能够在我的一些案例中得到一些启示和帮助,其实是一件很让人欣喜的事情。

当然图书的内容质量也离不开朋友们的支持,感谢盖国强,杨志洪为本书作序,同时感谢黄远邦,熊军,怀晓明,丁俊,马红,洪烨,卢飞,蔡皓对于书稿的审阅,他们都是奋斗在一线的DBA,很多都是行业先锋,高手,在工作中积累了大量的实践经验,感谢他们对本书给出了很多宝贵的建议。

完成本书也离不开家庭的大力支持,感谢妻子雪丽在我写书没有思路以及动力的时候给予我支持和鼓励,而且还参与了全稿的内容审核,感谢父母默默地支持我的想法,虽然他们看不懂我写的内容,但是总是会问问写书的进度和想法。还有我可爱的女儿珊珊,是我生活中的精神依靠,看着她活泼可爱的模样,我会更有动力来努力工作。

感谢荆波老师对于本书的大力支持,在所有的环节都严格把关,一丝不苟,能够写成本书,与他的帮助是分不开的。

由于本人知识水平有限,书中难免存在着一些错误和不妥之处,敬请批评指正,如果您有更多的宝贵意见,也欢迎在我的微信公众号(jianrong-notes)讨论交流,大家一起学习交流,共同进步。


【书摘与插画】

返回顶部