oracle資料庫常用語句

阿寶叔發表於2021-09-02
檢視oracle資料庫的連線數以及使用者
--1、查詢oracle的連線數
select count(*) from v$session;
--2、查詢oracle的併發連線數
select count(*) from v$session where status='ACTIVE';
--3、檢視不同使用者的連線數
select username,count(username) from v$session where username is not null group by username;
--4、檢視所有使用者:
select * from all_users;
--5、檢視使用者或角色系統許可權(直接賦值給使用者或角色的系統許可權):
select * from dba_sys_privs;
select * from user_sys_privs;
--6、檢視角色(只能檢視登陸使用者擁有的角色)所包含的許可權
select * from role_sys_privs;
--7、檢視使用者物件許可權:
select * from dba_tab_privs;
select * from all_tab_privs;
select * from user_tab_privs;
--8、檢視所有角色:
select * from dba_roles;
--9、檢視使用者或角色所擁有的角色:
select * from dba_role_privs;
select * from user_role_privs;
--10、檢視哪些使用者有sysdba或sysoper系統許可權(查詢時需要相應許可權)
select * from V$PWFILE_USERS;
--11.檢視總消耗時間最多的前10條SQL語句
select *
from (select v.sql_id,
v.child_number,
v.sql_text,
v.elapsed_time,
v.cpu_time,
v.disk_reads,
rank() over(order by v.elapsed_time desc) elapsed_rank
from v$sql v) a
where elapsed_rank <= 10;
--12.檢視CPU消耗時間最多的前10條SQL語句
select *
from (select v.sql_id,
v.child_number,
v.sql_text,
v.elapsed_time,
v.cpu_time,
v.disk_reads,
rank() over(order by v.cpu_time desc) elapsed_rank
from v$sql v) a
where elapsed_rank <= 10;
--13.檢視消耗磁碟讀取最多的前10條SQL語句
select *
from (select v.sql_id,
v.child_number,
v.sql_text,
v.elapsed_time,
v.cpu_time,
v.disk_reads,
rank() over(order by v.disk_reads desc) elapsed_rank
from v$sql v) a
where elapsed_rank <= 10;
--14.檢視oracle當前連線數
select count(*) from v$process;
--15.檢視oracle允許的最大連線數
select value from v$parameter where name = 'processes';
show parameter processes #最大連線(命令頁面)
--16.修改oracle最大連線數
alter system set processes = value scope = spfile;重啟資料庫 #修改連線
alter system set processes = 300 scope = spfile;
--17.重啟資料庫:
shutdown immediate;
startup;
--17.檢視當前有哪些使用者正在使用資料
SELECT osuser, a.username,cpu_time/executions/1000000||'s', sql_fulltext,machine
from v$session a, v$sqlarea b
where a.sql_address =b.address order by cpu_time/executions desc;

unix 1個使用者session 對應一個作業系統 process
而 windows體現線上程

DBA要定時對資料庫的連線情況進行檢查,看與資料庫建立的會話數目是不是正常,如果建立了過多的連線,會消耗資料庫的資源。同時,對一些“掛死”的連線,可能會需要DBA手工進行清理。
以下的SQL語句列出當前資料庫建立的會話情況:
select sid,serial#,username,program,machine,status
from v$session;
輸出結果為:
SID SERIAL# USERNAME PROGRAM MACHINE STATUS
---- ------- ---------- ----------- --------------- --------
1 1 ORACLE.EXE WORK3 ACTIVE
2 1 ORACLE.EXE WORK3 ACTIVE
3 1 ORACLE.EXE WORK3 ACTIVE
4 1 ORACLE.EXE WORK3 ACTIVE
5 3 ORACLE.EXE WORK3 ACTIVE
6 1 ORACLE.EXE WORK3 ACTIVE
7 1 ORACLE.EXE WORK3 ACTIVE
8 27 SYS SQLPLUS.EXE WORKGROUP\\WORK3 ACTIVE
11 5 DBSNMP dbsnmp.exe WORKGROUP\\WORK3 INACTIVE
其中,
SID 會話(session)的ID號;
SERIAL# 會話的序列號,和SID一起用來唯一標識一個會話;
USERNAME 建立該會話的使用者名稱;
PROGRAM 這個會話是用什麼工具連線到資料庫的;
STATUS 當前這個會話的狀態,ACTIVE表示會話正在執行某些任務,INACTIVE表示當前會話沒有執行任何操作;
如果DBA要手工斷開某個會話,則執行:
alter system kill session \'SID,SERIAL#\'

sql語句
SQL語句如下:

SELECT username, machine, program, status, COUNT (machine) AS
連線數量
FROM v$session
GROUP BY username, machine, program, status
ORDER BY machine;

顯示結果(每個人的機器上會不同)

SCHNEIDER|WORKGROUD\WANGZHENG|TOAD.exe|ACTIVE|1
SCHNEIDER|WORKGROUP\597728AA514F49D|sqlplusw.exe|INACTIVE|1
|WWW-Q6ZMR2OIU9V|ORACLE.EXE|ACTIVE|8
PUBLIC|||INACTIVE|0
 
按主機名查詢
SELECT COUNT(*) FROM V$SESSION WHERE MACHINE = 'DXMH';      'DXMH'為主機名
 
資料恢復語句
create table informationlaw_bak 
as 
select * from informationlaw as of TIMESTAMP to_timestamp('20121126 103435','yyyymmdd hh24miss');
 
//按機器名分組查
select username,machine,count(username) from v$session where username is not null group by username,machine;

-------鎖表
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$session s,v$lock l,dba_objects o
WHERE l.sid = s.sid
AND l.id1 = o.object_id(+)
AND s.username is NOT Null

---當鎖表不能通過一般alter結束的時候使用下邊的語句進行強制刪除
SELECT spid 
FROM v$process  a ,v$session  b
WHERE b.paddr = a.addr and sid in ('4087','2001','3997')

kill -9 spid號


--kill session語句
alter system kill session '50,492';
--以下幾個為相關表
SELECT * FROM v$lock;
SELECT * FROM v$sqlarea;
SELECT * FROM v$session;
SELECT * FROM v$process ;
SELECT * FROM v$locked_object;
SELECT * FROM all_objects;
SELECT * FROM v$session_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$locked_object l, all_objects o, v$session 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$sqlarea a,v$session s, v$locked_object l
WHERE l.session_id = s.sid
AND s.prev_sql_addr = a.address
ORDER BY sid, s.serial#;
--3.查出鎖定表的sid, serial#,os_user_name, machine_name, terminal,鎖的type,mode
SELECT s.sid, s.serial#, s.username, s.schemaname, s.osuser, s.process, s.machine,
s.terminal, s.logon_time, l.type
FROM v$session s, v$lock l
WHERE s.sid = l.sid
AND s.username IS NOT NULL
ORDER BY sid;

