达梦数据库常见的重要巡检语句
一、数据库授权信息查询
SELECT
LIC_VERSION AS "许可证版本",
SERIES_NO AS "序列号",
CHECK_CODE AS "校验码",
AUTHORIZED_CUSTOMER AS "最终用户",
PROJECT_NAME AS "项目名称",
PRODUCT_TYPE AS "产品名称",
CASE SERVER_TYPE
WHEN '1' THEN
'正式版'
WHEN '2' THEN
'测试版'
WHEN '3' THEN
'试用版'
WHEN '4' THEN
'其他'
END AS "产品类型",
TO_CHAR(EXPIRED_DATE) AS "有效日期",
OS_TYPE AS "授权系统",
TO_CHAR(AUTHORIZED_USER_NUMBER) AS "授权用户数",
NVL(TO_CHAR(CONCURRENCY_USER_NUMBER), '') AS "授权并发数",
NVL(TO_CHAR(MAX_CPU_NUM), '') AS "授权CPU个数",
CLUSTER_TYPE AS "授权集群"
FROM
V$LICENSE
1.该项需注意数据库授权的有效日期,到期前需及时进行更换。
2.授权CPU个数字段值(出现过因限制CPU使用个数导致DB性能下降)
二、查询数据库的实例信息
SELECT
'版本号',
(SELECT
id_code)
FROM
v$instance
union all
select
'数据库名',
name
from
v$database
union all
select
'实例名',
instance_name
from
v$instance
union all
select
'系统状态',
status$
from
v$instance
union all
select
'实例模式',
mode$
from
v$instance
union all
select
'是否启用归档',
case arch_mode
when 'Y' then
'是'
when 'N' then
'否'
end
from
v$database
union all
SELECT
'页大小',
cast(PAGE() / 1024 as varchar)
union all
SELECT
'大小写敏感',
cast(
case SF_GET_CASE_SENSITIVE_FLAG()
when '1' then
'是'
when '0' then
'否'
end as varchar)
union all
SELECT
'字符集',
CASE SF_GET_UNICODE_FLAG()
WHEN '0' THEN
'GBK18030'
WHEN '1' then
'UTF-8'
when '2' then
'EUC-KR'
end
union all
SELECT
'以字符为单位',
cast(
case SF_GET_LENGTH_IN_CHAR()
when '1' then
'是'
when '0' then
'否'
end as varchar)
union all
SELECT
'空白字符填充模式',
cast(
case(select
BLANK_PAD_MODE())
when '1' then
'是'
when '0' then
'否'
end as varchar)
union all
select
'日志文件个数',
to_char(count(*))
from
v$rlogfile
union all
select
'日志文件大小',
cast(RLOG_SIZE / 1024 / 1024 as varchar)
from
v$rlogfile
where
rowid = 1
union all
select
'创建时间',
to_char(create_time)
from
v$database
union all
select
'启动时间',
to_char(last_startup_time)
from
v$database;
1.该sql查询的是数据库的安装信息参数,当需要进行实例迁移时需保障两端实例必须一致。
2.系统状态字段查询值如为非OPEN状态,需检查数据库是否正常
3.日志文件大小即redo日志不建议低于2G大小
三、查询数据库中语句统计信息
select
NAME,
STAT_VAL
from
v$sysstat
where
name in ('select statements',
'insert statements',
'delete statements',
'update statements',
'ddl statements',
'transaction total count')
1.这个值是数据库启动以后从0不断递增的值,当数据库重启后清空又从0计数。
2.该值可以用来做监控项判断某个时间段sql的执行情况
四、数据库表空间的状态检查
SELECT
NAME AS "NAME",
CASE TYPE$
WHEN '1' THEN
'DB类型'
WHEN '2' THEN
'临时表空间'
END AS "TYPE",
CASE STATUS$
WHEN '0' THEN
'联机'
WHEN '1' THEN
'脱机'
WHEN '2' THEN
'脱机'
WHEN '3' THEN
'损坏'
END AS "STATUS",
TOTAL_SIZE * PAGE / 1024 / 1024 AS "TOTALSIZE",
FILE_NUM AS "FILENUM"
FROM
V$TABLESPACE
需重点关注表空间类型非联机的情况,需重点监控
五、查询数据库表空间的使用情况
SELECT
F.TABLESPACE_NAME,
ROUND((T.TOTAL_SPACE -F.FREE_SPACE) / 1024, 2) "USED",
CASE
WHEN H.TOTAL_MAX_SPACE == 0 THEN
ROUND(F.FREE_SPACE / 1024, 2)
ELSE
ROUND((H.TOTAL_MAX_SPACE -(T.TOTAL_SPACE -F.FREE_SPACE)) / 1024, 2)
END "FREE_MAX",
CASE
WHEN H.TOTAL_MAX_SPACE == 0 THEN
ROUND(T.TOTAL_SPACE / 1024, 2)
ELSE
ROUND(H.TOTAL_MAX_SPACE / 1024, 2)
END "TOTAL_MAX",
CASE
WHEN H.TOTAL_MAX_SPACE == 0 THEN
ROUND((F.FREE_SPACE / 1024) / (T.TOTAL_SPACE / 1024), 4) * 100 || '%'
ELSE
ROUND(((H.TOTAL_MAX_SPACE -(T.TOTAL_SPACE -F.FREE_SPACE)) / 1024) / (H.TOTAL_MAX_SPACE / 1024), 4) * 100 || '%'
END PER_FREE_MAX,
CASE
WHEN H.TOTAL_MAX_SPACE == 0 THEN
ROUND((((T.TOTAL_SPACE -F.FREE_SPACE)) / 1024) / (T.TOTAL_SPACE / 1024), 4) * 100 || '%'
ELSE
ROUND((((T.TOTAL_SPACE -F.FREE_SPACE)) / 1024) / (H.TOTAL_MAX_SPACE / 1024), 4) * 100 || '%'
END PER_USED_MAX,
ROUND(F.FREE_SPACE / 1024, 2) "FREE",
ROUND(T.TOTAL_SPACE / 1024, 2) "TOTAL",
CASE
WHEN T.TOTAL_SPACE == 0 THEN
''
ELSE
(ROUND((F.FREE_SPACE / T.TOTAL_SPACE), 4) * 100) || '% '
END PER_FREE,
CASE
WHEN T.TOTAL_SPACE == 0 THEN
''
ELSE
(ROUND((T.TOTAL_SPACE -F.FREE_SPACE) / T.TOTAL_SPACE, 4) * 100) || '%'
END PER_USED
FROM
(SELECT
TABLESPACE_NAME,
ROUND(SUM(BLOCKS *(SELECT
PARA_VALUE / 1024
FROM
V$DM_INI
WHERE
PARA_NAME = 'GLOBAL_PAGE_SIZE') / 1024)) FREE_SPACE
FROM
DBA_FREE_SPACE
GROUP BY
TABLESPACE_NAME) F,
(SELECT
TABLESPACE_NAME,
ROUND(SUM(BYTES / 1048576)) TOTAL_SPACE
FROM
DBA_DATA_FILES
GROUP BY
TABLESPACE_NAME) T,
(SELECT
TABLESPACE_NAME,
ROUND(SUM(MAXBYTES / 1048576)) TOTAL_MAX_SPACE
FROM
DBA_DATA_FILES
GROUP BY
TABLESPACE_NAME) H
WHERE
F.TABLESPACE_NAME = T.TABLESPACE_NAME
AND F.TABLESPACE_NAME = H.TABLESPACE_NAME
1.MAIN|TEMP|ROLL|SYSTEM这几个表空间是由系统自动管理的不需要关注使用率情况
2.SQL的计算公式比较复杂,原因是因为一个表空间可以有多个数据文件,这些数据文件中如有一个设置的是自动拓展空间且无上限,那么就不应该关注使用率了。
六、查询表空间的数据文件使用情况
SELECT
PATH,
TO_CHAR(TOTAL_SIZE * PAGE / 1024 / 1024) AS TOTAL_SIZE,
TO_CHAR(FREE_SIZE * PAGE / 1024 / 1024) AS FREE_SIZE,
(TO_CHAR(100 -FREE_SIZE * 100 / TOTAL_SIZE)) AS REM_PER,
CASE AUTO_EXTEND
WHEN '0' THEN
'未开启'
WHEN '1' THEN
'已开启'
END AS AUTO_EXTEND,
NEXT_SIZE,
MAX_SIZE,
b.TABLESPACE_NAME
FROM
V$DATAFILE a,
dba_data_files b
where
b.file_name = a.PATH
order by
GROUP_ID
MAIN|TEMP|ROLL|SYSTEM这几个表空间是由系统自动管理的不需要关注
七、查询数据库中的用户信息
SELECT
A.USERNAME,
CASE B.RN_FLAG
WHEN '0' THEN
'否'
WHEN '1' THEN
'是'
END AS READ_ONLY,
CASE A.ACCOUNT_STATUS
WHEN 'LOCKED' THEN
'锁定'
WHEN 'OPEN' THEN
'正常'
END AS "状态",
TO_CHAR(A.LOCK_DATE, 'YYYY-MM-DD HH24:MI:SS') AS "锁定起始时间",
TO_CHAR(A.EXPIRY_DATE, 'YYYY-MM-DD HH24:MI:SS') AS "密码截止使用时间",
TO_CHAR(round(datediff(DAY, TO_CHAR(sysdate, 'YYYY-MM-DD HH24:MI:SS'), TO_CHAR(A.EXPIRY_DATE, 'YYYY-MM-DD HH24:MI:SS')), 2)) AS EXPIRY_DATE_DAY,
TO_CHAR(round(datediff(DAY, TO_CHAR(sysdate, 'YYYY-MM-DD HH24:MI:SS'), TO_CHAR(A.LOCK_DATE, 'YYYY-MM-DD HH24:MI:SS')), 2)) AS LOCK_DATE_DAY,
A.DEFAULT_TABLESPACE,
A.PROFILE,
TO_CHAR(A.CREATED, 'YYYY-MM-DD HH24:MI:SS') AS CREATE_TIME
FROM
DBA_USERS A,
SYSUSERS B
WHERE
A.USER_ID = B.ID
1.需关注用户中是否存在密码设置有效期后到期的用户
2.需关注查询中的状态字段是正常状态还是非预期下的用户账号已被锁定
八、查询数据库中用户权限
SELECT USERNAME AS "用户名", WM_CONCAT(PRIVILEGE) AS "默认权限"
FROM (
SELECT A.USERNAME, C.PRIVILEGE
FROM DBA_USERS A, SYSUSERS B, (
SELECT A.*
FROM (
SELECT GRANTEE, GRANTED_ROLE PRIVILEGE, 'ROLE_PRIVS' PRIVILEGE_TYPE,
CASE ADMIN_OPTION WHEN 'Y' THEN 'YES' ELSE 'NO' END ADMIN_OPTION
FROM DBA_ROLE_PRIVS
UNION
SELECT GRANTEE, PRIVILEGE, 'SYS_PRIVS' PRIVILEGE_TYPE, ADMIN_OPTION
FROM DBA_SYS_PRIVS
UNION
SELECT GRANTEE, PRIVILEGE||' ON '||OWNER||'.'||TABLE_NAME PRIVILEGE,
'TABLE_PRIVS' PRIVILEGE_TYPE, GRANTABLE
FROM DBA_TAB_PRIVS
) A
WHERE GRANTEE IN (
SELECT USERNAME
FROM ALL_USERS
WHERE USERNAME NOT IN ('SYS','SYSDBA','SYSSSO','SYSAUDITOR')
)
) C
WHERE A.USER_ID = B.ID AND A.USERNAME = C.GRANTEE
)
GROUP BY USERNAME
需关注是否给应用用户授予DBA权限这类操作
九、查询数据库中的对象是否无效(函数、存储过程、包等对象)
SELECT
OWNER,
OBJECT_NAME,
OBJECT_TYPE,
TO_CHAR(CREATED, 'YYYY-MM-DD HH24:MI:SS'),
TO_CHAR(LAST_DDL_TIME, 'YYYY-MM-DD HH24:MI:SS')
FROM
DBA_OBJECTS
WHERE
OWNER NOT IN ('SYS', 'SYSJOB', 'SYSAUDITOR', 'CTISYS', 'SYSSSO')
and STATUS = 'INVALID'
需关注库中的函数、包函数、存储过程等对象是否报错,是否需要处理
十、查询数据库中的大表信息
SELECT
A.TABLE_NAME,
A.TABLESPACE_NAME,
B.OWNER,
B.BYTES
FROM
(SELECT TABLE_NAME, TABLESPACE_NAME FROM ALL_TABLES GROUP BY TABLE_NAME, TABLESPACE_NAME) AS A
LEFT JOIN (SELECT
OWNER,
SEGMENT_NAME,
SUM(BYTES) BYTES
FROM
DBA_SEGMENTS
WHERE
SEGMENT_TYPE = 'TABLE'
GROUP BY
OWNER,
SEGMENT_NAME) AS B ON A.TABLE_NAME = B.SEGMENT_NAME
WHERE
B.OWNER NOT IN ('SYS', 'SYSDBA', 'SYSAUDITOR', 'SYSSSO', 'CTISYS')
ORDER BY
BYTES DESC
LIMIT 10
十一、查询数据库中会话的使用情况
SELECT
*
FROM
(SELECT
STATE,
CASE
WHEN INSTR(CLNT_IP, ':', 8) > 0 THEN
SUBSTR(CLNT_IP, 1, INSTR(CLNT_IP, ':', 8) -1)
ELSE
CLNT_IP
END AS CLNT_IP,
CLNT_TYPE,
CURR_SCH,
USER_NAME,
COUNT(*) COUNTS
FROM
V$SESSIONS
GROUP BY
STATE,
CASE
WHEN INSTR(CLNT_IP, ':', 8) > 0 THEN
SUBSTR(CLNT_IP, 1, INSTR(CLNT_IP, ':', 8) -1)
ELSE
CLNT_IP
END,
CLNT_TYPE,
CURR_SCH,
USER_NAME
ORDER BY
STATE)
十二、长时间空闲会话检查
SELECT
SESS_ID,
SESS_SEQ,
USER_NAME,
CREATE_TIME,
CLNT_TYPE,
CLNT_HOST,
CLNT_IP,
OSNAME,
CONN_TYPE,
CLNT_VER
FROM
SYS.V$SESSIONS
WHERE
STATE = 'IDLE'
AND DATEDIFF(HH, LAST_SEND_TIME, SYSDATE) > 48
AND DATEDIFF(HH, CREATE_TIME, SYSDATE) > 48;
1.在达梦数据库中默认情况下不会断开数据库的会话连接
2.运维中出现过管理工具中执行一条insert语句未进行提交,导致其他事务插入该表时发生事务等待从而影响生产的情况
3.对于长时间的空闲会话,应该定期进行会话连接清理
十三、查询数据库的redo日志大小
SELECT FILE_ID,PATH,CLIENT_PATH,RLOG_SIZE FROM V$RLOGFILE
单个redo文件不建议低于2g大小,最好保障每个redo大小日志都是一样的
十四、查询数据库的定时任务信息
SELECT
SYSJOB."NAME",
SCHE."NAME" SCHENAME,
SCHE."JOBID",
SCHE."TYPE",
SCHE."FREQ_INTERVAL",
SCHE."FREQ_SUB_INTERVAL",
SCHE."STARTTIME",
STEPS."NAME" STEPSNAME,
STEPS."SEQNO" STEPSSEQNO,
STEPS."TYPE" STEPSTYPE,
STEPS.COMMAND WHAT,
STEPS.SUCC_ACTION,
STEPS.FAIL_ACTION FROM
SYSJOB.SYSJOBSCHEDULES
SCHE LEFT
JOIN
SYSJOB.SYSJOBSTEPS
STEPS ON
SCHE.JOBID = STEPS.JOBID LEFT
JOIN
SYSJOB.SYSJOBS
SYSJOB ON
SCHE.JOBID = SYSJOB.ID
WHERE
SCHE.VALID == 'Y'ORDER BY
STEPS.JOBID ,
STEPS.SEQNO ASC
检查数据库中是否有配置定时数据备份任务,来保障数据安全
社区地址:https://eco.dameng.com