引言
数据库跑在 Linux 上,DBA 不懂 Linux 等于瞎子摸象。
性能问题定位、故障排查、日常运维——每一步都离不开 Linux 基础功。本文整理 DBA 必须掌握的 Linux 操作技能,不会这些,别说自己是 DBA。
一、性能监控命令
1. CPU 分析:top / htop
# top 实时查看进程资源占用top -c -d 2# 关注指标:# %Cpu(s): us(用户态) sy(内核态) wa(IO等待) id(空闲)# wa > 20% → 磁盘IO瓶颈# us + sy > 80% → CPU瓶颈# htop:更友好的交互式监控htop -d 20 # 2秒刷新# F6排序 F5树形显示 F9杀进程
2. 内存分析:free / vmstat
# 内存概览free -h# total used free shared buff/cache available# Mem: 62G 45G 1.2G 256M 16G 15G# Swap: 8G 2.1G 5.9G# 关键判断:看 available 而非 free# Swap 使用 > 0 不一定有问题,但持续增长要警惕# vmstat 综合监控(每2秒一次,共10次)vmstat 2 10# procs memory swap io system cpu# r b swpd free si so bi bo in cs us sy wa# 3 1 2048 1200 0 0 150 80 3500 6000 25 10 15## r(运行队列) > CPU核数 → CPU不够用# b(阻塞进程) > 0 → 有进程在等IO# si/so > 0 → 正在使用Swap,内存不足
3. 磁盘 I/O:iostat / iotop
# iostat 查看磁盘IO统计iostat -xdm 2 5# Device rrqm/s wrqm/s r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await svctm %util# sda 0.0 5.2 150 200 2.3 5.1 42.5 3.2 9.1 2.8 98.2# 关键指标:# %util > 80% → 磁盘接近饱和# await > 10ms → IO响应慢# avgqu-sz > 4 → 队列积压严重# iotop 找出IO最高的进程iotop -oP # 只显示有IO的进程
4. 综合监控:sar
# sar 是性能数据的瑞士军刀# CPU 历史数据sar -u 2 10# 内存使用历史sar -r 2 10# 磁盘IO历史sar -d 2 10# 网络流量sar -n DEV 2 10# 查看昨天的历史数据sar -u -f /var/log/sa/sa18 # 查看18号数据
二、进程与文件诊断
5. lsof:谁在用这个文件
# 查看数据库进程打开的文件lsof -p $(pgrep -f ora_pmon)# 查看谁在用某个端口lsof -i :1521lsof -i :3306lsof -i :5432# 查看某个文件被哪个进程占用lsof /u01/app/oracle/oradata/orcl/system01.dbf# 查找已删除但未释放空间的文件lsof | grep deleted | sort -k7 -rn | head# 数据库日志被 rm 但进程还持有句柄 → 空间不释放
6. strace:跟踪系统调用
# 跟踪数据库进程的系统调用strace -p <pid> -e trace=read,write,open -T# 常用场景:# - 数据库进程卡住,看它在等什么# - IO慢,看是在读哪个文件# - 启动失败,看哪一步出错# 统计系统调用耗时strace -c -p <pid> -e trace=all# 看哪类系统调用占时间最长
7. tcpdump:网络抓包
# 抓取数据库端口的网络包tcpdump -i eth0 port 1521 -w /tmp/oracle_traffic.pcaptcpdump -i eth0 port 3306 -w /tmp/mysql_traffic.pcap# 实时查看连接情况tcpdump -i eth0 port 3306 -nn -q# 常用场景:# - 排查连接超时问题# - 确认客户端是否发送了请求# - 网络丢包/重传分析
三、内存与 Swap 排查
# 查看进程内存详情cat /proc/<pid>/status | grep -i vm# VmRSS: 实际使用的物理内存# VmSwap: 被换出到Swap的内存# 找出使用Swap最多的进程for pid in $(ls /proc | grep -E '^[0-9]+$'); do swap=$(grep VmSwap /proc/$pid/status 2>/dev/null | awk '{print $2}')if [ "${swap:-0}" -gt 0 ]; then name=$(cat /proc/$pid/cmdline 2>/dev/null | tr '\0'' ')echo"$swap KB - $pid - $name"fidone | sort -rn | head -10# 数据库进程使用 Swap → 性能严重下降# 解决方案:# 1. 调整 vm.swappiness = 1(几乎不用Swap)# 2. 增加物理内存# 3. 减少 SGA/buffer_pool 配置
四、Cron 与 Systemd 管理
定时任务管理
# 查看当前用户的 croncrontab -l# 编辑定时任务crontab -e# 数据库DBA常用cron示例# 每天凌晨2点全量备份0 2 * * * /home/oracle/scripts/rman_full_backup.sh >> /var/log/backup.log 2>&1# 每小时归档备份0 * * * * /home/oracle/scripts/rman_arch_backup.sh >> /var/log/arch_backup.log 2>&1# 每天早8点发送巡检报告0 8 * * * /home/dba/scripts/daily_check.sh | mail -s "DB Daily Report" dba@company.com# cron 排错:查看执行日志grep CRON /var/log/syslog # Debian/Ubuntugrep CRON /var/log/cron # RHEL/CentOS
Systemd 服务管理
# 数据库服务管理systemctl status oracle-database.servicesystemctl start mysqldsystemctl restart postgresql-15# 设置开机自启systemctl enable oracle-database.service# 查看服务启动失败原因systemctl status mysqld -ljournalctl -u mysqld --since "10 minutes ago"# 自定义数据库服务文件示例# /etc/systemd/system/oracle.service# [Unit]# Description=Oracle Database# After=network.target# [Service]# Type=forking# User=oracle# ExecStart=/home/oracle/scripts/start_db.sh# ExecStop=/home/oracle/scripts/stop_db.sh# [Install]# WantedBy=multi-user.target
五、日志分析:journalctl
# 查看系统启动以来的日志journalctl -b# 按时间范围查看journalctl --since "2026-05-19 00:00" --until "2026-05-19 08:00"# 按服务过滤journalctl -u mysqld --no-pager | tail -50# 查看内核消息(OOM Killer、磁盘错误)journalctl -k | grep -i "oom\|error\|fail"# DBA 必关注的系统日志:# - OOM Killer 杀掉数据库进程# - 磁盘IO错误# - 网卡故障# - 时钟同步异常
六、文件系统管理
LVM 操作
# 查看 LV/VG/PV 信息pvs; vgs; lvs# 在线扩展逻辑卷(数据库表空间不够时常用)lvextend -L +50G /dev/vg_data/lv_oradata# XFS 在线扩展xfs_growfs /u01/oradata# EXT4 在线扩展resize2fs /dev/vg_data/lv_oradata
XFS 文件系统维护
# 查看 XFS 信息xfs_info /u01# XFS 碎片检查xfs_db -r -c frag /dev/sdb1# XFS 文件系统修复(需卸载)xfs_repair /dev/sdb1# 关键配置:Oracle 推荐 XFS 挂载参数# /dev/sdb1 /u01 xfs noatime,nodiratime,nobarrier,inode64 0 0
七、网络诊断速查
# 查看数据库端口监听状态ss -tlnp | grep -E '1521|3306|5432'# 查看连接数统计ss -s# 查看到某个IP的连接状态ss -tn state established dst 10.0.1.100# 网络延迟测试ping -c 10 db-standby-server# 路由跟踪traceroute db-remote-server# 带宽测试(RAC 互联网络)iperf3 -c peer-node -t 10
命令速查表
┌──────────────┬──────────────────────────────────┐│ 场景 │ 命令 │├──────────────┼──────────────────────────────────┤│ CPU 高 │ top -c, sar -u, perf top ││ 内存不足 │ free -h, vmstat, /proc/meminfo ││ IO 慢 │ iostat -xdm, iotop, blktrace ││ 磁盘满 │ df -h, du -sh *, lsof |grep del ││ 进程卡住 │ strace -p, pstack, gdb bt ││ 网络问题 │ tcpdump, ss, ping, traceroute ││ 日志排查 │ journalctl, dmesg, /var/log/ ││ 空间扩展 │ lvextend + xfs_growfs ││ 定时任务 │ crontab -l, systemctl list-timers│└──────────────┴──────────────────────────────────┘
ora100 OS 课程推荐
ora100.com 的 Linux 操作系统课程 包含 100 篇文章,系统覆盖:
配合 531 条命令速查手册,覆盖 DBA 日常工作中所有 Linux 操作场景。
访问 ora100.com,补齐你的 Linux 技能短板。
关注「DBA 学习之路」,每周分享数据库技术干货。