這個語句將查詢到資料庫中所有的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$session s,v$lock l,dba_objects o
WHERE l.sid = s.sid
AND l.id1 = o.object_id(+)
AND s.username is NOT NULL
如果發生了鎖等待,我們可能更想知道是誰鎖了表而引起誰的等待
以下的語句可以查詢到誰鎖了表,而誰在等待。
以上查詢結果是一個樹狀結構,如果有子節點,則表示有等待發生。
如果想知道鎖用了哪個回滾段,還可以關聯到V$rollname,其中xidusn就是回滾段的USN
col user_name format a10
col owner format a10
col object_name format a10
col object_type format a10
SELECT /*+ rule */ lpad(' ',decode(l.xidusn ,0,3,0))||l.oracle_username User_name,
o.owner,o.object_name,o.object_type,s.sid,s.serial#
FROM v$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



設帶回車符號的欄位為field_A
替換回車符:
replace(field_A,CHR(13),'')

替換換行符:
replace(field_A,CHR(10),'')

替換回車換行符:
replace(replace(field_A,CHR(13),''),CHR(10),'')



(1)oracle中實現擷取字串:substr
substr(string, start_position, [length])
其中,string是元字串,start_position為開始位置,length是可選項,表示子字串的位數。
例子:
substr('ABCDEFG', 0);    -- 返回結果是:ABCDEFG,從0位開始擷取後面所有
substr('ABCDEFG', 2);    -- 返回結果是:CDEFG,從2位開始擷取後面所有
substr('ABCDEFG', 0, 3);  -- 返回結果是:ABC,從0位開始往後擷取3個字元長度
substr('ABCDEFG', 0, 100);  -- 返回結果是:ABCDEFG,雖然100超出了元字串長度,但是系統會按元字串最大數量返回,不會影響返回結果
substr('ABCDEFG', -3);  -- 返回結果是:EFG,如果是負數,則從尾部往前數,擷取-3位置往後的所有字串
(2)查詢字串位置:instr
instr(string, subString, [start_position, [nth_appearance]])
其中,string是元字串;subString是要查詢的子字串;start_position是要查詢的開始位置,為可選項(預設為1),注意在這裡字串索引從1開始,如果此引數為正,則從左到右檢索,如果此引數為負,則從右到左檢索;nth_appearance是元字串中第幾次出現的子字串,此引數可選,預設預設為1,如果是負數則系統報錯。
例子:
instr('ABCDABCDAEF', 'AB');   -- 返回結果是:1,因為instr字串索引從1開始,所以是1不是0
instr('ABCDABCDAEF', 'DA', 1, 2);   -- 返回結果是:8,返回第二次出現'DA'的位置
instr('A BCDABCDAEF', 'DA', 1, 2);  -- 返回結果是:9,由於我在元字串中加了一個空格,空格仍然算一個字元
(3)替換字串:replace
replace(str1, str2, str3)
其表示的意思是:在str1中查詢str2,凡是出現str2的地方,都替換成str3。
replace('ABCDEFG', 'CDE', 'cde');  -- 返回結果是:ABcdeFG
replace('ABCDEFG', 'CDE', '');   -- 返回結果是:ABFG,CDE被替換成空字元
replace('ABCDEFG', 'CDE');   -- 返回結果是:ABFG,當不存在第三個引數時,CDE直接被刪掉
本來我還以為oracle中也有系統自帶的那種像split這樣的拆分字串的函式,結果找了好久,發現居然沒有,網上有很多解決方法,我就不總結在這裡了,後面需要的時候視情況來寫。
如果想批量替換修改表中某個欄位的某個字串,可以使用如下的方式:


1、建立oracle使用者並初始化密碼
create user qc_resbjlt_cs identified by qc_resbjlt_cs_59;
2、修改oracle使用者密碼
alter user qc_resbjlt_cs identified by resbjlt_cs_59;
3、給oracle使用者賦許可權
grant connect,resource,dba to qc_resbjlt_cs;
4、刪除使用者
drop user qc_resbjlt_cs cascade;
5、查詢表空間
select tablespace_name,contents from dba_tablespaces where tablespace_name in('QC_RMS','QC_AUTHDB','resbjlt_cs')
order by tablespace_name;
6、修改使用者指定的表空間
alter user qc_resbjlt_cs default tablespace QC_RESBJLT_CS
temporary tablespace temp;
7、建立表空間
drop tablespace qc_resbjlt_cs INCLUDING CONTENTS;
create tablespace  qc_resbjlt_cs datafile '+DATA01'  size 10G;
8、imp資料庫dump檔案
impdp qc_resbjlt_cs/qc_resbjlt_cs_59 DIRECTORY=impdp_bak DUMPFILE=resbjlt_cs0712.dmp  REMAP_SCHEMA=RESBJLT_CS:QC_RESBJLT_CS REMAP_TABLESPACE=RESBJLT_CS:QC_RESBJLT_CS;
9、檢視錶空間使用情況
SELECT UPPER(F.TABLESPACE_NAME) "表空間名",
  D.TOT_GROOTTE_MB "表空間大小(M)",
  D.TOT_GROOTTE_MB - F.TOTAL_BYTES "已使用空間(M)",
  TO_CHAR(ROUND((D.TOT_GROOTTE_MB - F.TOTAL_BYTES) / D.TOT_GROOTTE_MB * 100,2),'990.99') || '%' "使用比",
  F.TOTAL_BYTES "空閒空間(M)",
  F.MAX_BYTES "最大塊(M)"
  FROM (SELECT TABLESPACE_NAME,
  ROUND(SUM(BYTES) / (1024 * 1024), 2) TOTAL_BYTES,
  ROUND(MAX(BYTES) / (1024 * 1024), 2) MAX_BYTES
  FROM SYS.DBA_FREE_SPACE
  GROUP BY TABLESPACE_NAME) F,
  (SELECT DD.TABLESPACE_NAME,
   ROUND(SUM(DD.BYTES) / (1024 * 1024), 2) TOT_GROOTTE_MB
  FROM SYS.DBA_DATA_FILES DD
  GROUP BY DD.TABLESPACE_NAME) D
  WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME
  ORDER BY 1;


-按使用者匯出表
expdp bdcdj/bdcdj@pana schemas=bdcdj directory=a dumpfile=bdcdj.dmp 
--按表名匯出表
expdp scott/tiger@orcl TABLES=emp,dept dumpfile=expdp.dmp DIRECTORY=dpdata1;
--按查詢條件匯出表
expdp scott/tiger@orcl directory=dpdata1 dumpfile=expdp.dmp Tables=emp query='WHERE deptno=20'; 
--按表空間匯出表
expdp system/manager DIRECTORY=dpdata1 DUMPFILE=tablespace.dmp TABLESPACES=temp,example; 
--導整個資料庫
expdp system/manager DIRECTORY=dpdata1 DUMPFILE=full.dmp FULL=y;

