表空间使用率
SELECT
a.tablespace_name “表空间名称” ,
total / (1024 * 1024) “表空间大小(M)” ,
free / (1024 * 1024) “表空间剩余大小(M)” ,
(total - free) / (1024 * 1024 ) “表空间使用大小(M)” ,
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;
临时表空间
Temp 表空间可自动扩充,为了不影响磁盘空间的使用,通常会通过 ini 参数 TEMP_SIZE 配置大小,TEMP_SPACE_LIMIT 设置上限,通过存储过程 SP_TRUNC_TS_FILE 来收缩 Temp 表空间文件过大可能说明内存过小或者存在大量排序或者中间结果集存放,需要视情况开展优化工作。
检查 Temp 表空间的大小,SQL 语句如下所示:
SELECT
a.tablespace_name “表空间名称” ,
total / (1024 * 1024) “表空间大小(M)” ,
free / (1024 * 1024) “表空间剩余大小(M)” ,
(total - free) / (1024 * 1024 ) “表空间使用大小(M)” ,
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 and a.tablespace_name=‘TEMP’;
回收 Temp 表空间,SQL 语句如下所示:
CALL SP_TRUNC_TS_FILE (ts_id ,file_id, to_size);
其中 ts_id,file_id 可以通过 v$datafile 查询,to_szieb 表示指定将文件截断至多大,以 MB 为单位;to_size 大小换算成页数后,值必须在 4096 到 2 GB 之间。
Ts_id 对应 GROUP_ID。
File_id 对应 ID。
CALL SP_TRUNC_TS_FILE (3 ,0, 32) 表示将临时表空间文件号为 0 的文件截断缩小到 32 MB 大小。
Undo 回滚段
Undo 回滚段也被称为 undo 表空间,是由 DM 数据库自动维护管理。记录的是数据变动过程中的各个版本,在数据库数据发生频繁变动时,会生成大量的回滚段记录,由参数 UNDO_RETENTION 来控制回滚页保持时间,默认为 90s,一般保持默认即可,设置太小,可能会影响数据大批量查询,设置太大会在数据库启动时做过多的回滚操作。
查看用户占用的空间,返回值为占用的页的数
SELECT USER_USED_SPACE(‘USER’);
看表占用的空间
函数参数为模式名和表名 页的数目。
SELECT TABLE_USED_SPACE(‘SYSDBA’, ‘TEST’);
查看索引占用的空间,函数参数为索引 ID 页的数目。
SELECT INDEX_USED_SPACE(33555463);
实例中查询活动会话
SELECT count(*) FROM v
s
e
s
s
i
o
n
s
W
H
E
R
E
s
t
a
t
e
=
′
A
C
T
I
V
E
′
;
−
−
获
取
完
整
s
q
l
S
E
L
E
C
T
S
Y
S
D
A
T
E
,
S
F
G
E
T
S
E
S
S
I
O
N
S
Q
L
(
S
E
S
S
I
D
)
,
s
e
s
s
i
d
,
s
e
s
s
s
e
q
,
s
q
l
t
e
x
t
,
s
t
a
t
e
,
s
e
q
n
o
,
u
s
e
r
n
a
m
e
,
t
r
x
i
d
,
c
r
e
a
t
e
t
i
m
e
,
c
l
n
t
i
p
F
R
O
M
v
sessions WHERE state='ACTIVE'; --获取完整sql SELECT SYSDATE, SF_GET_SESSION_SQL (SESS_ID), sess_id, sess_seq, sql_text, state, seq_no, user_name, trx_id, create_time, clnt_ip FROM v
sessionsWHEREstate=′ACTIVE′;−−获取完整sqlSELECTSYSDATE,SFGETSESSIONSQL(SESSID),sessid,sessseq,sqltext,state,seqno,username,trxid,createtime,clntipFROMvsessions
WHERE state = ‘ACTIVE’;
实例中锁查询
锁查询语句:
SELECT o.name, l.*
FROM v$lock l, sysobjects o
WHERE l.table_id = o.id AND blocked = 1;
WITH locks
AS (SELECT o.name,
l.*,
s.sess_id,
s.sql_text,
s.clnt_ip,
s.last_send_time
FROM v
l
o
c
k
l
,
s
y
s
o
b
j
e
c
t
s
o
,
v
lock l, sysobjects o, v
lockl,sysobjectso,vsessions s
WHERE l.table_id = o.id AND l.trx_id = s.trx_id),
lock_tr
AS (SELECT trx_id wt_trxid, row_idx blk_trxid
FROM locks
WHERE blocked = 1),
res
AS (SELECT SYSDATE stattime,
t1.name,
t1.sess_id wt_sessid,
s.wt_trxid,
t2.sess_id blk_sessid,
s.blk_trxid,
t2.clnt_ip,
SF_GET_SESSION_SQL (t1.sess_id) fulsql,
datediff (ss, t1.last_send_time, SYSDATE) ss,
t1.sql_text wt_sql
FROM lock_tr s, locks t1, locks t2
WHERE t1.ltype = ‘OBJECT’
AND t1.table_id <> 0
AND t2.ltype = ‘OBJECT’
AND t2.table_id <> 0
AND s.wt_trxid = t1.trx_id
AND s.blk_trxid = t2.trx_id)
–select distinct clnt_ip from res;
SELECT DISTINCT wt_sql, clnt_ip, ss
FROM res;
实例中已执行未提交的 SQL 查询
SELECT t1.sql_text, t1.state, t1.trx_id
FROM v
s
e
s
s
i
o
n
s
t
1
,
v
sessions t1, v
sessionst1,vtrx t2
WHERE t1.trx_id = t2.id AND t1.state = ‘IDLE’ AND t2.status = ‘ACTIVE’;
有事务未提交的表查询
SELECT b.object_name, c.sess_id, a.*
FROM v
l
o
c
k
a
,
d
b
a
o
b
j
e
c
t
s
b
,
v
lock a, dba_objects b, v
locka,dbaobjectsb,vsessions c
WHERE a.table_id = b.object_id AND ltype = ‘OBJECT’ AND a.trx_id = c.trx_id;
长时间的 SQL 查询
SELECT t1.sql_text, t1.state, t1.trx_id
FROM v
s
e
s
s
i
o
n
s
t
1
,
v
sessions t1, v
sessionst1,vtrx t2
WHERE t1.trx_id = t2.id AND t1.state = ‘IDLE’ AND t2.status = ‘ACTIVE’;
找出已执行超过 2 秒的活动 SQL
SELECT *
FROM (SELECT sess_id,
sql_text,
datediff (ss, last_recv_time, SYSDATE) Y_EXETIME,
SF_GET_SESSION_SQL (SESS_ID) fullsql,
clnt_ip
FROM V$SESSIONS
WHERE STATE = ‘ACTIVE’)
WHERE Y_EXETIME >= 2;
linux
ethtool 查看网卡
单机、主备集群、MPP、读写分离集群要求网卡是千兆网卡以上,DMDSC 集群建议是万兆网卡
防火墙及 selinux 检查
redhat 6
service iptables status
若防火墙开启,检查数据库端口策略
iptables -L -n 查看是否有5236
service iptables status
chkconfig iptables off
redhat 7
systemctl status firewalld
firewall-cmd --list-all
关闭 selinux
set enforce 0
vim /etc/selinux/config
CPU 型号及核数
cat /proc/cpuinfo
系统资源限制
data seg size
建议用户设置为 1048576 (即 1 GB)以上或 unlimited(无限制),此参数过小 将可能导致数据库启动失败。
file size
建议用户设置为 unlimited(无限制),此参数过小将可能导致数据库安装或初始化失败。
open files
建议用户设置为 65536 以上或 unlimited(无限制)。
virtual memory
建议用户设置为 1048576(即 1 GB)以上或 unlimited(无限制),此参数过小 将可能导致数据库启动失败。
登录数据库运行用户,执行以下命令:
ulimit -a
root 修改 /etc/security/limits.conf
Core 文件设置
ulimit -c
修改 core 文件大小,执行以下命令:(只在当前会话有效)
例如:ulimit -c unlimited 表示不限制生成的core文件大小
修改 limit 配置,即登录 root 修改 /etc/security/limits.conf
查看及修改 core 默认生成路径
执行以下命令:
cat /proc/sys/kernel/core_pattern
echo “/corefile/core-%e-%p-%t” > /proc/sys/kernel/core_pattern
将会控制所产生的 core 文件会存放到 /corefile 目录下,产生的文件名为 core- 命令名 -pid- 时间戳,执行以下命令:
sysctl -w kernel.core_pattern=/corefile/core.%e.%p.%s.%E
磁盘调度算法
查看 sda 盘调度算法命令:cat /sys/block/sda/queue/scheduler,数据库服务器建议使用 deadline io 调度算法
echo deadline > /sys/block/sda/queue/scheduler
修改内核引导参数,加入 elevator= 调度程序名,执行以下命令:(永久修改,需要重启服务器才生效)
[root@localhost ~]# grubby --update-kernel=ALL --args=“elevator=deadline”
[root@localhost ~]# reboot
磁盘读写检查
写入测试
dd if=/dev/zero of=test bs=64k count=4k oflag=dsync
正常写速度:机械磁盘在 50 MB/s~90 MB/s,固态硬盘在 150 MB/s-300 MB/s。
读取测试
dd if=test of=/dev/zero bs=64k count=4k oflag=dsync
操作系统资源利用率
cpu----top
%id:空闲 CPU 百分比,若该值很低,则需要检查 CPU 具体被哪个进程占用,是否存在瓶颈。
%us:用户空间占用 CPU 百分比。
内存
使用命令:<free -m /nmon>,关注 buffer/cache 和 free 内存,若 swap 可用过少,服务器内存使用可能有存在内存问题。
可用 cat /proc/sys/vm/swappiness
查看当物理内存使用多少后才会用到 swap。
该参数建议修改为 60%.
磁盘I/O速率
<iostat -xm -t 1 /nmon>,关注 cpu 使用率及读写率。
如果 %iowait 的值过高,表示硬盘存在 I/O 瓶颈。
如果 %idle 值高,表示 CPU 较空闲。
如果 %idle 值高但系统响应慢时,可能是 CPU 等待分配内存,应加大内存容量。
如果 %idle 值持续低于 10,表明 CPU 处理能力相对较低,系统中最需要解决的资源是 CPU。
数据库版本
select * from v$version;
安全性
密码策略检查
默认2 即密码长度不小于9。
Select * from v$dm_ini where para_name=‘PWD_POLICY’;
用户资源限制检查
DM 管理工具->右键相应用户->修改->资源限制
通讯加密检查
dm.ini 参数 COMM_ENCRYPT_NAME 来实现,消息加密算法名。如果为空则不进行通信加密;如果给的加密算法名错误,则用使用加密算法 DES_CFB。DM 支持的加密算法名可以通过查询动态视图 V$CIPHERS 获取。无特殊要求,请勿开启该参数,以免造成不必要的性能消耗。
集群配置健康检查
获取主备库状态、守护进程状态、以及主备库数据同步情况等信息。
./dmmonitor dmmonitor.ini
切换模式
切换模式分为自动切换和手动切换,可检查主备库 dmwatcher.ini 文件的 DW_MODE 参数。
MANUAL
故障手动切换模式,故障时前台启动监视器进行切换。
AUTO
故障自动切换模式,需要后台运行确认监视器。