欢迎光临
我们一直在努力

DBA的能力——不是会写SQL是数据库挂了你敢上去救

DBA的能力——不是会写SQL,是数据库挂了你敢上去救

会写SQL的叫开发,会配参数的是初级运维,会恢复无备份数据库的才是DBA。这篇从生产排障、性能诊断、备份恢复、监控预防四个层面,讲清楚DBA的真正能力边界。不是"这个命令怎么用"的教程,是一个开发转DBA的人踩了无数坑之后对DBA这个角色的理解。

文章目录

  • DBA的能力——不是会写SQL,是数据库挂了你敢上去救
    • 一、DBA不是高级SQL开发
    • 二、DBA的四个能力维度
      • 1. 生产排障——数据库挂了你敢不敢上去救
      • 2. 性能诊断——不是加索引,是找到根本原因
      • 3. 备份恢复——不是有备份就够了,是知道能恢复到哪一秒
      • 4. 监控预防——不是等出事再救,是提前知道会出事
    • 三、开发转DBA的踩坑之路
    • 四、DBA和开发的本质区别
    • 五、结语

一、DBA不是高级SQL开发

很多开发觉得自己SQL写得不错、索引会加、执行计划会看,就离DBA不远了。差远了。

开发的视角是"一条SQL怎么跑最快"。DBA的视角是:

  • 这条SQL在执行的时候,会不会把整个缓冲池冲掉,导致其他所有查询全部变慢
  • 这个索引建了之后,写入操作的代价是多少,是不是一张频繁插入的表上不该加索引
  • 这条SQL的执行计划稳定吗,会不会因为数据量变化突然从Nested Loop变成Hash Join
  • 凌晨三点数据库起不来了,备份是昨天的,今天的业务数据还能不能救回来

开发和DBA的视角差异,本质上是单点优化 vs 全局稳定。一个让一条SQL快10倍的人,不一定是好DBA。但一个让整个数据库凌晨两点不出事的人,一定是。


二、DBA的四个能力维度

1. 生产排障——数据库挂了你敢不敢上去救

开发看到数据库报错,通常的反应是:“DBA帮看一下这个SQL为什么不走索引”。DBA看到报错的第一反应不是查SQL,是查数据库是否还活着。

— 有没有被锁住的会话
select * from v$lock where block = 1;

— 有没有长时间未提交的事务
select * from v$transaction t, v$session s
where t.addr = s.taddr and s.status = 'ACTIVE';

— 归档日志空间是否正常
select * from v$flash_recovery_area_usage;

开发关心"我的SQL怎么优化",DBA关心"数据库有没有潜在风险会在某个时刻爆炸"。

真正的DBA能力是当数据库真的挂掉的时候,你敢不敢上去救。

我曾经在一个深夜遇到Oracle数据库完全崩溃——Redo日志和Undo回滚段全部损坏,系统能mount但打不开。开发团队已经在考虑重建数据库从头导入数据——这意味着当天的业务数据全部丢失。

DBA做的事情不是重建,是在损坏的数据文件上让数据库强行启动:

— 第一步:用隐藏参数允许在有损坏的情况下打开数据库
alter system set "_allow_resetlogs_corruption" = true scope = spfile;
alter system set "_allow_terminal_recovery_corruption" = true scope = spfile;

— 第二步:shutdown → startup mount → 用备份控制文件恢复
recover database using backup controlfile until cancel;
— (输入cancel跳过无法恢复的部分)

— 第三步:清除损坏的日志组
alter database clear logfile group 1;
— 如果有必要,open resetlogs强制打开
alter database open resetlogs;

— 第四步:切换日志,重启,关闭隐藏参数
alter system switch logfile;
shutdown immediate;
startup;
alter system set "_allow_resetlogs_corruption" = false scope = spfile;

这些命令不是从任何一本书上学的——每个参数都对应着一次真实的故障。做过一次无备份恢复,就知道为什么生产库的redo日志至少要保留三天的,就知道为什么说"备份+归档日志缺一不可"。

排障能力是DBA和开发最大的分水岭。 开发排的是"这条SQL慢了半秒为什么",DBA排的是"数据库挂了所有人都在等你什么时候能弄好"。

2. 性能诊断——不是加索引,是找到根本原因

开发的性能优化思路是"慢了就加索引"。DBA的优化思路是"先搞清楚为什么慢"。

一个真实的案例:医生工作站打开一个病人列表页要20秒。开发的诊断结果是"没有索引",加了一堆索引后还是20秒。DBA上去查:

— 第一步:查等待事件,发现大量"buffer busy waits"
select event, count(*) from v$session_wait
where state = 'WAITING'
group by event order by 2 desc;

— 第二步:查哪个对象在争用
select * from v$session_wait where event = 'buffer busy waits';

— 第三步:定位到具体的数据块
select p1 "file#", p2 "block#", p3 "class#"
from v$session_wait where event = 'buffer busy waits';

— 第四步:查这个块上是什么对象
select owner, segment_name, segment_type
from dba_extents
where file_id = &file# and &block# between block_id and block_id + blocks – 1;

根因找到了——不是索引问题,是热块争用。这张表的并发插入被集中在同一个数据块上,每个插入操作都要等前一个提交后才能获得块锁。20秒里18秒在排队等锁。

解决方案不是加索引——是把表改成hash分区表,让并发插入分散到不同的物理块上。改了之后从20秒变成秒开。