--正常備份
exp bdcdj/bdcdj@pana file=e:\bdcdj.dmp owner=bdcdj
--正常備份單張表
exp system/manager@TEST file=d:\daochu.dmp tables=(table1,table2)

----------------------------------------------------------------------------------------------------------------------
---dump恢復到資料庫使用者
impdp qc_res_empty/qc_res_empty_59 DIRECTORY=impdp_bak DUMPFILE=res_empty_%U.dmp logfile=resltjt20160721_1.log remap_schema=res_empty:qc_res_empty REMAP_TABLESPACE=$REMAP_TABLESPACE parallel=4 transform=oid:n TABLE_EXISTS_ACTION=REPLACE 
REMAP_TABLESPACE='RES_EMPTY:QC_RES_EMPTY,GENERAL:QC_RES_EMPTY,BASE_DATA:QC_RES_EMPTY,INDX_GEN:QC_RES_EMPTY,SUB_AREA1:QC_RES_EMPTY,SUB_AREA2:QC_RES_EMPTY,SUB_AREA3:QC_RES_EMPTY,SUB_AREA4:QC_RES_EMPTY,SUB_AREA6:QC_RES_EMPTY'



oracle還原(imp、impdp)

--匯入表
impdp sde/sde@nbdcj schemas=bdcdj directory=a dumpfile=bdcdj.dmp 
--匯入表空間
impdp system/manager DIRECTORY=dpdata1 DUMPFILE=tablespace.dmp TABLESPACES=example;
--匯入資料庫 
impdp system/manager DIRECTORY=dump_dir DUMPFILE=full.dmp FULL=y; 
--追加資料 
impdp system/manager DIRECTORY=dpdata1 DUMPFILE=expdp.dmp SCHEMAS=system TABLE_EXISTS_ACTION
--改變表的owner 
impdp system/manager DIRECTORY=dpdata1 DUMPFILE=expdp.dmp TABLES=scott.dept REMAP_SCHEMA=scott:system;

--還原單表
imp sde/sde@pana file=e:\xx.dmp tables=表名
imp sde/sde@nbbdc file=e:\sde_T_xtsz.dmp tables=T_xtsz

--正常還原
imp sde/sde@nbbdc file=E:\nb\sde.dmp fromuser=sde touser=sde buffer=99999999 log='E:\nb\sde.log' 
-- 2 將d:\daochu.dmp中的表table1 匯入
imp system/manager@TEST file=d:\daochu.dmp tables=(table1)


----傳輸板卡更新
----所屬專業(傳輸專業50),維護狀態(正常160060),業務狀態(空閒170001),產權歸屬(聯通67590032),維保型別(提供技術支撐80013),生命週期狀態(工程驗收後在網10030304)
update QC_RMS_BOARD set CARD_NO=zh_label,
speciality_id='50',mnt_state_id='160060',
opr_state_id='170001',property_belong='67590032',
mnt_type='80013',LIFE_CYCLE='10030304' where stateflag=0;
commit;
update QC_RMS_BOARD set SUPER_RES_NAME=substr(zh_label,1,instr(zh_label,'/',1)-1) where stateflag=0;
commit;
update QC_RMS_BOARD a set (a.SUPER_RES_id)=
((select b.int_id from qc_rms_transne b where b.stateflag=0 and a.SUPER_RES_NAME=b.zh_label ))
where exists
(select b.int_id from qc_rms_transne b where b.stateflag=0 and a.SUPER_RES_NAME=b.zh_label );
commit;
update QC_RMS_BOARD a set (a.SUPER_RES_id)=
((select b.int_id from qc_rms_transne b where b.stateflag=0 and a.related_ne=b.wg_id  and  a.SUPER_RES_id is null
and b.wg_id  in (select wg_id from (select wg_id,count(*) from qc_rms_transne where stateflag=0 group by wg_id having count(*)=1 ))
))
where exists
(select b.int_id from qc_rms_transne b where b.stateflag=0 and a.related_ne=b.wg_id  and  a.SUPER_RES_id is null
and b.wg_id  in (select wg_id from (select wg_id,count(*) from qc_rms_transne where stateflag=0 group by wg_id having count(*)=1 )));
commit;

-----傳輸埠所屬板卡重新整理
update qc_rms_trans_port a  set (a.related_board_id)=
((select b.int_id from QC_RMS_BOARD b where a.=b.   and b.stateflag=0 ))
where exists
((select b.int_id from QC_RMS_BOARD b where a.=b.   and b.stateflag=0 ));

select zh_label ,substr(zh_label,1,instr(zh_label,'/',1)-1)||'-'||substr(substr(zh_label,instr(zh_label,'slot=',1)+5),0,instr(substr(zh_label,instr(zh_label,'slot=',1)+5),'/',1)-1)
from QC_RMS_BOARD where stateflag=0;

---思路,可以先把板卡所屬槽位更新正確,然後用上邊的語句進行組織進行更新
update qc_rms_trans_port set solt_no=substr(zh_label,instr(zh_label,'-',1,2)+1,instr(zh_label,'-',1,3)-1-instr(zh_label,'-',1,2)) where  stateflag=0 and solt_no is null 

select zh_label,solt_no,substr(zh_label,instr(zh_label,'-',1,2)+1,instr(zh_label,'-',1,3)-1-instr(zh_label,'-',1,2)) from qc_rms_trans_port where stateflag=0 and solt_no <> substr(zh_label,instr(zh_label,'-',1,2)+1,instr(zh_label,'-',1,3)-1-instr(zh_label,'-',1,2))


----替換回車換行
chr(9) 水平製表符
chr(10)換行鍵
chr(13)Enter鍵
update m_resattribute set sourceexpression=REPLACE(sourceexpression,CHR(10), '') where
resclassenname in (
'QC_RMS_RELATED_EQUIP_FRAME',
'QC_RMS_MACHINE_FRAME',
'QC_RMS_EQUIP_PHY_STRUCT',  
'QC_RMS_BOARD'
) 

update m_resattribute set sourceexpression=REPLACE(sourceexpression,CHR(13), '') where
resclassenname in (
'QC_RMS_RELATED_EQUIP_FRAME',
'QC_RMS_MACHINE_FRAME',
'QC_RMS_EQUIP_PHY_STRUCT',  
'QC_RMS_BOARD'
) 


