一. 概述
本日常维护规程主要包含两个重要组成部分日常监控和日常维护部分。日常监控部分包含每日检查和定期检查两部分,每日检查的主要作用是防患于未然,定期检查的作用是做前驱行的分析。
日常维护部分的作用主要是给DBA做维护参考。

二. 数据库日常监控
日常监控/检查操作是一个预防式的维护手段,能够将多数可能带来数据库异常的因素提前发现并及时消除,从而提高系统的稳定性、高可用性及恢复效率,同时确保数据库性能不发生大的性能偏差,保持其一贯的高效性。数据库巡检的必要性:
数据库全面检查,提前预知隐患,并作出规避措施;
及时发现数据库的异常情况,并能立即处理,保障企业数据库的稳定运行;
随着IT技术和业务发展及各种各样安全漏洞的涌现,消除安全隐患;
2.1每日检查
为达到上述目的,每日检查操作必须包含以下内容:日志检查
系统空间使用率
表空间使用率
数据文件状态检查
失效对象检查
异常对象检查
备份结果检查
性能检查
2.2日志检查
2.2.1数据库服务日志
数据库服务日志记录了数据库服务启动,刷检查点,写归档、刷盘等一系列实例的运行过程,按月生成,一般默认命名为 dm_实例名称_月份.log。针对该日志的分析,可了解以上过程的运行状态,通过检查点刷盘,也可以分析业务的繁忙程度,作为调整内存、检查点参数的依据。通过 grep 筛选检查具有 ERROR 或者 FATAL 关键字的日志,如下图所示:告警日志不仅仅每日要做检查,数据库发生任何故障或不可用时也应该进行检查。
root@hadoop4:[/dm8/log]tail -f dm_DMSERVER_202106.log
root@hadoop4:[/dm8/log]cat dm_DMSERVER_202105.log | grep ERROR
查看最近一段时间比如最近一周数据库日志是否有错误信息,如有错误信息,联系相关技术人员进行分析处理。
root@hadoop4:[/dm8/log]cat dmsvc_sh.log
2.2.2DMAP 进程日志
damp 日志是记录 DMAP 插件的运情况的日志,DMAP 日志的位置和数据库运行日志的位置相同,命名方式为 dm_DMAP_日期.log,如下图所示:2.2.3数据库备份日志
数据库备份日志,是记录了是数据库备份情况的日志,主要用于记录数据库备份的过程信息,判断备份是否完成的日志,日志存放的位置和数据库运行日志相同,命名格式为 dm_BAKES_日期.log,如下图所示:2.2.4数据守护集群日志检查
数据守护集群,由至少两台数据库服务器组成相比单实例数据库多出了守护进程日志需要检查,并且集群中的每一个节点的数据库日志,守护进程日志都要检查。数据库守护进程日志:
数据守护进程日志,主要记录守护进程对数据库进程运行情况的监控信息和守护集群之间的内部通讯信息,守护进程日志的命名方式为 dm_watcher_日期.log,如下图所示
2.3检查数据库基本状况
2.3.1检查达梦实例状态
SELECT * FROM SYS.“V$INSTANCE”;其中“STATUS”表示达梦当前的实例状态,必须为“OPEN”。 2.3.2检查数据库授权信息 SELECT * FROM VLICENSE;
2.3.2检查数据库授权信息
SELECT * FROM “V$LICENSE”;
备注:查看EXPIRED_DATE即授权过期日期,判断过期日期还有多久,若过期时间离当前日期很近了,则需要联系数据库厂商进行数据库授权;
2.3.3查看数据库版本
SELECT * FROM V$VERSION;SELECT ID_CODE;
2.3.4查看概况
SELECT ‘实例名称’ 数据库选项,INSTANCE_NAME 数据库集群相关参数值
FROM vinstance UNION ALL SELECT '数据库版本', SUBSTR(svr_version,instr(svr_version,'(')) FROM vinstance
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(PAGE() / 1024 AS VARCHAR)
UNION ALL
SELECT ‘簇大小’,
CAST(SF_GET_EXTENT_SIZE() AS VARCHAR)
UNION ALL
SELECT ‘大小写敏感’,
CAST(SF_GET_CASE_SENSITIVE_FLAG() AS VARCHAR)
UNION ALL
SELECT ‘数据库模式’,
MODEinstance
UNION ALL
SELECT ‘唯一魔数’,
CAST(permanent_magic AS VARCHAR)
UNION ALL
SELECT ‘数据库魔数’,
CAST(DB_MAGIC AS VARCHAR)
FROM dual
UNION ALL
SELECT ‘LSN’,
CAST(cur_lsn AS VARCHAR)
FROM v$rlog;
2.4表空间使用率
表空间不足会导致新数据无法插入,直接关系到业务系统的正常运行。SELECT F.TABLESPACE_NAME,
(T.TOTAL_SPACE - F.FREE_SPACE) / 1024 "USED (GB)",
F.FREE_SPACE / 1024 "FREE (GB)",
T.TOTAL_SPACE / 1024 "TOTAL(GB)",
(ROUND((F.FREE_SPACE / T.TOTAL_SPACE) * 100)) || '% ' PER_FREE
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
WHERE F.TABLESPACE_NAME = T.TABLESPACE_NAME;
备注:当PER_FREE列的值低于20%时,表示该表空间剩余不多,为告警标志,将该表空间及空闲率记录在登记表上,准备扩充该表空间;当 PER_FREE 列的值低于 10% 时,则表示该表空间增长过快,应立即扩充表空间,并对比前期该表空间的增长速度,分析空间增长过快的原因。
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
2.5数据文件检查
2.5.1数据文件
检查数据库中是否存在状态异常的数据文件SELECT PATH, STATUS$, RW_STATUS FROM V$DATAFILE;
2.5.2查询表空间与数据文件对应关系
SELECT TS.NAME, DF.PATH
FROM V$TABLESPACE AS TS, V$DATAFILE AS DF
WHERE TS.ID = DF.GROUP_ID;
2.5.3控制文件
SELECT PARA_VALUE NAME FROM V$DM_INI WHERE PARA_NAME = 'CTL_PATH';
2.5.4联机日志文件
SELECT * FROM V$RLOGFILE;
2.6失效检查
2.6.1对象检查
无效对象可能影响某些应用功能不能正常执行SELECT OWNER, OBJECT_NAME, OBJECT_TYPE, STATUS
FROM DBA_OBJECTS
WHERE DBA_OBJECTS.STATUS = 'INVALID';
备注:对象状态,‘VALID‘表示生效,‘INVALID‘表示失效
2.6.2约束检查
无效约束可能会影响数据库的数据完整性。SELECT *
FROM DBA_CONSTRAINTS
WHERE CONSTRAINT_TYPE = 'P'
AND INVALID = 'INVALID'
检查输出结果,并与应用人员联系,确保该约束存在的合理性。
2.6.3触发器检查
select * from DBA_TRIGGERS where DBA_TRIGGERS.STATUS = 'N'
2.6.4索引检查
SELECT * FROM DBA_INDEXES WHERE STATUS = 'UNUSABLE'
备注:status:非分区索引的状态 VALID 或 UNUSABLE。
2.6.5监控索引是否被用到
CREATE INDEX IDX_CITY_NAME ON "DMHR"."CITY"("CITY_NAME" ASC) STORAGE(ON "MAIN", CLUSTERBTR) ;
ALTER INDEX DMHR.IDX_CITY_NAME MONITORING USAGE;
SELECT COUNT(*) FROM "DMHR"."CITY" WHERE CITY_NAME='ZZ' ;
SELECT * FROM V$OBJECT_USAGE ;
2.6.6查看是否有重复索引
SELECT
/*+ rule */
a .table_owner ,
a.table_name ,
a.index_owner ,
a.index_name ,
column_name_list ,
column_name_list_dup ,
dup duplicate_indexes,
i.uniqueness ,
i.partitioned ,
i.leaf_blocks ,
i.distinct_keys ,
i.num_rows ,
i.clustering_factor
FROM
(
SELECT
table_owner ,
table_name ,
index_owner ,
index_name ,
column_name_list_dup,
dup ,
MAX(dup) OVER(PARTITION BY table_owner, table_name, index_name) dup_mx
FROM
(
SELECT
table_owner ,
table_name ,
index_owner ,
index_name ,
SUBSTR(SYS_CONNECT_BY_PATH(column_name, ','), 2) column_name_list_dup,
dup
FROM
(
SELECT
index_owner ,
index_name ,
table_owner ,
table_name ,
column_name ,
COUNT(1) OVER(PARTITION BY index_owner, index_name) cnt ,
ROW_NUMBER() OVER(PARTITION BY index_owner, index_name ORDER BY column_position) AS seq,
COUNT(1) OVER(PARTITION BY table_owner, table_name, column_name, column_position) AS dup
FROM
sys.dba_ind_columns
WHERE
(
index_owner LIKE 'E%'
OR index_owner LIKE 'TRIAL%'
OR index_owner = 'TEST'
)
AND index_owner NOT IN ('EXFSYS')
)
WHERE
dup != 1 START
WITH seq = 1 CONNECT BY PRIOR seq + 1 = seq
AND PRIOR index_owner = index_owner
AND PRIOR index_name = index_name
)
)
a,
(
SELECT
table_owner,
table_name ,
index_owner,
index_name ,
SUBSTR(SYS_CONNECT_BY_PATH(column_name, ','), 2) column_name_list
FROM
(
SELECT
index_owner ,
index_name ,
table_owner ,
table_name ,
column_name ,
COUNT(1) OVER(PARTITION BY index_owner, index_name) cnt,
ROW_NUMBER() OVER(PARTITION BY index_owner, index_name ORDER BY column_position) AS seq
FROM
sys.dba_ind_columns
WHERE
(
index_owner LIKE 'E%'
OR index_owner LIKE 'TRIAL%'
OR index_owner = 'TEST'
)
AND index_owner NOT IN ('EXFSYS')
)
WHERE
seq = cnt START
WITH seq = 1 CONNECT BY PRIOR seq + 1 = seq
AND PRIOR index_owner = index_owner
AND PRIOR index_name = index_name
)
b,
dba_indexes i
WHERE
a.dup = a.dup_mx
AND a.index_owner = b.index_owner
AND a.index_name = b.index_name
AND a.index_owner = i.owner
AND a.index_name = i.index_name
ORDER BY
a.table_owner,
a.table_name ,
column_name_list_dup;
备注:需要根据实际情况调整index_owner的值
2.6.7异常对象检查
将数据表和索引分别存放在不同的表空间,方便管理,提高高可用性。SELECT OWNER, TABLESPACE_NAME TBS, TABLE_NAME TBL
FROM DBA_TABLES
WHERE TABLESPACE_NAME = 'MAIN';
SELECT OWNER, TABLESPACE_NAME TBS, TABLE_NAME, INDEX_NAME TBL
FROM DBA_INDEXES
WHERE TABLESPACE_NAME = 'MAIN';
2.6.8统计信息及收集方法
2.6.8.1收集索引统计信息
CALL SP_TAB_INDEX_STAT_INIT ('WW', 'T_USER');
2.6.8.2收集表统计信息CALL DBMS_STATS.GATHER_TABLE_STATS('WW', 'T_USER',NULL,100,TRUE,'FOR ALL COLUMNS SIZE AUTO');
2.6.8.3收集模式的统计信息CALL DBMS_STATS.GATHER_SCHEMA_STATS('WW',100,TRUE,'FOR ALL COLUMNS SIZE AUTO');
2.6.8.4查看统计信息
CALL DBMS_STATS.TABLE_STATS_SHOW(OWNNAME='WW',TABNAME='T_USER');
CALL DBMS_STATS.INDEX_STATS_SHOW(OWNNAME='WW',INDEXNAME='INDEX1317527581666300');
CALL DBMS_STATS.COLUMN_STATS_SHOW(OWNNAME='WW',TABNAME='T_USER',COLNAME='ID');
–表最后统计时间
SELECT ST.*
FROM SYSSTATS ST
INNER JOIN (SELECT ID
FROM SYS.SYSOBJECTS
WHERE NAME = 'T_USER'
AND SYSOBJECTS.SCHID =
(SELECT ID
FROM SYS.SYSOBJECTS
WHERE TYPE$ = 'SCH'
AND SYSOBJECTS.NAME = 'WW')) B
ON B.ID = ST.ID
ORDER BY ST.LAST_GATHERED DESC;
2.7锁检查
- 共享锁
共享锁(Share Lock,简称 S 锁)用于读操作,防止其他事务修改正在访问的对象。
这种封锁模式允许多个事务同时并发读取相同的资源,但是不允许任何事务修改这个资源。 - 排他锁
排他锁(Exclusive Lock,简称 X 锁)用于写操作,以独占的方式访问对象,不允许任何其他事务访问被封锁对象;防止多个事务同时修改相同的数据,避免引发数据错误;
防止访问一个正在被修改的对象,避免引发数据不一致。一般在修改对象定义时使用 - 意向锁
意向锁(Intent Lock)用于读取或修改被访问对象数据时使用,多个事务可以同时
对相同对象上意向锁,DM 支持两种意向锁:
- 意向共享锁(Intent Share Lock,简称 IS 锁):一般在只读访问对象时使用;
- 意向排他锁(Intent Exclusive Lock,简称 IX 锁):一般在修改对象数据时
使用。
四种锁模式的相容矩阵如下表所示,其中―Y‖表示相容;―N‖表示不相容。如表中第二
行第二列为―Y‖,表示如果某个事务已经加了 IS 锁时,其他事务还可以继续添加 IS 锁,
第二行第五列为―N‖,表示如果某个事务已经加了 IS 锁时,其他事务不能添加 X 锁。
历史锁
SELECT * FROM V$DEADLOCK_HISTORY;
当前锁
SELECT O.NAME, L.*
FROM V$LOCK L, SYSOBJECTS O
WHERE L.TABLE_ID = O.ID
AND BLOCKED = 1
2.8阻塞检查
WITH LOCKS AS
(SELECT O.NAME, L.*, S.SESS_ID, S.SQL_TEXT, S.CLNT_IP, S.LAST_SEND_TIME
FROM V$LOCK L, SYSOBJECTS O, V$SESSIONS S
WHERE L.TABLE_ID = O.ID
AND L.TRX_ID = S.TRX_ID),
LOCK_TR AS
(SELECT TRX_ID WT_TRXID, TID 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 WT_SQL, CLNT_IP, SS, WT_TRXID, BLK_TRXID FROM RES;
备注:事务84842被阻塞了,阻塞他的事务为84841,
SELECT SESS_ID,
"V$SESSIONS".SQL_TEXT,
STATE,
USER_NAME,
"V$SESSIONS".TRX_ID,
"V$SESSIONS".CREATE_TIME,
"V$SESSIONS".CLNT_HOST,
"V$SESSIONS".APPNAME,
"V$SESSIONS".CLNT_IP
FROM V$SESSIONS;
解决措施(sess_id):
SQL> sp_close_session(223781112);
2.9备份结果检查
本项检查备份日志是否正常,是否有备份失败发生。备份结果是否正常关系到数据库数据库发生损坏时,是否有正确的备份数据能够恢复,是否能在有限的时间内将应用恢复到正常水平,因此备份结果检查非常重要。备份结果检查应包含以下几项:
逻辑备份 (dexp)
物理备份
2.10参数是否优化检查
SELECT *
FROM V$DM_INI
WHERE PARA_NAME IN
('MAX_SESSIONS', 'MAX_SESSION_STATEMENT', 'COMPATIBLE_MODE');
判断标准:MAX_SESSIONS的值为8000,MAX_SESSION_STATEMENT的值为2000,COMPATIBLE_MODE的值为2,表示兼容oracle。
2.11归档检查
SELECT CREATE_TIME START_TIME,
CASE
WHEN ARCH_MODE = 'N' THEN
'非归档'
ELSE
'归档'
END
FROM V$DATABASE;
2.12性能检查常用语句
2.12.1查询当前活动会话
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$SESSIONS
WHERE STATE = 'ACTIVE';
2.12.2已执行超过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;
2.12.3耗时查询
查询最近10000条SQL历史记录,并按照耗时倒序排列select * from v$sql_history order by time_used desc
备注:执行时间(毫秒)
显示系统自启动以来执行时间最长的20条SQL语句
SELECT * FROM V$SYSTEM_LONG_EXEC_SQLS ORDER BY EXEC_TIME DESC;
2.12.4内存语句查询
最近 1000 条使用大内存的 sql 语句。一条 sql 语句使用的内存值超过 ini 参数LARGE_MEM_THRESHOLD,就认为使用了大内存。select * from V$LARGE_MEM_SQLS order by mem_used_by_k desc
–当前会话
SELECT
A.CREATOR ,
B.SQL_TEXT ,
SUM(A.TOTAL_SIZE)/1024/1024 TOTAL_M,
SELECT
A.CREATOR ,
B.SQL_TEXT ,
SUM(A.TOTAL_SIZE)/1024/1024 TOTAL_M,
SUM(A.DATA_SIZE) /1024/1024 DATA_SIZE_M
FROM
V$MEM_POOL A,
V$SESSIONS B
WHERE
A.CREATOR = B.THRD_ID
-- AND B.APPNAME ='DIsql.exe'
GROUP BY
A.CREATOR,
B.SQL_TEXT
ORDER BY
TOTAL_M DESC;
2.12.5实例中已执行未提交的 SQL 查询
SELECT T1.SQL_TEXT, T1.STATE, T1.TRX_ID
FROM V$SESSIONS T1, V$TRX T2
WHERE T1.TRX_ID = T2.ID
AND T1.STATE = 'IDLE'
AND T2.STATUS = 'ACTIVE';
2.12.6事务锁使用中的表查询
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
AND IGN_FLAG = 0;
备注:LMODE字段说明锁模式:S 锁、X 锁、IX 锁、IS 锁
–以下查找对应事务语句方法
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$SESSIONS
WHERE STATE = 'ACTIVE';
2.12.7以表大小排序
2.12.7.1按照数据行数排序
SELECT TABLE_NAME, NUM_ROWS
FROM DBA_TABLES
WHERE OWNER = 'WW'
AND NUM_ROWS IS NOT NULL
ORDER BY NUM_ROWS DESC;
2.12.7.2按照表占用的字节数
SELECT segment_name AS TABLENAME,
BYTES B,
BYTES / 1024 KB,
BYTES / 1024 / 1024 MB
FROM DBA_segments
WHERE DBA_SEGMENTS.OWNER='WW' AND SEGMENT_TYPE='TABLE' ORDER BY KB DESC
2.12.8TOP等待事件
SELECT *
FROM (SELECT EVENT,
TOTAL_WAITS,
AVERAGE_WAIT_MICRO,
TIME_WAITED,
WAIT_CLASS
FROM V$SYSTEM_EVENT
-- WHERE
-- WAIT_CLASS<>'IDLE'
ORDER BY TIME_WAITED DESC)
WHERE ROWNUM <= 10;
dbfile read:读用户数据文件;
dbfilemulti read:批量读用户数据文件;
dbfile readwait:写用户数据文件;
dbfile remote read:DSC 引起的读磁盘;
instance recovery read:recorvery 引起的读磁盘;
dbfile remote write:DSC 引起的写磁盘;
dbfile discardwrite:buf 不够引起的写磁盘;
dbfile ckptwrite:ckpt 引起的写磁盘;
dbfile extend:扩库文件引起的写磁盘;
shared memory poolbusy:共享内存并发使用冲突;
buffer busywait:buffer 并发使用冲突;
dict cache busy:字典 cache 并发使用冲突;
plan cache busy:计划 cache 发使用冲突;
redo log systembusy:redo log 系统并发冲突;
redo log bufferbusy:redo log 缓冲区并发冲突;
kernel busy:kernel并发冲突;
table lock busy:表锁系统并发冲突;
tid lock busy:行锁系统并发冲突;
parallel bdta pool busy:并行 bdta pool并发冲突;
iid system busy:iid 系统并发冲突;
session system busy:session 系统并发冲突;
public vpool busy:公共vpool 并发冲突;
psegqueue busy:pseg 队列并发冲突;
pseg stack busy:pseg 堆栈并发冲突;
page busy wait:数据页并发冲突;
table lock wait:事务间表锁等待发生;
trxid lock wait:事务间行锁等待发生;
dead lock:事务间产生死锁;
transaction system busy:事务系统并发冲突;
transaction view busy:事务可见性视图并发冲突;
purge system busy:purge 系统并发冲突;
file system busy:文件系统并发冲突;
asm system busy:ASM 系统并发冲突;
out of share mem pool:共享内存池不足;
out of share coldata pool:共享 coldata池不足:
network send wait:网络发送等待;
network recv wait:网络接收等待
2.12.9查看当前会话等待事件
SELECT * FROM V$SESSION_EVENT;
2.12.10查看会话等待事件的历史信息
select * from V$SESSION_WAIT_HISTORY;select * from V$SESSION_WAIT_HISTORY t1 where (t1.SESSADDR,t1.session#) in (SELECT t.SESSADDR,t."SESSION#" FROM V$SESSION_EVENT t )
2.12.11查看历史sql
SELECT * FROM V$SQL_HISTORY ORDER BY TIME_USED DESC
-- N_LOGIC_READ 语句逻辑读的次数
-- N_PHY_READ 语句物理读的次数
2.13数据库性能诊断
2.13.1sql日志
–设置 SQL 过滤规则,只记录必要的 SQL,生产环境不要设成 1– 2 只记录 DML 语句 3 只记录 DDL 语句 22 记录绑定参数的语句
– 25 记录 SQL 语句和它的执行时间 28 记录 SQL 语句绑定的参数信息
CALL SF_SET_SYSTEM_PARA_VALUE('SQL_TRACE_MASK','2:3:22:25:28',0,1);
–同步日志会严重影响系统效率,生产环境必须设置为异步日志
CALL SF_SET_SYSTEM_PARA_VALUE('SVR_LOG_ASYNC_FLUSH',1,0,1);
–下面这个语句设置只记录执行时间超过 200 ms 的语句
CALL SF_SET_SYSTEM_PARA_VALUE('SVR_LOG_MIN_EXEC_TIME',200,0,1);
–下面的语句查看设置是否生效
SELECT * FROM V$DM_INI where para_name='SVR_LOG_ASYNC_FLUSH';
SELECT * FROM V$DM_INI where para_name='SQL_TRACE_MASK';
SELECT * FROM V$DM_INI where para_name='SVR_LOG_MIN_EXEC_TIME';
–开启 SQL 日志:
SP_SET_PARA_VALUE(1, 'SVR_LOG', 1);
–关闭 SQL 日志:
SP_SET_PARA_VALUE(1, 'SVR_LOG', 0);
2.13.2Awr日志
启用系统包和AWR包:CALL SP_INIT_AWR_SYS(1);
CALL SP_CREATE_SYSTEM_PACKAGES(1);
设置快照间隔,如果不设置快照间隔,手动执行快照后 SYS.WRM$_SNAPSHOT 视图中没有记录:
CALL DBMS_WORKLOAD_REPOSITORY.AWR_SET_INTERVAL(30);
在两个时间点分别手动创建快照,或者等待系统自动生成:
17:00时创建第一快照:
CALL DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT();
30分钟后再创建一个,17:30,
CALL DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT();
查询 AWR 快照:
SELECT* FROM SYS.WRM$_SNAPSHOT;
创建AWR报告,SYS.AWR_REPORT_HTML(快照ID1,快照ID2,‘AWR报告存放路径’,‘AWR报告名称.HTLM’);:
SYS.AWR_REPORT_HTML(1,2,'/home/dmdba','AWR1.HTML');
2.13.3JDBC驱动日志
2.14解决方案
2.14.1表设计优化
2.14.2索引设计优化
2.14.2.1适合使用索引的场景
- 主键自动创建唯一索引
- 频繁作为查询条件的字段
- 查询中与其他表关联的字段
- 查询中排序的字段
- 查询中统计或分组字段
2.14.2.2不适合使用索引的场景 - 频繁更新的字段
- where条件中用不到的字段
- 表记录太少(300)
- 经常增删改的表
- 字段的值的差异性不大或重复性高
三. 日常维护命令
3.1数据表空间管理
3.1.1创建表空间
CREATE TABLESPACE DMTS01 DATAFILE '/dm8/data/DAMENG/DMTS01.DBF' SIZE 500 ;
3.1.2添加数据文件
--添加
alter tablespace DMTS01 add datafile '/dm8/data/DAMENG/DMTS00.DBF' size 500 ;
--自动扩展
alter tablespace DMTS01 datafile '/dm8/data/DAMENG/DMTS00.DBF' autoextend on MAXSIZE UNLIMITED;
SELECT
ts.NAME,
df.PATH
FROM
V$TABLESPACE AS ts,
V$DATAFILE AS df
WHERE
ts.ID = df.GROUP_ID and ts.NAME='DMTS01';
3.1.3查看表空间扩张能力
SELECT TABLESPACE_NAME,
FILE_ID,
FILE_NAME,
BYTES / 1024 / 1024 AS "SPACE(M)",
AUTOEXTENSIBLE,
MAXBYTES / 1024 / 1024 AS "maxSPACE(M)"
FROM DBA_DATA_FILES
order by TABLESPACE_NAME;
3.2用户管理
3.2.1创建用户
CREATE USER DMTEST IDENTIFIED BY DMTEST123 DEFAULT TABLESPACE DMTS01;
GRANT RESOURCE TO DMTEST;
3.2.2修改口令
ALTER USER DMTEST IDENTIFIED BY "DMTEST1234";
3.2.3锁定账户SELECT * FROM DBA_USERS WHERE DBA_USERS.USERNAME = 'WW';
ALTER USER WW ACCOUNT LOCK;
3.2.4解锁账户
SELECT * FROM DBA_USERS WHERE DBA_USERS.USERNAME = 'WW';
ALTER USER WW ACCOUNT UNLOCK;
四. 服务器日常监控
4.1系统空间使用率
关注文件系统空间增长情况,如果文件操作系统空间使用率达到80%,则将超过80%使用率的文件系统记录在检查表上,计划增加文件系统空间或找出空间异常原因;如果接近空间使用率接近或超过90%,则应立即通知管理员,找出空间快速增长的原因,并将空间使用率降至80%以下,并在备注栏注明该操作。root@hadoop4:[/etc/systemd/system]df -hT
4.2全局负载
[root@localhost ~]# top4.3局部负载
[root@localhost ~]# ps -ef |grep dms[root@localhost ~]# top -Hp 893
4.4CPU负载
dmdba@hadoop4:[/dm8/bin]sar -u 1 114.5内存负载
dmdba@hadoop4:[/dm8/bin]vmstat 1 11dmdba@hadoop4:[/var/log/sa]sar -r 1 11