性能诊断的核心不是"会不会看执行计划",是从等待事件反推根因——先看数据库在等什么,再顺着等待链往上游追,一直到找到触发等待的业务操作。

3. 备份恢复——不是有备份就够了,是知道能恢复到哪一秒

开发的认知是"有备份就安全了"。DBA的认知是"备份只是最后一道防线,什么样的故障用什么样的恢复策略"。

场景1:误删了一张表的数据

— 查出删除操作的具体时间——精确到秒
select * from v$logmnr_contents where seg_name = 'AC01'
and operation = 'DELETE';

— 执行不完全恢复,恢复到删除操作之前的那一秒
recover database until time '2024-01-15 14:32:15';
alter database open resetlogs;

只要归档日志在,可以精确恢复到一个特定的SCN或时间点。丢了整个下午的业务数据?不存在的。恢复到删除前的那一秒,再重新录入这一个小时的数据就行。

场景2:归档日志的存储空间满了,数据库挂了

— 检查归档日志占用空间
select * from v$recovery_area_usage;

— 清理已备份过的归档日志(前提是已经用RMAN备份过)
rman target /
delete archivelog all backed up 1 times to device type disk;

— 如果连RMAN都没配——手动删除3天前的归档日志

归档日志存储空间满,数据库会直接停止服务——比"空间满了不报错"的表空间陷阱更严重。DBA的知识藏在那些看似不起眼的操作里——知道文件的保留周期,知道备份策略的门道,知道不是磁盘够大就高枕无忧。

场景3:没有备份,数据库完全崩溃

这不是教程里的场景——是真实发生的生产事故。没有RMAN备份、没有expdp导出、只有一套已经起不来的数据文件和几份不完整的归档日志。这种场景下没有标准操作手册,DBA的每一个操作都是在理解Oracle内部机制的基础上做尝试。

恢复是DBA的最后一道防线。一个DBA的价值不在于平时巡检了多少日志,在于危急关头——当所有"正常恢复"的路径都走不通时,有没有人在场。

4. 监控预防——不是等出事再救,是提前知道会出事

最高级别的DBA,不是救火的英雄,是不让火烧起来的人。

监控项阈值为什么
表空间使用率 85% 自动扩展失效时不至于立即爆
归档日志空间 60% 留出日志突增的缓冲时间
等待事件异常 enq: TX buffer busy waits
慢查询 超过100ms 记录到tuning事件表,定期分析趋势
会话数 超过正常值的120% 可能是连接泄露,或者有人在压测

"预防"不是在数据库上装一个监控工具配几个报警阈值就完了——是你知道哪些指标会在一周后有风险。防的是这种事:一个表在三个月内的写入量是100万/天,按这个速度增长一个月,表空间会到什么状态,早一个礼拜扩容就平淡无事,晚一晚上就是生产事故。


三、开发转DBA的踩坑之路

我是在一次医保结算系统"热块争用"引发的生产事故后被迫学的DBA。从一个"只会写SQL"的开发,到能独立处理生产故障,中间经历了五个阶段:

阶段能力标志事件
只会写SQL select/insert/update/delete 写了几年CRUD
开始看执行计划 知道索引、Full Scan、Cost 第一次遇到慢查询,DBA帮你加了索引
开始管备份 RMAN、expdp/impdp 数据库好像不是永远不坏的
能独立排故障 v

s

e

s

s

i

o

n

v

session、v

sessionvlock、AWR报告

系统异常卡顿,没人帮你自己扛
能设计容灾恢复 RAC、DataGuard、flashback 知道数据库不能只有一份

大部分开发只能停在第一个阶段——不是他们学不会,是没有被动接触到排障的机会。你不是"主动学DBA"的——是数据库挂了没人帮,只能自己上。从被迫自救到形成方法论,这是很多开发转DBA的必经之路,区别在于有的人经历了然后去学了,有的人经历了然后选择下次继续找人帮忙。


四、DBA和开发的本质区别

开发DBA
优化目标 让一条SQL更快 让整个数据库更稳定
关注指标 响应时间 等待事件、IOPS、命中率
排障思维 从代码往底层追 从等待事件往上追
备份意识 代码有Git就行 数据没备份就是事故
职业底线 不写bug 不丢数据
最惶恐的时刻 加班改bug 数据库起不来

开发可以不关心数据库的运行状态,只要SQL返回结果就行。DBA不可以——他必须知道每一秒数据库在干什么、谁在用、用了多少资源、有没有潜在风险。


五、结语

DBA不是"会写SQL"的升级版。是数据库挂了所有人看着你,你敢上去救的那个角色。每个DBA都是从开发转型过来的,但转型的关键不是学会了多少命令——是第一次独立处理生产故障的时候没退缩。

从那以后,你看数据库的视角就永远变了——不再是"SQL怎么优化",是"这个操作会不会引发等待事件、这个索引加了对写入有多大影响、这个表三个月后会不会撑爆表空间"。

这些本事不是从书上学来的,是从每一个深夜里的生产故障排措中硬生生磨出来的。你写的DBA系列文章,不是在讲数据库教程——是你在复盘那些随时可能再出现的生产隐患。

赞(0)
未经允许不得转载:171主机测评 » DBA的能力——不是会写SQL是数据库挂了你敢上去救
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址