返回多個取第一個
select * from (select * from ITF_MONITOR_SPC_STATION order by int_id) where rownum=1;
select * from (select * from <table> order by <key> desc) where rownum=1;




ORACLE資料庫DMP及其中單表的匯入匯出 (2013-02-18 11:09:16)轉載▼
標籤: oracle it	分類: 資料庫
匯入某個使用者下所有表: 
imp username/pwd[@sid] file=pathname+filename [full=y] 
匯入某個使用者下的某張表: 
imp username/pwd[@sid] file=pathname+filename tables=(tablename) 
匯入區域網內其他機器的資料庫: 
imp username/pwd[@ip地址/sid] file=pathname+filename 

匯出某個使用者下所有表: 
exp username/pwd[@sid] file=pathname+filename 
匯出某個使用者下的某張表: 
exp username/pwd[@sid] file=pathname+filename tables=(tablename) 
匯出區域網內其他機器的資料庫: 
exp username/pwd[@ip地址/sid] file=pathname+filename 







Oracle 表空間管理維護
2014年02月10日 15:51:32 果兒媽 閱讀數 825
1:表空間概念

 

在ORACLE資料庫中,所有資料從邏輯結構上看都是存放在表空間當中,當然表空間下還有段、區、塊等邏輯結構。從物理結構上看是放在資料檔案中。一個表空間可由多個資料檔案組成。

如下圖所示,一個資料庫由對應一個或多個表空間,表空間邏輯上有一個或多個段(Segment)組成,物理上由一個或多個os file組成。


 

 

 

1.1基本的表空間

 

系統中預設建立的幾個表空間:

    SYSTEM

    SYSAUX

    USERS

    UNDOTBS1

    EXAMPLE

    TEMP

系統中必須的表空間有那幾個?

答案: SYSTEM、SYSAUX、TEMP、UNDO, 像USERS、EXAMPLE等表空間是可有可無的。

 

1.2表空間的分類

 

永久表空間                存放永久性資料,如表,索引等。

臨時表空間                不能存放永久性物件,用於儲存資料庫排序,分組時產生的臨時資料。

UNDO表空間             儲存資料修改前的鏡象。

 

1.3表空間的管理

 

表空間的管理方式:

字典管理:全庫所有的空間分配都放在資料字典中。容易引起字典爭用,而導致效能問題。

本地管理:空間分配不放在資料字典,而在每個資料檔案頭部的第3到第8個塊的點陣圖塊,來管理空間分配。

 

2:建立表空間

   1: CREATE TABLESPACE TBS_TR_DATA
   2: DATAFILE '/oradata/rTBS_TR_DATA_001.dbf'
   3: SIZE 64G 
   4: EXTENT MANAGEMENT LOCAL
   5: SEGMENT SPACE MANAGEMENT AUTO ONLINE;
   6:  
   7:  
   8:  
   9: ALTER TABLESPACE TBS_TR_DATA
  10: ADD DATAFILE '/oradata/rTBS_TR_DATA_002.dbf'
  11: SIZE 64G
  12: AUTOEXTEND OFF;
 

3:表空間管理

 

3.1 表空間資訊


如何檢視資料庫有哪些表空間?如何檢視錶空間對應的資料檔案?

檢視錶空間:

檢視錶空間可以通過下面幾個系統檢視檢視基本資訊

 

--包含資料庫中所有表空間的描述資訊

SELECT * FROM DBA_TABLESPACES

 

--包含當前使用者的表空間的描敘資訊

SELECT * FROM USER_TABLESPACES

 

--包含從控制檔案中獲取的表空間名稱和編號資訊

SELECT * FROM V$TABLESPACE;

 

檢視資料檔案

--包含資料檔案以及所屬的表空間的描述資訊

SELECT * FROM DBA_DATA_FILES

 

--包含臨時資料檔案以及所屬的表空間的描述資訊

SELECT * FROM DBA_TEMP_FILES

 

--包含從控制檔案中獲取的資料檔案的基本資訊,包括它所屬的表空間名稱、編號等

SELECT * FROM V$DATAFILE

 

--包含所有臨時資料檔案的基本資訊

SELECT * FROM V$TEMPFILE

 

 

3.1.1:檢視預設的TEMP表空間

資料庫級別

   1: SQL> SELECT PROPERTY_NAME, PROPERTY_VALUE
   2:  
   3: 2 FROM DATABASE_PROPERTIES
   4:  
   5: 3 WHERE PROPERTY_NAME='DEFAULT_TEMP_TABLESPACE'
   6:  
   7: 4 ;
   8:  
   9: PROPERTY_NAME                        PROPERTY_VALUE
  10:  
  11: ------------------------------ ----------------------------
  12:  
  13: DEFAULT_TEMP_TABLESPACE                  TEMP
使用者級別

   1: SELECT USERNAME, DEFAULT_TABLESPACE FROM DBA_USERS

3.1.2:檢視預設的永久表空間

如果建立使用者時,不指定其永久表空間,則會使用預設的表空間。

 

   1: SQL> SELECT PROPERTY_NAME, PROPERTY_VALUE 
   2:  
   3: 2 FROM DATABASE_PROPERTIES;
   4:  
   5: PROPERTY_NAME PROPERTY_VALUE
   6:  
   7: ------------------------------ ------------------
   8:  
   9: DEFAULT_TEMP_TABLESPACE              TEMP
  10:  
  11: DEFAULT_PERMANENT_TABLESPACE         USERS
3.1.3:檢視預設的表空間型別

 

如果不指定表空間型別,就會預設使用DEFAULT_TBS_TYPE引數指定的表空間型別。

 

   1: SQL> 
   2:  
   3: SQL> SELECT PROPERTY_NAME, PROPERTY_VALUE
   4:  
   5: 2 FROM DATABASE_PROPERTIES
   6:  
   7: 3 WHERE PROPERTY_NAME='DEFAULT_TBS_TYPE';
   8:  
   9: PROPERTY_NAME                    PROPERTY_VALUE
  10:  
  11: ------------------------------ ------------------
  12:  
  13: DEFAULT_TBS_TYPE                     SMALLFILE
3.1.4:檢視錶空間情況

 

SELECT * FROM DBA_TABLESPACES

 

3.1.5:檢視錶空間的資料檔案

 

永久表空間/UNDO表空間

SELECT * FROM DBA_DATA_FILES;

臨時表空間

SELECT * FROM V$TEMPFILE;

 

3.1.6:檢視錶空間使用情況

