--1、查詢數據庫臨時表空間信息
SELECT * FROM DATABASE_PROPERTIES WHERE PROPERTY_VALUE='TEMP';
--2、表空間信息
SELECT TP.tablespace_name AS 表空間名稱,
TP.block_size / 1024 || 'M' AS 空間塊大小,
TP.contents AS 空間類型,
TP.extent_management AS 表空間管理方式
FROM DBA_TABLESPACES TP;
--查詢數據字典管理模式下,哪些區被佔用,權限屬於sys,如果是LOCAL管理方式,則數據行爲空
SELECT * FROM UET$;
--查詢數據字典管理模式下,哪些區是空閒狀態(FET:FREE EXTENT TABLE)
SELECT * FROM FET$;
--創建普通表空間語法
CREATE TABLESPACE test DATAFILE 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TEST.DBF' SIZE 5M EXTENT MANAGEMENT LOCAL
--創建UNDO表空間
CREATE UNDO TABLESPACE testundo DATAFILE 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TESTUNDO.DBF' SIZE 5M
--創建臨時表空間
CREATE TEMPORARY TABLESPACE testtemp TEMPFILE 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TESTTEMP.DBF' SIZE 5M
SELECT * FROM V$datafile;
數據庫(Database)可以擁有多個表空間(Tablespace),一個表空間在同一時間只能屬於同一個數據庫,即兩者是1:N的關係;
一個表空間(Tablespace)可以由多個段(Segment)組成,段可以跨越不同的數據文件(Data file);
一個段(Segment)由由多個區(Extent)組成;
一個數據文件(Data file)由多個區組成,即存在1:N的關係,一個區只能屬於一個數據文件;
一個區由多個連續的Oracle數據塊(Block)組成;
在Oracle數據庫中Block是最小的存儲單位;
Oracle數據塊與操作系統的數據塊的關係是整數倍的關係,比如OS的block大小是4K,則Oracle數據塊大小隻能是4的整數倍,如4K、8K、16K等,整數倍的意義在於不必要的I/O;
附:
查詢Windows操作系統Block大小的方法:命令行執行“fsutil fsinfo ntfsinfo c:”
查詢Oracle Block大小的方法:sqlplus中執行 “show parameter db_block_size”
其他操作系統(如linux、HP-UNIX等)查詢數據塊大小方法具體請參考:http://blog.itpub.net/25116248/viewspace-1063047/
一個數據庫中只有SYSTEM表空間是必須的,如果使用DBCA創建數據庫時選擇表空間管理方式爲Local Managent,則日後無法再更改數據庫表空間管理方式;
段(Segment)有兩種管理方式
1、手動管理,用FREELIST,叫MSMM;
2、自動管理,叫ASSM
區(Extent)的兩種管理方式
1、字典管理方式(Dictionary,Oracle8.15版本之前默認管理方式,現在已經被淘汰,字典管理方式容易產生遞歸,不能良好支持併發)
2、本地管理(Oracle9版本以後默認管理方式)
創建數據庫時,會自動預置如下數據表空間
1、SYSAUX:這是SYSTEM 表空間的輔助表空間,Oracle Database 10g 或更高版本都必須擁有SYSAUX 表空間本地化自動段管理;
2、UNDOTBS1:這是數據庫服務器用於存儲還原信息的還原表空間
3、TEMP:如果執行的SQL 語句需要創建臨時段(如大規模排序或創建索引),則可以使用臨時表,創建數據庫時如果用戶沒有明確指定默認臨時表空間,則此表空間會被作爲默認臨時表空間。
4、USERS:此表空間用於存儲永久用戶對象和數據。
5、EXAMPLE:此表空間包含創建數據庫時可以安裝的例子數據
alter tablespace offline;
alter tablespace online;
說明:offline可以使表空間離線,但是不能對system、temp以及有活動事務的undo表空間進行離線操作;
--查詢數據文件信息
select * from dba_data_files;
select * from v$datafile;
--修改數據文件自動擴展範圍
alter database datafile 'E:\APP\NEUSOFT\ORADATA\ORCL\DATAFILE\O1_MF_DUSHUAI_BBQ2GWSK_.DBF' autoextend on next 50M maxsize unlimited;
--查詢臨時數據文件信息
select * from dba_temp_files;
select * from v$tempfile;
--空間分配信息
select * from dba_free_space;
select * from dba_extents;
--修改數據文件自動擴展範圍
alter database datafile 'E:\APP\NEUSOFT\ORADATA\ORCL\DATAFILE\O1_MF_DUSHUAI_BBQ2GWSK_.DBF' autoextend on next 50M maxsize unlimited;
================================================
Oracle表空間和數據文件章節試驗章節
================================================
SQL> --更改會話標識符爲dushuai
SQL> set sqlprompt "dushuai>>"
dushuai>>--創建一個本地化管理的表空間,初始大小定義爲20M,統一塊大小256K
dushuai>>create tablespace test datafile 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TEST.DBF' size=20M extent management local uniform=256K;
create tablespace test datafile 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TEST.DBF' size=20M extent management local uniform=256K
*
第 1 行出現錯誤:
ORA-02237: 無效的文件大小
dushuai>>create tablespace test datafile 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TEST.DBF' size 20M extent management local uniform size 256K;
表空間已創建。
dushuai>>--上面的創建錯誤,依然說明對於創建表空間的語法不熟練,加強練習!
dushuai>>--創建一個test用戶,默認表空間是test
dushuai>>create user test identified by test default tablespace test;
用戶已創建。
dushuai>>--爲新創建的用戶test賦予基本權限
dushuai>>grant connect,resource to test;
授權成功。
dushuai>>--下面我們用新創建的用戶登錄sqlplus
dushuai>>conn test/test
已連接。
dushuai>>show user
USER 爲 "TEST"
dushuai>>--創建一張表test,則test表默認的表空間就是test
dushuai>>create table test (id integer,name varchar2(100));
表已創建。
dushuai>>desc test
名稱 是否爲空? 類型
----------------------------------------- -------- ----------------------------
ID NUMBER(38)
NAME VARCHAR2(100)
dushuai>>--向test表插入幾行模擬數據
dushuai>>insert into test values(1,'dushuai');
已創建 1 行。
dushuai>>insert into test values(2,'tom');
已創建 1 行。
dushuai>>commit;
提交完成。
dushuai>>col name for a20;
dushuai>>select * from test;
ID NAME
---------- --------------------
1 dushuai
2 tom
dushuai>>--查看dba_tablespace表的字段信息
dushuai>>grant dba to test;
授權成功。
dushuai>>conn test/test;
已連接。
dushuai>>desc dba_tablespaces;
名稱 是否爲空? 類型
----------------------------------------- -------- ----------------------------
TABLESPACE_NAME NOT NULL VARCHAR2(30)
BLOCK_SIZE NOT NULL NUMBER
INITIAL_EXTENT NUMBER
NEXT_EXTENT NUMBER
MIN_EXTENTS NOT NULL NUMBER
MAX_EXTENTS NUMBER
PCT_INCREASE NUMBER
MIN_EXTLEN NUMBER
STATUS VARCHAR2(9)
CONTENTS VARCHAR2(9)
LOGGING VARCHAR2(9)
FORCE_LOGGING VARCHAR2(3)
EXTENT_MANAGEMENT VARCHAR2(10)
ALLOCATION_TYPE VARCHAR2(9)
PLUGGED_IN VARCHAR2(3)
SEGMENT_SPACE_MANAGEMENT VARCHAR2(6)
DEF_TAB_COMPRESSION VARCHAR2(8)
RETENTION VARCHAR2(11)
BIGFILE VARCHAR2(3)
dushuai>>--上面的錯誤說明一個普通用戶無法查詢dba_ 報表
dushuai>>SELECT TP.tablespace_name AS 表空間名稱,
2 TP.block_size / 1024 || 'M' AS 空間塊大小,
3 TP.contents AS 空間類型,
4 TP.extent_management AS 表空間管理方式
5 FROM DBA_TABLESPACES TP
6 WHERE TP.tablespace_name='TEST';
表空間名稱 空間塊大小 空間類型 表空間管理
-------------- ----------- ---------- ------------------
TEST 8M PERMANENT LOCAL
dushuai>>--我們將新創建的test表空間設置爲只讀
dushuai>>alter tablespace test read only;
表空間已更改。
dushuai>>--表空間設置爲只讀模式,會引起系統發生檢查點操作,會促使DBWR進程將內存塊中的髒數據寫入磁盤數據文件中
dushuai>>--需要注意的是,檢查點只會寫髒數據,但是並不會完結事務,所以在設置只讀模式前,必須保證沒有尚未結束的事務,否則操作會hang在哪裏;
dushuai>>--我們檢測一下只讀模式下,能否插入、刪除、更新數據行
dushuai>>insert into test values(3,'wanwei');
insert into test values(3,'wanwei')
*
第 1 行出現錯誤:
ORA-00372: 此時無法修改文件 7
ORA-01110: 數據文件 7: 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TEST.DBF'
dushuai>>delete from test where id=2;
delete from test where id=2
*
第 1 行出現錯誤:
ORA-00372: 此時無法修改文件 7
ORA-01110: 數據文件 7: 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TEST.DBF'
dushuai>>update test set id=88 where id=2;
update test set id=88 where id=2
*
第 1 行出現錯誤:
ORA-00372: 此時無法修改文件 7
ORA-01110: 數據文件 7: 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TEST.DBF'
dushuai>>--上面的事例告訴我們,表空間只讀模式下是無法進行DML操作的;
dushuai>>--我們再試試是否可以truncate、drop表
dushuai>>truncate table test;
truncate table test
*
第 1 行出現錯誤:
ORA-00372: 此時無法修改文件 7
ORA-01110: 數據文件 7: 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TEST.DBF'
dushuai>>drop table test;
表已刪除。
dushuai>>--上面的事例告訴我們,只讀模式下只能drop,不能truncate
dushuai>>--更改表空間爲可讀可寫模式
dushuai>>alter tablespace test read write;
表空間已更改。
dushuai>>--如果一個表空間不需要更新、寫入數據,可以設置爲只讀模式
dushuai>>--表空間離線操作:system、處於活動狀態的undo表空間、默認的temp表空間不能離線,表空間後,用戶無法訪問;
dushuai>>alter tablespace test offline;
表空間已更改。
dushuai>>--查詢表test
dushuai>>select * from test;
select * from test
*
第 1 行出現錯誤:
ORA-00942: 表或視圖不存在
dushuai>>--上述現象說明,表空間離線後,無法再訪問表空間中原有的對象信息,如表;
dushuai>>--表空間在線
dushuai>>alter tablespace test online;
表空間已更改。
SQL> show user
USER 爲 "SYS"
SQL> --變更test表空間爲自動擴展模式,每次自動擴展大小爲10M
SQL> alter database datafile 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TEST.DBF' autoextend on next 10M;
數據庫已更改。
SQL> --注意使用的是alter database命令項
SQL> DESC DBA_FREE_SPACE
名稱 是否爲空? 類型
----------------------------------------- -------- ----------------------------
TABLESPACE_NAME VARCHAR2(30)
FILE_ID NUMBER
BLOCK_ID NUMBER
BYTES NUMBER
BLOCKS NUMBER
RELATIVE_FNO NUMBER
SQL> --在test表空間下再增加一個表空間
SQL> alter tablespace test add datafile 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TEST02.DBF' size 20M autoextend on next 10M maxsize 500M;
表空間已更改。
SQL> --查詢表空間使用率情況信息
SQL> col 表空間名稱 for a10;
SQL> select a.tablespace_name "表空間名稱",
2 a.bytes / 1024 / 1024 "空間總大小/MB",
3 (a.bytes - b.bytes) / 1024 / 1024 "空間已使用/MB",
4 b.bytes / 1024 / 1024 "空間剩餘/MB",
5 round(((a.bytes - b.bytes) / a.bytes) * 100, 2) "空間使用率"
6 from (select tablespace_name, sum(bytes) bytes
7 from dba_data_files
8 group by tablespace_name) a,
9 (select tablespace_name, sum(bytes) bytes, max(bytes) largest
10 from dba_free_space
11 group by tablespace_name) b
12 where a.tablespace_name = b.tablespace_name
13 order by ((a.bytes - b.bytes) / a.bytes) desc
14 /
表空間名稱 空間總大小/MB 空間已使用/MB 空間剩餘/MB 空間使用率
---------- ------------- ------------- ----------- ----------
SYSAUX 280 277.375 2.625 99.06
SYSTEM 490 484.75 5.25 98.93
EXAMPLE 100 77.6875 22.3125 77.69
USERS 5 3.375 1.625 67.5
UNDOTBS1 70 26.3125 43.6875 37.59
TEST 40 .5 39.5 1.25
DUSHUAI 100 .0625 99.9375 .06
已選擇7行。
SQL> /*總結:增加表空間容量的方法主要有以下幾種,1、在已存在的表空間中添加一個新的數據文件datafile;2、對已存在的數據文件進行擴容處理,使用alter database命令;**/
SQL> conn /as sysdba
已連接。
SQL> show user
USER 爲 "SYS"
SQL> set sqlprompt "dushuai>>"
dushuai>>--更改dba_data_files的輸出格式
dushuai>>col file_name for a40;
dushuai>>col tablespace_name for a10
dushuai>>col bytes for a10
dushuai>>select file_name,tablespace_name,bytes/1024/1024 from dba_data_files where tablespace_name='TEST';
FILE_NAME TABLESPACE BYTES/1024/1024
---------------------------------------- ---------- ---------------
D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TE TEST 20
ST.DBF
D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TE TEST 20
ST02.DBF
dushuai>>--我們使用命令行增大指定表空間中數據文件的size大小
dushuai>>alter database datafile 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TEST.DBF' resize 40M;
數據庫已更改。
dushuai>>--檢驗一下更改後數據文件size是否生效
dushuai>>select file_name,tablespace_name,bytes/1024/1024 from dba_data_files where tablespace_name='TEST';
FILE_NAME TABLESPACE BYTES/1024/1024
---------------------------------------- ---------- ---------------
D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TE TEST 40
ST.DBF
D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TE TEST 20
ST02.DBF
dushuai>>--下面我們進行表空間中數據文件移動路徑的操作實驗
dushuai>>--方法1:通過alter tablepace命令實現
dushuai>>--首先讓數據文件所在的表空間離線,我們讓test02這個數據文件移動到上級目錄下
dushuai>>alter tablespace test offline;
表空間已更改。
dushuai>>--使用操作系統命令複製或移動數據文件路徑,因爲我們當前是windows環境,我們就使用圖形化界面移動數據文件,移動完畢僅僅屬於物理層面移動;
dushuai>>--我們還需要使用命令修改控制文件
dushuai>>alter tablespace test rename datafile 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TEST02.DBF' to 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST02.DBF';
表空間已更改。
dushuai>>--我們讓表空間在線online
dushuai>>alter tablespace test online;
表空間已更改。
dushuai>>col file_name for a40;
dushuai>>col tablespace_name for a15
dushuai>>col bytes for a10
dushuai>>select file_name,tablespace_name,bytes/1024/1024 from dba_data_files where tablespace_name='TEST';
FILE_NAME TABLESPACE_NAME BYTES/1024/1024
---------------------------------------- --------------- ---------------
D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TE TEST 40
ST.DBF
D:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST02. TEST 20
DBF
dushuai>>--通過上面的查詢語句我們看見操作已經成功
dushuai>>--下面我們使用方法2:alter database命令行將test.dbf移動到上級目錄
dushuai>>--首先我們需要將數據庫關閉
dushuai>>shutdown immediate;
數據庫已經關閉。
已經卸載數據庫。
ORACLE 例程已經關閉。
dushuai>>--然後將數據庫啓動到mount狀態
dushuai>>startup mount;
ORACLE 例程已經啓動。
Total System Global Area 293601280 bytes
Fixed Size 1290208 bytes
Variable Size 222298144 bytes
Database Buffers 62914560 bytes
Redo Buffers 7098368 bytes
數據庫裝載完畢。
dushuai>>show user
USER 爲 "SYS"
dushuai>>alter database rename file 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TEST.DBF' to 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST.DBF';
數據庫已更改。
dushuai>>col file_name for a40;
dushuai>>col tablespace_name for a15
dushuai>>col bytes for a15
dushuai>>select file_name,tablespace_name,bytes/1024/1024 from dba_data_files where tablespace_name='TEST';
select file_name,tablespace_name,bytes/1024/1024 from dba_data_files where tablespace_name='TEST'
*
第 1 行出現錯誤:
ORA-01219: 數據庫未打開: 僅允許在固定表/視圖中查詢
dushuai>>--上面的錯誤,是因爲我們操作完畢後,沒有將數據庫狀態變更爲open狀態
dushuai>>alter database open;
數據庫已更改。
dushuai>>select file_name,tablespace_name,bytes/1024/1024 from dba_data_files where tablespace_name='TEST';
FILE_NAME TABLESPACE_NAME BYTES/1024/1024
---------------------------------------- --------------- ---------------
D:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST.DB TEST 40
F
D:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST02. TEST 20
DBF
dushuai>>--上面的查詢結果讓我們知道我們的操作已經成功
dushuai>>--總結:上面兩種方法都是可以實現將指定數據文件修改文件路徑的目的,但是推薦第一種方法,因爲不需要全局關閉數據庫,不影響其他表空間的用戶使用,數據庫的修改一定需要注意減小影響範圍;
SQL> conn /as sysdba
已連接。
/*表空間語法彙總說明
--刪除空的表空間,但是不包含物理文件
drop tablespace tablespace_name;
--刪除非空表空間,但是不包含物理文件
drop tablespace tablespace_name including contents;
--刪除空表空間,包含物理文件
drop tablespace tablespace_name including datafiles;
--刪除非空表空間,包含物理文件
drop tablespace tablespace_name including contents and datafiles;
--如果其他表空間中的表有外鍵等約束關聯到了本表空間中的表的字段,就要加上CASCADE CONSTRAINTS
drop tablespace tablespace_name including contents and datafiles CASCADE CONSTRAINTS;
**/
SQL> --使用including contents刪除邏輯塊
SQL> drop tablespace test including contents;
表空間已刪除。
SQL> col file_name for a40
SQL> col tablespace_name for a15
SQL> select * from dba_data_files where tablespace_name='TEST';
未選定行
SQL> --但是此時已刪除表空間中的原數據文件還是存放於物理磁盤上
SQL> --我們可以通過including contents and datafiles 進行徹底刪除
SQL> drop tablespace test including contents and datafiles;
drop tablespace test including contents and datafiles
*
第 1 行出現錯誤:
ORA-00959: 表空間 'TEST' 不存在
SQL> drop tablespace dushuai including contents and datafiles;
表空間已刪除。
SQL> spool off