1. 程式人生 > >oracle表空間查詢維護命令大全之中的一個(數據表空間)史上最全

oracle表空間查詢維護命令大全之中的一個(數據表空間)史上最全

ava 劃分 man max rac 帳戶 oca nio msi

表空間是數據庫的邏輯劃分,一個表空間僅僅能屬於一個數據庫。

全部的數據庫對象都存放在建立指定的表空間中。但主要存放的是表, 所以稱作表空間。在oracle 數據庫中至少存在一個表空間。即SYSTEM的表空間。一個表空間能夠包括多個段。以及區。以及最小的塊,同一時候也能夠包括多個數據文件(物理結構)。
oracle 能夠依據表空間對相關的用戶配額以及磁盤空間都有極大的保護作用,並且還能夠靈活的存放。同一時候也能夠把不同的數據文件分開存放,保證不同數據文件的安全行。


所以在一般數據創建後,就會創建相關的表空間,再創建相關的用戶。

Oracle數據庫開創性地提出了表空間的設計理念,這為Oracle數據庫的高性能做出了不可磨滅的貢獻。能夠這麽說,Oracle中非常多優化都是基於表空間的設計理念而實現的。

下面針對數據表空間一些相關命令進行匯總

1,表空間匯總

--創建表空間的腳本
CREATE TABLESPACE TEST_FILE
LOGGING
DATAFILE ‘/U02/APP/ORACLE/ORADATA/ITSDB/TEST_FILE.DBF‘
SIZE 10M
AUTOEXTEND ON
NEXT 10M MAXSIZE 10240M
EXTENT MANAGEMENT LOCAL;

--查看用戶的默認表空間
SELECT T.USERNAME,T.DEFAULT_TABLESPACE FROM DBA_USERS T

--改動用戶的默認表空間TABLESPACE_B
ALTER USER USER_A DEFAULT TABLESPACE TABLESPACE_B

--用戶在表空間上放開限制
ALTER USER USER_A QUOTA UNLIMITED ON TABLESPACE_B;

--回收權限
REVOKE UNLIMITED TABLESPACE ON TABLESPACE_A FROM USER_A

--以使USER_A帳戶不能在TABLESPACE_A上創建不論什麽對象。
ALTER USER USER_A QUOTA 0 ON TABLESPACE_A


--移動表的表空間
ALTER TABLE CQRM.CQ_FLIGHTS_SEATS_SEQUENCE MOVE TABLESPACE CQRM;COMMIT;

--批量移動表空間的語句
SELECT ‘ALTER TABLE ‘||TABLE_NAME||‘ MOVE TABLESPACE CQRM;COMMIT;‘ FROM USER_TABLES WHERE TABLESPACE_NAME=‘TEST‘;

--在表空間上重建索引
SELECT ‘ALTER INDEX ‘||OWNER||‘.‘||INDEX_NAME||‘ REBUILD TABLESPACE CQRM;COMMIT;‘ FROM DBA_INDEXES WHERE TABLE_NAME IN (‘‘)
AND OWNER=‘TEST‘


SELECT ‘ALTER TABLE ‘||OWNER||‘.‘||TABLE_NAME||‘ MOVE TABLESPACE TEST;COMMIT;‘ FROM DBA_TABLES WHERE TABLESPACE_NAME=‘TEST1‘ AND OWNER=‘TEST‘

2,改變表空間狀態

1.使表空間脫機

ALTER TABLESPACE GAME OFFLINE;

假設是意外刪除了數據文件,則必須帶有RECOVER選項

ALTER TABLESPACE GAME OFFLINE FOR RECOVER;

2.使表空間聯機

ALTER TABLESPACE GAME ONLINE;

3.使數據文件脫機

ALTER DATABASE DATAFILE 3 OFFLINE;

4.使數據文件聯機

ALTER DATABASE DATAFILE 3 ONLINE;

5.使表空間僅僅讀

ALTER TABLESPACE GAME READ ONLY;

6.使表空間可讀寫

ALTER TABLESPACE GAME READ WRITE;

刪除表空間

DROP TABLESPACE DATA01 INCLUDING CONTENTS AND DATAFILES;

擴展表空間

3,首先查看表空間的名字和所屬文件