--SQL 1:

   1: SELECT A.TABLESPACE_NAME                     AS TABLESPACE_NAME, 
   2:         ROUND(A.BYTES/(1024*1024*1024),2)    AS "TOTAL(G)"     , 
   3:         ROUND(B.BYTES/(1024*1024*1024),2)    AS "USED(G)"      , 
   4:         ROUND(C.BYTES/(1024*1024*1024),2)    AS "FREE(G)"      , 
   5:         ROUND((B.BYTES * 100) / A.BYTES,2)   AS "% USED"       , 
   6:         ROUND((C.BYTES * 100) / A.BYTES,2)   AS "% FREE" 
   7: FROM SYS.SM$TS_AVAIL A, SYS.SM$TS_USED B, SYS.SM$TS_FREE C 
   8: WHERE A.TABLESPACE_NAME = B.TABLESPACE_NAME 
   9: AND A.TABLESPACE_NAME = C.TABLESPACE_NAME;
計算表空間使用情況(考慮了資料檔案自動增長情況)

   1: SELECT UPPER(F.TABLESPACE_NAME) AS "表空間名稱", 
   2:         ROUND(D.AVAILB_BYTES ,2) AS "表空間大小(G)", 
   3:         ROUND(D.MAX_BYTES,2) AS "最終表空間大小(G)", 
   4:         ROUND((D.AVAILB_BYTES - F.USED_BYTES),2) AS "已使用空間(G)", 
   5:         TO_CHAR(ROUND((D.AVAILB_BYTES - F.USED_BYTES) / D.AVAILB_BYTES * 100, 
   6:             2), '999.99') AS "使用比", 
   7:         ROUND(F.USED_BYTES, 6) AS "空閒空間(G)", 
   8:         F.MAX_BYTES AS "最大塊(M)" 
   9:  FROM (
  10:         SELECT TABLESPACE_NAME, 
  11:                 ROUND(SUM(BYTES) / (1024 * 1024 * 1024), 6) USED_BYTES, 
  12:                 ROUND(MAX(BYTES) / (1024 * 1024 * 1024), 6) MAX_BYTES 
  13:         FROM SYS.DBA_FREE_SPACE 
  14:         GROUP BY TABLESPACE_NAME) F, 
  15:       (SELECT DD.TABLESPACE_NAME, 
  16:                 ROUND(SUM(DD.BYTES) / (1024 * 1024 * 1024), 6) AVAILB_BYTES, 
  17:             ROUND(SUM(DECODE(DD.MAXBYTES, 0, DD.BYTES, DD.MAXBYTES))/(1024*1024*1024),6) MAX_BYTES 
  18:        FROM SYS.DBA_DATA_FILES DD 
  19:        GROUP BY DD.TABLESPACE_NAME) D 
  20:         WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME 
  21: ORDER BY 4 DESC
 

 

3.2 預設表空間

 

在ORACLE 9i資料庫中,建立資料庫使用者時,如果沒有指定預設的永久性表空間,則系統使用SYSTME表空間分別作為該使用者的預設永久表空間,預設的臨時表空間為TEMP。在ORACLE 10/11g中,如果不指定預設永久性表空間,則是USERS.預設的臨時表空間為TEMP,當然前提是你沒有修改過預設永久表空間值或指定使用者的預設永久性表空間。ORACLE允許使用自定義的表空間作為預設永久性表空間,你可以用下面SQL檢視資料庫的預設永久表空間和預設臨時表空間

SQL>SELECT * FROM database_properties 
WHERE PROPERTY_NAME = 'DEFAULT_PERMANENT_TABLESPACE';

SQL>SELECT * FROM database_properties 
WHERE PROPERTY_NAME ='DEFAULT_PERMANENT_TABLESPACE'

你可以使用ALTER DATABASE DEFAULT TABLESPACE語句可以設定資料庫的預設永久性表空間,這樣建立使用者時,預設將使用指定的表空間。

資料庫級別:

永久表空間

SQL>ALTER DATABASE DEFAULT TABLESPACE USER;

臨時表空間

SQL>ALTER DATABASE DEFAULT TEMPORARY TABLESPACE TEMP;

使用者級別

 

SQL>ALTER USER USERNAM DEFAULT TABLESPACE NEW_TABLESPACE_NAME

檢視使用者對應的預設表空間

SELECT USERNAME, DEFAULT_TABLESPACE FROM DBA_USERS

注意事項:

1:如果我們在建立使用者時指定了預設表空間為DEFAULT_PERMANENT_TABLESPACE的值,那麼在修改預設表空間後,之前使用者的預設表空間也會發生改變。

eg:

   1: SQL> SELECT *   FROM database_properties
   2:   2   WHERE PROPERTY_NAME IN( 'DEFAULT_PERMANENT_TABLESPACE','DEFAULT_TEMP_TABLESPACE');
   3:  
   4:  
   5: PROPERTY_NAME                  PROPERTY_VALUE                                     DESCRIPTION
   6: ---------------- -------------------------------- ------------------------------------------------------------
   7: DEFAULT_TEMP_TABLESPACE        TEMP                                       Name of default temporary tablespace
   8: DEFAULT_PERMANENT_TABLESPACE   USERS                                      Name of default permanent tablespace
   9:  
  10:  
  11: SQL>   CREATE USER U1 IDENTIFIED BY U1 DEFAULT TABLESPACE USERS TEMPORARY TABLESPACE TEMP; 
  12:  
  13:  
  14: SQL>  SELECT USERNAME, DEFAULT_TABLESPACE, TEMPORARY_TABLESPACE FROM DBA_USERS WHERE USERNAME ='U1';
  15:  
  16: USERNAME                       DEFAULT_TABLESPACE             TEMPORARY_TABLESPACE
  17: ------------------------------ ------------------------------ ------------------------------
  18: U1   
  19:  
  20:  
  21: SQL> ALTER DATABASE DEFAULT TABLESPACE TEST1;
  22:  
  23: Database altered
  24:  
  25: 修改了預設永久性表空間後,此時檢視使用者U1的DEFAULT_TABLESPACE值,發現其值也改為了TEST1,證實了結論1的正確性。
  26:  
  27: SQL> SELECT USERNAME, DEFAULT_TABLESPACE, TEMPORARY_TABLESPACE FROM DBA_USERS WHERE USERNAME ='U1';
  28:  
  29: USERNAME                       DEFAULT_TABLESPACE             TEMPORARY_TABLESPACE
  30: ------------------------------ ------------------------------ ------------------------------
  31: U1                             TEST1                          TEMP
  32:  
 

 

2:如果我們在建立使用者時沒有指定使用者表空間,那麼預設也會使用DB的預設表空間,這時候如果我們修改了DB的預設表空間,使用者的表空間也會發生改變。

