1.了解存储过程、触发器、包、游 标等对象的基本操作。
–创建包
CREATE OR REPLACE PACKAGE PersonPackage AS
E_NoPerson EXCEPTION;
PersonCount INT;
Pcur CURSOR;
PROCEDURE AddPerson(Pname VARCHAR(100), Pcity varchar(100));
PROCEDURE RemovePerson(Pname VARCHAR(100), Pcity varchar(100));
PROCEDURE RemovePerson(Pid INT);
FUNCTION GetPersonCount RETURN INT;
PROCEDURE PersonList;
END PersonPackage;
–创建包体 含存储过程
CREATE OR REPLACE PACKAGE BODY PersonPackage AS
PROCEDURE AddPerson(Pname VARCHAR(100), Pcity varchar(100) )AS
BEGIN
INSERT INTO Person(Name, City) VALUES(Pname, Pcity);
PersonCount = PersonCount + SQL%ROWCOUNT;
END AddPerson;
PROCEDURE RemovePerson(Pname VARCHAR(100), Pcity varchar(100)) AS
BEGIN
DELETE FROM Person WHERE NAME LIKE Pname AND City like Pcity;
PersonCount = PersonCount - SQL%ROWCOUNT;
END RemovePerson;
PROCEDURE RemovePerson(Pid INT) AS
BEGIN
DELETE FROM Person WHERE Id = Pid;
PersonCount = PersonCount - SQL%ROWCOUNT;
END RemovePerson;
FUNCTION GetPersonCount RETURN INT AS
BEGIN
RETURN PersonCount;
END GetPersonCount;
PROCEDURE PersonList AS
DECLARE
V_id INT;
V_name VARCHAR(100);
V_city VARCHAR(100);
BEGIN
IF PersonCount = 0 THEN
RAISE E_NoPerson;
END IF;
OPEN Pcur FOR SELECT Id, Name, City FROM Person;
LOOP
FETCH Pcur INTO V_id,V_name,V_city;
EXIT WHEN Pcur%NOTFOUND;
PRINT (‘No.’ || (cast (V_id as varchar(100))) || ’ ’ || V_name || ‘来自’ || V_city );
END LOOP;
CLOSE Pcur;
END PersonList;
BEGIN
SELECT COUNT(*) INTO PersonCount FROM Person;
END PersonPackage;
–重新编译包:
ALTER PACKAGE PersonPackage COMPILE;
调用包中的 AddPerson 过程,往数据表中增加一条记录:
CALL PersonPackage. AddPerson (‘BLACK’, ‘南京’) ;
CALL PersonPackage. RemovePerson (‘JACK’, ‘北京’) ;
–引用包中的变量。
SELECT PersonPackage. PersonCount;
SELECT PersonPackage. GetPersonCount;
–调用包中的过程 PersonList 查看表中的所有记录:
CALL PersonPackage. PersonList;
–创建触发器
SET SCHEMA other;
CREATE OR REPLACE TRIGGER Reader_Before_St
BEFORE UPDATE ON other.reader
BEGIN
PRINT ‘BEFORE UPDATE TRIGGER FIRED’;
END;
CREATE OR REPLACE TRIGGER Reader_After_St
AFTER UPDATE ON other.reader
BEGIN
PRINT ‘AFTER UPDATE TRIGGER FIRED’;
END;
CREATE OR REPLACE TRIGGER Reader_Before_Row
BEFORE UPDATE ON other.reader
FOR EACH ROW
BEGIN
PRINT ‘BEFORE UPDATE EACH ROW TRIGGER FIRED’;
END;
UPDATE OTHER.READER SET AGE=AGE+1;
select * from OTHER.READER;
select * from lcc.city;
update lcc.city set region_id=2 where city_id=‘BJ’;
COMMIT;
CREATE TABLE T_EAF(
N INT,
SQLTEXT VARCHAR,
OBJECTNAME VARCHAR(128),
OBJECTTYPE VARCHAR(128),
OBJECTOWNER VARCHAR(128)
);
CREATE OR REPLACE TRIGGER TRIG_EAF_01 BEFORE DDL ON DATABASE
DECLARE
N NUMBER;
STR_STMT VARCHAR;
SQL_TEXT DM_NAME_LIST_T;
BEGIN
N := DM_SQL_TXT(SQL_TEXT); --N 为占用嵌套表单元个数
FOR I IN 1…N
LOOP
STR_STMT := STR_STMT || SQL_TEXT(I); – STR_STMT 为获取的 DDL 语句
END LOOP;
INSERT INTO T_EAF VALUES(N,STR_STMT,DM_DICT_OBJ_NAME, DM_DICT_OBJ_TYPE,
DM_DICT_OBJ_OWNER);
END;
create schema systest;
create table T_systest(c1 int);
SELECT * FROM T_EAF;
2、 了解 DM 系统表和系统视图。
达梦数据库中的动态性能视图能自动收集数据库中的一些活动信息,系统管理员根据这 些信息可以了解数据库运行的基本情况,为数据库的维护和优化提供依据。动态性能视图信 息也是数据库中数据字典的一部分,与我们平常所说的数据字典不同的是,平常意义上的数 据字典是指静态数据字典信息,也即用户访问数据字典信息时,内容不会发生改变,而动态 视图信息是随着数据库的运行随时更改,具有一定的即时性。 系统管理员为了更好地了解数据库的一些运行时信息,可以查询动态视图表。首先系统 管理员需要知道达梦数据库中提供了多少动态视图,有哪些类型动态视图,以及这些动态视 图的用途是什么。关于这些内容可以通过查询V$DYNAMIC_TABLES
获 得所有的动态性能视图名称。 动态视图表与静态字典信息表命名方式不同,静态字典表一般以 SYS 为前缀,如系统 表 SYSINDEXES,而动态视图则以 V$
为前缀,如 V$DM_INI
。
系统信息 包括数据库版本、实例统计信息、资源限制信息、进程信息、全局索引 IID 信息、事 件信息;涉及的动态视图有 V$SESSIONS、V$INSTANCE、V$RESOURCE_LIMIT、 V$PROCESS、V$IID、V$SYSSTAT
等。
存储信息 包括数据库信息、表空间信息、数据文件信息、日志相关信息;涉及的动态视图有 V$DATAFILE、V$DATABASE、V$TABLESPACE、V$HUGE_TABLESPACE、V$RLOGFILE
等。
内存管理信息 包括内存池使用情况、BUFFER 缓冲区信息、虚拟机信息、虚拟机栈帧信息;涉及的动 态视图有 V$MEM_POOL、V$VMS、V$STKFRM、V$BUFFERPOOL、V$BUFFER_LRU_FIRST、 V$BUFFER_UPD_FIRST、V$BUFFER_LRU_LAST、V$BUFFER_UPD_LAST、V$ RLOG_PKG、 V$COSTPARA
等
事务信息 包括所有事务信息、当前事务可见的事务信息、事务锁信息(TID 锁、对象锁)、回滚 段信息、事务等待信息;涉及的动态视图有 V$TRX、V$TRXWAIT、V$TRX_VIEW、V$LOCK、 V$PURGE
等。
线程信息 包括所有活动线程信息、线程作业信息、线程锁信息、线程的资源等待信息;涉及的动 态视图有 V$THREADS、V$LATCHES
等。
历史模块 包括 SQL 历史信息、SQL 执行节点历史信息、检查点历史信息、命令行历史信息、线 程等待历史信息、死锁历史信息、回滚段历史信息、运行时错误历史信息、DMSQL 程序中 执行 DDL 语句的历史信息、返回大数据量结果集的历史信息、所有活动过线程的历史信息; 涉及的动态视图有 V$CKPT_HISTORY、V$CMD_HISTORY、V$DEADLOCK_HISTORY、 V$PLSQL_DDL_HISTORY、V$PRE_RETURN_HISTORY、V$RUNTIME_ERR_HISTORY、 V$WAIT_HISTORY、V$WTHRD_HISTORY、V$SQL_HISTORY、V$SQL_NODE_HISTORY、 V$SQL_NODE_NAME
等。
缓存信息 包括 SQL 语句缓存、执行计划缓存、结果集缓存、字典缓存信息、字典缓存中的对象 信息、代价信息;涉及的动态视图有 V$CACHEITEM、V$SQL_PLAN、V$CACHERS、 V$CACHESQL、V$DICT_CACHE_ITEM、V$DICT_CACHE
等
会话信息 包括连接信息、会话信息;涉及的动态视图有 V$CONNECT、V$STMTS、V$SESSIONS
等。
捕获信息 捕获信息涉及的视图为 V$CAPTURE
。 例如查看捕获信息。
查看动态视图可以不单单只查询一个动态视图表,还可利用动态视图表之间的联系得到 更多想要的信息。
例如,系统管理员如果要对一条 SQL 语句进行调优,需要知道每个执行节点花费了多 少时间,查询 V$SQL_NODE_NAME
可以知道执行节点的名字,查询 V$SQL_NODE_HISTORY
可以查询到每个执行节点的时间,通过两个动态视图表的执行节点类型 TYPE$字段做等值 连接。
如执行一条 SQL 语句,然后查询其执行节点所花费时间,假设其执行 ID(EXEC_ID) 为 4。
(3、 基于这些系统对象,能够了解 到哪些信息。 4、基于这些系统对象,可以加工得 到哪些信息。)
–线程监控
–V$LATCHES
记录当前正在等待的线程信息
–V$THREADS
记录当前系统中活动线程的信息
–V$WTHRD_HISTORY
记录自系统启动以来,所有活动过线程的相关历史信息
–V$PROCESS
记录服务器进程信息
–会话监控
SELECT SESS_ID,SQL_TEXT,STATE,CREATE_TIME,CLNT_HOST FROM V$SESSIONS;
–事务监控
–包括所有事务信息、当前事务可见的事务信息、事务锁信息(TID 锁、对象锁)、回滚段信息、事务等待信息;涉及的动态视图有 V$TRX、V$TRXWAIT、V$TRX_VIEW、V$LOCK、V$PURGE
等
–SQL 监视
–通过 V$SQL_HISTORY
视图可以查询执行 SQL 的历史记录信息;可以方便用户经常使用的记录进行保存。
–通过 V$SQL_NODE_HISTORY
既可以查询 SQL 执行节点信息,包括 SQL 节点的类型、进入次数和使用时间等等;也可以查询所有执行的 SQL 节点执行情况,如哪些使用最频繁、耗时多少等。当 INI 参数 ENABLE_MONITOR 和 MONITOR_SQL_EXEC 都开启时,才会记录 SQL 执行节点信息。如果需要时间统计信息,还需要打开 MONITOR_TIME。
–通过 V$SQL_NODE_NAME
显示所有的 SQL 节点描述信息,包括 SQL 节点类型、名字和详细描述
–日志文件分析
–通过查询 V$RLOG
获取日志的总体信息。通过该视图可以了解系统当前日志事务号 LSN 的情况、归档日志情况、检查点的执行情况等。
–通过查询 V$RLOGFILE
视图可以显示日志文件的具体信息。包括文件号、完整路径、文件的状态、文件大小等等
–资源监控
–内存池
–用户也可以通过查询 V$MEM_POOL
动态视图掌握 DM Server 的内存使用情况
–缓冲池
–用户也可以通过 V$SCP_CACHE
动态性能视图查看缓存池的详细信
–SQL 缓存
–在 V$SCP_CACHE
视图中 SQL_CNT 列表示 SQL 缓存总数。
–字典缓存
–数据库中查看字典缓存的信息还可以通过查询 V$DICT_CACHE
视图
–表空间
–若要检查表空间失效文件,可以通过 dm.ini 中的参数 FIL_CHECK_INTERVAL 的值指定 DM 系统检查数据文件是否仍存在的时间间隔。将其设为 0 表示不进行检查。
–也可以通过系统过程 SP_FILE_SYS_CHECK() 来手动的进行检查。系统一旦检测出某个表空间内的数据文件被删除,则与该表空间所有的操作都将会失败,并报错该表空间内有数据文件被删除。
SELECT ts.NAME, df.PATH FROM V$TABLESPACE AS ts, V$DATAFILE AS df WHERE ts.ID = df.GROUP_ID;
–死锁
–通过 V$DEADLOCK_HISTORY
视图查询死锁的历史信息
–大量数据返回结果集
–大量数据返回结果集页面展示了数据库中执行事务返回的结果集信息,包括执行 SQL 语句和会话事务信息,如下图所示
–查看用户占用的空间
SELECT USER_USED_SPACE('lcc');
–看表占用的空间
SELECT TABLE_USED_SPACE('LCC','CITY');
–查看索引占用的空间
CREATE INDEX TEST ON LCC.CITY(CITY_ID);
–索引id怎么找
SELECT INDEX_USED_SPACE(33555463);
–实例中查询活动会话
SELECT count(*) FROM v$sessions WHERE state='ACTIVE';
–获取完整sql
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';
–实例中锁查询
SELECT o.name, l.*
FROM v$lock l, sysobjects o
WHERE l.table_id = o.id AND blocked = 1;
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 clnt_ip from res;
SELECT DISTINCT wt_sql, clnt_ip, ss
FROM res;
–实例中已执行未提交的 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';
–有事务未提交的表查询
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;
–长时间的 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 秒的活动 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;
–会话监视
SELECT SESS_ID,SQL_TEXT,STATE,CREATE_TIME,CLNT_HOST FROM V$SESSIONS;
–表空间和对应数据文件的关系
SELECT ts.NAME, df.PATH FROM V$TABLESPACE AS ts, V$DATAFILE AS df WHERE ts.ID = df.GROUP_ID;
SP_FILE_SYS_CHECK();
–死锁
select * from LCC.CITY;
update LCC.CITY set region_id=1000 where region_id=3;
update LCC.CITY set region_id=100 where region_id=3;
—命令行查看作业运行状态
select * from sysjob.sysjobs;
select * from sysjob.sysjobhistories;
select * from sysjob.sysjobschedules;
select * from sysjob.sysjobsteps;
–数据库版本可以通过 v$version 检查数据库版本
select * from v$version;
–修改参数三种
SP_SET_PARA_VALUE();
SP_SET_PARA_DOUBLE_VALUE();
SP_SET_PARA_STRING_VALUE();
https://eco.dameng.com