1、     数据库基础操作

 

1.1.           创建表空间

例,以 SYSDBA 身份登录数据库后,创建表空间 TS1,指定数据文件 TS1.dbf,大小128M。

CREATE TABLESPACE TS1 DATAFILE 'd:\TS1.dbf' SIZE 128 AUTOEXTNED ON NEXT 256;

注意事项:

1. 表空间名在数据库中必须唯一;

2. 一个表空间中,数据文件和镜像文件一起不能超过 256 个;

3. 如果全库已经加密,就不再支持表空间加密;

4. SYSTEM 表空间不允许关闭自动扩展,且不允许限制空间大小。

5. 表空间数据文件的路径一定要在规划的数据盘上,避免空间不足。

6. MPP、DSC集群环境在创建表空间时,数据文件写数据文件名即可,不需要写绝对路径,写绝对路径可以会出现错误。

1.2.           表空间增加数据文件

例,单个数据文件过大不利于数据库的运维管理,为已有的表空间TS1 增加一个新的数据文件,并设置这个数据文件最大上限1000G

ALTER TABLESPACE TS1 ADD DATAFILE 'd:\TS1.dbf' SIZE 128 AUTOEXTNED ON NEXT 256 MAX 102400;

1.3.           创建用户

例,创建用户名为 BOOKSHOP_USER、口令为 BOOKSHOP_PASSWORD用户,并为用户指定默认表空间。

CREATE USER BOOKSHOP_USER IDENTIFIED BY BOOKSHOP_PASSWORD DEFAULT TABLESAPCE TS1;

也可在管理工具中创建用户,用户-管理用户-右键-新建用户

注意事项:

  1. 新建用户一定要为用户指定默认表空间,否则会使用默认系统表空间,不利于以后的维护和扩展;

1.4.           用户授权

例,给TEST用户授予权限

grant public,resource to "TEST";

同样也可在管理工具中更改用户权限,用户-管理用户-TEST用户-右键-修改

注意事项:

1. dba角色不要轻易授予,临时授权需要及时回收;

1.5.           创建索引

例,在 emp 表的 ename 列上创建一个名为 idx_emp_ename 的索引,并指定该索引使用表空间 users。

CREATE INDEX idx_emp_ename ON emp(ename) STORAGE (ON USERS);

注意事项:

  1. 创建索引会锁表,影响表上的删除、更新、插入等操作,要在确保没有操作的表上创建索引;
  2. 不指定索引使用的表空间,默认会使用用户的默认表空间。

1.6.           创建唯一索引

可用 CREATE UNIQUE INDEX 语句来创建唯一索引,如下例子创建一个唯一索引:

CREATE UNIQUE INDEX dept_unique_index ON dept (dname) STORAGE (ON users);

1.7.           创建函数索引

例如, WHERE 子句中的表达式使用了函数,通过函数索引可以提高查询效率

CREATE INDEX IDX ON EXAMPLE_TAB(avg(column))

 

SELECT * FROM EXAMPLE_TAB WHERE avg(column) < 10;

1.8.           创建主键

如下面的语句会自动在表emp的name列上创建一个唯一索引。

ALTER TABLE EMP ADD CONSTRAINT PK_EMP_NAME PRIMARY KEY (NAME);

 

1.9.           查看所有会话

select * from v$sessions;

 

1.10.    查看活动会话

select * from v$sessions where state='ACTIVE';

 

1.11.    查看最慢20条SQL

select TOP 20* from V$SYSTEM_LONG_EXEC_SQLS ORDER BY EXEC_TIME DESC;

 

1.12.    查看最近的20条慢sql

select * from V$LONG_EXEC_SQLS order by EXEC_TIME DESC limit 0,20;

2、     常见问题处理

2.1.           锁表的处理

    锁表的问题主要是多个事务同时对一张表进行更新、删除造成,一个事务对表加锁未释放前,其他事务无法再次进行加锁,处于等待状态。

2.1.1.     查询正在运行的事务

select

tw.id as "等待的事务ID",

tw.wait_for_id as "正在运行的事务ID",

s.sess_id as "等待的会话",

ws.sess_id as "正在执行的会话",

s.sql_text as "等待的sql",

ws.sql_text as "正在执行的sql" ,

cast(ws.rowid as varbinary ) >> 58 "运行节点号",

'SP_CLOSE_SESSION('||ws.sess_id||');' "关闭会话的语句"

from v$trxwait tw left join v$sessions s

on tw.id=s.trx_id

left join v$sessions ws

on tw.wait_for_id=ws.trx_id;

#######

#"正在执行的事务ID":处于等待状态的事务ID;