將資料庫的預設表空間切換為USERS

   1: SQL>  ALTER DATABASE  DEFAULT TABLESPACE USERS;
   2:  
   3: Database altered
   4:  
   5: SQL> CREATE USER U2 IDENTIFIED BY U2;
   6:  
   7: User created
   8:  
   9: SQL> SELECT USERNAME, DEFAULT_TABLESPACE, TEMPORARY_TABLESPACE FROM DBA_USERS WHERE USERNAME ='U1';
  10:  
  11: USERNAME                       DEFAULT_TABLESPACE             TEMPORARY_TABLESPACE
  12: ------------------------------ ------------------------------ ------------------------------
  13: U1                             USERS                          TEMP
  14:  
  15: SQL> ALTER DATABASE DEFAULT TABLESPACE TEST1;
  16:  
  17: Database altered
  18:  
  19: SQL> SELECT USERNAME, DEFAULT_TABLESPACE, TEMPORARY_TABLESPACE FROM DBA_USERS WHERE USERNAME ='U1';
  20:  
  21: USERNAME                       DEFAULT_TABLESPACE             TEMPORARY_TABLESPACE
  22: ------------------------------ ------------------------------ ------------------------------
  23: U1                             TEST1                          TEMP
3: 如果我們在建立使用者指定使用者的表空間是其他的表空間,那麼我們修改DB的預設表空間不會影響使用者的表空間。

eg:

 

   1: SQL> CREATE USER U3 IDENTIFIED BY U3 DEFAULT TABLESPACE TEST2;
   2:  
   3: User created
   4:  
   5: SQL> SELECT USERNAME, DEFAULT_TABLESPACE, TEMPORARY_TABLESPACE FROM DBA_USERS WHERE USERNAME='U3';
   6:  
   7: USERNAME                       DEFAULT_TABLESPACE             TEMPORARY_TABLESPACE
   8: ------------------------------ ------------------------------ ------------------------------
   9: U3                             TEST2                          TEMP
  10:  
  11: SQL> ALTER DATABASE DEFAULT TABLESPACE USERS;
  12:  
  13: Database altered
  14:  
  15: SQL> SELECT USERNAME, DEFAULT_TABLESPACE, TEMPORARY_TABLESPACE FROM DBA_USERS WHERE USERNAME='U3';
  16:  
  17: USERNAME                       DEFAULT_TABLESPACE             TEMPORARY_TABLESPACE
  18: ------------------------------ ------------------------------ ------------------------------
  19: U3                             TEST2                          TEMP
  20:  
4: DB的預設表空間不能刪除,除非將預設表空間指向其他表空間之後才可以刪除。

SQL> DROP TABLESPACE USERS;

DROP TABLESPACE USERS

ORA-12919: 不能刪除預設永久表空間

5: 如果使用者的預設表空間指向其他的表空間,當這個表空間被drop 之後,使用者的預設表空間會自動指向DB的預設表空間。

SQL> DROP TABLESPACE TEST2;

 

3.3 刪除表空間

 

除了SYSTEM表空間外,資料庫中的任何表空間可以刪除。刪除表空間時,ORACLE僅僅是在控制檔案和資料字典中刪除與表空間和資料檔案相關的資訊。預設情況下,ORACLE並不會在操作作業系統中刪除相應的資料檔案,因此在成功執行刪除表空間的操作後,需要手動刪除該表空間在作業系統中對應的資料檔案。如果在刪除表空間的同時要刪除對應的資料檔案,則必須顯示的指定INCLUDING CONTENTS AND DATAFILES子句。注意:當前的資料庫級的預設表空間不能刪除,使用者級的可以刪除.否則會報錯:ORA-12919: Can not drop the default permanent tablespace

DROP TABLESPACE 表空間名 [INCLUDING CONTENTS [AND DATAFILES] [CASCADE CONSTRAINTS]]

SQL> DROP TABLESPACE URER01 INCLUDING CONTENTS;

如果在表空間中包含資料庫物件,則必須在DROP TABLESPACE語句中顯示的指定INCLUDING CONTENTS. 如果要再刪除表空間USER的同時刪除它所對應的資料檔案,則可以使用下面的語句

SQL>DROP TABLESPACE USER01 INCLUDING CONTENTS AND DATAFILES;

注意:刪除表空間時,CONTENTS與DATAFILES選項錯位,會報如下錯誤:

SQL>DROP TABLESPACE TBS_STAGE_DAT INCLUDING DATAFILES AND CONTENTS

ORA-01911:contents keyword expected

SQL>DROP TABLESPACE TBS_STAGE_DAT INCLUDING CONTENTS AND DATAFILES

3.4 調整表空間

 

 

3.4.1 增加資料檔案

 

如果發現某個表空間儲存空間不足時,可以為表空間新增新的資料檔案,擴充套件表空間大小。但是一般建議預先估計表空間所需的儲存空間大小,然後為它建立若干適當大小的資料檔案。

例子:

   1: ALTER TABLESPACE TBS_TR_IND
   2:  
   3: ADD DATAFILE '/oradata/rTBS_TR_IND_002.dbf'
   4:  
   5: SIZE 32G
   6:  
   7: AUTOEXTEND OFF;
   8:  
   9: SQL> ALTER TABLESPACE TBS_EDS_DAT
  10:  
  11: 2 ADD DATAFILE 'G:\datafile\TBS_EDS_DAT01.DBF'
  12:  
  13: 3 SIZE 100M
  14:  
  15: 4 AUTOEXTEND ON
  16:  
  17: 5 NEXT 10M
  18:  
  19: 6 MAXSIZE 20480M;
  20:  
  21: SQL> ALTER TABLESPACE temp01
  22:  
  23: 2 ADD TMPFILE 'D:\ORACLEDATA\temp01_02.dbf' SIZE 10M REUSE;
  24:  
在新增新的資料檔案時,如果同名的作業系統已經存在,ALTER TABLESPACE語句將失敗。如果要覆蓋同名的作業系統檔案時,則必須在後面顯示的指定REUSE子句。

SQL> ALTER TABLESPACE TBS_EDS_DAT

2 ADD DATAFILE 'G:\datafile\TBS_EDS_DAT01.DBF'

3 SIZE 100M

4 AUTOEXTEND ON

5 NEXT 10K

6 MAXSIZE 51200M;

ALTER TABLESPACE TBS_EDS_DAT

*

第 1 行出現錯誤:

ORA-03206: AUTOEXTEND 子句中 (6553600) 塊的最大檔案大小超出範圍

ORACLE支援的資料檔案大小是由它的db_block_size和db_block的數量決定的。其中db_block(ORACLE塊)的數量是一個定值2**22-1(4194303).資料檔案大小容量=塊數量*塊大小。下面列表說明不同資料塊資料庫所能支援的最大物理檔案大小:

資料塊的大小        物理檔案的最大值M  物理檔案的最大值G

=============================================================================

