DBMS_STATS.GATHER_TABLE_STATS(USER, ‘表名’,null,100,false, ‘FOR ALL COLUMNS SIZE AUTO’); --更新所有列
对指定的列生成统计信息
CALL SP_COL_STAT_INIT (‘模式名’, ‘表名’, ‘列名’);
SP_COL_STAT_INIT_EX(USER,‘表名’,‘列名’,100); --更新单列
索引 收集某张表的所有索引的统计信息
CALL SP_TAB_INDEX_STAT_INIT (‘模式名’, ‘表名’);
对指定的索引生成统计信息
DBMS_STATS.GATHER_INDEX_STATS(user,‘索引名’);
CALL SP_INDEX_STAT_INIT (‘模式名’, ‘索引名’);
CALL SP_INDEX_STAT_INIT(USER,‘索引名’);
语句 对SQL语句涉及的所有表和过滤列生成统计信息
CALL SP_SQL_STAT_INIT (‘SQL’);
三 查看统计信息
查看指定列的统计信息
DBMS_STATS.COLUMN_STATS_SHOW(USER, ‘表名’,‘列名’);
查看指定索引的统计信息
dbms_stats.index_stats_show(user,‘索引名’);
查看最后统计收集时间 select table_name,num_rows,blocks,last_analyzed from user_tables where table_name=‘T2’;
收集统计信息:
收集统计信息一共有三种方式:
1. Sp 系统函数
2. Stat 命令
3. Dbms_stats 系统包
方法1 :
既然是函数,那么我们通过达梦提供的系统视图看看,一共有哪些相关函数:
Select * from v$ifun where name like '%SP%STAT%INIT';
有的人会问为什么这么查,其实,确实,不用记住,只要知道为什么这么查询就可以了
1. V$ifun 是达梦提供的函数
2. 通过名字 like 就可以找出来, sp 是 system procedure 的意思, stat 是统计信息的意思, init 是初始化的意思,而且很巧 like %init 也包含了 deinit 反初始化(清空统计信息),所以我们通过 where 条件, name like '%SP%STAT%INIT' 找出我们感兴趣的系统过程了
对于查询出来的其他函数,不做解释,大家可以有个印象就好了,我们要用到的就下面这几个:
-- 针对表自身的
SP_TAB_STAT_INIT
SP_TAB_STAT_DEINIT
-- 针对索引的
SP_INDEX_STAT_INIT
SP_INDEX_STAT_DEINIT
-- 针对全库的(慎用,库比较大的话,每个一时半会,别想跑完)
SP_DB_STAT_INIT
SP_DB_STAT_DEINIT
-- 针对列的
SP_COL_STAT_INIT
SP_COL_STAT_DEINIT
-- 针对sql 语句的
SP_SQL_STAT_INIT
下面分别是他们的一个例子:
基础数据:
drop table if exists test ;
create table test ( v1 int , v2 int );
insert into test select level , level connect by level <=10000 ;
commit ;
create index idx_test_v1 on test ( v1 ); -- 注意索引的命名规范
DECLARE begin for rec in (select table_name from user_tables ) loop execute immediate 'grant select,update,insert,delete on '||rec.table_name||' to SYSDBA;'; end loop; end;
select '实例名称' 数据库选项,INSTANCE_NAME 数据库集群相关参数值 FROM v$instance union all select '数据库版本',substr(svr_version,instr(svr_version,'V')) 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 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 '数据库模式',MODE$ from v$instance union all select '授权用户',authorized_customer from v$license union all select '授权时间',to_char(expired_date) from v$license;
SELECT TABLE_USED_PAGES('模式名', '表名') * PARA_VALUE / 1024 / 1024 "USER_USED_SPACE(MB)"
FROM V$DM_INI
WHERE PARA_NAME LIKE 'GLOBAL_PAGE_SIZE';
2.拼接sql,批量删除模式下的表:
select 'drop table SYSDBA."'
|| A .TABLE_NAME
||' ;'
FROM DBA_TABLES A WHERE OWNER='SYSDBA';
3.查找一个表属于哪个用户;
select * from dba_tables where TABLE_NAME='表名';
4.查询某一模式下的所有表名
select TABLE_NAME from dba_tables where owner='SYSDBA';
5.查询数据库中所有用户及状态
select username, ACCOUNT_STATUS from dba_users ;
6.查询当前用户拥有哪些角色;
select grantee,granted_role from dba_role_privs where grantee='用户名';
7.查询当前角色下有哪些权限;
select grantee,privilege from dba_sys_privs where grantee='角色名';
8.查询数据库是否兼容其他数据库模式
select * from v$dm_ini where "V$DM_INI".PARA_NAME='COMPATIBLE_MODE';
查询结果为0,表示不兼容; 2:部分兼容 ORACLE, 3:部 分兼容 MS SQL SERVER, 4:部分兼容 MYSQL
9.修改数据库当前兼容模式
见上一条,如果修改为部分兼容 MYSQL;
sp_set_para_value(2,'COMPATIBLE_MODE',4);
见上一条,如果修改为部分兼容 ORACLE;
sp_set_para_value(2,'COMPATIBLE_MODE',2);
修改以后重启数据库实例服务生效;
10.查询表上的唯一索引对应的列
修改PRODUCT_VENDOR为对应的表名
select
column_name
FROM
dba_ind_columns
where
index_name in
(
select
index_name
from
dba_indexes
where
table_name ='PRODUCT_VENDOR'
and uniqueness = 'UNIQUE'
);
二、优化相关sql
1.更新模式下统计信息:
DBMS_STATS.GATHER_SCHEMA_STATS(
'模式名',
100,
FALSE,
'FOR ALL COLUMNS SIZE AUTO');
2.更新单表统计信息:
SP_TAB_STAT_INIT('模式名','表名');
或者
DBMS_STATS.GATHER_TABLE_STATS('模式名','表名',NULL,100,TRUE,'FOR ALL COLUMNS SIZE AUTO')
3.更新单列统计信息:
STAT 100 ON 表名(列名);
sp_col_stat_init('模式名','表名','列名');
sp_tab_col_stat_init('模式名','表名');
from
v$sessions
where state='ACTIVE' and sess_id != sessid
order by a;
5.查询阻塞锁
select * from v$lock where blocked=1;
6.查询锁等待
select * from v$trxwait;
7.按照耗时排序查询慢sql
select timestampdiff(ss,LAST_RECV_TIME,sysdate),sf_get_session_sql(sess_id),*
from SYS."V$SESSIONS"
where sess_id<>sessid
order by 6 asc,1 desc;
8.查询死锁涉及的事务信息
select
dh.trx_id ,
sh.sess_id,
wm_concat(top_sql_text)
from
V$DEADLOCK_HISTORY dh,
V$SQL_HISTORY sh
where
dh.trx_id =sh.trx_id
and dh.sess_id=sh.sess_id
group by
dh.trx_id,
sh.sess_id
三、 其他常用sql
1.初始化代理环境:
SP_INIT_JOB_SYS(1);
2.授权激活:
sp_load_lic_info();
3.查询数据库使用的字符集
SELECT sf_get_unicode_flag()
结果为1,表示字符集为utf-8; 结果为0,表示字符集为gbk;
4.查询数据库大小写是否敏感
select sf_get_case_sensitive_flag()
结果为1,表示大小写敏感; 结果为0,表示大小写不敏感;
5.查询varchar类型是否以字符为单位
select sf_get_length_in_char()
结果为1,表示以字符为单位; 结果为0,表示以字节为单位;
6.清理归档:
SF_ARCHIVELOG_DELETE_BEFORE_TIME(SYSDATE - 15);
7.查看用户会话空闲时间,登录失败次数限制
select
a.ID as 用户ID,
b.name as 用户名,
CONN_IDLE_TIME as 用户会话的最大空闲时间,
FAILED_NUM as 用户登录失败次数限制,
SESS_PER_USER,
LOCK_TIME as 用户口令锁定时间
from
SYSUSERS a,sysobjects b
where a.id=b.id
8.查询用户的会话持续期以及会话使用cpu时间上限
select
a.ID as 用户ID,
b.name as 用户名,
a.INFO1 as 会话持续期,
a.CPU_PER_SESSION as 会话使用cpu时间上限
from
SYSRESOURCES a,
sysobjects b
where
a.id=b.id
(二)删除表空间 只可以删除用户创建的表空间并且只能删除未使用过的表空间。删除表空间时会删除其拥有的所有数据文件。 例如删除bookshop表空间: drop tablespace bookshop;
(三)修改表空间名 可修改已存在的由用户创建的表空间的名称。 比如可修改bookshop表空间名为books: alter tablespace bookshop rename to books;
(四)扩展表表空间 在bookshop表空间中添加大小为64M的数据文件: alter tablespace bookshop add datafile 'd:\book.dbf' size 64; 扩展bookshop表空间中数据文件book.dbf大小至128M: alter tablespace bookshop resize datafile 'd:\book.dbf' to 128;
三、账户 (一)账户创建 创建用户TEST_USER时指定该用户使用的最大磁盘空间为50M create user test_user identified by test_password diskspace limit 50; 对用户的空间限制也可进行更改,如修改用户TEST_USER的磁盘空间限制为无限制: alter user test_user diskspace unlimited;
(二)表创建 创建表TEST时指定该表对象可使用的最大磁盘空间为500M create table test(sno int,myinfo varchar) diskspace limit 500; 对表对象空间的限制也可进行更改,如修改表TEST的磁盘空间限制为50M: alter table test modify diskspace limit 50;
2、连接会话详细信息 如:执行的sql语句、主库名、当前会话状态、用户名等等 ---会话id可以通过“select sessid ();”获取 select *from v$sessions where state='ACTIVE'; select *from v$sessions where user_name='OA' and clnt_host='dmtest' and appname='disql' and clnt_ip='::1' and sess_id=281223325068824; select sess_seq,state,substr(sql_text,0,10)sql_text,user_name,create_time,clnt_host,appname,clnt_ip,osname,last_send_time,trx_id from v$sessions;
(二)SQL 1、通过会话id查询SQL执行文本 select sf_get_session_sql(281223325068824)from dual; 2、通过sql文本查询sql_id和hash_value select*from v$sqltext where sql_text like '%select wftnode0_.NODEID as NODEID40_0_%'; 3、通过sql_id或hash_value查询执行计划 select*from v$sql_plan where sql_id=16919; 4、通过sql_id查询sql历史执行信息 select*from v$sql_history where sql_id=16919; 5、查询执行时长超过2秒的活动SQL语句 select sess_id,sql_text,sf_get_session_sql(sess_id)fullsql,last_recv_time,datediff(ss,last_recv_time,sysdate)y_exectime,clnt_ip from v$sessions where state='ACTIVE'; 6、显示系统最近1000条执行时间超过预定值的SQL语句 select*from v$long_exec_sqls where to_char(finish_time,'yyyymmdd')='20210219' order by finish_time desc;
(三)事务和锁 select*from v$trx select*from v$lock; select ,l.* from v$lock l,sysobjects o where l.table_id= and l.blocked=1;
(四)数据库对象信息 1、所有账户 select username,user_id,account_status,default_tablespace,temporary_tablespace,created,profile from dba_users; select ,u.id,o.crtdate,o.valid,u.locked_status,last_login_dtid from sysusers u,sysobjects o where u.id= and o.type$='UR' and o.subtype$='USER';
2、指定账户下所有对象 select*from sysobjects where schid in(select id from sysobjects where type$='SCH' and name='OA'); sysobjects字段说明: schid:TYPE$=SCHOBJ或者TYPE$=TABOBJ时表示对象所属的模式 ID,否则为 0。 type$:对象的主类型 1) 库级:UR(用户), SCH(模式), POLICY,GDBLINK, GSYNOM,DSYNOM,DIR,OPV,SPV,RULE,DMNOBJ; 2) 模式级:SCHOBJ; 3) 表级:TABOBJ subtype$:对象的子类型。分为三种: 1) 用户对象:USER, ROLE; 2) 模式对象:UTAB,STAB,VIEW,PROC,SEQ,PKG,TRIG, DBLINK,SYNOM, CLASS,TYPE,JCLASS,DOMAIN,CHARSET,CLLT,CONTEXT; 3) 表对象:INDEX,CNTIND,CONS
(五)表空间 1、单独查询数据文件 select ts_name, decode(d.auto_extend,1,'自动扩展',0,'非自动扩展')auto_extend, d.next_size, ts_id, d.id file_id, d.path file_name, d.create_time, d.modify_time, d.status$, d.total_size * sf_get_page_size() / 1024 / 1024||'M' "Size(MB)", d.free_size * sf_get_page_size() / 1024 / 1024||'M' "Free(MB)", (d.total_size-d.free_size) * 100 / d.total_size||'%' "Used(%)" from v$tablespace t, v$datafile d where = d.group_id order by ,d.id;
2、汇总数据文件 select name, sum(total_size) * sf_get_page_size() / 1024 / 1024 || 'M' "Size(MB)", sum(free_size) * sf_get_page_size() / 1024 / 1024 || 'M' "Free(MB)", (sum(total_size)-sum(free_size)) * 100 / sum(total_size) || '%' "Used(%)" from (select , d.total_size, d.free_size from v$tablespace t, v$datafile d where = d.group_id) group by name;
dm 的动态 ini 参数分为系统级和会话级两种级别。会话级参数在服务器运行过程中被修改时,之前创建的会话不受影响,只有新创建的会话使用新的参数值。 1. sf_set_session_para_value (paraname varchar(8187), value bigint) 设置某个会话级 ini 参数的值,设置的参数值只对本会话有效。 2. sp_reset_session_para_value (paraname varchar(8187)) 重置某个会话级 ini 参数的值,使得这个 ini 参数的值和系统 ini 参数的值保持一致。 3. sf_get_session_para_value (paraname varchar(8187)) 获得当前会话的某个会话级 ini 参数的值。需要注意的是,在对参数进行调整前,dba 应该深刻理解配置参数中每个参数的含义和对系统的影响,避免由于错误的调整导致影响整个系统对外提供正常服务。对于一些关键业务,在实际调整前,建议在测试系统上先进行试验,验证通过后再在生产系统上进行调整。
(八)数据库归档配置 1、开启归档 alter database add archivelog 'type=local,dest=/dm8/dmarch,file_size=512,space_limit=0'; 参数说明: file_size 单个redo日志归档文件大小,取值范围65MB-2048MB,默认是1024MB。
2、查看是否开启归档 SQL> select name,status$,role$,arch_mode from v$database;
行号 NAME STATUS$ ROLE$ ARCH_MODE ---------- ---- ----------- ----------- --------- 1 DMOA 4 0 Y
(十二)对象相关信息管理 1、返回表/视图定义 CALL SP_TABLEDEF('PRODUCTION','PRODUCT'); CALL SP_VIEWDEF('PURCHASING','VENDOR_EXCELLENT'); 2、获取check约束/unique约束/索引/同义词/序列 通过查询系统表,得到约束 ID 为 134217770,查询check约束定义: SELECT , FROM SYSOBJECTS A, SYSOBJECTS B WHERE ='TEST_CHECKDEF' AND A.PID= AND A.SUBTYPE$='CONS'; SELECT CHECKDEF(134217770,1); 通过查询系统表,系统生成 C2 上的 INDEX 为 33555481,查询unique约束定义: SELECT C.INDEXID FROM SYSOBJECTS O,SYSCONS C WHERE ='CONS1' AND =; SELECT CONSDEF(33555481,1); 查询系统表得到索引 ID,获取index的创建定义: SELECT NAME, ID FROM SYSOBJECTS WHERE NAME='PRODUCT_IND' AND SUBTYPE$='INDEX'; SELECT indexdef(33555530,1); 获取同义词定义: SELECT SYNONYMDEF('SYSDBA', 'SYSOBJECTS',0,1); 获取序列定义: SELECT ID FROM SYSOBJECTS WHERE NAME='SEQ1'; --查出 id 为 167772160 SELECT SEQDEF(167772160, 1); 3、对指定索引进行空间整理 CALL SP_REORGANIZE_INDEX('PRODUCTION','PRODUCT_IND'); 4、重建索引 SP_REBUILD_INDEX('SYSDBA', 33555530); 5、获取自增列当前值 SELECT IDENT_CURRENT('PRODUCTION.PRODUCT');
26 个回复
nccloud
赞同来自: 13601175187
锁定/解锁
alter user 用户名 account unlock;
alter user 用户名 account lock;
nccloud
1、查询某个库有多少张表
2、通过指定文件执行文件中的sql
3、查询表字段:
select * from user_tab_columns where Table_Name='TestDataBase';
4、查询限制字段:
select * from user_cons_columns where Table_Name='TestDataBase';
5、查询限制字段详情:
select * from user_constraints where Table_Name='TestDataBase';
6、查询某个表的表结构/ddl
select dbms_metadata.get_ddl('TABLE','sm_user','NCCGH_202012') from dual;
nccloud
一 统计信息分类
表统计信息、列统计信息、索引统计信息。
统计信息生成过程分以下三个步骤:
1) 表:计算表的行数、所占的页数目、平均记录长度
2) 列:统计列数据的分布情况
3) 索引:统计索引列的数据分布情况
二 统计信息收集范围
全库
对库上所有模式下的所有用户表以及表上的所有索引生成统计信息,如下:
CALL SP_DB_STAT_INIT ();
模式
一般在首次迁移完成后使用,如下:
DBMS_STATS.GATHER_SCHEMA_STATS(‘模式名’,100,TRUE,‘FOR ALL COLUMNS SIZE AUTO’);
表
CALL SP_TAB_STAT_INIT (‘模式名’, ‘表名’);
DBMS_STATS.GATHER_TABLE_STATS(‘模式名’, ‘表名’,null,100,TRUE,‘FOR ALL COLUMNS SIZE AUTO’);
列
对某个表上所有的列生成统计信息
CALL SP_TAB_COL_STAT_INIT (‘模式名’, ‘表名’);
CALL SP_STAT_ON_TABLE_COLS (‘模式名’,‘表名’,采样率);–采样率0-100
DBMS_STATS.GATHER_TABLE_STATS(USER, ‘表名’,null,100,false, ‘FOR ALL COLUMNS SIZE AUTO’); --更新所有列
对指定的列生成统计信息
CALL SP_COL_STAT_INIT (‘模式名’, ‘表名’, ‘列名’);
SP_COL_STAT_INIT_EX(USER,‘表名’,‘列名’,100); --更新单列
索引
收集某张表的所有索引的统计信息
CALL SP_TAB_INDEX_STAT_INIT (‘模式名’, ‘表名’);
对指定的索引生成统计信息
DBMS_STATS.GATHER_INDEX_STATS(user,‘索引名’);
CALL SP_INDEX_STAT_INIT (‘模式名’, ‘索引名’);
CALL SP_INDEX_STAT_INIT(USER,‘索引名’);
语句
对SQL语句涉及的所有表和过滤列生成统计信息
CALL SP_SQL_STAT_INIT (‘SQL’);
三 查看统计信息
查看指定列的统计信息
DBMS_STATS.COLUMN_STATS_SHOW(USER, ‘表名’,‘列名’);
查看指定索引的统计信息
dbms_stats.index_stats_show(user,‘索引名’);
查看最后统计收集时间
select table_name,num_rows,blocks,last_analyzed from user_tables where table_name=‘T2’;
收集统计信息:
收集统计信息一共有三种方式:
1. Sp 系统函数
2. Stat 命令
3. Dbms_stats 系统包
方法1 :
既然是函数,那么我们通过达梦提供的系统视图看看,一共有哪些相关函数:
Select * from v$ifun where name like '%SP%STAT%INIT';
有的人会问为什么这么查,其实,确实,不用记住,只要知道为什么这么查询就可以了
1. V$ifun 是达梦提供的函数
2. 通过名字 like 就可以找出来, sp 是 system procedure 的意思, stat 是统计信息的意思, init 是初始化的意思,而且很巧 like %init 也包含了 deinit 反初始化(清空统计信息),所以我们通过 where 条件, name like '%SP%STAT%INIT' 找出我们感兴趣的系统过程了
对于查询出来的其他函数,不做解释,大家可以有个印象就好了,我们要用到的就下面这几个:
-- 针对表自身的
SP_TAB_STAT_INIT
SP_TAB_STAT_DEINIT
-- 针对索引的
SP_INDEX_STAT_INIT
SP_INDEX_STAT_DEINIT
-- 针对全库的(慎用,库比较大的话,每个一时半会,别想跑完)
SP_DB_STAT_INIT
SP_DB_STAT_DEINIT
-- 针对列的
SP_COL_STAT_INIT
SP_COL_STAT_DEINIT
-- 针对sql 语句的
SP_SQL_STAT_INIT
下面分别是他们的一个例子:
基础数据:
drop table if exists test ;
create table test ( v1 int , v2 int );
insert into test select level , level connect by level <=10000 ;
commit ;
create index idx_test_v1 on test ( v1 ); -- 注意索引的命名规范
执行例子:
-- 针对表自身的
SP_TAB_STAT_INIT ( 'SYSDBA' , 'TEST' );
SP_TAB_STAT_DEINIT ( 'SYSDBA' , 'TEST' );
-- 针对索引的
SP_INDEX_STAT_INIT ( 'SYSDBA' , 'IDX_TEST_V1' );
SP_INDEX_STAT_DEINIT ( 'SYSDBA' , 'IDX_TEST_V1' );
-- 针对全库的(慎用,库比较大的话,每个一时半会,别想跑完)
SP_DB_STAT_INIT ();
SP_DB_STAT_DEINIT ();
-- 针对列的
SP_COL_STAT_INIT ( 'SYSDBA' , 'TEST' , 'V2' );
SP_COL_STAT_DEINIT ( 'SYSDBA' , 'TEST' , 'V2' );
-- 针对 sql 语句的
SP_SQL_STAT_INIT ( 'select * from test a ,test b where a.v1=b.v2' );
方法2 :
Stat 命令,主要是我们用在表的列上,比较方便:
Stat 100 on test(v1);
当然,stat 100 on sysdba.test(v1); 也是对的。( 就是这么通过指定用户名——有的时候我们叫做模式名 )
方法3 :
这里只讲两个方法,其他可以参考:达梦安装目录的/doc/special 目录下的 System_Packages.pdf 手册(系统包),中间 第21 章 DBMS_STATS 包 的详尽介绍。
收集统计信息:
收集某用户下的所有索引:
DBMS_STATS.GATHER_SCHEMA_STATS('USERNAME',100,TRUE,'FOR ALL INDEXED COLUMNS SIZE AUTO');
注意字符串参数里面的空白符,请 一定手敲整个字符串,不要从网页上复制,不要从网页上复制,不要从网页上复制,不要搞些全角空格进去,那样子在,可能你的这个命令(当成 sql 语句执行),执行的非常快,但是没用,没有收集统计信息。
某用户下所有字段(包括索引):
DBMS_STATS.GATHER_SCHEMA_STATS('USERNAME',100,TRUE,'FOR ALL COLUMNS SIZE AUTO');
某表下的所有字段:
DBMS_STATS.GATHER_TABLE_STATS('USERNAME','TABLENAME',null,100,TRUE,'FOR ALL COLUMNS SIZE AUTO');
几种方式的DBA 意识层面的比对
方法1
可以对表自身收集
可以对sql 语句涉及到的对象收集,—— 当sql 很复杂的时候,很舒服!
但是,他使用的自适应的采样比例,不可以控制。——系统内嵌的算法,数据量在什么级别的时候,用多大的采样比例,不可以指定。
方法2
对于收集列的统计信息的时候,最常用
nccloud
更新指定用户的统计信息
--创建系统包
SP_CREATE_SYSTEM_PACKAGES(1);
--更新统计信息
DBMS_STATS.GATHER_SCHEMA_STATS('NCC_2005',100,FALSE, 'FOR ALL COLUMNS SIZE AUTO');
--清理统计信息
SP_CREATE_SYSTEM_PACKAGES (1,'DBMS_STATS');
DBMS_STATS.delete_schema_stats('用户名','表名');
nccloud
通过命令行建库:./dminit PATH=/data/dmdbms_V8_20201026/data db_name=DM5248 PAGE_SIZE=32 EXTENT_SIZE=32 CASE_SENSITIVE=1 CHARSET=1 BLANK_PAD_MODE=1 port_num=5248
自定义dm参数,比如全局的关键字
nccloud
数据库批量授权,非DBA,指定库批量。登陆B用户 然后将 SYSDBA 改成A用户名 执行就可以了
DECLARE
begin
for rec in (select table_name from user_tables )
loop
execute immediate 'grant select,update,insert,delete on '||rec.table_name||' to SYSDBA;';
end loop;
end;
nccloud
查询当前登录用户 select current_user()
nccloud
阻塞的排查
当阻塞发生时,我们可以通过 v$lock 视图查到当前数据库中锁的状态
结果中我们可以看到,事务 2399 被阻塞了,阻塞他的事务为 2393,同样我们也可以通过 V$TRXWAIT 视图查找谁阻塞谁,
得出同样的结果,ID 为 2399 的事务正在等待 ID 为 2393 的事务,等待时间是1071599 毫秒。
接下来,通过 V$SESSIONS 视图查找两个事务对应的会话
可以得到两个事务对应的会话 ID 和当前执行 SQL 语句,可以知道是哪些 SQL 语句产生的阻塞。
5.阻塞的解决方法
根据需求,可以有两种解决方案。
5.1 提交或回滚产生阻塞的事务。
根据上文,我们可知产生阻塞的事务会话 ID 为 2410147992。此时,我们只需要在该会话下提交或回滚事务,锁自然会被释放,阻塞解决。
5.2 关闭产生阻塞的会话
同样,我们也可以使用系统过程 SP_CLOSE_SESSION(SESS_ID)来关闭对应的会话,具体使用方法如下。
此时,锁被释放,delete 操作也可以顺利进行下去。
nccloud
在使用数据库的过程中,我们有时希望杀掉某个会话,以解决死锁,或者释放相应的资源,回滚事务等。在达梦数据中(DM7)中如何杀掉会话。
首先通过v$sessions动态视图,查询出需要杀掉会话的会话id
select sess_id from v$sessions;
然后执行系统过程sp_close_session,杀掉相应会话:
sp_close_session(sess_id)
nccloud
解除用户密码错误次数限制及过期等
普通机登录SYSDBA即可,专用机登录syssso/SYSSSO123登录执行
alter user 用户名 limit failed_login_attemps unlimited;
alter user 用户名 limit password_life_time unlimited;
alter user 用户名 limit password_lock_time unlimited;
alter user 用户名 account unlock;
nccloud
1、查看执行计划缓存
select cache_item,sqlstr from v$cachepln where sqlstr like '%你的SQL语句关键信息%';
2、清理执行计划缓存
sp_clear_plan_cache( cache_item号);
nccloud
查看版本
select* from v$version;
select id_code;
nccloud
查看当前数据库版本、字符集、页大小等
一、
select '实例名称' 数据库选项,INSTANCE_NAME 数据库集群相关参数值 FROM v$instance union all
select '数据库版本',substr(svr_version,instr(svr_version,'V')) 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 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 '数据库模式',MODE$ from v$instance union all
select '授权用户',authorized_customer from v$license union all
select '授权时间',to_char(expired_date) from v$license;
二、
select * from V$DM_INI;
nccloud
查询表的DDL:select to_char(dbms_metadata.get_ddl('TABLE','HI_PSNJOB'))
查询表空间的:select to_char(dbms_metadata.get_ddl('TABLESPACE','nnc_data01'))
nccloud
修改字段长度
alter table HI_PSNJOB modify jobglbdef16 char(30);
改字段名
alter table "表名" rename column A to B;
添加字段
alter table "表名" add column A char(30);
nccloud
1.修改dm.ini内容。要重启数据库才能生效配置。
2.使用DM8的console控制台工具修改。要重启数据库才能生效配置。
3.使用alter system语句修改
4.通过调用系统过程SP_SET_PARA_VALUE()、SP_SET_PARA_DOUBLE_VALUE()和SP_SET_PARA_STRING_VALUE()对参数值进行修改。
alter system语句
修改参数文件 修改参数文件 修改参数文件
比如:
alter SYSTEM set 'COMPATIBLE_MODE' = 2 spfile;(修改数据库兼容性)
修改参数文件和内存中的值(动态参数)
alter SYSTEM set 'LIST_TABLE' = 1 both;
修改内存中的值(针对动态参数,当前会话不生效,下一个会话生效)
alter SYSTEM set 'LIST_TABLE' = 1 DEFERRED;
修改内存中的值(针对动态参数)
alter SYSTEM set 'LIST_TABLE' = 1 MEMORY;
修改当前会话中的值(只针对seesion类型)
alter session set 'LIST_TABLE' = 0;
系统过程SP_SET_PARA_VALUE()用于修改静态配置参数和动态配置参数。
sp_set_para_value第一个参数scope范围
1:等同于 :等同于 both ,修改参数文件和内存中的值
2:等同于 :等同于 spfile spfile ,只修改参数文件的值(静态参数只能使用 2)
例如:
call SP_SET_PARA_DOUBLE_VALUE(1, 'UNDO_RETENTION', 900);
call sp_set_para_value(2, 'COMPATIBLE_MODE', 0);
控制台工具
控制台工具可以搜索和修改参数
重要的动态视图和存储过程
DM8的静态字典表一般以SYS为前缀。而动态视图则以v$为前缀。
动态视图里可以找到会话号等需要知道的信息。
例如:
select * from v$dm_ini t where t.PARA_NAME like '%TEMP%';
select * from v$ifun t where t.name like '%SP_SET_PARA%';
select * from v$rlogfile;
select * from v$trxwait;
call sp_close_session(139650995922456);--杀死某个会话
select SF_GET_PARA_VALUE(1,'BUFFER');
重要的系统信息涉及的动态视图:
系统信息:包括数据库版本、实例、统计信息、资源限制信息、进程信息、全局索引 IID 信息、事件信息;涉及的动态视图有 V$SESSIONS、V$INSTANCE、V$RESOURCE_LIMIT、V$PROCESS、V$IID、V$SYSSTAT 等。
存储信息:包括数据库信息、表空间信息、数据文件信息、日志相关信息;涉及的动态视图有
V$DATAFILE、V$DATABASE、V$TABLESPACE、V$HUGE_TABLESPACE、V$RLOGFIL等。
会话信息:包括连接信息、会话信息;涉及的动态视图有 V$CONNECT、V$STMTS、V$SESSIONS等。
nccloud
--命令行连接数据库
disql sysdba/sysdba@IP:端口
--通过关键字查询某个参数
selectPARA_NAME,PARA_VALUE,PARA_TYPE from v$dm_ini where para_name like '%WORD%';
-- 达梦数据库的参数类型分为四种,read only、sys、in file、session
read only参数无法在数据库内部修改,只能直接修改参数文件,重启数据库后生效。
sys、session参数可以在数据库内部修改,并且立即在全局级别、会话级别生效。
in file参数可以在数据库内部修改,但无法立即生效,只能重启数据库后生效。
nccloud
参数修改的方法有两种:“达梦模式”和“Oracle模式”
所谓“达梦模式”,即使用达梦系统过程修改,具体的用法是sp_set_para_value(scope,para_name,para_value)
scope=1表示内存和参数文件同时修改(both)
scope=2表示只修改参数文件(spfile)
示例:将compatible_mode参数为2
sp_set_para_value(2,'COMPATIBLE_MODE',2)
所谓“Oracle模式”,即使用oracle原生命令“alter system set”修改参数。但是达梦对这个命令做过变化,和oracle有所不同:参数名称必须加英文单引号,spfile前不用加scope=
alter systemset‘COMPATIBLE_MODE’=271 spfile;
推荐使用达梦的系统过程修改参数。
nccloud
达梦使用系统过程sp_close_session('会话ID')杀会话
nccloud
一、对象操作相关sql
1.查看表占用空间:
2.拼接sql,批量删除模式下的表:
3.查找一个表属于哪个用户;
4.查询某一模式下的所有表名
5.查询数据库中所有用户及状态
6.查询当前用户拥有哪些角色;
7.查询当前角色下有哪些权限;
8.查询数据库是否兼容其他数据库模式
查询结果为0,表示不兼容;
2:部分兼容 ORACLE,
3:部 分兼容 MS SQL SERVER,
4:部分兼容 MYSQL
9.修改数据库当前兼容模式
见上一条,如果修改为部分兼容 MYSQL;
见上一条,如果修改为部分兼容 ORACLE;
修改以后重启数据库实例服务生效;
10.查询表上的唯一索引对应的列
修改PRODUCT_VENDOR为对应的表名
二、优化相关sql
1.更新模式下统计信息:
2.更新单表统计信息:
3.更新单列统计信息:
4.查询慢sql:
5.查询阻塞锁
6.查询锁等待
7.按照耗时排序查询慢sql
8.查询死锁涉及的事务信息
三、 其他常用sql
1.初始化代理环境:
2.授权激活:
3.查询数据库使用的字符集
结果为1,表示字符集为utf-8;
结果为0,表示字符集为gbk;
4.查询数据库大小写是否敏感
结果为1,表示大小写敏感;
结果为0,表示大小写不敏感;
5.查询varchar类型是否以字符为单位
结果为1,表示以字符为单位;
结果为0,表示以字节为单位;
6.清理归档:
7.查看用户会话空闲时间,登录失败次数限制
8.查询用户的会话持续期以及会话使用cpu时间上限
nccloud
一 统计信息分类
表统计信息、列统计信息、索引统计信息。
统计信息生成过程分以下三个步骤:
1) 表:计算表的行数、所占的页数目、平均记录长度
2) 列:统计列数据的分布情况
3) 索引:统计索引列的数据分布情况
二 统计信息收集范围
全库
对库上所有模式下的所有用户表以及表上的所有索引生成统计信息,如下:
CALL SP_DB_STAT_INIT ();
模式
一般在首次迁移完成后使用,如下:
DBMS_STATS.GATHER_SCHEMA_STATS(‘模式名’,100,TRUE,‘FOR ALL COLUMNS SIZE AUTO’);
表
CALL SP_TAB_STAT_INIT (‘模式名’, ‘表名’);
DBMS_STATS.GATHER_TABLE_STATS(‘模式名’, ‘表名’,null,100,TRUE,‘FOR ALL COLUMNS SIZE AUTO’);
列
对某个表上所有的列生成统计信息
CALL SP_TAB_COL_STAT_INIT (‘模式名’, ‘表名’);
CALL SP_STAT_ON_TABLE_COLS (‘模式名’,‘表名’,采样率);–采样率0-100
DBMS_STATS.GATHER_TABLE_STATS(USER, ‘表名’,null,100,false, ‘FOR ALL COLUMNS SIZE AUTO’); --更新所有列
对指定的列生成统计信息
CALL SP_COL_STAT_INIT (‘模式名’, ‘表名’, ‘列名’);
SP_COL_STAT_INIT_EX(USER,‘表名’,‘列名’,100); --更新单列
索引
收集某张表的所有索引的统计信息
CALL SP_TAB_INDEX_STAT_INIT (‘模式名’, ‘表名’);
对指定的索引生成统计信息
DBMS_STATS.GATHER_INDEX_STATS(user,‘索引名’);
CALL SP_INDEX_STAT_INIT (‘模式名’, ‘索引名’);
CALL SP_INDEX_STAT_INIT(USER,‘索引名’);
语句
对SQL语句涉及的所有表和过滤列生成统计信息
CALL SP_SQL_STAT_INIT (‘SQL’);
三 查看统计信息
查看指定列的统计信息
DBMS_STATS.COLUMN_STATS_SHOW(USER, ‘表名’,‘列名’);
查看指定索引的统计信息
dbms_stats.index_stats_show(user,‘索引名’);
查看最后统计收集时间
select table_name,num_rows,blocks,last_analyzed from user_tables where table_name=‘T2’;
nccloud
归档模式查看
第一种方法是使用命令select arch_mode ffrom v$database,如果是Y则说明是归档模式,N是非归档模式。
第二种方法是在达梦manage管理工具中,在数据库连接串右击,选择管理服务器,点击归档配置,查看是否开启归档模式。
归档日志信息
查询本地归档日志信息,使用命令:SELECT * FROM V$ARCH_FILE ;即可查看,对于DMDSC 集群,除了显示本地归档外,也显示远程归档信息。
归档状态查看
使用命令:SELECT * FROM V$ARCH_STATUS 即可查看归档状态,主要是看该归档是否有效。
nccloud
#语句句柄个数超上限或系统内存不足
select sql_text,state,n_stmt "句柄的容量",n_used_stmt as "使用的句柄数",curr_sch,user_name,trx_id,create_time,clnt_type,clnt_ip,run_status from v$sessions;
nccloud
一、密码包含了@等特殊字符导致disql无法直接连接和运行。需要通过转移符来处理。disql转义符使用如下,如数据库端口为非5236标准端口,需带上端口号
./disql SYSDBA/' "abcd@1234" ':5238
使用disql连接数据库时,需进到/dm8/bin/目录下执行
如果在/dm8/tool/目录下执行./disql SYSDBA/' "abcd@1234" ':5238,则会出现未连接状态,此时需要使用conn SYSDBA/' "abcd@1234" ':5238进行连接
二、查询数据库的初始化参数
select * from v$parameter t;
三、增大BUFFER缓冲区、增大TEMP_SIZE
alter system set 'BUFFER'=500 spfile;
alter system set 'TEMP_SIZE' = 100 spfile;
四、达梦数据库进程、线程查询
select * from v$process;
select * from v$threads;
五、更新数据的时候提示记录超长
达梦里面一个表中所有的列(大字段除外)的长度加起来不能超过页大小的一半。
比如安装时页大小为16k,那么一行记录的长度除大字段外所有列加起来不能超过8k
六、查看建库时的字符集
select unicode();
根据返回值进行判断:0 表示 GB18030,1 表示 UTF -8,2 表示 EUC -KR
七、达梦的密码策略
通过DM.INI里的参数:PWD_POLICY设置系统默认口令策略。0: 无策略;1: 禁止与用户名相同;2:口令长度不小于 9;4:至少包含一个大写字母(A-Z);8 :至少包含一个数字(0-9);16:至少包含一个标点符号(英文输入法状态下,除“和空格外的所有符号;若为其他数字,则表示配置值的和,如 3=1+2,表示同时启用第 1 项和第 2 项策略。当 INI参数COMPATIBLE_MODE=1 时,PWD_POLICY 的实际值均为 0
八、查表必须要表空间.表名
使用某一个用户登陆时,访问该用户的默认表空间里的表时,不需要带表空间名。
九、切换模式
set schema XXX
十、使用 SP_TRUNC_TS_FILE 函数在线收缩临时表空间;
SP_TRUNC_TS_FILE(3,0, 100);
第一个参数是临时表空间ID
第二个参数是临时表空间数据文件ID
第三个参数是截断至多大
十一、ODBC安装、配置
[root@KylinDCA04 opt]# tar -zxvf unixODBC-2.3.0.tar.gz
[root@KylinDCA04 opt]# cd unixODBC-2.3.0
[root@KylinDCA04 unixODBC-2.3.0]# ./configure --prefix=/usr/local --指定安装目录
[root@KylinDCA04 unixODBC-2.3.0]# make
[root@KylinDCA04 unixODBC-2.3.0]# make install
安装完成后有两个配置文件在etc下面odbc.ini、odbcinst.ini
[root@KylinDCA04 etc]# odbcinst -j
unixODBC 2.3.0
DRIVERS............: /usr/local/etc/odbcinst.ini
SYSTEM DATA SOURCES: /usr/local/etc/odbc.ini
FILE DATA SOURCES..: /usr/local/etc/ODBCDataSources
USER DATA SOURCES..: /root/.odbc.ini
SQLULEN Size.......: 8
SQLLEN Size........: 8
SQLSETPOSIROW Size.: 8
[root@KylinDCA04 etc]# cat /usr/local/etc/odbcinst.ini
[DM8 ODBC DRIVER]
Description = ODBC DRIVER FOR DM8
Driver = /dm8/bin/libdodbc.so
[root@KylinDCA04 etc]# cat /usr/local/etc/odbc.ini
[DM8]
Description = DM ODBC DSN
Driver = DM8 ODBC DRIVER
SERVER = localhost
UID = SYSDBA
PWD = Dameng123
TCP_PORT = 5236
验证ODBC是否安装成功:
[root@test etc]# su - dmdba
[dmdba@test ~]$ isql dm8 -v
+---------------------------------------+
| Connected! |
| |
| sql-statement |
| help [tablename] |
| quit |
| |
+---------------------------------------+
————————————————
nccloud
使用简单介绍
达梦数据库支持使用IPv6的地址访问数据库。
与使用IPv4相比,在连接时需要指定相应的格式:
(1)使用JDBC连接时,若使用ipv6地址,需要用[]指明是ipv6地址,即ipv6的地址需要包含在[]中。
例如:
达梦管理工具使用IPV6地址,如ipv6地址为fe80::1a2d:8be9:91f6:6b51,那么主机名那里则为[fe80::1a2d:8be9:91f6:6b51]。
(2)disql工具使用ipv6地址连接时,本地测试在Linux上与在Windows上存在一点区别。
主要区别如下:
Linux上使用disql采用ipv6地址访问,需要使用方括号[]将ipv6地址%disql机器的网络接口名整个包起来,如:ipv6地址为fe80::1a2d:8be9:91f6:6b51,ens33为disql机器对应的网络接口名称,则disql连接串host地址为[fe80::1a2d:8be9:91f6:6b51%ens33]。
Windows上使用disql采用ipv6地址访问配置和JDBC使用ipv6访问一样,使用方括号[]将ipv6地址包起来即可。
具体可以参考《DM8程序员手册》《DM8 disql使用手册》等。
使用演示
检查IPv6是否启用
关于IPv6启用设置可以在网上搜索方法,网上很多。默认Centos 7启用了IPv6,Windows(win10 win11)也默认启用了IPv6。
简单查看系统是否启用IPv6:
Linux7:
[root@localhost ~]# sysctl -a|grep ipv6|grep disable
net.ipv6.conf.all.disable_ipv6 = 0
net.ipv6.conf.default.disable_ipv6 = 0
net.ipv6.conf.ens32.disable_ipv6 = 0
##上面为0,则表示未禁用ipv6(默认)
[root@localhost ~]# ifconfig
ens32: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.15.71 netmask 255.255.255.0 broadcast 192.168.15.255
inet6 fe80::1a2d:8be9:91f6:6b51 prefixlen 64 scopeid 0x20<link>
inet6 fd15:4ba5:5a2b:1008:9ef5:bef9:de64:c30a prefixlen 64 scopeid 0x0<global>
ether 00:0c:29:89:30:0d txqueuelen 1000 (Ethernet)
RX packets 796502 bytes 872721471 (832.2 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 1028073 bytes 2448756974 (2.2 GiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
##上面inet6表示启用了ipv6
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Windows:
ipconfig [-all]
#可以看到显示IPv6地址,则表示启用
1
2
测试机器之间IPv6地址是否能正常通信
方法:
假如Linux数据库服务器为A机,Linux客户端机器为B机,Windows客户端机器为C机
B机 telnet A机:telnet -6 A机ipv6地址%B机使用的网络接口名称 端口号 (Linux-Linux,网络接口名称比如ens32)
C机 telnet A机:telnet A机ipv6地址%C机对应地址的scopeid 端口号 (Windows-Linux,scopeid为Windows IPv6地址那里显示的"ipv6地址%scopeid"中的scopeid)
###关于IPv6这块详细的知识,可以查阅网上相关文章等,此处就简单说明一下
Linux数据库服务器的IPv6地址为fe80::1a2d:8be9:91f6:6b51 , IPv4地址为:192.168.15.71
(1)linux之间telnet测试
客户端机器地址:为fe80::89b7:a6c4:d5cc:d905
telnet测试:
telnet测试IPv6网络正常。
(2)Windows到Linux之间telnet测试
Windows客户机器地址:
以太网适配器 以太网:
连接特定的 DNS 后缀 . . . . . . . :
本地链接 IPv6 地址. . . . . . . . : fe80::d5af:10cd:5f2e:4fda
IPv4 地址 . . . . . . . . . . . . : 192.168.0.100
子网掩码 . . . . . . . . . . . . : 255.255.255.0
默认网关. . . . . . . . . . . . . : 192.168.0.1
以太网适配器 VMware Network Adapter VMnet1:
连接特定的 DNS 后缀 . . . . . . . :
本地链接 IPv6 地址. . . . . . . . : fe80::4c57:e965:991d:f036
IPv4 地址 . . . . . . . . . . . . : 192.168.25.1
子网掩码 . . . . . . . . . . . . : 255.255.255.0
默认网关. . . . . . . . . . . . . :
以太网适配器 VMware Network Adapter VMnet8:
连接特定的 DNS 后缀 . . . . . . . :
IPv6 地址 . . . . . . . . . . . . : fd15:4ba5:5a2b:1008:6170:2d1c:c51d:a1b3
临时 IPv6 地址. . . . . . . . . . : fd15:4ba5:5a2b:1008:1b9:c6a1:c604:e634
本地链接 IPv6 地址. . . . . . . . : fe80::6170:2d1c:c51d:a1b3%20 ###ipv6%scopeid
IPv4 地址 . . . . . . . . . . . . : 192.168.15.1
子网掩码 . . . . . . . . . . . . : 255.255.255.0
默认网关. . . . . . . . . . . . . : fe80::250:56ff:fec0:2222%20
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
本次环境数据库机器是VMware虚拟机,使用的NAT网络即VMnet8,所以采用VMnet8的IPv6地址后面的scopeid进行测试。如下:
测试ipv6地址网络正常。
使用disql进行连接测试
Linux客户机使用disql连接
(1)###ipv4
[dmdba@localhost bin]$ ./disql SYSDBA/SYSDBA@192.168.15.71:5236
服务器[192.168.15.71:5236]:处于普通打开状态
登录使用时间 : 31.898(ms)
disql V8
SQL> QUIT
(2)###ipv6
####disql连接串host不加网络接口名称,连接失败
[dmdba@localhost bin]$ ./disql SYSDBA/SYSDBA@[fe80::1a2d:8be9:91f6:6b51]:5236
[-70028]:创建SOCKET连接失败.
disql V8
用户名:
密码:
[-70028]:创建SOCKET连接失败.
用户名:^C
####disql连接串host加上网络接口名称,连接正常
[dmdba@localhost bin]$ ./disql SYSDBA/SYSDBA@[fe80::1a2d:8be9:91f6:6b51%ens33]:5236
服务器[fe80::1a2d:8be9:91f6:6b51%ens33:5236]:处于普通打开状态
登录使用时间 : 5.810(ms)
disql V8
SQL> select * from v$instance;
行号 NAME INSTANCE_NAME INSTANCE_NUMBER HOST_NAME
---------- -------- ------------- --------------- ---------------------
SVR_VERSION DB_VERSION START_TIME STATUS$ MODE$
-------------------------- ------------------- ------------------- ------- ------
OGUID DSC_SEQNO DSC_ROLE
----------- ----------- --------
1 DMSERVER DMSERVER 1 localhost.localdomain
DM Database Server x64 V8 DB Version: 0x7000c 2021-10-28 11:36:28 OPEN NORMAL
0 0 NULL
已用时间: 32.412(毫秒). 执行号:1500.
SQL>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
Windows客户机使用disql连接
###ipv4 连接成功
E:\dmdbms270\bin>disql SYSDBA/SYSDBA@192.168.15.71:5236
服务器[192.168.15.71:5236]:处于普通打开状态
登录使用时间 : 15.842(ms)
disql V8
SQL> QUIT
###ipv6
####disql连接串host不加scopeid,连接成功
E:\dmdbms270\bin>disql SYSDBA/SYSDBA@[fe80::1a2d:8be9:91f6:6b51]:5236
服务器[fe80::1a2d:8be9:91f6:6b51:5236]:处于普通打开状态
登录使用时间 : 17.334(ms)
disql V8
SQL> QUIT
####disql连接串host加scopeid,也可连接成功
E:\dmdbms270\bin>disql SYSDBA/SYSDBA@[fe80::1a2d:8be9:91f6:6b51%20]:5236
服务器[fe80::1a2d:8be9:91f6:6b51%20:5236]:处于普通打开状态
登录使用时间 : 3.872(ms)
disql V8
SQL> quit
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
使用DM管理工具进行连接测试
Linux客户机使用DM管理工具进行连接
可以发现使用JDBC连接时(DM管理工具使用的是JDBC连接),连接地址那里加或者不加网络接口名称都能连接成功。
Windows客户机使用DM管理工具进行连接
通过测试发现,同Linux上使用DM管理工具的情况。Windows上加不加对应网卡的scopeid,都可以成功连接到数据库。
使用dm_svc.conf中服务名方式连接测试
Linux客户端机器上dm_svc.conf文件配置内容如下:
TIME_ZONE=(480)
LANGUAGE=(cn)
IPV6=([fe80::1a2d:8be9:91f6:6b51]:5236)
IPV6_2=([fe80::1a2d:8be9:91f6:6b51%ens33]:5236)
1
2
3
4
Windows客户端机器上dm_svc.conf文件配置内容如下:
TIME_ZONE=(480)
LANGUAGE=(cn)
IPV6=([fe80::1a2d:8be9:91f6:6b51]:5236)
IPV6_2=([fe80::1a2d:8be9:91f6:6b51%20]:5236)
1
2
3
4
disql测试服务名方式
Linux客户机:
Windows客户机:
DM管理工具测试
LInux客户端机器:
Windows客户端机器:
简单的 JAVA 代码测试
(1)直接使用IPv6地址连接,操作数据库成功
(2)使用dm_svc.conf中的服务名连接,操作数据库正常
总结
1、使用JDBC通过IPv6地址进行访问时,只需要在连接串中将IPv6地址使用方括号[] 括起来即可。
2、Linux机器上使用disql工具采用IPv6地址进行连接时,需要加上%disql客户机对应的网络接口名称(同telnet),如**./disql SYSDBA/SYSDBA@[fe80::1a2d:8be9:91f6:6b51%ens33]:5236**,而Windows机器只需要使用方括号[]将IPv6地址括起来即可。
nccloud
一、启动/关闭数据库
(一)启动数据库
1、命令行方式
cd /dm8/dmdbms/bin
./dmserver [ini_file_path] [-noconsole] [mount]
说明:
(1)Dmserver命令行启动参数可指定dm.ini文件的路径,非控制台方式启动及指定数据库是否以MOUNT状态启动。
(2)Dmserver启动时可不指定任何参数,默认使用当前目录下的dm.ini文件,如果当前目录不存在dm.ini文件,则无法启动
(3)Dmserver 启动时可以指定-noconsole 参数。如果以此方式启动,则无法通过在控制台中输入服务器命令。当以控制台方式启动dmserver时,用户可以在控制台输入一些命令。
当不确定启动参数的使用方法时,可以使用 help 参数,将打印出格式、参数说明和使用示例。使用方法如下:
[dmdba@dmtest ~]$ /dm8/dmdbms/bin/dmserver help
格式: ./dmserver [ini_file_path] [-noconsole] [mount] [path=ini_file_path] [dcr_ini=dcr_path]
实例:
./dmserver path=/opt/dmdbms/bin/dm.ini
./dmserver /opt/dmdbms/bin/dm.ini
关键字 说明
--------------------------------------------------------------------------------
path dm.ini绝对路径或者dmserver当前目录的dm.ini
dcr_ini 如果使用css集群环境,指定dmdcr.ini文件路径
-noconsole 以服务方式启动
mount 配置方式启动
help 打印帮助信息
生产库实例:/dm8/dmdbms/bin/dmserver /dm8/dmdata/DMOA/dm.ini -noconsole
2、服务的方式
systemctl start DmServiceDMOASERVER.service
systemctl status DmServiceDMOASERVER.service
[root@dmtest ~]# systemctl list-unit-files|grep Dm*
DmAPService.service enabled
DmServiceDMOASERVER.service enabled
说明:
无论是在何种操作系统下运行,DM数据库在启动时都会进行LICENSE检查。若LICENSE过期或KEY文件与实际运行环境不配套,DM服务器会强制退出。
(二)关闭数据库
1、命令行模式
在启动数据库的命令工具中输入exit,然后回车,退出DM数据库
2、服务的方式
systemctl stop DmServiceDMOASERVER.service
二、表空间
DM8创建数据库时,系统会自动创建5个表空间:SYSTEM、ROLL、MAIN、TEMP、HMAIN。
(1)SYSTEM 存放全局数据字典信息和全局系统数据。
(2)ROLL 存放回滚记录。
(3)MAIN 存放临时数据。
(4)TEMP 用户默认表空间。
(5)HMAIN HUGE表空间,存放列式存储数据。
(一)创建表空间
创建名为bookshop的表空间,并指定该空间上拥有2个数据文件,每个数据文件的大小为128M:
create tablespace bookshop datafile 'd:\bookshop1.dbf' size 128,'d:\bookshop2.dbf' size 128;
创建表空间时指定数据文件初始代销为128M,扩展属性为可自动扩展,每次扩展大小为100m,最大可扩展到200M:
create tablespace test datafile '/dm8/dmdata/DMOA/test.dbf' size 128 autoextend on next 100 maxsize 200;
说明:
添加的数据文件大小最小为4096*页大小,如页大小为32K,则可添加的文件最小值为4096*32k=128M。
(二)删除表空间
只可以删除用户创建的表空间并且只能删除未使用过的表空间。删除表空间时会删除其拥有的所有数据文件。
例如删除bookshop表空间:
drop tablespace bookshop;
(三)修改表空间名
可修改已存在的由用户创建的表空间的名称。
比如可修改bookshop表空间名为books:
alter tablespace bookshop rename to books;
(四)扩展表表空间
在bookshop表空间中添加大小为64M的数据文件:
alter tablespace bookshop add datafile 'd:\book.dbf' size 64;
扩展bookshop表空间中数据文件book.dbf大小至128M:
alter tablespace bookshop resize datafile 'd:\book.dbf' to 128;
三、账户
(一)账户创建
创建用户TEST_USER时指定该用户使用的最大磁盘空间为50M
create user test_user identified by test_password diskspace limit 50;
对用户的空间限制也可进行更改,如修改用户TEST_USER的磁盘空间限制为无限制:
alter user test_user diskspace unlimited;
(二)表创建
创建表TEST时指定该表对象可使用的最大磁盘空间为500M
create table test(sno int,myinfo varchar) diskspace limit 500;
对表对象空间的限制也可进行更改,如修改表TEST的磁盘空间限制为50M:
alter table test modify diskspace limit 50;
四、重做日志文件
(一)添加重做日志文件
在服务器打开状态下,可以添加新的重做日志文件。添加的数据文件大小最小为4096*页大小,如页大小为32K,则可添加的文件最小值为4096*32k=128M。
示例如下:
alter database add logfile 'd:\dameng03.log' size 128;
(二)扩展重做日志文件
在服务器打开状态下,可以扩展已有的重做日志文件的大小。
alter database resize logfile 'd:\dameng03.log' to 256;
五、回滚表空间
回滚空间的空间名固定为ROLL,不可修改。
(一)扩展回滚表空间
回滚空间的其他管理和用户表空间的管理基本是一样的,可增加和扩展回滚空间中的回滚文件,设置回滚空间的扩展属性。
(二)修改回滚表空间路径
回滚文件的路径记录在控制文件里面,可以使用dmctlcvt工具在DM服务器关闭的状态下对控制文件进行修改。使用dmctlcvt工具将控制文件转换为文本文件,编辑文本文件
中要修改的文件的路径后再使用dmctlcvt工具将文本文件转换为控制文件即可。
示例如下:回滚表空间路径从d盘移动到e盘
(1)首先转换控制文件到文本文件
dmctlcvt c2t D:\dm.ctl D:\ctl.txt
(2)编辑ctl.txt文本文件
将文件中的fil_path=d:\roll.dbf改为新路径fil_path=e:\roll.dbf,保存文本文件。
(3)复制d:\roll.dbf文件为e:\roll.dbf
(4)最后转换文本文件到控制文件
dmctlcvt t2c D:\ctl.txt D:\dm.ctl
这种修改文件路径的方法也可用于重做日志文件,系统表空间文件等路径的修改
六、常用操作
(一)会话
1、连接会话概况
select*from v$connect;
说明:IP_ADDR为“::1”且TYPE$为“SQL3”,表示会话是在达蒙服务器通过bing/disql直连的
2、连接会话详细信息
如:执行的sql语句、主库名、当前会话状态、用户名等等
---会话id可以通过“select sessid ();”获取
select *from v$sessions where state='ACTIVE';
select *from v$sessions where user_name='OA' and clnt_host='dmtest' and appname='disql' and clnt_ip='::1' and sess_id=281223325068824;
select sess_seq,state,substr(sql_text,0,10)sql_text,user_name,create_time,clnt_host,appname,clnt_ip,osname,last_send_time,trx_id from v$sessions;
3、杀掉会话
sp_close_session(281224128100360);
说明:281224128100360是v$sessions中的sess_id
(二)SQL
1、通过会话id查询SQL执行文本
select sf_get_session_sql(281223325068824)from dual;
2、通过sql文本查询sql_id和hash_value
select*from v$sqltext where sql_text like '%select wftnode0_.NODEID as NODEID40_0_%';
3、通过sql_id或hash_value查询执行计划
select*from v$sql_plan where sql_id=16919;
4、通过sql_id查询sql历史执行信息
select*from v$sql_history where sql_id=16919;
5、查询执行时长超过2秒的活动SQL语句
select sess_id,sql_text,sf_get_session_sql(sess_id)fullsql,last_recv_time,datediff(ss,last_recv_time,sysdate)y_exectime,clnt_ip from v$sessions where state='ACTIVE';
6、显示系统最近1000条执行时间超过预定值的SQL语句
select*from v$long_exec_sqls where to_char(finish_time,'yyyymmdd')='20210219' order by finish_time desc;
(三)事务和锁
select*from v$trx
select*from v$lock;
select ,l.* from v$lock l,sysobjects o where l.table_id= and l.blocked=1;
(四)数据库对象信息
1、所有账户
select username,user_id,account_status,default_tablespace,temporary_tablespace,created,profile from dba_users;
select ,u.id,o.crtdate,o.valid,u.locked_status,last_login_dtid from sysusers u,sysobjects o where u.id= and o.type$='UR' and o.subtype$='USER';
2、指定账户下所有对象
select*from sysobjects where schid in(select id from sysobjects where type$='SCH' and name='OA');
sysobjects字段说明:
schid:TYPE$=SCHOBJ或者TYPE$=TABOBJ时表示对象所属的模式 ID,否则为 0。
type$:对象的主类型
1) 库级:UR(用户), SCH(模式), POLICY,GDBLINK, GSYNOM,DSYNOM,DIR,OPV,SPV,RULE,DMNOBJ;
2) 模式级:SCHOBJ;
3) 表级:TABOBJ
subtype$:对象的子类型。分为三种:
1) 用户对象:USER, ROLE;
2) 模式对象:UTAB,STAB,VIEW,PROC,SEQ,PKG,TRIG, DBLINK,SYNOM, CLASS,TYPE,JCLASS,DOMAIN,CHARSET,CLLT,CONTEXT;
3) 表对象:INDEX,CNTIND,CONS
(五)表空间
1、单独查询数据文件
select ts_name,
decode(d.auto_extend,1,'自动扩展',0,'非自动扩展')auto_extend,
d.next_size,
ts_id,
d.id file_id,
d.path file_name,
d.create_time,
d.modify_time,
d.status$,
d.total_size * sf_get_page_size() / 1024 / 1024||'M' "Size(MB)",
d.free_size * sf_get_page_size() / 1024 / 1024||'M' "Free(MB)",
(d.total_size-d.free_size) * 100 / d.total_size||'%' "Used(%)"
from v$tablespace t, v$datafile d
where = d.group_id order by ,d.id;
2、汇总数据文件
select name,
sum(total_size) * sf_get_page_size() / 1024 / 1024 || 'M' "Size(MB)",
sum(free_size) * sf_get_page_size() / 1024 / 1024 || 'M' "Free(MB)",
(sum(total_size)-sum(free_size)) * 100 / sum(total_size) || '%' "Used(%)"
from (select , d.total_size, d.free_size
from v$tablespace t, v$datafile d
where = d.group_id)
group by name;
(六)数据库及参数配置
数据库信息:
select*from v$database;
实例信息:
select*from v$instance;
所有初始化参数:
select*from v$dm_ini;
控制文件:
select*from v$dm_ini where para_name='CTL_PATH';
归档配置:
select*from v$dm_arch_ini;
日志文件:
select*from v$rlogfile;
(七)查看/调整数据库参数配置
1、通过视图查看
select*from v$dm_ini where para_name='SVR_LOG';
此参数表示是否打开SQL日志功能,0:表示关闭;1:表示打开;2:按文件中记录数量切换日志文件,日志记录为详细模式;3:不切换日志文件,日志记录为简单模式,只记录时间和原始语句
2、通过函数查看/修改
可以在dm数据库运行过程中执行sf_get_para_value、sf_get_para_double_value和sf_get_para_string_value这三个函数来获取系统的当前配置参数,并且可以使用sp_set_para_value 和 sp_set_para_double_value 过程来修改静态/动态配置参数。
SQL> select sf_get_para_value(1,'svr_log') from sysdual;
行号 SF_GET_PARA_VALUE(1,'svr_log')
---------- ------------------------------
1 1
SQL> SELECT sf_get_sys_priv(8197) FROM sysdual;
行号 SF_GET_SYS_PRIV(8197)
---------- ---------------------
1 EXECUTE
示例如下:
sf_get_para_value(scope int, paraname varchar(256))
配置参数的值类型为数值类型时使用该函数来获取当前值。scope 参数为1表示获取ini文件中配置参数的值,为2表示获取内存中配置参数的值。
sf_get_para_double_value(scope int, paraname varchar(8187))
配置参数的值类型为浮点型时使用该函数来获取当前值。scope 参数为1 表示获取ini文件中配置参数的值,为 2 表示获取内存中配置参数的值。
sf_get_para_string_value (scope int, paraname varchar(8187))
配置参数的值为字符串类型时用该系统函数来获取当前值。scope 参数为 1 表示获取ini 文件中配置参数的值,为 2 表示获取内存中配置参数的值。
sp_set_para_value (scope int, paraname varchar(256), value int64)
该过程用于修改整型静态配置参数和动态配置参数。scope 参数为1 表示在内存和ini文件中都修改参数值,此时只能修改动态的配置参数。参数为 2 表示只在 ini 文件中修改配置参数,此时可用来修改静态配置参数和动态配置参数。当 scope 等于 1,试图修改静态配置参数时服务器会返回错误信息。只有具有 dba 角色的用户才有权限调用 sp_set_para_value。
sp_set_para_double_value (scope int, paraname varchar(8187),alue double)
该过程用于修改浮点型静态配置参数和动态配置参数。scope 参数为 1 表示在内存和ini 文件中都修改参数值,此时只能修改动态的配置参数。参数为 2 表示只在 ini 文件中修改配置参数,此时可用来修改静态配置参数和动态配置参数。当 scope 等于 1,试图修改静态配置参数时服务器会返回错误信息。只有具有 dba 角色的用户才有权限调用sp_set_para_double_value。
sf_set_system_para_value (paraname varchar(256), value int64\double\varchar(256), deferred int, scope int64)
该过程用于修改系统整型、double、varchar 的静态配置参数或动态配置参数。deferred 参数,为 0 表示当前 session 修改的参数立即生效,为 1 表示当前 session不生效,后续再生效,默认为 0。scope 参数为 1 表示在内存和 ini 文件中都修改参数值,此时只能修改动态的配置参数。参数为 2 表示只在 ini 文件中修改配置参数,此时可用来修 改 静 态 配 置 参 数 和 动 态 配 置 参 数 。 只 有 具 有 dba 角 色 的 用 户 才 有 权 限 调 用sf_set_system_para_value。
dm 的动态 ini 参数分为系统级和会话级两种级别。会话级参数在服务器运行过程中被修改时,之前创建的会话不受影响,只有新创建的会话使用新的参数值。
1. sf_set_session_para_value (paraname varchar(8187), value bigint)
设置某个会话级 ini 参数的值,设置的参数值只对本会话有效。
2. sp_reset_session_para_value (paraname varchar(8187))
重置某个会话级 ini 参数的值,使得这个 ini 参数的值和系统 ini 参数的值保持一致。
3. sf_get_session_para_value (paraname varchar(8187))
获得当前会话的某个会话级 ini 参数的值。需要注意的是,在对参数进行调整前,dba 应该深刻理解配置参数中每个参数的含义和对系统的影响,避免由于错误的调整导致影响整个系统对外提供正常服务。对于一些关键业务,在实际调整前,建议在测试系统上先进行试验,验证通过后再在生产系统上进行调整。
(八)数据库归档配置
1、开启归档
alter database add archivelog 'type=local,dest=/dm8/dmarch,file_size=512,space_limit=0';
参数说明:
file_size 单个redo日志归档文件大小,取值范围65MB-2048MB,默认是1024MB。
2、查看是否开启归档
SQL> select name,status$,role$,arch_mode from v$database;
行号 NAME STATUS$ ROLE$ ARCH_MODE
---------- ---- ----------- ----------- ---------
1 DMOA 4 0 Y
3、查看归档配置
SQL> select*from v$dm_arch_ini;
行号 ARCH_NAME ARCH_TYPE ARCH_DEST ARCH_FILE_SIZE ARCH_SPACE_LIMIT ARCH_HANG_FLAG ARCH_TIMER_NAME ARCH_IS_VALID ARCH_WAIT_APPLY ARCH_INCOMING_PATH ARCH_CURR_DEST
---------- -------------- --------- ----------- -------------- ---------------- -------------- --------------- ------------- --------------- ------------------ --------------
1 ARCHIVE_LOCAL1 LOCAL /dm8/dmarch 512 51200 1 NULL Y NULL NULL /dm8/dmarch
七、常用函数
(一)执行检查点
select checkpoint(rate int);
说明:rate表示刷脏页百分比,取值范围1-100或0,如果为0表示所有脏页都刷新到磁盘,如果是30表示30%的脏页刷新到磁盘。
(二)INI参数管理
1、获得dm.ini文件中BUFFER参数值
select sf_get_para_value(1,'buffer');
2、将dm.ini文件中HFS_CACHE_SIZE参数值设置为320
sp_set_para_value (1,'hfs_cache_size',320);
也可以统一使用如下函数修改系统整型、double、varchar 的静态配置参数或动态配置参数:
sf_set_system_para_value ('join_hash_size',50,1,1);
3、设置会话级ini参数join_hash_size的值为2000
sf_set_session_para_value('join_hash_size',2000);
4、重置会话级ini参数join_hash_size的值
sp_reset_session_para_value('join_hash_size')
5、获取会话级ini参数join_hash_size的值:
select sf_get_session_para_value('join_hash_size');
6、设置服务器日志相关INI参数
select sf_set_sql_log(1, '3:5:7');
(三)杀掉会话
说明:281224128100360是v$sessions中的sess_id
sp_close_session(281224128100360);
终止 id 为 310509680 的会话的操作
call sp_cancel_session_operation (310509680);
(四)查询数据库基础信息
1、获得系统建库时指定的簇大小
select sf_get_extent_size ();
2、获得系统建库时指定的页大小
select sf_get_page_size ();
3、获得系统建库时指定字符集
select sf_get_unicode_flag ();
4、获取数据库唯一标志 sguid
select sf_get_sguid();
5、获取一个唯一编码串。
select guid();
6、返回当前连接 id
select sessid ();
7、返回当前用户 id
select uid();
8、返回当前用户名
select user();
9、获取数据库名
select cur_database();
10、获取系统当前时钟记数
select cur_tick_time();
(五)重组表空间空闲簇
call sp_reclaim_ts_free_extents('system');
(六)清空执行缓存信息
call sp_clear_plan_cache();
(七)执行计划
设置计划 id 为 473546872 的计划结果集缓存生效。
call sp_set_pln_rs_cache(473546872, 1);
清空 id 为 473546872 的执行缓存信息
call sp_clear_plan_cache(473546872);
(八)用户对表或列的权限
获得用户 sysdba 对表 sys.sysobjects 的查询权限
select sf_check_user_table_priv ('sys', 'sysobjects', 'sysdba', 0);
获得用户 sysdba 对表 sys.sysobjects 的 id 列的查询权限
select sf_check_user_table_col_priv ('sys', 'sysobjects', 'id' ,'sysdba', 0);
说明:0=select, 1=insert, 2=delete, 3=update,4=reference
(九)监控执行时间超过5秒的语句
监控结果存放在v$log_exec_sqls_time
call sp_set_long_time(5000);
查看 v$long_exec_sqls 监控的最短执行时间。
select sf_get_long_time();
(十)返回指定会话上最近处理的完整的语句
select sf_get_session_sql(96710784);
(十一)备份恢复管理
1、添加备份目录
SELECT SF_BAKSET_BACKUP_DIR_ADD('DISK','/home/dm_bak');
2、删除备份目录
SELECT SF_BAKSET_BACKUP_DIR_REMOVE('DISK','/home/dm_bak');
3、清理全部备份目录
SELECT SF_BAKSET_BACKUP_DIR_REMOVE_ALL();
4、删除指定备份集
SELECT SF_BAKSET_REMOVE('DISK','/home/dm_bak/db_bak_for_remove',1);
5、批量删除满足指定条件的所有备份集。
SELECT SF_BAKSET_REMOVE_BATCH ('DISK', now(), NULL, NULL);
6、批量删除指定时间之前的数据库备份集
CALL SP_DB_BAKSET_REMOVE_BATCH('DISK', NOW());
7、批量删除指定表空间对象及指定时间之前的表空间备份集
CALL SP_TS_BAKSET_REMOVE_BATCH('DISK',NOW(),'MAIN');
8、批量删除指定表对象及指定时间之前的表备份集
CALL SP_TAB_BAKSET_REMOVE_BATCH('DISK',NOW(),'SYSDBA','TAB_FOR_BATCH_DEL');
9、批量删除指定时间之前的归档备份集
CALL SP_ARCH_BAKSET_REMOVE_BATCH('DISK', NOW());
(十二)对象相关信息管理
1、返回表/视图定义
CALL SP_TABLEDEF('PRODUCTION','PRODUCT');
CALL SP_VIEWDEF('PURCHASING','VENDOR_EXCELLENT');
2、获取check约束/unique约束/索引/同义词/序列
通过查询系统表,得到约束 ID 为 134217770,查询check约束定义:
SELECT , FROM SYSOBJECTS A, SYSOBJECTS B WHERE ='TEST_CHECKDEF' AND A.PID= AND A.SUBTYPE$='CONS';
SELECT CHECKDEF(134217770,1);
通过查询系统表,系统生成 C2 上的 INDEX 为 33555481,查询unique约束定义:
SELECT C.INDEXID FROM SYSOBJECTS O,SYSCONS C WHERE ='CONS1' AND =;
SELECT CONSDEF(33555481,1);
查询系统表得到索引 ID,获取index的创建定义:
SELECT NAME, ID FROM SYSOBJECTS WHERE NAME='PRODUCT_IND' AND SUBTYPE$='INDEX';
SELECT indexdef(33555530,1);
获取同义词定义:
SELECT SYNONYMDEF('SYSDBA', 'SYSOBJECTS',0,1);
获取序列定义:
SELECT ID FROM SYSOBJECTS WHERE NAME='SEQ1'; --查出 id 为 167772160
SELECT SEQDEF(167772160, 1);
3、对指定索引进行空间整理
CALL SP_REORGANIZE_INDEX('PRODUCTION','PRODUCT_IND');
4、重建索引
SP_REBUILD_INDEX('SYSDBA', 33555530);
5、获取自增列当前值
SELECT IDENT_CURRENT('PRODUCTION.PRODUCT');
(十三)日志管理
1、删除三天之前的归档日志
SELECT SF_ARCHIVELOG_DELETE_BEFORE_TIME(SYSDATE - 3);
2、删除 LSN 值小于 95560 的归档日志文件。
SELECT SF_ARCHIVELOG_DELETE_BEFORE_LSN(95560)
(十四)统计信息
1、对 SYSOBJECTS 表上所有的索引生成统计信息
CALL SP_TAB_INDEX_STAT_INIT ('SYS', 'SYSOBJECTS');
2、对库上所有模式下的所有用户表以及表上的所有索引生成统计信息
CALL SP_DB_STAT_INIT ();
3、对指定的索引 IND 生成统计信息
CALL SP_INDEX_STAT_INIT ('SYSDBA', 'IND');
4、对表 SYSOBJECTS 的 ID 列生成统计信息
CALL SP_COL_STAT_INIT ('SYS', 'SYSOBJECTS', 'ID');
5、对'SYSOBJECTS'表上所有的列生成统计信息
CALL SP_TAB_COL_STAT_INIT ('SYS', 'SYSOBJECTS');
6、对'SYSOBJECTS'表上所有的列生成统计信息,采样率 90
CALL SP_STAT_ON_TABLE_COLS ('SYS','SYSOBJECTS',90);
7、对表 SYSOBECTS 生成统计信息
CALL SP_TAB_STAT_INIT ('SYS', 'SYSOBJECTS');
8、对'SELECT * FROM SYSOBJECTS'语句涉及的所有表生成统计信息
CALL SP_SQL_STAT_INIT ('SELECT * FROM SYSOBJECTS');
9、清空索引 IND 的统计信息
CALL SP_INDEX_STAT_DEINIT ('SYSDBA', 'IND');
10、删除 SYSOBJECTS 的 ID 列的统计信息
CALL SP_COL_STAT_DEINIT ('SYS', 'SYSOBJECTS', 'ID');
11、删除 SYSOBJECTS 表上所有列的统计信息
CALL SP_TAB_COL_STAT_DEINIT ('SYS', 'SYSOBJECTS');
12、删除表 SYSOBECTS 的统计信息
CALL SP_TAB_STAT_DEINIT ('SYS', 'SYSOBJECTS');
13、统计指定执行ID的所有操作符的执行时间
需设置INI参数ENABLE_MONITOR=1、MONITOR_TIME=1 和 MONITOR_SQL_EXEC=1。
select count(*) from sysobjects where name='SYSDBA';
已用时间: 14.641(毫秒). 执行号:26. 可以得到执行号为 26。
et(26);
(十五)资源监控
1、监测当前系统的内存空间是否低于阀值
CALL SP_CHECK_IDLE_MEM ();
2、监测 d:\data 路径下的磁盘空间是否低于阀值
CALL SP_CHECK_IDLE_DISK ('d:\data');
说明:对 指 定 位 置 的 磁 盘 空 间 进 行 检 测 , 并 在 低 于 阈 值 ( 对 应 INI 参 数IDLE_DISK_THRESHOLD)的情况下打印报警记录到日志,同时报磁盘空间不足的异常。
3、查看 DM 服务器对用户命令的平均响应时间
在 dm.ini 中 ENABLE_MONITOR 取值不小于 2 的前提下执行,单位秒
SELECT SYS.SF_GET_CMD_RESPONSE_TIME();
4、查看事务的平均响应时间
在 dm.ini 中 ENABLE_MONITOR 取值不为 0 的前提下执行,单位秒
SELECT SYS.SF_GET_TRX_RESPONSE_TIME();
5、查看数据库中用户态时间占总处理时间的比值
在 dm.ini 中 ENABLE_MONITOR 取值不小于 2 的前提下执行,用户态时时间占总处理时间的比值,该比值越大表明用于 IO、事务等待等耗费的时间越少
SELECT SYS.SF_GET_DATABASE_TIME_PER_SEC();
(十六)空间占用
1、查看用户占用的空间
可以使用系统函数USER_USED_SPACE得到用户占用空间的大小,函数参数为用户名,返回值为占用的页的数目。
SELECT USER_USED_SPACE('TEST_USER');
2、查看表占用的空间
可以使用系统函数TABLE_USED_SPACE得到表对象占用空间的大小,函数参数为模式名和表名,返回值为占用的页的数目。
SELECT TABLE_USED_SPACE('SYSDBA', 'TEST');
3、查看表使用的页数
可以使用系统函数TABLE_USED_PAGES得到表对象实际使用页的数目,函数参数为模式名和表名,返回值为实际使用页的数目。
SELECT TABLE_USED_PAGES('SYSDBA', 'TEST');
4、查看索引占用的空间
可以使用系统函数INDEX_USED_SPACE得到索引占用空间的大小,函数参数为索引ID,返回值为占用的页的数目。
SELECT INDEX_USED_SPACE(33555463);
5、查看索引使用的页数
可以使用系统函数INDEX_USED_PAGES得到索引实际使用页的数目,函数参数为索引ID,返回值为实际使用页的数目。
SELECT INDEX_USED_PAGES(33555463);
6、获取整个数据库占用的页数
SELECT DB_USED_SPACE ();
(十七)其他杂类函数
1、将整型数 2010,2,2,5,5 转换成日期时间类型
SELECT TO_DATETIME (2010,2,2,5,5);
2、清空动态性能视图 V$SQL_HISTORY 的历史数据
SP_DYNAMIC_VIEW_DATA_CLEAR('V$SQL_HISTORY');
3、解锁用户
call SP_UNLOCK_USER('USER123');
4、获得表达式的内部存储字节
select dump('an',1017);
5、让一个线程睡眠 1 秒钟之后,再醒过来继续运行
sleep(1);
6、获取表的行数,功能和 SP_GET_TABLE_COUNT 一样
SELECT SP_GET_TABLE_COUNT(1097);