一、出現原因:表空間不夠
1、查看有哪些表空間及特定表空間所包含的表
SELECT * FROM DBA_TABLESPACES; --查看有哪些表空間
SELECT * FROM DBA_TABLES WHERE TABLESPACE_NAME='CHENMU'; --查看CHENMU表空間有哪些表
SELECT USERNAME,DEFAULT_TABLESPACE,TEMPORARY_TABLESPACE FROM DBA_USERS; --查看用戶所屬的默認表空間、臨時表空間
基本的表空間有SYSTEM、SYSAUX(輔助表空間)、USERS、UNDOTBS1(回滾表空間)、TEMP(臨時表空間,保存數據庫排序,分組時產生的臨時數據)
2、查看數據文件以及所屬表空間的相關信息
SELECT * FROM DBA_DATA_FILES; --查看數據文件信息 SELECT * FROM DBA_TEMP_FILES; --查看臨時數據文件信息
SELECT * FROM DBA_FREE_SPACE; --查看表空間剩余空間,每段剩余空間都會有一條記錄,如果一個表空間記錄過多說明碎片過多
--DBA_DATA_FILES
FILE_NAME 數據文件的名稱,物理文件存放地址
TABLESPACE_NAME 數據文件所屬的表空間
BYTES 文件的字節大小
BLOCKS 文件的塊大小
STATUS 文件的狀態,有效或無效
AUTOEXTENSIBLE 是否自動擴展
MAXBYTES 最大自動擴展字節數
MAXBLOCKS 最大自動擴展塊數
INCREMENT_BY 默認自動增量
USER_BYTES 有用的字節大小
USER_BLOCKS 有用的塊大小
3、查詢表空間使用情況
select b.tablespace_name --表空間名 ,b.m_bytes --表空間大小 ,b.m_bytes-nvl(a.mbytes_free,0) used --已使用空間 ,nvl(a.mbytes_free,0) free --剩余空間 ,round(((b.m_bytes-nvl(a.mbytes_free,0))/b.m_bytes),2)*100||'%' pct_used --使用率 from (select sum(bytes)/(1024*1024) mbytes_free,max(bytes)/(1024*1024) largest,tablespace_name from sys.dba_free_space group by tablespace_name)a, (select sum(bytes)/(1024*1024) m_bytes,sum(maxbytes)/(1024*1024) mbytes_max,tablespace_name from sys.dba_data_files group by tablespace_name union all select sum(bytes)/(1024*1024) m_bytes,sum(maxbytes)/(1024*1024) mbytes_max,tablespace_name from sys.dba_temp_files group by tablespace_name)b where a.tablespace_name (+)= b.tablespace_name order by a.tablespace_name asc
二、解決方法:增加表空間或收縮對象
1、給表空間增加數據文件並自動增長
ALTER TABLESPACE TEST ADD DATAFILE '/u01/app/oracle/oradata/CHENMU/TEST02.DBF' SIZE 50M AUTOEXTEND ON;
2、允許已存在的數據文件自動增長
ALTER DATABASE DATAFILE '/u01/app/oracle/oradata/CHENMU/TEST.DBF' AUTOEXTEND ON;
3、修改數據文件大小
ALTER DATABASE DATAFILE '/u01/app/oracle/oradata/CHENMU/TEST.dbf' RESIZE 200M;
4、收縮對象
段的收縮:高位線下移,返回空間給表空間(壓縮沒有返回),將數據遷移到段后面空閑的地方,所以需要行遷移。提高性能和空間使用率,保留索引,無觸發器觸發。
select table_name,row_movement from user_tables; //檢查行遷移功能是否開啟 alter table employees enable row movement; //打開行遷移
alter table employees shrink space compact; //將比較空的數據放在同一塊,但是水位線不變 alter table employees shrink space; //將比較空的數據放在同一塊,但是水位線改變
表的壓縮(表超過255列不建議使用):basic compression,基本壓縮,將行里面的空格去掉,適用於Direct-Path insert(繞過數據緩存,通過組織塊直接存),壓縮10倍左右,用在DSS;advanced row compression常用在DML,壓縮在2-4倍,用在OLTP、DSS,不是插入一行就壓縮一行,而是數據快到pctfree臨界點時觸發壓縮機制。HWM(High water mark)標記歷史用過了多少塊,不一定有數據,但是每次掃描表的時候都是從高水位線開始往下掃描。Direct-Path insert每次插入數據不查找高水位線下面空閑的塊,而是直接從高水位線上面插入。
三、創建表空間
CREATE TABLESPACE TEST DATAFILE '/u01/app/oracle/oradata/TEST.DBF' SIZE 100M EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO ONLINE;
四、表空間其他操作
1、遷移數據文件
ALTER DATABASE MOVE DATAFILE '/u01/app/oracle/oradata/TEST.DBF' TO '/u01/app/oracle/oradata/CHENMU/test.dbf'; //把沒在CHENMU里的數據文件遷移到該文件夾下,在12c以前遷移數據文件要先offline,12c以后可以move
2、重命名表空間
ALTER TABLESPACE hr_temp RENAME TO test_temp;
3、刪除表空間
drop tablespace test; //這樣刪除表空間,數據文件還是存在,如果以后創建同名的表空間,該數據文件自動歸類到該表空間里 drop tablespace test including contents; //刪除表空間和表空間里的對象,經過創建默認表空間和臨時表空間並指定給用戶test,在里面創建一個表后執行該語句,test用戶還存在也還可以連接,但是創建的表不存在了,也不能創建表了 drop tablespace test including contents and datafiles; //刪除表空間、對象以及數據文件