2KB                            8191M                                   8G

4KB                          16383M                                 16G

8KB                          32767M                                 32G

16KB                        65535M                                 64G

32KB                      131072M                               128G

64KB                      262144M                               256G

 

3.4.2 調整資料檔案大小

 

 

 

重置資料檔案的大小

ALTER DATABASE DATAFILE '/database/oracle/oradata/gsp/tbs_dm_data_002.dbf'

RESIZE 500M;

 

3.4.3 刪除資料檔案

 

ALTER TABLESPACE TEST

DROP DATAFILE '/database/oracle/oradata/gsp/tbs_dm_data_002.dbf'

 

 

3.4.4 移動資料檔案

 

 

現在有這樣一個案例:以前資料庫伺服器只有一個容量比較小得磁碟,資料檔案全部放在D盤,後來申請了一個1T的磁碟,需要給D盤騰出一些空間(D盤爆滿了),現在想移動一些大的資料檔案到1T的磁碟:

   1: 1.1:連線資料庫
   2:  
   3: SQL> conn sysdba/manage as sysdba
   4:  
   5: 已連線。
   6:  
   7: 1.2:把要移動資料檔案的表空間離線
   8:  
   9: SQL> ALTER TABLESPACE TBS_EDS_DAT OFFLINE NORMAL ;
  10:  
  11: 表空間已更改。
  12:  
  13: 1.3:移動物理資料檔案。
  14:  
  15: 1.4:重新命名檔案
  16:  
  17: SQL> ALTER DATABASE
  18:  
  19: 2 RENAME FILE 
  20:  
  21: 3 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\WGODS\TBS_EDS_DAT.DBF'
  22:  
  23: 4 TO
  24:  
  25: 5 'G:\datafile\TBS_EDS_DAT.DBF';
  26:  
  27: 資料庫已更改。
  28:  
  29: 1.5:表空間聯機
  30:  
  31: SQL> ALTER TABLESPACE TBS_DM_DAT ONLINE;
  32:  
  33: 表空間已更改。
  34:  
  35: 1.6:如果要刪除以前的資料檔案,則必須先關閉資料庫,手動刪除檔案,否則會報錯。
  36:  
  37: SQL> shutdow immediate
  38:  
  39: 資料庫已經關閉。
  40:  
  41: 已經解除安裝資料庫。
  42:  
  43: ORACLE 例程已經關閉。
  44:  
  45: SQL> startup
  46:  
  47: ORACLE 例程已經啟動。
  48:  
  49: Total System Global Area 612368384 bytes
  50:  
  51: Fixed Size 1250428 bytes
  52:  
  53: Variable Size 104860548 bytes
  54:  
  55: Database Buffers 499122176 bytes
  56:  
  57: Redo Buffers 7135232 bytes
  58:  
  59: 資料庫裝載完畢。
  60:  
  61: 資料庫已經開啟。
  62:  
Linux/Unix下

 

   1: 1、檢視錶空間的檔案分佈
   2:  
   3: SQL> select TABLESPACE_NAME,FILE_NAME,BYTES/1024/1024 "MB" 
   4:  
   5: from dba_data_files;
   6:  
   7: 2、將表空間離線
   8:  
   9: SQL> alter tablespace users offline;
  10:  
  11: 3、在作業系統下將資料檔案移到另一位置
  12:  
  13: SQL> host mv /u01/app/oracle/oradata/ocp/users01.dbf /u02/
  14:  
  15: SQL> host ls /u02/
  16:  
  17: 4、修改控制檔案的記錄指標
  18:  
  19: SQL> alter database rename file 
  20:  
  21: '/u01/app/oracle/oradata/ocp/users01.dbf' to '/u02/users01.dbf';
  22:  
  23: 或者
  24:  
  25: SQL> alter tablespace users rename datafile 
  26:  
  27: '/u01/app/oracle/oradata/ocp/users01.dbf' to '/u02/users01.dbf';
  28:  
  29: 注:執行此項時,目標檔案(TO後面的那一段)一定要存在。
  30:  
  31: 5、將表空間線上
  32:  
  33: SQL> alter tablespace users online;
  34:  
  35: 對於那些不能offline的表空間,只能關閉資料,在mount狀態下修改,修改後再OPEN
 

3.4.5 資料檔案離線

 

 

 

ALTER DATABASE DATAFILE '/database/oracle/oradata/gsp/tbs_dm_data_002.dbf' OFFLINE;

 

 

3.4.6 資料檔案聯機

 

 

ALTER DATABASE DATAFILE '/database/oracle/oradata/gsp/tbs_dm_data_002.dbf' ONLINE;

 

4:維護表空間

 

4.1 變更表空間狀態

 

 

表空間狀態有下面幾種狀態:online、offline、read only、read write。

若要檢視錶空間的狀態,可以通過下面SQL語句來檢視。

 

   1: SQL> SELECT TABLESPACE_NAME, CONTENTS, STATUS FROM DBA_TABLESPACES;
   2:  
   3:         TABLESPACE_NAME                CONTENTS  STATUS
   4:         ------------------------------ --------- ---------
   5:         SYSTEM                         PERMANENT ONLINE
   6:         UNDOTBS1                       UNDO      ONLINE
   7:         SYSAUX                         PERMANENT ONLINE
   8:         TEMP                           TEMPORARY ONLINE
   9:         USERS                          PERMANENT ONLINE
  10:         EXAMPLE                        PERMANENT ONLINE
  11:         TBS_DM_DATA                    PERMANENT READ ONLY
  12:  
  13:         7 rows selected
  14:  
  15:          
  16:         SQL> SELECT FILE#, STATUS, ENABLED FROM V$DATAFILE;
  17:  
  18:                  FILE# STATUS  ENABLED
  19:         ---------- ------- ----------
  20:                  1 SYSTEM  READ WRITE
  21:                  2 ONLINE  READ WRITE
  22:                  3 ONLINE  READ WRITE
  23:                  4 ONLINE  READ WRITE
  24:                  5 ONLINE  READ WRITE
  25:                  6 OFFLINE READ ONLY
  26:                  7 OFFLINE READ ONLY
 

4.1.1 表空間離線

SQL>ALTER TABLESPACE TBS_DM_DAT OFFLINE IMMEDIATE;

設定離線狀態,可以使用下面4個引數來控制離線方式

NORMAL 該參數列示將表空間以正常方式切換到離線狀態,在進入離線狀態過程中,ORACLE會執行一次檢查點, 將SGA區中與該表空間相關的髒快取塊寫入資料檔案中,然後再關閉表空間的所有資料檔案。如果在這過程中沒有發生任何錯誤,則可以使用NORMAL引數,這也是預設的方式。

