本文主要内容为Linux操作系统层面,对正在运行的数据库实例和所在服务器的一些基础监控命令
本文不涉及高级运维监控工具的使用
实际上高级工具大部分功能正是基于这些基础命令实现的
熟练掌握基础命令的好处:
学习掌握这些基础命令并不是要排斥使用高级运维监控工具,而是根据情况综合使用相辅相成,达到运维好整个系统的目的
有很多命令之前已经掌握,本文主要起到一个系统性整理归纳,供自己查漏补缺。如果能对其他同行有所帮助,也算是做成了一件小事
监控是DBA的主要工作内容之一
根据监控对象可以分为对操作系统资源的监控和对数据库实例的监控
主要内容:
CPU、内存、磁盘、网络、I/O
三大硬件简介
CPU:中央处理器,计算机的核心,作用是运算和控制
内存:内存储器,存取速度较快(相比于CPU cache还是很慢),断电数据丢失
磁盘:属于外存储器,存取速度较慢(即使SSD比传统的HDD快了很多,但相比于内存还是很慢),断电数据仍保存
top
top
查看实时CPU、内存、进程等
使用样例
[root@host ~]# top
top - 20:47:22 up 33 min, 2 users, load average: 0.00, 0.01, 0.07
Tasks: 95 total, 1 running, 94 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 1882048 total, 746216 free, 426412 used, 709420 buff/cache
KiB Swap: 2097148 total, 2097148 free, 0 used. 1289700 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 128144 6384 3772 S 0.0 0.3 0:01.76 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd
...
输出内容简介
top - 20:47:22 当前系统时间 up 33 min 已启动时间, 2 users 当前登录用户数, load average 系统平均负载: 0.00 近1分钟, 0.01 近5分钟, 0.07 近15分钟 Tasks 进程: 95 total 总数, 1 running 正在运行, 94 sleeping 睡眠, 0 stopped 停止, 0 zombie 僵尸 %Cpu(s) CPU状态百分比: 0.0 us user用户(未改变过nice值), 0.0 sy system系统内核, 0.0 ni nice用户(改变过nice值),100.0 id idle空闲, 0.0 wa IO-wait等待输入输出, 0.0 hi hardware interrupts硬中断, 0.0 si software interrupts软中断, 0.0 st stolen虚拟机被hypervisor偷取 KiB Mem 物理内存: 1882048 total 总量, 746216 free 空闲, 426412 used 使用, 709420 buff/cache 缓冲/缓存 KiB Swap 交换区: 2097148 total 总量, 2097148 free 空闲, 0 used 使用. 1289700 avail Mem 可用物理内存 KiB = kibibyte = 1024 bytes MiB = mebibyte = 1024 KiB = 1,048,576 bytes GiB = gibibyte = 1024 MiB = 1,073,741,824 bytes TiB = tebibyte = 1024 GiB = 1,099,511,627,776 bytes PiB = pebibyte = 1024 TiB = 1,125,899,906,842,624 bytes EiB = exbibyte = 1024 PiB = 1,152,921,504,606,846,976 bytes PID 进程号 USER 用户 PR 进程优先级 越小越高 NI nice值 负优先级高 VIRT 虚拟内存 RES 物理内存 SHR 共享内存 S 进程状态 %CPU CPU使用率 %MEM 内存使用率 TIME+ CPU时间 COMMAND 命令 S 进程状态说明 D = uninterruptible sleep R = running S = sleeping T = stopped by job control signal t = stopped by debugger during trace Z = zombie
free
free
查看内存使用情况
使用样例
[root@host ~]# free
total used free shared buff/cache available
Mem: 1882048 713040 898304 8740 270704 1020744
Swap: 2097148 0 2097148
输出内容简介
Mem 物理内存 Swap 交换区 total 总数 used 已使用 free 空闲 shared 共享 buff/cache 缓冲/缓存 available 可用
有时会有一种情况
free
输出 Mem free 为0,但 available 还有余量
之前版本的free
没有 available 项,是在 Mem 和 Swap 之间还有一行 -/+ buffers/cache ,此行的 free 还有余量
实际上是操作系统OS将空闲的内存空间作为缓冲/缓存使用了
- 对于操作系统 这部分内存确实已被使用
- 对于应用程序 这部分内存可以使用,需要时OS回收缓冲/缓存再分配给应用程序
这种情况并不是可用内存已耗尽,无需过于担心,可以简单理为只需解关注 available 项,或者 -/+ buffers/cache 行的 free 项
需要注意的是,回收buff/cache还是需要消耗资源,此部分内存不完全等同于空闲空间,频繁或大量进行回收还是可能会引起性能问题
显示单位参数
OPTIONS
-b, --bytes
Display the amount of memory in bytes.
-k, --kilo
Display the amount of memory in kilobytes. This is the default.
-m, --mega
Display the amount of memory in megabytes.
-g, --giga
Display the amount of memory in gigabytes.
--tera Display the amount of memory in terabytes.
--peta Display the amount of memory in petabytes.
-h, --human
Show all output fields automatically scaled to shortest three digit unit and display the units of print out. Following units are used.
B = bytes
K = kilos
M = megas
G = gigas
T = teras
P = petas
If unit is missing, and you have exabyte of RAM or swap, the number is in terabytes and columns might not be aligned with header.
df
df
查看磁盘和文件系统,常用-h参数df -h
使用样例
[root@host ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 908M 0 908M 0% /dev
tmpfs 919M 0 919M 0% /dev/shm
tmpfs 919M 8.6M 911M 1% /run
tmpfs 919M 0 919M 0% /sys/fs/cgroup
/dev/mapper/centos-root 27G 3.7G 24G 14% /
/dev/sr0 4.5G 4.5G 0 100% /mnt/centos
/dev/sda1 1014M 152M 863M 15% /boot
tmpfs 184M 0 184M 0% /run/user/0
输出内容简介
Filesystem 文件系统 Size 大小 Used 已使用 Avail 可用 Use% 使用率 Mounted on 挂载点
在生产环境上,磁盘空间写满会造成严重事故,是非常重要的监控项
一般建议数据、归档、备份分别存放在不同的磁盘上,并且都不在根目录挂载点下
iostat
iostat
查看设备I/O统计信息
iostat
在sysstat
工具包中,安装为yum -y install sysstat
使用样例
[root@host ~]# iostat -xm
Linux 3.10.0-1160.71.1.el7.x86_64 (dmtest) MM/DD/2023 _x86_64_ (1 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.04 0.00 0.09 0.09 0.00 99.78
Device: rrqm/s wrqm/s r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda 0.00 0.04 0.80 1.31 0.03 0.01 43.45 0.00 1.28 1.08 1.41 0.94 0.20
dm-0 0.00 0.00 0.55 1.35 0.03 0.01 44.36 0.00 1.45 1.34 1.50 0.99 0.19
dm-1 0.00 0.00 0.01 0.00 0.00 0.00 50.09 0.00 0.53 0.53 0.00 0.34 0.00
输出内容简介
avg-cpu 参考top中信息 Device rrqm/s 每秒合并的读操作次数 wrqm/s 每秒合并的写操作次数 r/s 每秒读次数 w/s 每秒写次数 rMB/s 每秒读数据量MB wMB/s 每秒写数据量MB avgrq-sz 平均扇区大小 avgqu-sz 平均IO队列长度,越小越好 await IO请求平均处理时间ms r_await 读操作平均时间ms w_await 写操作平均时间ms svctm 平均设备操作时间 %util 统计时间内IO处理时间占比
磁盘性能指标
记录了一些常用的数据库管理 SQL
相关 SQL 语句在命令行 disql 或图形界面 DM管理工具 中执行
--查询当前所有会话数
SELECT COUNT(*) FROM V$SESSIONS;
--查看当前数据库中活动会话
SELECT COUNT(*) FROM V$SESSIONS WHERE STATE='ACTIVE';
--查看当前非活动会话
SELECT COUNT(*) FROM V$SESSIONS WHERE STATE='IDLE';
--结束会话
SP_CLOSE_SESSION(${SESSION_ID});
#基于端口为 5236 的会话数查询
[root@host ~]# lsof -i:5236|grep dmserver|wc -l
[root@host ~]# netstat -nat|awk '{print $4}'|grep 5236|wc -l
查看当前活动会话时,若当前活动会话连接数量太大,则说明数据库当前可能存在以下异常情况:
- 当前业务繁忙,业务量太大;
- 当前系统中存在慢 SQL;
- 应用的重连机制存在缺陷。
查看当前非活动会话时,若当前非活动会话连接数量太大,说明数据库可能存在以下情况:
- 系统当前处于会话空闲期;
- 连接池会话上线设置过高;
- 应用释放连接机制存在异常。
--监控当前系统中活动线程的信息
SELECT * FROM V$THREADS;
--监控当前正在等待的线程信息
SELECT * FROM V$LATCHES;
--慢 SQL 及阻塞
SELECT
DS.SESS_ID "被阻塞的会话ID",
DS.SQL_TEXT "被阻塞的SQL",
DS.TRX_ID "被阻塞的事务ID",
(CASE L.LTYPE WHEN 'OBJECT' THEN '对象锁' WHEN 'TID' THEN '事务锁' END CASE ) "被阻塞的锁类型",
DS.CREATE_TIME "开始阻塞时间",
SS.SESS_ID "占用锁的会话ID",
SS.SQL_TEXT "占用锁的SQL",
SS.CLNT_IP "占用锁的IP",
L.TID "占用锁的事务ID"
FROM
V$LOCK L
LEFT JOIN V$SESSIONS DS
ON
DS.TRX_ID = L.TRX_ID
LEFT JOIN V$SESSIONS SS
ON
SS.TRX_ID = L.TID
WHERE
L.BLOCKED = 1;
--死锁历史事务信息
SELECT
DH.TRX_ID ,
SH.SESS_ID,
WM_CONCAT(TOP_SQL_TEXT)
FROM
V$DEADLOCK_HISTORY DH,
V$SQL_HISTORY SH
WHERE
DH.TRX_ID =SH.TRX_ID
AND DH.SESS_ID=SH.SESS_ID
GROUP BY
DH.TRX_ID, SH.SESS_ID;
--有事务未提交的表
SELECT B.OBJECT_NAME, C.SESS_ID, A.*
FROM V$LOCK A, DBA_OBJECTS B, V$SESSIONS C
WHERE A.TABLE_ID = B.OBJECT_ID AND LTYPE = 'OBJECT' AND A.TRX_ID = C.TRX_ID;
--内存总量
SELECT
(SELECT SUM(N_PAGES * PAGE_SIZE)/1024/1024 FROM V$BUFFERPOOL)||'MB' AS BUFFER_SIZE,
(SELECT SUM(TOTAL_SIZE)/1024/1024 FROM V$MEM_POOL)||'MB' AS MEM_POOL,
(SELECT SUM(N_PAGES * PAGE_SIZE)/1024/1024 FROM V$BUFFERPOOL)+(SELECT SUM(TOTAL_SIZE)/1024/1024 FROM V$MEM_POOL)||'MB' AS TOTAL_SIZE
FROM DUAL;
--最占用内存的SQL
SELECT "SESSID", MAX_MEM_USED||'KB',SQL_TXT FROM V$SQL_STAT
ORDER BY MAX_MEM_USED DESC;
--内存池使用信息
SELECT
NAME, --内存池名称
IS_SHARED, --是否是共享的
IS_OVERFLOW, --是否用到了备份池
ORG_SIZE/1024.0/1024.0, --内存池初始大小
TOTAL_SIZE/1024.0/1024.0, --内存池总大小(包括扩展的)
RESERVED_SIZE/1024.0/1024.0, --当前已分配大小(包括扩展的)
DATA_SIZE/1024.0/1024.0, --实际有效字节
EXTEND_SIZE, --每次扩展多少
TARGET_SIZE, --目标大小
N_EXTEND_NORMAL , --TARGET范围内累计扩展次数
N_EXTEND_EXCLUSIVE --超过TARGET累计扩展次数
FROM V$MEM_POOL
ORDER BY TOTAL_SIZE DESC;
--总体内存使用情况
SELECT NAME ,STAT_VAL/1024.0/1024.0 FROM V$SYSSTAT WHERE CLASSID=11;
--单个会话内存使用情况
SELECT
A.CREATOR ,
B.SQL_TEXT ,
SUM(A.TOTAL_SIZE)/1024.0/1024.0 TOTAL_M, --当前总量(包括扩展)
SUM(A.DATA_SIZE) /1024.0/1024.0 DATA_SIZE_M --实际使用量
FROM
V$MEM_POOL A,
V$SESSIONS B
WHERE
A.CREATOR = B.THRD_ID
GROUP BY
A.CREATOR,
B.SQL_TEXT
ORDER BY
TOTAL_M DESC;
--缓冲区命中率
SELECT
NAME 缓冲池名称,
SUM(PAGE_SIZE)*SF_GET_PAGE_SIZE 缓冲池大小_G,
SUM(RAT_HIT) /COUNT(*) 命中率
FROM
V$BUFFERPOOL
GROUP BY NAME;
SELECT UPPER(F.TABLESPACE_NAME) "表空间名",
D.TOT_GROOTTE_MB "表空间大小(M)",
D.TOT_GROOTTE_MB - F.TOTAL_BYTES "已使用空间(M)",
TO_CHAR(ROUND(( D.TOT_GROOTTE_MB - F.TOTAL_BYTES ) / D.TOT_GROOTTE_MB * 100, 2), '990.99')
|| '%' "使用比",
F.TOTAL_BYTES "空闲空间(M)",
F.MAX_BYTES "最大块(M)"
FROM (SELECT TABLESPACE_NAME,
ROUND(SUM(BYTES) / ( 1024 * 1024 ), 2) TOTAL_BYTES,
ROUND(MAX(BYTES) / ( 1024 * 1024 ), 2) MAX_BYTES
FROM SYS.DBA_FREE_SPACE
GROUP BY TABLESPACE_NAME) F,
(SELECT DD.TABLESPACE_NAME,
ROUND(SUM(DD.BYTES) / ( 1024 * 1024 ), 2) TOT_GROOTTE_MB
FROM SYS.DBA_DATA_FILES DD
GROUP BY DD.TABLESPACE_NAME) D
WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME
ORDER BY 2 DESC;
--表空间与数据文件对应关系
SELECT TS.NAME, DF.PATH FROM V$TABLESPACE AS TS, V$DATAFILE AS DF WHERE TS.ID = DF.GROUP_ID;
--UNDO/ROLL表空间
SELECT * FROM DBA_DATA_FILES WHERE TABLESPACE_NAME='ROLL';
--设置UNDO/ROLL表空间
ALTER TABLESPACE "ROLL" DATAFILE 'ROLL.DBF' AUTOEXTEND ON MAXSIZE 512000;
--已使用ROLL表空间
SELECT
A.TABLESPACE_NAME SPACE_NAME ,
TOTAL /1024/1024/1024 "总大小(G)" ,
FREE /1024/1024/1024 "可使用(G)" ,
(TOTAL -FREE) /1024/1024/1024 "已使用(G)",
ROUND((TOTAL -FREE)/TOTAL, 4)*100 "使用率"
FROM
(
SELECT
TABLESPACE_NAME,
SUM(BYTES) FREE
FROM
DBA_FREE_SPACE
GROUP BY
TABLESPACE_NAME
)
A,
(
SELECT
TABLESPACE_NAME,
SUM(BYTES) TOTAL
FROM
DBA_DATA_FILES
GROUP BY
TABLESPACE_NAME
)
B
WHERE
A.TABLESPACE_NAME = B.TABLESPACE_NAME
ORDER BY
"使用率" DESC;
--查看待 PURGE 的事务
SELECT * FROM V$PURGE;
--REDO
SELECT * FROM V$RLOGFILE;
--归档文件是否在持续生成
SELECT * FROM V$ARCHIVED_LOG ORDER BY FIRST_CHANGE# DESC;
文章
阅读量
获赞