达梦数据库常见的重要巡检语句

一、数据库授权信息查询

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