
1.查看版本
版本:
Select * from v$version;
小版本号:
select BUILD_VERSION from v$instance;
补丁号:
select id_code();
2.数据库基本信息
数据库名、归档模式、创建时间、最近一次启动时间
select NAME,ARCH_MODE,CREATE_TIME,LAST_STARTUP_TIME FROM V$DATABASE;
初始化参数:
select '实例名称' 数据库选项,INSTANCE_NAME 数据库集群相关参数值 FROM v$instance union allselect '数据库版本',substr(svr_version,instr(svr_version,'(')) FROM v$instance union all SELECT '字符集',CASE SF_GET_UNICODE_FLAG() WHEN '0' THEN 'GBK18030' WHEN '1' then 'UTF-8' when '2' then 'EUC-KR' end union allSELECT '页大小',cast(PAGE()/1024 as varchar) union all SELECT '簇大小',cast(SF_GET_EXTENT_SIZE() as varchar) union allSELECT '大小写敏感',cast(SF_GET_CASE_SENSITIVE_FLAG() as varchar) union allselect '数据库模式',MODE$ from v$instance union allselect '唯一魔数',cast(permanent_magic as varchar) union allselect 'LSN',cast(cur_lsn as varchar) from v$rlog;
select '实例名称' 数据库选项,INSTANCE_NAME 数据库集群相关参数值 FROM v$instance union allselect top 1 '数据库版本', banner ||'.'||id_code from v$versionunion allSELECT '字符集',CASE SF_GET_UNICODE_FLAG() WHEN '0' THEN 'GBK18030' WHEN '1' then 'UTF-8' when '2' then 'EUC-KR' end union allSELECT '页大小',cast(PAGE()/1024 as varchar) union allSELECT '簇大小',cast(SF_GET_EXTENT_SIZE() as varchar) union allSELECT '大小写敏感',cast(SF_GET_CASE_SENSITIVE_FLAG() as varchar) union allselect '数据库模式',MODE$ from v$instance;
3.服务器资源信息
CPU、内存、磁盘等
SELECT N_CPU,TOTAL_PHY_SIZE,FREE_PHY_SIZE,TOTAL_DISK_SIZE,FREE_DISK_SIZE,DRIVER_NAME FROM V$SYSTEMINFO;
4.字符集
select unicode();Select sf_get_unicode_flag();SELECT (CASE SF_GET_UNICODE_FLAG() WHEN '0' THEN 'GBK18030' WHEN '1' THEN 'UTF-8' WHEN '2' THEN 'EUC-KR' END);
其中:0表示GB18030;1表示UTF-8; 2表示EUC-KR
5.大小写敏感
查询大小写是否敏感:
SELECT SF_GET_CASE_SENSITIVE_FLAG();SELECT CASE_SENSITIVE();
6.页大小
SELECT SF_GET_PAGE_SIZE();SELECT CAST(PAGE()/1024 AS VARCHAR);
7.簇大小
SELECT SF_GET_EXTENT_SIZE();
8.数据文件信息
表空间、数据文件路径名称、自动扩展、最大扩展
SET PAGESIZE 100;SELECT TABLESPACE_NAME,FILE_NAME,BYTES,STATUS,AUTOEXTENSIBLE,MAXBYTES FROM DBA_DATA_FILES;
9.表空间
表空间使用率:
selecta.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(selecttablespace_name,sum(bytes) freefromdba_free_spacegroup bytablespace_name)a,(selecttablespace_name,sum(bytes) totalfromdba_data_filesgroup bytablespace_name)bwherea.tablespace_name = b.tablespace_nameORDER BY"使用率" DESC;
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) freeFROM dba_free_spaceGROUP BY tablespace_name) a,(SELECT tablespace_name, SUM(bytes) totalFROM dba_data_filesGROUP BY tablespace_name) bWHERE a.tablespace_name = b.tablespace_name;
10.Temp表空间
TEMP 表空间完全由 DM 数据库自动维护。当用户的 SQL 语句需要磁盘空间来完成某个操作时,DM 数据库会从 TEMP 表空间分配临时段。如创建索引、无法在内存中完成的排序操作、SQL 语句中间结果集以及用户创建的临时表等都会使用到 TEMP 表空间。
查看方法如下:
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) freeFROM dba_free_spaceGROUP BY tablespace_name) a,(SELECT tablespace_name, SUM(bytes) totalFROM dba_data_filesGROUP BY tablespace_name) bWHERE a.tablespace_name = b.tablespace_name;
11.控制文件
控制文件信息
show parameter ctl;Select para_name,para_value from v$dm_ini where para_name='CTL_PATH';select name,type,value,default_value,isdefault from v$parameter where name like '%CTL%';
转储控制文件
dmctlcvt TYPE=1 SRC=/dm8/ctl/dm01.ctl DEST=/dm8/tmp/20250306_dmctl.txt
转储控制文本文件为二进制
dmctlcvt TYPE=2 SRC=/dm8/tmp/20250306_dmctl.txt DEST=/dm8/ctl02/dm02.ctl
12.REDO日志文件
查看:
select group_id,file_id,path,rlog_size,create_time from v$rlogfile;
SELECTA.FILE_ID ,A.PATH ,A.CLIENT_PATH,A.RLOG_SIZE ,B.FREE_SPACE ,B.TOTAL_SPACE,B.CUR_FILEfrom(select * from V$RLOGFILE where true) A,(select * from V$RLOG where true) B;
添加REDO日志文件:
ALTER DATABASE ADD LOGFILE '/dm8/redo/dm_redo03.log' size 1024;
扩展REDO日志文件
alter database resize logfile '/dm8/redo/dm_redo03.log' to 2048;
13.实例初始化
[dmdba@cjc-db-01 dmdbms]$ dminit help...CHARSET/UNICODE_FLAG CHARSET(0), optional value:0[GB18030],1[UTF-8],2[EUC-KR]
可以看到字符集默认GB18030,本次选择字符集为UTF-8。
开始初始化
注意:
部分参数只有初始化时可以指定,一旦初始化完成,不再支持参数的修改,例如CHARSET等参数。
dminit path=/dm8/data CTL_PATH=/dm8/ctl/dm01.ctl LOG_PATH=/dm8/redo/dm_redo01.log LOG_PATH=/dm8/redo/dm_redo02.log LOG_SIZE=2048 CASE_SENSITIVE=N CHARSET=1 DB_NAME=cjc INSTANCE_NAME=cjc EXTENT_SIZE=32 PAGE_SIZE=32 SYSDBA_PWD=************ SYSAUDITOR_PWD=************ BUFFER=2048 PORT_NUM=5238 AUTO_OVERWRITE=0
参数说明
Path: 初始数据库存放路径CTL_PATH:控制文件路径LOG_PATH:日志文件路径CASE_SENSENSITIVE:大小写敏感,可选择值,Y/N 1/0CHARSET:字符集:0(GB18030)、1(UTF-8)、2(EUC-KR)DB_NAME:数据库名INSTANCE_NAME:实例名SYSDBA_PWD:设置SYSDBA密码SYSAUDITOR_PWD:设置SYSAUDITOR 密码BUFFER:系统缓存大小PORT_NUM:数据库服务器监听端口号
14.注册和取消服务
注册服务
root用户执行
cd /dm8/dbms/script/root./dm_service_installer.sh -t dmserver -dm_ini dm8/data/cjc/dm.ini -p cjc
取消注册服务:
./dm_service_uninstaller.sh -n 服务名称
15.达梦数据库启动和关闭
启动(三种方式):
systemctl start DmServiceCJC.serviceDmServiceCJC startdmserver dm8/data/CJC/dm.ini
关闭(三种方式):
systemctl stop DmServiceCJC.serviceshutdown immediate;DmServiceCJC stop
守护进程的启动和关闭
systemctl start DmWatcherServiceWATCHER.servicesystemctl stop DmWatcherServiceWATCHER.service
监控器的启动和关闭:
systemctl start DmMonitorServiceMONITOR.servicesystemctl stop DmMonitorServiceMONITOR.service
16.达梦数据库连接
(1):本地连接su - dmdba语法:disql 用户名:端口号disql 用户名/密码:端口号示例:disql SYSDBA:5238disql SYSDBA/******:5238
(2):远程连接语法:disql 用户名@IP:端口号disql 用户名/密码@IP:端口号示例:disql SYSDBA@IP:5238disql SYSDBA/******@IP:5238
(3):服务名连接使用服务名连接,需要提前在客户端所在服务器配置/etc/dm_svc.conf文件守护集群配置示例:vi etc/dm_svc.conf##全局配置区TIME_ZONE=(480)LANGUAGE=(cn)DMHACJC=(IP1:5238,IP2:5238)##服务配置[DMHACJC]SWITCH_TIMES=(3)SWITCH_INTERVAL=(100)LOGIN_MODE=(1)其中:LOGIN_MODE=(1)表示只连接主库;IP1和IP2是主、备库的物理IP。连接方式:disql 用户名@服务名disql 用户名/密码@服务名例如:disql sysdba/******@DMHACJC
17.查询参数
查询参数:
查询方法:
1.v$parameter2.v$dm_ini3.dm.ini文件4.show parameter命令5.通过函数查看
方法1:v$parameter
select name,type,value,default_value,isdefault from v$parameter where name='BUFFER';
方法2:v$dm_ini
SELECT PARA_NAME,PARA_VALUE,MIN_VALUE,MAX_VALUE,DEFAULT_VALUE FROM V$DM_INI WHERE PARA_NAME='BUFFER';
方法3:dm.ini文件
dmdba@CJC-DB-01:/db/dm8/data/cjc$cat dm.ini|grep -w BUFFER
方法4:show parameter命令
SQL> show parameter buffer
方法5:函数方式
查看BUFFER参数内存中的值
SELECT SF_GET_PARA_VALUE(2,'BUFFER');
查看常见参数:
set pagesize 100;select name,type,value,default_value,isdefault from v$parameterwhere name in('MEMORY_POOL','BUFFER','PWD_POLICY','SORT_BUF_SIZE','MAX_SESSIONS','TEMP_SPACE_LIMIT','CALC_AS_DECIMAL','RLOG_BUF_SIZE','DICT_BUF_SIZE','CACHE_POOL_SIZE','GLOBAL_STR_CASE_SENSITIVE','GLOBAL_CHARSET') order by type,name;
参数类型
select distinct type,count(*) from v$parameter group by type order by 2 desc;
18.权限
1.查询CJC用户有哪些角色
select grantee,granted_role from dba_role_privs where grantee in ('CJC') order by 1;
一共有19种role角色:
select ROLE FROM DBA_ROLES order by 1;或select distinct granted_role from dba_role_privs order by 1;
2.查询CJC用户有哪些系统权限
Select grantee,privilege from dba_sys_privs where grantee in ('CJC') order by 1;
3.查询CJC用户有哪些对象权限
Select grantee,privilege from dba_tab_privs where grantee in ('CJC') order by 1;
4.查询CJC用户有哪些列权限
Select grantee,privilege from dba_col_privs where grantee in ('CJC') order by 1;
6.查看RESOURCE 角色对应的权限
系统权限
SET PAGESIZE 100;Select privilege from dba_sys_privs where grantee in ('RESOURCE') order by 1;
7.拥有DBA角色的用户
select grantee,granted_role from dba_role_privs where GRANTED_ROLE='DBA';
8.用户权限信息
通过以下 SQL 命令可以对用户的权限信息进行检查,包括用户名、权限、类型等信息。
SELECT * 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_PRIVSUNION SELECT GRANTEE,PRIVILEGE,'SYS_PRIVS' PRIVILEGE_TYPE,ADMIN_OPTION FROM DBA_SYS_PRIVSUNION SELECT GRANTEE,PRIVILEGE||' ON '||OWNER||'.'||TABLE_NAME PRIVILEGE,'TABLE_PRIVS' PRIVILEGE_TYPE,GRANTABLE FROM DBA_TAB_PRIVS)WHERE GRANTEE IN (SELECT USERNAME FROM ALL_USERS WHERE USERNAME NOT IN ('SYS','SYSDBA','SYSSSO','SYSAUDITOR') )ORDER BY GRANTEE,PRIVILEGE_TYPE,PRIVILEGE;
19.查询表定义
CALL SP_TABLEDEF('CJC','EMP');select dbms_metadata.get_ddl('TABLE','EMP','CJC') from dual;
20.表使用情况
已分配给表的页面数
SELECT table_used_space('CJC','EMP');
表已使用的页面数
SELECT table_used_pages('CJC','EMP');
查询某个表的大字段空间占用大小
select obj.name,seg.n_extent*sf_get_page_size()*sf_get_extent_size()/1024/1024 MBfrom sysobjects objleft join v$lob_seg segon obj.id=seg.tab_idwhere obj.name ='表名';
查询分区子表的对象大小和占用空间
询分区表的每个分区的对象大小和占用空间,便于评估分区表数据量。
select schname,ptab,subtabname,TABLE_USED_PAGES(schname,subtabname)*page()/1024/1024.0 as "子表对象大小_MB",TABLE_USED_SPACE(schname,subtabname)*page()/1024/1024.0 as "子表占用空间_MB"from(select SF_GET_SCHEMA_NAME_BY_ID(b.schid) as schname,b.name as subtabname,a.name as ptabfrom sysobjects a,sysobjects bwhere a.id=b.pidand b.subtype$='UTAB' and a.name='<分区表名>')order by 3;
21.查询列信息
查询用户中所有表所有列的注释、列类型、列长度、是否允许为空、缺省值
SELECTTAB.NAME AS "表名",SYSCOL.NAME AS "列名",SYSCOL.TYPE$||'('||SYSCOL.LENGTH$||')' AS "列类型and列长度",SYSCOL.NULLABLE$ as "是否为空" ,SYSCOL.DEFVAL AS "缺省值",COMM.COMMENT$FROMSYSOBJECTS AS TAB,SYSOBJECTS AS SCH,SYSCOLUMNS AS SYSCOL,SYSCOLUMNCOMMENTS as COMMWHERESCH.ID =TAB.SCHIDAND TAB.ID =SYSCOL.IDAND SCH.NAME = 'SYSDBA'AND SYSCOL.NAME = COMM.COLNAMEand TAB.NAME IN(select TABLE_NAME from ALL_TABLES WHERE OWNER = 'SYSDBA'--用户名);
22.查看索引信息
索引信息
SELECT TABLE_NAME,INDEX_NAME,INDEX_TYPE,STATUS FROM USER_INDEXES WHERE TABLE_NAME='EMP';
索引 和 列的信息
set line 300set pagesize 100col TABLE_OWNER for a15col TABLE_NAME for a30col COLUMN_NAME for a15col INDEX_NAME for a35select TABLE_OWNER,TABLE_NAME,COLUMN_NAME,INDEX_NAME from dba_ind_columns where TABLE_NAME in ('T1') order by 2,4,3;
SELECT TABLE_NAME,INDEX_NAME,COLUMN_NAME FROM USER_IND_COLUMNS WHERE TABLE_NAME='EMP';
索引定义语句
select dbms_metadata.get_ddl('INDEX','IDX_EMP_NAME','CJC') from dual;
selectindexdef(id, 1)fromsysobjectswherepid =(SELECTIDFROMsysobjectsWHERENAME='T1'AND SCHID =(SELECT ID FROM SYSOBJECTS WHERE NAME='CJC' AND TYPE$='SCH'))and subtype$ = 'INDEX'and name != 'INDEX' || id ;
重组表的索引
SP_REORGANIZE_INDEX('用户名','索引名');
23.查看约束信息
查询约束:
SELECT OWNER,CONSTRAINT_NAME,CONSTRAINT_TYPE,TABLE_NAME,STATUS,DEFERRABLE FROM DBA_CONSTRAINTS WHERE OWNER='CJC';
查询统计表的各种约束
查询主键SELECT a.OWNER as "模式名",a.TABLE_NAME as "表名",b.COLUMN_NAME as "列名", a.CONSTRAINT_NAME as "约束名"from DBA_CONSTRAINTS a, ALL_CONS_COLUMNS b where a.CONSTRAINT_NAME=b.CONSTRAINT_NAME and CONSTRAINT_TYPE='P';查询外键SELECT a.OWNER as "模式名",a.TABLE_NAME as "表名",b.COLUMN_NAME as "列名", a.CONSTRAINT_NAME as "约束名"from DBA_CONSTRAINTS a, ALL_CONS_COLUMNS b where a.CONSTRAINT_NAME=b.CONSTRAINT_NAME and CONSTRAINT_TYPE='R';查询唯一约束SELECT a.OWNER as "模式名",a.TABLE_NAME as "表名",b.COLUMN_NAME as "列名", a.CONSTRAINT_NAME as "约束名"from DBA_CONSTRAINTS a, ALL_CONS_COLUMNS b where a.CONSTRAINT_NAME=b.CONSTRAINT_NAME and CONSTRAINT_TYPE='U';查询check约束SELECT a.OWNER as "模式名",a.TABLE_NAME as "表名",b.COLUMN_NAME as "列名", a.CONSTRAINT_NAME as "约束名",SEARCH_CONDITION as "CHECK约束的条件"from DBA_CONSTRAINTS a, ALL_CONS_COLUMNS b where a.CONSTRAINT_NAME=b.CONSTRAINT_NAME and CONSTRAINT_TYPE='C';查询默认列SELECT OWNER as "模式名",TABLE_NAME as "表名",COLUMN_NAME as "列名",DATA_TYPE as "列类型",DATA_DEFAULT as "默认值" FROM DBA_TAB_COLUMNS WHERE DATA_DEFAULT IS NOT NULL;查询非空列SELECT OWNER as "模式名",TABLE_NAME as "表名",COLUMN_NAME as "列名",DATA_TYPE as "列类型" FROM DBA_TAB_COLUMNS WHERE NULLABLE ='Y';
约束定义语句:
select dbms_metadata.get_ddl('CONSTRAINT','CK_DEPT_ID','CJC') from dual;select dbms_metadata.get_ddl('CONSTRAINT','CONS134220458','CJC') from dual;select dbms_metadata.get_ddl('CONSTRAINT','fk_emp_deptno','CJC') from dual;
24.视图依赖
查看某个表被哪些视图引用
select * from DBA_dependencies T WHERE t.REFERENCED_NAME = '表名';select * from DBA_dependencies T WHERE t.REFERENCED_NAME = 'DEPARTMENT';
25.查询外键关联表
selectt1.owner 原始表用户名,t1.table_name 原始表,t2.owner as 被依赖表用户名,t2.table_name as 被依赖的表,t1.constraint_name 外键名称,a1.column_name 列,a2.column_name as 被依赖的列from dba_constraints t1, dba_constraints t2, dba_cons_columns a1, dba_cons_columns a2wheret1.r_constraint_name = t2.constraint_name andt1.constraint_name = a1.constraint_name andt1.r_constraint_name = a2.constraint_nameorder by t1.owner;
26.查询使用自增列的表
select b.owner,b.table_name,a.name COL_NAMEfromSYS.SYSCOLUMNS a,all_tables b ,sys.sysobjects cwherea.INFO2=1and a.id =c.idand c.name = b.table_name order by 1,2,3;
28.查询模式
用户和模式:
select a.name as username, b.name as schenma from sysobjects a inner join sysobjects b on a.id = b.pid where b.subtype$ is null order by username,schenma;
select a.name as username, b.name as schenma from sysobjects a inner join sysobjects b on a.id = b.pid where b.subtype$ is null and a.name='CJC' order by username,schenma;
当前模式:
SELECT SF_GET_SCHEMA_NAME_BY_ID(CURRENT_SCHID());
29.查看对象大小
SELECT TABLE_USED_SPACE('CJC','T1')*page()/1024/1024.0 FROM dual;
SELECT segment_name AS TABLENAME,BYTES B,BYTES / 1024 KB,BYTES / 1024 / 1024 MBFROM user_segmentsWHERE segment_name = upper('CJC');
30.查询系统函数以及参数定义
select i.id,i.name as f_name,i.arg_num,ig.name as arg_name,ig.seq,ig.data_type,ig.len,ig.prec,ig.io_type,i.IS_READONLY,i.IS_MOUNT_ONLY,i.IS_INCLUDE_SQL,i.IS_LPQ_FORBIDDEN,i.CLASS$from v$ifun i,v$ifun_arg igwhere i.id=ig.idand i.name = 'SP_CLOSE_SESSION'order by 1,2,3,5;
31.查看作业信息
查看当前库中的作业状态是否启用
select name,CASE ENABLE WHEN '1'THEN '已启用' when '0' THEN '已禁用' end as enablefrom USER_JOBS_VIEW;
作业信息
set pagesize 300;SELECT EXEC_ID,NAME,START_TIME,END_TIME,ERRCODE,JOBID FROM SYSJOB.SYSJOBHISTORIES2 ORDER BY START_TIME;
查看所有作业信息
SELECT A.ID,A.NAME,A."ENABLE",A.USERNAME,A.CREATETIME,A.MODIFYTIME,A.DESCRIBE,B.LAST_DATE||' '||B.LAST_SEC LAST_TIME,B.NEXT_DATE||' '||B.NEXT_SEC NEXT_TIME,B.WHATFROM SYSJOB.SYSJOBS A,SYSJOB.USER_JOBS BWHERE A.ID=B.JOB;
查看所有作业调度信息
SELECT * FROM SYSJOB.SYSJOBSCHEDULES;
通过 SQL 命令检查。通过执行以下命令查看作业运行历史信息。
SELECT *FROM SYSJOB.SYSSTEPHISTORIES2 AWHERE (SELECT COUNT(*)FROM SYSJOB.SYSSTEPHISTORIES2 BWHERE B.NAME = A.NAMEAND B.EXEC_ID >= A.EXEC_ID) <= 10ORDER BY A.START_TIME DESC,A.NAME;
32.查询数据字典和视图
动态性能视图v$dynamic_tables数据字典SYSOBJECTS
例如:查看SQL相关的动态性能视图 和 数据字典
set pagesize 500;select NAME from v$dynamic_tables where NAME like '%SQL%';select NAME from SYSOBJECTS where NAME like '%SQL%';
33.统计信息
查询统计信息:
select a.object_name,a.owner,a.object_type,b.last_gatheredfrom dba_objects a,SYSSTATS bwhere a.object_id = b.id --and a.OWNER = '用户名'order by b.last_gathered limit 10;
查询CJC用户下T1表上字段的具体统计信息:
select * from (select o.owner,o.object_name,b.column_name,b.column_id,b.data_type,s.t_total,s.n_smaple,s.n_distinct,s.n_null,s.n_buckets,s.last_gatheredfrom sysstats sinner join dba_objects o on s.id=o.object_idinner join dba_tab_columns b on o.owner=b.owner and o.object_name=b.table_name and s.colid+1=b.column_idwhere o.owner='CJC'and o.object_name='T1'and o.object_type='TABLE')order by b.column_id;
## CALL SP_DB_STAT_INIT ();
收集表统计信息:示例如下:DBMS_STATS.GATHER_TABLE_STATS(OWNNAME=>'CJC',TABNAME=>'T1',ESTIMATE_PERCENT=>100,METHOD_OPT=>'FOR ALL COLUMNS SIZE AUTO',CASCADE=>TRUE);收集索引统计信息:示例如下:DBMS_STATS.GATHER_INDEX_STATS(OWNNAME=>'CJC',INDNAME=>'IDX001',ESTIMATE_PERCENT=>100);收集模式下对象的统计信息示例如下:DBMS_STATS.GATHER_SCHEMA_STATS(OWNNAME=>'CJC',ESTIMATE_PERCENT=>100,METHOD_OPT=>'FOR ALL COLUMNS SIZE AUTO',CASCADE=>TRUE);收集某表某列的统计信息:STAT 100 ON table_name(column_name);删除表统计信息根据设定参数,删除与表相关对象的统计信息。示例如下:DBMS_STATS.DELETE_TABLE_STATS(OWNNAME=>'CJC',TABNAME=>'T1',CASCADE_INDEXES='TRUE');删除模式统计信息根据设定参数,删除模式下对象的统计信息。示例如下:DBMS_STATS.DELETE_SCHEMA_STATS(OWNNAME=>'CJC');删除索引统计信息示例如下:DBMS_STATS.DELETE_INDEX_STATS(OWNNAME=>'CJC',INDNAME=>'IDX001');删除列统计信息示例如下:DBMS_STATS.DELETE_COLUMN_STATS(OWNNAME=>'CJC',TABNAME=>'T1',COLNAME=>'COL1');
查看统计信息收集进度:
SELECT wm_concat(progess) from (select COUNT(*) progess from dba_tables whereOWNER='SYSDBA' AND to_char(last_analyzed,'yyyymmdd') =to_char(sysdate,'yyyymmdd') --目前收集的个数UNIONSELECT COUNT(*) progess from dba_tables where OWNER='SYSDBA' --总的表个数);
34.SQL跟踪日志
show parameter SVR_LOG开启跟踪日志SP_SET_PARA_VALUE(1,'SVR_LOG',1);关闭SVR_LOGSP_SET_PARA_VALUE(0,'SVR_LOG',1);
35.视图查看慢SQL
1. SQL 记录配置
当 INI 参数 ENABLE_MONITOR=1、MONITOR_TIME=1 打开时,显示系统最近 1000 条执行时间超过预定值的 SQL 语句,默认预定值为 1000 毫秒。
以上两个参数可通过 SP_SET_PARA_VALUE 系统函数修改,通过 SF_GET_PARA_VALUE 系统函数查看当前值。
查看参数值
select SF_GET_PARA_VALUE(1,'ENABLE_MONITOR');select SF_GET_PARA_VALUE(1,'MONITOR_TIME');
修改参数值
SP_SET_PARA_VALUE(1,'ENABLE_MONITOR',1);SP_SET_PARA_VALUE(1,'MONITOR_TIME',1);
查询
SELECT * FROM V$LONG_EXEC_SQLS;
查询当前正在执行的会话信息。
SELECT * FROM (SELECT 'SP_CLOSE_SESSION('||SESS_ID||');' AS CLOSE_SESSION,DATEDIFF(SS,LAST_SEND_TIME,SYSDATE) sql_exectime,TRX_ID,CLNT_IP,B.IO_WAIT_TIME AS IO_WAIT_TIME,SF_GET_SESSION_SQL(SESS_ID) FULLSQL,A.SQL_TEXTFROM V$SESSIONS a,V$SQL_STAT B WHERE STATE IN ('ACTIVE','WAIT')AND A.SESS_ID = B.SESSID);
36.生成执行计划
方法一:EXPLAIN
explain select id,name,time from cjc.t1 where id=100;
方法二:AUTOTRACE
SQL> set autotrace onSQL> select * from cjc.t1;SQL> set autotrace traceonlySQL> select * from cjc.t1;
37:ET工具
ET 工具是 DM 数据库自带的 SQL 性能分析工具,能够统计 SQL 语句执行过程中每个操作符的实际开销,为 SQL 优化提供依据以及指导。
1. 功能的开启/关闭
ET 功能默认关闭,可通过配置 INI 参数中的 ENABLE_MONITOR=1、MONITOR_SQL_EXEC=1 开启该功能。
两个参数均为动态参数,可直接调用系统函数进行修改
查询
select SF_GET_PARA_VALUE(1,'ENABLE_MONITOR');select SF_GET_PARA_VALUE(1,'MONITOR_SQL_EXEC');
启动 ET
SP_SET_PARA_VALUE(1,'ENABLE_MONITOR',1);SP_SET_PARA_VALUE(1,'MONITOR_SQL_EXEC',1);
查看方式
执行 SQL 语句后,客户端会返回 SQL 语句的执行号。单击执行号即可查看 SQL 语句对应的 ET 结果。
如果没有图形界面,调用存储过程可返回相同结果。
select * from cjc.t1;
SET PAGESIZE 100;CALL ET(9713);
关闭 ET
SP_SET_PARA_VALUE(1,'ENABLE_MONITOR',0);SP_SET_PARA_VALUE(1,'MONITOR_SQL_EXEC',0);
38.10053事件
开启10053事件:alter session set events '10053 trace name context forever,level 1';...执行SQL...关闭10053事件:alter session set events '10053 trace name context off';查看trace日志:select para_name,para_value from v$dm_ini where para_name like '%TRACE_PATH%';
调整级别:
其中 session 0 表示所有会话,省略表示为当前会话。level 1:输出查询语句计划中单表过滤或多表连接的优化过程。level 2:输出查询语句计划中单表过滤以及多表连接的优化过程。alter session 0 set events '10053 trace name context forever,level 1';
39.使用 DBMS_SQLTUNE 包获取 SQL 执行信息
DBMS_SQLTUNE 包提供一系列对实时 SQL 监控的方法。
当 SQL 监控功能开启后,DBMS_SQLTUNE 包可以实时监控 SQL 执行过程中的信息,包括:执行时间、执行代价、执行用户、统计信息等情况。SQL 监控功能开启的方法是将 DM.INI 参数 ENABLE_MONITOR 和 MONITOR_SQL_EXEC 均设置为 1。
具体操作步骤:
设置 disql 界面显示长度。SET LONG 9999999打开 MONITOR_SQL_EXECsf_set_session_para_value('MONITOR_SQL_EXEC',1);执行需要调优的 SQL,例如如下 SQL:select * from cjc.t1;调用 DBMS_SQLTUNE.REPORT_SQL_MONITOR,例如传入执行 ID 17909。select DBMS_SQLTUNE.REPORT_SQL_MONITOR(SQL_EXEC_ID=>17909) from dual;
40.查询内存中执行计划
获取内存的执行计划,计划生成时间,相关表和模式
selects.phd_time ,s1.name as sch_name,c.cache_item ,'sp_clear_plan_cache('|| c.cache_item|| ');','alter session set events ''immediate trace name plndump level '|| C.CACHE_ITEM|| ',dump_file ''''/tmp/'|| C.CACHE_ITEM||'.log'''''';',c.HASH_VALUE ,c.sqlstrfromv$cachepln cjoin V$SQL_PLAN sonc.cache_item=s.PLN_ADDRand c.HASH_VALUE=s.HASH_VALUEjoin sysobjects s1ons.SCHID=s1.idwherec.sqlstr like '获取计划的sql%' ;
41.绑定执行计划
设置参数 LOAD_BINDED_PLN=1sp_set_para_value(1,'LOAD_BINDED_PLN',1);通过查询执行计划缓存视图,找到 SQL 需要绑定的正确执行计划缓存的 hash 值。select * from v$cachepln where sqlstr like '%XXX%'绑定执行计划,通过语句 hash 值绑定执行计划。--内存中绑定SP_SET_PLN_BINDED(-522750294, 'SYSDBA', 'SQL', 1);--持久化绑定SP_SET_PLN_BINDED(-522750294, 'SYSDBA', 'SQL', 2);如果想取消绑定,清理计划缓存即可。sp_clear_plan_cache(-522750294);
补充查询视图信息
--查询系统中绑定执行计划持久化的信息。
select * from SYSPLNINFO;
--查询系统中绑定执行计划对应字典对象的信息。
select * from SYSPLNOBJID;
42.会话信息
查询当前所有会话数
select count(*) from v$sessions;
查看当前数据库中活动会话
select count(*) from v$sessions where state='ACTIVE';
查看当前空闲会话
select count(*) from v$sessions where state='IDLE';
结束会话
sp_close_session(sess_id);
操作系统命令查询会话数
假设端口为 5236:
lsof -i:5236|grep dmserver|wc -lnetstat -nat|awk '{print $4}'|grep 5236|wc -l
会话汇总
select count(*),state from v$sessions group by state;select count(*),clnt_ip from v$sessions group by clnt_ip;
用户的主机名和用户的 IP 等信息:
SELECT CLNT_HOST,CLNT_IP,OSNAME FROM V$SESSIONS;
活跃的会话
select--sysdate ,datediff (ss, last_recv_time, SYSDATE) Y_EXETIME,---SF_GET_SESSION_SQL(SESS_ID), --获取完整 SQLsess_id ,sess_seq ,---sql_text ,state ,seq_no ,user_name ,trx_id--create_timefromv$sessionswherestate='ACTIVE';
当前正在执行的会话
SELECT * FROM (SELECT 'SP_CLOSE_SESSION('||SESS_ID||');' AS CLOSE_SESSION,DATEDIFF(SS,LAST_SEND_TIME,SYSDATE) sql_exectime,TRX_ID,CLNT_IP,B.IO_WAIT_TIME AS IO_WAIT_TIME,SF_GET_SESSION_SQL(SESS_ID) FULLSQL,A.SQL_TEXTFROM V$SESSIONS a,V$SQL_STAT B WHERE STATE IN ('ACTIVE','WAIT')AND A.SESS_ID = B.SESSID);
通过 sess_id 获取SQL语句
select SF_GET_SESSION_SQL(281422297507000)
活跃会话数和总会话数
select(select count(*)from v$sessionswhere state='ACTIVE' and sess_id != sessid()) act_ses,(select count(*) from v$sessions) tot_ses;
查询已执行超过 2 秒的活动 SQL
select *from ( SELECT sess_id,sql_text,state,datediff(ss,last_recv_time,sysdate) Y_EXETIME,to_char(SF_GET_SESSION_SQL(SESS_ID)) fullsql,clnt_ipFROM V$SESSIONSWHERE STATE='ACTIVE')where Y_EXETIME>=2;
数据库连接资源释放:
命令行设置:比如设置会话空闲时间为 10 分钟,采用如下 SQL 语法:
alter user 用户名 limit CONNECT_IDLE_TIME 10;
通过 V$SESSIONS 查出空闲会话,然后使用 sp_close_session(会话 ID) 关闭会话。
select * from V$SESSIONS where STATE='IDLE' ;sp_close_session(会话ID);
43.线程信息
线程监控主要监控数据库中活动线程信息和等待线程信息。
监控当前系统中活动线程的信息
SELECT * FROM V$THREADS;
监控当前正在等待的线程信息。
SELECT * FROM V$LATCHES;
44.杀会话
select user_name,count(*) from v$sessions group by user_name;
活跃的事务
set pagesize 1000select SESS_ID,STATE,USER_NAME,TRX_ID,CREATE_TIME,RUN_STATUS from v$sessions;select ADDR,TRX_ID,LTYPE,LMODE,BLOCKED,TABLE_ID from v$lock;select ADDR,TRX_ID,LTYPE,LMODE,BLOCKED,TABLE_ID from v$lock where TRX_ID !=0 order by table_id;select SQL_TEXT from v$sessions;
查看事务
SELECT * FROM V$TRXWAIT;select ID,STATUS,SESS_ID from V$TRX;
查看 39948,39943,39944 对应SQL语句
select SESS_ID,STATE,USER_NAME,TRX_ID,CREATE_TIME,RUN_STATUS,SQL_TEXT from v$sessions where TRX_ID IN (39943,39944,39948);
杀会话
select SESS_ID,STATE,USER_NAME,TRX_ID,CREATE_TIME,RUN_STATUS from v$sessions where SQL_TEXT like 'delete from HRMDEPARTMENT';call sp_close_session('140130307046***');
结束 60 秒以上的活动会话:
首先查看一下符合条件的相关会话:
select * from(SELECTDATEDIFF(SS, LAST_RECV_TIME, SYSDATE) SS ,DBMS_LOB.SUBSTR(SF_GET_SESSION_SQL(SESS_ID)),*FROMV$SESSIONSWHERESTATE = 'ACTIVE'order byss desc) where SS >60;
使用游标去执行杀会话
DECLARECURSOR c_sessionsisselect * from(SELECTDATEDIFF(SS, LAST_RECV_TIME, SYSDATE) SS ,DBMS_LOB.SUBSTR(SF_GET_SESSION_SQL(SESS_ID)),*FROMV$SESSIONSWHERESTATE = 'ACTIVE'order byss desc) where SS >60;c_raw c_sessions%rowtype;beginfor c_row in c_sessionsloopexecute immediate 'sp_close_session('''||c_row.sess_id||''')';end loop;end;/
45.查询当前会话事物ID
通过包 DBMS_TRANSACTION:
select DBMS_TRANSACTION.LOCAL_TRANSACTION_ID();
通过函数 tid:
select tid ;
通过 v$sessions 视图:
select trx_id from v$sessions where sess_id=sessid;
46.句柄数满
达梦数据库通过配置系统参数 MAX_SESSION_STATEMENT 来管控数据库单个会话上允许同时打开的语句句柄最大数。
一般情况下,当单个会话上句柄数达到 MAX_SESSION_STATEMENT 设置后,会出现【语句句柄个数超上限或系统内存不足】报错。
在遇到该问题时,为了快速恢复系统,可以参考如下思路进行恢复:
可以通过调大 dm.ini 文件中的 MAX_SESSION_STATEMENT 参数暂时解决问题。
可以通过语句查询各个会话的句柄数量。
selectsql_text ,state ,n_stmt "句柄的容量" ,n_used_stmt as "使用的句柄数",curr_sch ,user_name ,trx_id ,create_time ,clnt_type ,clnt_ip ,run_statusfromv$sessions;
47.查询最大空闲时间
检查是否用户设置了最大空闲时间参数,导致超时断开
select name,value from v$parameter where name='MAX_SESSIONS';select b.username 账号,b.password_versions 密码策略,a.sess_per_user 同时拥有的会话数,a.conn_idle_time 会话访问服务器的时间上限 from sysusers a,dba_users b where a.id=b.user_id;
48.执行时间超 2s 的SQL
可以自定义该时间
SELECT*FROM(SELECTsess_id ,sql_text ,datediff (ss, last_recv_time, SYSDATE) Y_EXETIME,SF_GET_SESSION_SQL (SESS_ID) fullsql ,clnt_ipFROMV$SESSIONSWHERESTATE = 'ACTIVE')WHEREY_EXETIME >= 2;
查询已执行超过 2 秒的活动 SQL
select * from(SELECTuser_name,clnt_ip,sess_id,sql_text,datediff(ss, last_send_time, sysdate) ss,SF_GET_SESSION_SQL(SESS_ID) fullsqlFROMV$SESSIONSWHERESTATE='ACTIVE' and user_name!='SYSDBA')where ss>=2 order by 5 desc;
查找出活动会话中执行时间大于 1S 的 SQL
select * from (select timestampdiff(second,s.last_recv_time,sysdate) t ,s.*from v$sessions s where state='ACTIVE')where t > 1;
49.清理内存中执行计划缓存
查找出活动会话中执行时间大于 1S 的 SQL
select * from (select timestampdiff(second,s.last_recv_time,sysdate) t ,s.*from v$sessions s where state='ACTIVE')where t > 1
到对应慢 SQL 对应的 cache_item 值
select * from v$cachepln where upper(sqlstr) like '%SQL%'
在 trace 目录中生成对应 trc 文件
alter session set events 'immediate trace name plndump ,level cache_item'
对比管理工具的执行计划和 .trc 文件中的执行计划。
清理内存中执行计划缓存
call sp_clear_plan_cache();call sp_clear_plan_cache(pln号);---不加 pln 就是清理所有 sql 缓存。
50.查询TOP SQL
查询最近的 sql 执行记录
select * from v$sql_history limit 10;
查看TOP SQL
set pagesize 100Selecttop 60 datediff(ss,last_send_time,sysdate) TIME,sess_id,run_status,---sql_text,AUTO_CMT,user_name,appname,CLNT_IP,trx_idfrom v$sessionsorder by TIME desc;
查询SQL
select SF_GET_SESSION_SQL(281422364616xxx);
按执行时间排序
set pagesize 100;select SESS_ID,SQL_ID,EXEC_TIME,N_RUNS from V$SYSTEM_LONG_EXEC_SQLS order by 3;
按执行次数排序
set pagesize 100;select SESS_ID,SQL_ID,EXEC_TIME,N_RUNS from V$SYSTEM_LONG_EXEC_SQLS order by 4 desc;
最慢的 20 条 SQL 统计
通过以下 SQL 命令可以查询到最慢的 20 条 SQL 信息。
SELECT TOP 20 START_TIME,TIME_USED/1000 TIME_USED,TOP_SQL_TEXT FROM V$SQL_HISTORY ORDER BY TIME_USED DESC;SELECT * FROM V$SYSTEM_LONG_EXEC_SQLS ORDER BY EXEC_TIME DESC;
高内存的 20 条 SQL 统计
通过以下 SQL 命令可以查询到高内存的 20 条 SQL 信息,包括会话 id、SQL ID、SQL 文本、使用内存数、执行结束时间、执行次数等。
select * from V$SYSTEM_LARGE_MEM_SQLS order by mem_used_by_k desc;
前 20 条长耗时等待事件统计
动态性能视图 V$SYSTEM_EVENT 可以查看到包括自系统启动以来所有等待事件的详细信息。通过以下 SQL 命令可以查询到前 20 条长耗时等待事件信息。
SELECT top 20 * FROM V$SYSTEM_EVENT ORDER BY TOTAL_WAITS DESC;
查询占用内存最多的 sql
查询执行在 1 秒以上的SQL语句使用的内存
SELECT "SESSID", MAX_MEM_USED||'KB',SQL_TXT FROM V$SQL_STAT order by MAX_MEM_USED DESC;
查询占用 io 较大的 sql
查询物理读次数较大的 sql
selects.sess_id,s.sql_text,s.user_name,s.state,st.PHY_READ_CNT,st.iO_WAIT_TIMEfromv$sessions s, v$session_stat stwheres.sess_id=st.sessid and s.state ='ACTIVE'ORDER BY 5 DESC;
查找性能相对较差的 sql
即磁盘读取次数较多,按照硬解析读取次数倒叙排序。
selectSQL_TXT,EXEC_TIME,PARSE_CNT,PARSE_TIME,HARD_PARSE_CNT,HARD_PARSE_TIMEFROMv$sql_statORDER BYHARD_PARSE_CNT DESC,EXEC_TIME DESC;
51.查看当前 DML 事务执行进度
当存在活动事务时,可以查询事务当前进度(执行时间、插入行数、删除行数、更新行数、是否正在回滚)便于判断事务当前状态。
可以参考如下 SQL 进行查询:
SELECT DATEDIFF(SS,LAST_RECV_TIME,SYSDATE) SS,S.LAST_RECV_TIME,S.SESS_ID,T.THRD_ID,T.ID,S.SQL_TEXT,SF_GET_SESSION_SQL(S.SESS_ID) AS SQL_FULL_TEXT,T.STATUS,T.INS_CNT,T.DEL_CNT,T.UPD_CNT,T.UPD_INS_CNT,T.WAITING,T.START_LSN,T.ROLLBACK_FLAG,T.LOCK_CNT,S.AUTO_CMT,S.CONNECTED,S.CLNT_IP,S.USER_NAMEFROM V$SESSIONS S,V$TRX TWHERE S.TRX_ID=T.IDAND S.STATE='ACTIVE'AND S.SESS_ID<>SESSID;
52.死锁
select * from V$DEADLOCK_HISTORY;
查询死锁历史事务信息
selectdh.trx_id ,sh.sess_id,wm_concat(top_sql_text)fromV$DEADLOCK_HISTORY dh,V$SQL_HISTORY shwheredh.trx_id =sh.trx_idand dh.sess_id=sh.sess_idgroup bydh.trx_id, sh.sess_id;
53.阻塞
通过 v$trxwait 视图查询阻塞者事务 ID:
select id,wait_for_id,wait_time,thrd_id from v$trxwait;
将得到的造成阻塞的事务 ID wait_for_id 代入 v$sessions 进行查询;
select sess_id,sql_text,state,trx_id from v$sessions where trx_id='wait_for_id';
通过得到的会话信息确认是否可以关闭阻塞者会话,如果可以关闭可通过执行下面语句关闭该会话。
sp_close_session(sess_id);
WITH TRX_TAB AS(SELECT O1.NAME,L1.TRX_ID FROM V$LOCK L1,SYSOBJECTS O1 WHERE L1.TABLE_ID=O1.ID AND O1.ID<>0),TRX_SESS AS (SELECT L.TRX_ID WT_TRXID, L.ROW_IDX BLK_TRXID,L.BLOCKED,(SELECT NAME TABLE_NAME FROM TRX_TAB A WHERE A.TRX_ID=L.TRX_ID) WT_TABLE,S1.SESS_ID WT_SESS,S2.SESS_ID BLK_SESS,S1.USER_NAME WT_USER_NAME,S2.USER_NAME BLK_USER_NAME,S1.SQL_TEXT,S1.CLNT_IP,DATEDIFF(SS, S1.LAST_SEND_TIME, SYSDATE) SSFROM V$LOCK L,V$SESSIONS S1,V$SESSIONS S2WHERE L.TRX_ID=S1.TRX_ID AND L.ROW_IDX=S2.TRX_ID)SELECT SYSDATE STATTIME,* FROM TRX_SESS where BLOCKED=1;
查询锁
SELECT O.NAME,L.* FROM V$LOCK L,SYSOBJECTS O WHERE L.TABLE_ID=O.ID AND BLOCKED=1;
查询阻塞
WITH LOCKSAS (SELECT O.NAME,L.*,S.SESS_ID,S.SQL_TEXT,S.CLNT_IP,S.LAST_SEND_TIMEFROM V$LOCK L, SYSOBJECTS O, V$SESSIONS SWHERE L.TABLE_ID = O.ID AND L.TRX_ID = S.TRX_ID),LOCK_TRAS (SELECT TRX_ID WT_TRXID, TID BLK_TRXIDFROM LOCKSWHERE BLOCKED = 1),RESAS (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_SQLFROM LOCK_TR S, LOCKS T1, LOCKS T2WHERE T1.LTYPE = 'OBJECT'AND T1.TABLE_ID <> 0AND T2.LTYPE = 'OBJECT'AND T2.TABLE_ID <> 0AND S.WT_TRXID = T1.TRX_IDAND S.BLK_TRXID = T2.TRX_ID)SELECT DISTINCT WT_SQL,CLNT_IP,SS,WT_TRXID,BLK_TRXIDFROM RES;
检查当前数据库中包含的慢 SQL 及阻塞语句:
SELECTDS.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"FROMV$LOCK LLEFT JOIN V$SESSIONS DSONDS.TRX_ID = L.TRX_IDLEFT JOIN V$SESSIONS SSONSS.TRX_ID = L.TIDWHEREL.BLOCKED = 1;
对象或资源发生等待问题
如果存在长时间没有返回结果的语句,首先通过 V$SESSIONS 确认语句处于活动状态,语句如下:
SELECT * FROM v$sessions WHERE state='ACTIVE' AND dbms_lob.substr(sf_get_session_sql(sess_id)) LIKE '%语句片段%';
明确事务等待导致语句没有正常执行结束,语句如下:
SELECT * FROM v$trxwait WHERE id = 上述语句得到结果的 TRX_ID
54.查询有事务未提交的表
SELECT b.object_name, c.sess_id, a.*FROM v$lock a, dba_objects b, v$sessions cWHERE a.table_id = b.object_id AND a.ltype = 'OBJECT' AND a.trx_id = c.trx_id;
已执行未提交的 SQL:
SELECT t1.sql_text, t1.state, t1.trx_idFROM v$sessions t1, v$trx t2WHERE t1.trx_id = t2.id AND t1.state = 'IDLE' AND t2.status = 'ACTIVE';
55.数据库统计信息检查
系统统计信息
通过 SQL 命令查询动态性能视图 V$SYSSTAT 统计系统对象的信息,包括对象的 id、对象类型、统计对象名、统计值等。
select * from V$SYSSTAT where classid in (11,5) order by classid desc;
会话统计
通过以下 SQL 命令可以查询到会话信息,包括会话活动状态、客户端 IP、客户端类型、当前模式、当前用户、会话数量等。
SELECT STATE,CLNT_IP,CLNT_TYPE,CURR_SCH,USER_NAME,COUNT(*)COUNTS FROM V$SESSIONS GROUP BY STATE,CLNT_IP,CLNT_TYPE,CURR_SCH,USER_NAMEORDER BY STATE;
对象统计
通过以下 SQL 命令可以查询到对象信息,包括表空间名、类型和数量等。
select tablespace_name,'TABLE_OF_TS' OBJTYPE,count(*) COUNTS from all_tables group by tablespace_name union allselect * from ( select owner,object_type,count(*) from all_objectswhere owner not in ('SYS','SYSTEM','SYSAUDITOR','SYSSSO','CTISYS') group by object_type,ownerorder by 1,2);
表行数统计
通过以下 SQL 命令可以查询表行数统计信息。
收集统计信息:
beginfor rec in (select owner,table_name from all_tables where owner not in ('SYS','SYSAUDITOR','SYSSSO','CTISYS')) loopcall SP_TAB_STAT_INIT(rec.owner,rec.table_name);end loop;end;/
查看统计信息
select owner,table_name,tablespace_name,status,num_rows from all_tables where owner not in ('SYS','SYSAUDITOR','SYSSSO','CTISYS')order by owner,num_rows desc;
56.密码策略
SELECT NAME,VALUE FROM V$PARAMETER WHERE NAME='PWD_POLICY';
其中VALUE数字代表不同密码策略,默认2。
0 表示无策略;1表示 禁止与用户名相同;2表示口令长度不小于9;4表示至少包含一个大写字母(A-Z);8表示至少包含一个数字(0-0);16表示至少包含一个标点符号(英文状态下,除了”和空格外的符号,口令策略可以单独使用,也可以组合使用)
57.内存使用
字典缓存
通过 SQL 命令查询动态性能视图 V$DB_CACHE,可以查看当前字典缓存信息、包括数据字典地址、缓存池总空间、实际使用空间等字典缓存信息。
select * from V$DB_CACHE;
数据缓冲池
通过 SQL 命令查询页面缓冲区动态性能表 V$BUFFERPOOL,可以查看缓冲区页数、页大小、空闲页、淘汰的页数、数据页被引用的次数等页面缓冲区信息。
select * from V$BUFFERPOOL;
selectname, --缓冲区名称n_pages, --页数free, --空闲页数目N_DISCARD64 --淘汰的页数from v$bufferpool;
查询结果可以参考如下:
(1)如果 free 较大,说明该缓冲区空闲,可以适当的调整降低 buffer 缓冲区参数值。(2)如果 free 项为 0,或者 N_DISCARD64 非零,表示该缓冲区经常淘汰,说明对应的缓冲区参数太小,导致频繁淘汰,需要调整对应的缓冲区的参数。
查询缓冲区命中率
数据缓冲区是 DMSERVER 在将数据页写入磁盘之前以及从磁盘上读取数据页之后,数据页所存储的地方。
数据缓冲区设定得太小,会导致缓冲页命中率低,磁盘 IO 频繁;将其设定得太大,又会导致操作系统内存本身不够用。
selectname 缓冲池名称,sum(page_size)*sf_get_page_size 缓冲池大小_G,sum(rat_hit) /count(*) 命中率fromv$bufferpoolgroup by name;
内存池
通过 SQL 命令查询动态性能视图 V$MEM_POOL 可以查看内存结构地址、是否是共享内存池、初始大小、当前总大小、数据占用大小等内存池信息。
select * from V$MEM_POOL;
查询内存总量
select(select sum(n_pages) * page()/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()/1024/1024 from v$bufferpool)+(select sum(total_size)/1024/1024 from v$mem_pool)||'MB' as TOTAL_SIZEfrom dual;
数据库的内存使用情况
数据库级别的判断:数据库使用的内存大致等于 BUFFER_SIZE + POOL_SIZE,对应的 SQL 语句如下:
select (select sum(n_pages * page_size) from v$bufferpool) + (select sum(total_size) from v$mem_pool) from dual;
一般来说,发生内存泄漏的都在 mem_pool 上,比如操作系统上看到内存占用 60G,但 BUFFER 已经占用到 50 GB,实际上发生泄漏的概率较小,应该适当调小 BUF,空出内存给内存池使用。
是否存在使用内存过多的 SQL:
较新版本的 DM7 服务器提供会话及语句资源监控视图(ENABLE_MONITOR=1) 生效 v$SESSION_STAT,V$SQL_STAT 视图上字段比较丰富,我们这里主要关注 MAX_MEM_USED 字段。 一般来讲,如果是某条或者特定的几条 SQL 导致内存增长过多,可以通过这两个视图查询出来。
通过执行以下语句:
SELECT MAX_MEM_USED,SQL_TXT FROM V$SQL_STAT order by MAX_MEM_USED DESC;
可以确定使用内存较大的 SQL,可以针对行的优化(消除 HASH,SORT,DISTINCT 等) 注意:该查询只能查询当前活动 STMT 上的语句消耗情况,历史情况需要查询 V$SQL_STAT_HISTORY,该视图上保留 1 万行 SQLSTAT 历史信息。
以上 MAX_MEM_USED 列的单位均为 KB。
是否存在扩展过大的内存池:
前面介绍过,正常使用过程中,内存池的大小一般会维持在 TARGET_SIZE 左右,不会发生太大的差距,如果发生非常多次计划外的扩展,需要考虑该池是否发生内存泄漏,与之相关的系统视图和系统视图字段为:v$mem_pool 上的 N_EXTEND_EXCLUSIVE 字段。
相应的查询语句为如下:
Select * from v$mem_pool where n_extend_exclusive = 0;
确认内存的详细使用情况:
详细的内存使用情况需要视图 v$mem_reginfo,该视图在 INI 参数 MEM_LEAK_CHECK 为 1 时有效,可动态开启,开启后登记数据库中所有内存的申请释放信息。
相应的查询语句如下:
Select sum(reserved_size),fname,lineno from v$mem_reginfo group by fname,lineno order by sum(reserved_size) desc;
按照大小降序,或者根据文件名、行号分组,查看是否存在大量某文件某行使用内存未释放的情况,转交研发处理。
内存池的使用:
selectname, --内存池名称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_poolorder by TOTAL_size desc;
查询结果可以参考如下:
(1)N_EXTEND_EXCLUSIVE 如果长期大于 0,说明长期从池外扩展,可能存在内存泄露,需要重点关注。(2)若使用到备份池,则需要保持高度关注。(3)内存池创建的线程号 creator 可以与 session 的 thrd_id 关联,查看对应的某个会话的内存使用情况,查看方法可以参考 单个会话内存使用情况。(4)若 RESERVED_SIZE 比 org_size 小,说明内存池非常空闲,可以减小对应的初始内存,避免浪费。(5)若 TOTAL_size 比 TARGET_SIZE 大,说明内存池不够,经常向池外申请,需要把对应参数调大。
可以通过 v$sysstat 视图监控内存的使用情况:
select name ,stat_val/1024.0/1024.0 from v$sysstat where CLASSID=11;
以上查询结果中,字段含义如下:
memory pool size in bytes:内存池总的大小。memory used bytes:内存池使用的内存大小。memory used bytes from os:内存池从操作系统分配的大小。
单个会话内存使用情况:
SELECTA.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 --实际使用量FROMV$MEM_POOL A,V$SESSIONS BWHEREA.CREATOR = B.THRD_IDGROUP BYA.CREATOR,B.SQL_TEXTORDER BYTOTAL_M DESC;
58.查询错误码
select * from v$err_info where ERRINFO like '%主键%';
59.兼容 MySQL 的 \G 列式
兼容 MySQL 的 \G 列式显示 SQL 结果disql 登录设置 ISQL_MODE=3。SQL> set isql_mode 3设置后即可支持 \G 列式显示(结尾没分号)。SQL> select * from cjc.t\G
60.设置命令行的前缀标识
如何设置命令行的前缀标识为用户名,IP,端口以及实例名
Disql 登录时如何设置命令行的前缀标识为用户名,IP,端口以及实例名
在 dmdbms/bin/disql_conf 目录下配置 glogin.sql 文件(默认是空文件),配置内容参考如下:
vi dmdbms/bin/disql_conf添加如下内容:column instance_name new_value instance_nameselect instance_name from v$instance;set sqlprompt "_user'@'_connect_identifier(&instance_name)>"
61.日志检查
日志中信息记录分类
达梦数据库日志主要有 INFO、WARNING、ERROR 和 FATAL 四类信息。
INFO(正常):用于打印程序应该出现的正常状态信息, 便于追踪定位;WARNING(告警):表明系统出现轻微的不合理,一般不影响运行和使用;ERROR(错误):表明出现了系统错误和异常,无法正常完成目标操作;FATAL(致命):表明发生了严重的错误,会导致数据库宕机,服务停止。
一般在进行数据库日志监控时,主要关注以下内容:
WARNING、ERROR 和 FATAL 类信息监控。
INFO 类信息中涉及实例重启的信息
cd $DM_HOMEcd logls -ltr *.log
检查日志中是否有错误信息cat dm_CJC_202504.log |grep '\[ERROR'检查日志中是否有警告信息cat dm_CJC_202504.log |grep '\[WARNING'检查数据库是否重启过cat dm_CJC_202504.log |grep 'SYSTEM IS READY'
参考:
达梦技术文档/运维常见问题https://eco.dameng.com/document/dm/zh-cn/faq/faq-db-check.html达梦技术文档/运维指南/数据库运维监控https://eco.dameng.com/document/dm/zh-cn/ops/达梦技术文档/运维指南/数据库监控检查https://eco.dameng.com/document/dm/zh-cn/ops/check-system.html
重要说明:
本人推出达梦数据库实战课程:
当前已更新18课时,计划约25课时,包括安装、守护集群、备份恢复、迁移、升级、故障处理、性能优化等。





限时优惠,仅需30元(300微信豆)(安卓)

专属答疑微信群:CJC_达梦数据库实战
目前已有39人付费学习:

欢迎关注我的公众号《IT小Chen》
###chenjuchao 20250408###