SELECT TABLESPACE_NAME, FILE_ID, FILE_NAME,
ROUND(BYTES/(1024*1024),0) TOTAL_SPACE
FROM DBA_DATA_FILES
ORDER BY TABLESPACE_NAME;

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;
4.更改數據文件的位置
ALTER TABLESPACE APP_DATA RENAME DATAFILE
‘‘ TO ‘‘


--整合表空間的碎片
ALTER TABLESPACE TABLESPACENAME COALESCE
此語句是整合表空間的碎片添加表空間的連續性,可是他不會收縮一個文件的大小的。



設定後查看表空間信息

SELECT A.TABLESPACE_NAME,A.BYTES TOTAL,B.BYTES USED, C.BYTES FREE,
(B.BYTES*100)/A.BYTES "% USED",(C.BYTES*100)/A.BYTES "% FREE"
FROM SYS.SM$TS_AVAIL A,SYS.SM$TS_USED B,SYS.SM$TS_FREE C
WHERE A.TABLESPACE_NAME=B.TABLESPACE_NAME AND A.TABLESPACE_NAME=C.TABLESPACE_NAME;

--查看表空間使用狀況

SELECT UPPER(F.TABLESPACE_NAME) "表空間名",
D.TOT_GROOTTE_MB "表空間大小(G)",
D.TOT_GROOTTE_MB - F.TOTAL_BYTES "已使用空間(G)",
CASE
WHEN D.TOT_GROOTTE_MB = 0 THEN
0
ELSE
TO_NUMBER(TO_CHAR(ROUND((D.TOT_GROOTTE_MB - F.TOTAL_BYTES) /
D.TOT_GROOTTE_MB * 100,
2),
‘990.99‘))
END "使用比",
F.TOTAL_BYTES "空暇空間(G)",
F.MAX_BYTES "最大塊(G)"
FROM (SELECT TABLESPACE_NAME,
ROUND(SUM(BYTES) / (1024 * 1024 * 1024), 2) TOTAL_BYTES,
ROUND(MAX(BYTES) / (1024 * 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 * 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 4 DESC
--也能夠從視圖DBA_TABLESPACE_USAGE_METRICS 查詢假設表空間不是自己主動擴展則兩者查詢結果同樣,假設是自己主動擴展的話則兩者有偏差,以上面的查詢為準


--查看用戶使用了那些表空間
SELECT OWNER, OBJECT_TYPE, TABLESPACE_NAME
FROM (SELECT DISTINCT ‘TABLE‘ OBJECT_TYPE, OWNER, TABLESPACE_NAME
FROM DBA_TABLES
UNION
SELECT DISTINCT ‘INDEX‘ OBJECT_TYPE, OWNER, TABLESPACE_NAME
FROM DBA_INDEXES)
WHERE TABLESPACE_NAME IS NOT NULL
AND OWNER = ‘EZOFFICE‘
ORDER BY 1, 2, 3;


SELECT T.SEGMENT_NAME, T.TABLESPACE_NAME, BYTES / 1024 / 1024
FROM DBA_SEGMENTS T
WHERE T.SEGMENT_NAME IN
(‘‘)
AND OWNER = ‘USER‘

--能夠查看回收的數據文件大小
SELECT ‘ALTER DATABASE DATAFILE ‘‘‘ || A.FILE_NAME || ‘‘‘ RESIZE ‘ ||
ROUND(A.FILESIZE - (A.FILESIZE - C.HWMSIZE - 100) * 0.8) || ‘M;‘,
A.FILESIZE || ‘M‘ AS "數據文件的總大小",
C.HWMSIZE || ‘M‘ AS "數據文件的有用大小"
FROM (SELECT FILE_ID, FILE_NAME, ROUND(BYTES / 1024 / 1024) AS FILESIZE
FROM DBA_DATA_FILES) A,
(SELECT FILE_ID, ROUND(MAX(BLOCK_ID) * 8 / 1024) AS HWMSIZE
FROM DBA_EXTENTS
GROUP BY FILE_ID) C
WHERE A.FILE_ID = C.FILE_ID

AND A.FILESIZE - C.HWMSIZE > 100;


下一篇會繼續講述uodo表空間


oracle表空間查詢維護命令大全之中的一個(數據表空間)史上最全