#"等待的事务ID":正在运行的事务ID;

#"正在执行的会话":处于等待状态的会话ID

#"等待的会话":正在运行的会话ID;

#"等待的sql":等待执行的SQL;

#"正在执行的sql":正在执行的SQL;

#"运行节点号":正在执行的SQL运行在哪个EP节点;

#"关闭会话的语句":关闭会话的执行语句;

2.1.2.     通过SESS_ID关闭会话

通过SQL_TEXT判断需要关闭的会话,通过上一步操作,可以提取出关闭阻塞会话的执行语句。

SP_CLOSE_SESSION(#SESSID);

2.1.3.     MPP场景的锁处理

MPP是分布式数据库,事务会分发到多个节点上同时执行,通过全局登录查询会看到所有节点上的会话信息,如果需要关闭某一个事务,需要将所有节点上的相关事务的会话都要关闭才可以。

以下命令需要在MPP多个节点同时进行执行:

./disql 用户名/密码#{MPP_TYPE=local}--MPP集群需要local登录

SP_SET_SESSION_LOCAL_TYPE (1);--允许本地登录执行DDL操作命令

SP_CLOSE_SESSION(#SESSID);

2.2.           数据库慢分析过程

2.2.1.     检查资源使用情况

free -g

vmstat 1

ps -aux | sort -k4nr | head -10

通过以上检查,可以分析内存使用情况,并找到内存占用最高的进程是哪些,从而对占用资源较高的进程进行分析。

2.2.2.     检查磁盘IO情况

iostat -xm -t 1

通过以上检查,可以分析是否有大量的读写在进行;

如果大量的写入,可以分析是否有正在运行的进程在做批量的插入操作,是否是正常的业务进程,是否可以在非业务高峰期进行。

如果有大量的读取需要分析是否有大表未使用索引,造成大数据量的全表扫描。

2.2.3.     检查数据库活动sessions

select count(*) from v$sessions;

select PARA_NAME,PARA_VALUE from v$dm_ini where para_name ='MAX_SESSIONS';

select count(*) from v$sessions where state='ACTIVE';

select * from v$sessions where state='ACTIVE';

通过以上检查可以分析是否连接会话数达到上线,造成会话连接等待。

如果活动会话数持续居高不下,需要具体分析活动的会话执行内容,是否存在死锁等待造成会话无法结束,是否存在应用程序异常操作。

2.2.4.     查询数据库中的慢sql

select * from V$LONG_EXEC_SQLS order by EXEC_TIME DESC limit 0,20;

通过以上检查可以分析数据中执行较慢的SQL,如果sql执行慢且执行频率高,必须进行优化,否则可能会造成数据库整体执行缓慢。

通过以上分析基本可以定位大部分数据库执行缓慢问题。如果通过以上分析依然无法准确定位问题,可以进行后续的堆栈分析。堆栈分析需要相关专家参与进行结果分析。

2.2.5.     查看数据库进程的资源使用情况

(1)提取进程号

ps -ef |grep dmserver

(2)查看数据库进程下,各线程的资源使用情况

ps -eLo pcpu,pmem,pid,tid,psr,wchan:14,comm|grep 进程号 |sort

2.2.6.     抓取消耗资源最高的线程堆栈信息

(1)堆栈信息抓取

pstack 进程号 |grep -A 14线程号

 

[dmdba@localhost ~]$ pstack 15248 |grep -A 14 2266805

Thread 241 (LWP 2091011):

#0 0x000000000053d790 in nrec_get_nth_fld_with_prev_offset ()

#1 0x0000000000d007c8 in cscn2_exec_fill_data_all_visible ()

#2 0x0000000000d01d34 in cscn2_exec_fetch ()

#3 0x0000000000d056b8 in cscn2_exec ()

#4 0x0000000000e4a340 in vm_run_low ()

#5 0x0000000000e4a5f0 in vm_run ()

#6 0x0000000000e4bb84 in vm_run_mpln ()

#7 0x00000000011fec20 in mtsk_process_mpln ()

#8 0x0000000001215d34 in mtsk_process_mal_letter_for_mpp ()

#9 0x00000000011144e4 in uthr_db_main_for_msess ()

#10 0x0000ffffa75e88cc in ?? () from /lib64/libpthread.so.0

#11 0x0000ffffa727a1ec in ?? () from /lib64/libc.so.6

 

(2)输出堆栈信息,提交给相关专家进一步分析

[dmdba@localhost ~]$ pstack 15248 > /tmp/15248.txt

posted on 2022-05-26 11:17  琦妮  阅读(1238)  评论(0编辑  收藏  举报