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.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.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