TEMPORARY 該引數將表空間以臨時方式切換到離線狀態。這時ORACLE在執行檢查點時並不會檢查各個資料檔案的狀態,即使某些資料檔案處於不可用狀態,ORACLE也會忽略這些錯誤。這樣將表空間設定為聯機狀態時,可能需要進行資料恢復。

IMMEDIATE 該引數將表空間以立即方式切換到離線狀態,這時ORACLE不會執行檢查點,也不會檢查資料檔案是否可用。而是直接將屬於表空間的資料檔案設定為離線狀態。下一次將表空間恢復為聯機狀態時必須進行資料庫恢復。

FOR RECOVER 該引數將表空間以用於恢復方式切換到離線狀態,如果要對錶空間進行基於時間的恢復,可以使用這個引數將表空間切換到離線狀態。

如果資料庫執行在非歸檔模式下(NOARCHIVELOG),由於無法保留恢復表空間所需要的重做資料,所以不能將表空間以立即方式切換到離線狀態。如果表空間離線了,則查詢表空間下的表,會報錯誤:ORA-00376 此時無法讀取檔案 以及 ORA-01110:資料檔案x......

 

注意:離線(offline)一般用於資料庫的聯機備份,資料恢復等維護操作。有些表空間不能OFFLINE,如:SYTEM,UNDO等

1. SYTEM 不能offline,也不能read only

2. 當前的UNDO表空空間,不能offline,也不能read only

3. 當前的臨時表空間不能offline,也不能read only

4. SYSAUX可以offline 不能read only

SQL> ALTER TABLESPACE SYSTEM OFFLINE;

ALTER TABLESPACE SYSTEM OFFLINE

ORA-01541: system tablespace cannot be brought offline; shut down if necessary

SQL> ALTER TABLESPACE SYSTEM OFFLINE;

ALTER TABLESPACE SYSTEM OFFLINE

ORA-01541: system tablespace cannot be brought offline; shut down if necessary

4.1.2 表空間聯機

 

 

SQL> ALTER TABLESPACE TBS_DM_DAT ONLINE;

 

4.1.3 表空間只讀

 

 

 

SQL>ALTER TABLESPACE TBS_DM_DAT READY ONLY;

表空間只讀時,其中的表,不能進行任何DML操作, 否則會報錯:ORA-00372: file xxx cannot be modified at this time

ORA-01110: data file xx: ********。但是能刪除表。

 

4.1.4 表空間讀寫

 

SQL>ALTER TABLESPACE TBS_DM_DAT READ WRITE;

 

 

4.1.5 表空間改名

在ORACLE 10g 之前,表空間的名稱是不能被修改的。在ORACLE 11G中,通過ALTER TABLESPACE 語句中使用RENAME子句,資料庫管理員可以修改表空間的名稱。

 

 

 

   1: CREATE TABLESPACE TBS_DM_DAT 
   2: DATAFILE 'E:\APP\KERRY\ORADATA\ORCL\TBS_DM_DAT.DBF'
   3: SIZE 50M
   4: EXTENT MANAGEMENT LOCAL
   5: SEGMENT SPACE MANAGEMENT AUTO ONLINE
   6:  
   7:  
   8: SQL>ALTER TABLESPACE TBS_DM_DAT RENAME TO TBS_DM_DATA
   9:  
  10: QL> SELECT TABLESPACE_NAME FROM DBA_TABLESPACES WHERE TABLESPACE_NAME = 'TBS_DM_DATA';
  11:  
  12: TABLESPACE_NAME
  13: ---------------------------
  14: TBS_DM_DATA
4.1.6 開啟自動擴充套件

 

ALTER DATABASE DATAFILE '/database/oracle/oradata/gsp/tbs_dm_data_002.dbf' AUTOEXTEND ON;

 

4.1.7 關閉自動擴充套件

 

 

ALTER DATABASE DATAFILE '/database/oracle/oradata/gsp/tbs_dm_data_002.dbf' AUTOEXTEND OFF;

5 表空間配額

 

表空間不足與使用者配額不足是兩種不同的概念。表空間的大小是指實際的使用者表空間的大小,而配額大小指的是使用者指定使用表空間的的大小。兩者的解決方式亦不相同

3.5.1 檢視使用者的表空間配額

 

   1: --檢視所有使用者表空間的配額情況 
   2: SELECT * FROM DBA_TS_QUOTAS
   3:   
   4: --檢視當前使用者表空間的配額情況   
   5: SELECT * FROM USER_TS_QUOTAS
   6:  
   7:  
   8: SQL> DESC DBA_TS_QUOTAS
   9: Name            Type         Nullable Default Comments                                         
  10: --------------- ------------ -------- ------- ------------------------------------------------ 
  11: TABLESPACE_NAME VARCHAR2(30)                  Tablespace name                                  
  12: USERNAME        VARCHAR2(30)                  User with resource rights on the tablespace      
  13: BYTES           NUMBER       Y                Number of bytes charged to the user              
  14: MAX_BYTES       NUMBER       Y                User's quota in bytes.  NULL if no limit         
  15: BLOCKS          NUMBER       Y                Number of ORACLE blocks charged to the user      
  16: MAX_BLOCKS      NUMBER       Y                User's quota in ORACLE blocks.  NULL if no limit 
  17: DROPPED         VARCHAR2(3)  Y                Whether the tablespace has been dropped  
MAX_BYTES=-1表示沒有配額限制,

3.5.2 管理使用者表空間配額

使用者表空間限額的建立與更改:

1.建立使用者時,指定限額

eg:

CREATE USER TEST IDENTIFIED BY TEST

DEFAULT TABLESPACE TS_TEST

TEMPORARY TABLESPACE TEMP

QUOTA 3M ON TS_TEST

PASSWORD EXPIRE;

2.更改使用者的表空間限額:

A:不對使用者做表空間限額控制:

檢視是否沒有表空間限額限制

B:取消限額

這種方式是全域性性的.

SQL> GRANT UNLIMITED TABLESPACE TO SCOTT;

或者針對特定的表空間的.

SQL>ALTER USER SCOTT QUOTA UNIMITED ON TBS_EDS_DAT;

SELECT * FROM SESSION_PRIVS WHERE PRIVILEGE='UNLIMITED TABLESPACE'

SQL> REVOKE UNLIMITED TABLESPACE FROM SCOTT;

C:制定配額

3. 可以分配自然也可以回收了:

revoke unlimited tablespace from TEST;

或者

alter user skate quota 0 on TB;

表空間大小不足問題的解決:使用“ALTER TABLESPACE tablespace_name ADD DATAFILE filename SIZE size_of_file”命令向指定的資料增加表空間,根據具體的情況可以增加一個或多個表空間。

  

相關文章