—表空间管理
–查询表空间使用情况
select a.tablespace_name,a.bytes/1024/1024 “Sum MB”,(a.bytes-b.bytes)/1024/1024 “Used MB”,b.bytes/1024/1024 “Free MB”,round(((a.bytes-b.bytes)/a.bytes)*100,2) “percent_used” from
(select tablespace_name,sum(bytes) bytes from dba_data_files group by tablespace_name) a,
(select tablespace_name,sum(bytes) bytes,max(bytes) largest from dba_free_space group by tablespace_name) b
where a.tablespace_name=b.tablespace_name
order by ((a.bytes-b.bytes)/a.bytes) desc
–1.增加数据文件
ALTER TABLESPACE game ADD DATAFILE ‘/oracle/oradata/db/GAME02.dbf’ SIZE 1000M;
–2.手动增加数据文件尺寸
ALTER DATABASE DATAFILE ‘/oracle/oradata/db/GAME.dbf’ RESIZE 4000M;
–3.设定数据文件自动扩展
ALTER DATABASE DATAFILE '/oracle/oradata/db/GAME.dbf
AUTOEXTEND ON NEXT 100M
MAXSIZE 10000M;
— 表空间碎片查询
SELECT tablespace_name, COUNT (*) chunks,
MAX (BYTES / 1024 / 1024) max_chunk
FROM dba_free_space GROUP BY tablespace_name;
其中,CHUNKS列表示表空间中有多少可用的空闲块(每个空闲块是由一些连续的Oracle数据块组成),
如果这样的空闲块过多,比如平均到每个数据文件上超过了100个,那么该表空间的碎片状况就比较严重了,
可以尝试用以下的SQL命令进行表空间相邻碎片的接合:
表空间碎片整理
alter tablespace 表空间名 coalesce;
会话管理
查询当前数据库建立的会话情况:
select sid,serial#,username,program,machine,status from v$session;
kill连接会话,注意SID 1到7是oracle后台进程,不能杀。
alter system kill session ‘SID,SERIAL#’;
Oracle的锁表与解锁
Oracle的锁表与解锁
–以下几个为相关表
SELECT * FROM v
l
o
c
k
;
S
E
L
E
C
T
∗
F
R
O
M
v
lock; SELECT * FROM v
lock;SELECT∗FROMvsqlarea;
SELECT * FROM v
s
e
s
s
i
o
n
;
S
E
L
E
C
T
∗
F
R
O
M
v
session; SELECT * FROM v
session;SELECT∗FROMvprocess ;
SELECT * FROM v
l
o
c
k
e
d
o
b
j
e
c
t
;
S
E
L
E
C
T
∗
F
R
O
M
a
l
l
o
b
j
e
c
t
s
;
S
E
L
E
C
T
∗
F
R
O
M
v
locked_object; SELECT * FROM all_objects; SELECT * FROM v
lockedobject;SELECT∗FROMallobjects;SELECT∗FROMvsession_wait;
–1.查出锁定object的session的信息以及被锁定的object名
SELECT l.session_id sid, s.serial#, l.locked_mode,l.oracle_username,
l.os_user_name,s.machine, s.terminal, o.object_name, s.logon_time
FROM v
l
o
c
k
e
d
o
b
j
e
c
t
l
,
a
l
l
o
b
j
e
c
t
s
o
,
v
locked_object l, all_objects o, v
lockedobjectl,allobjectso,vsession s
WHERE l.object_id = o.object_id
AND l.session_id = s.sid
ORDER BY sid, s.serial# ;
–2.查出锁定表的session的sid, serial#,os_user_name, machine name, terminal和执行的语句
–比上面那段多出sql_text和action
SELECT l.session_id sid, s.serial#, l.locked_mode, l.oracle_username, s.user#,
l.os_user_name,s.machine, s.terminal,a.sql_text, a.action
FROM v
s
q
l
a
r
e
a
a
,
v
sqlarea a,v
sqlareaa,vsession s, vKaTeX parse error: Expected 'EOF', got '#' at position 98: …Y sid, s.serial#̲; --3.查出锁定表的sid…session s, v$lock l
WHERE s.sid = l.sid
AND s.username IS NOT NULL
ORDER BY sid;
–4.结束被锁进程
这个语句将查找到数据库中所有的DML语句产生的锁,还可以发现,
任何DML语句其实产生了两个锁,一个是表锁,一个是行锁。
杀锁命令
alter system kill session 'sid,serial#’;
如果发生了锁等待,我们可能更想知道是谁锁了表而引起谁的等待
以下的语句可以查询到谁锁了表,而谁在等待。
SELECT /*+ rule */ s.username,
decode(l.type,‘TM’,‘TABLE LOCK’,
‘TX’,‘ROW LOCK’,
NULL) LOCK_LEVEL,
o.owner,o.object_name,o.object_type,
s.sid,s.serial#,s.terminal,s.machine,s.program,s.osuser
FROM v
s
e
s
s
i
o
n
s
,
v
session s,v
sessions,vlock l,dba_objects o
WHERE l.sid = s.sid
AND l.id1 = o.object_id(+)
AND s.username is NOT NULL
以上查询结果是一个树状结构,如果有子节点,则表示有等待发生。
如果想知道锁用了哪个回滚段,还可以关联到VKaTeX parse error: Double superscript at position 154: …rule */ lpad(' '̲,decode(l.xidus…locked_object l,dba_objects o,v$session s
WHERE l.object_id=o.object_id
AND l.session_id=s.sid
ORDER BY o.object_id,xidusn DESC