oracle表空間簡介
Oracle表空間是數據管理的基本方法,所有用戶的對象要存放在表空間中,也就是用戶有空間的使用權,才能創建用戶對象。否則是不充許創建對象,因爲就是想創建對象,如表,索引等,也沒有地方存放,Oracle會提示:沒有存儲配額。因此,在創建對象之前,首先要分配存儲空間。分配存儲,就要創建表空間:
Oracle可以創建的表空間有三種類型:
(1)temporary: 臨時表空間,用於臨時數據的存放;創建臨時表空間的語法如下:create temporary tablespace test_temp ......
(2)undo: 還原表空間。用於存入重做日誌文件。創建還原表空間的語法如下:create undo tablespace test_undo ......
(3)用戶(數據)表空間: 最重要,也是用於存放用戶數據表空間可以直接寫成: create tablespace test_data .......
temporaty 和 undo 表空間是Oracle 管理的特殊的表空間。只用於存放系統相關數據。
查看錶空間
- select tablespace_name,file_id,bytes,file_name from dba_data_files
<span style="font-size:18px;">select tablespace_name,file_id,bytes,file_name from dba_data_files</span>
創建(數據)表空間
(創建表空間stu_data,datafile指定數據表空間的存儲文件的位置,用來存放數據的文件)
- --第一種
- create tablespace stu_data
- logging
- datafile 'D:\oracle\product\10.2.0\oradata\orcl\stu_data.dbf'
- size 32m
- autoextend on
- next 32m
- maxsize 2048m
- extent management local;
<span style="font-size:18px;">--第一種
create tablespace stu_data
logging
datafile 'D:\oracle\product\10.2.0\oradata\orcl\stu_data.dbf'
size 32m
autoextend on
next 32m
maxsize 2048m
extent management local;
</span>
創建表空間參數講解
1、logging
有 nologging和 logging兩個選項,nologging:創建表空間時,不創建重做日誌。logging和nologging正好相反, 就是在創建表空間時生成重做日誌。用nologging時,好處在於創建時不用生成日誌,這樣表空間的創建較快,但是沒能日誌,數據丟失後,不能恢復,但是一般我們在創建表空間時,是沒有數據的,按通常的做法,是建完表空間,並導入數據後,是要對數據做備份的,所以通常不需要表空間的創建日誌,因此,在創建表空間時,選擇nologging,以加快表空間的創建速度。
2、datafile 用於指定數據文件的具體位置和大小。
如: datafile 'D:\Oracle\ORADATA\ORA92\LUNTAN.ora' SIZE 5M 說明文件的存放位置是'D:\Oracle\ORADATA\ORA92\LUNTAN.ora' ,文件的大小爲5M。如果有多個文件,可以用逗號隔開:
datafile 'D:\ORACLE\ORADATA\ORA92\LUNTAN.ora' SIZE 5M, 'D:\ORACLE\ORADATA\ORA92\dd.ora' SIZE 5M
但是每個文件都需要指明大小。單位以指定的單位爲準,如 5M 或 500K。對具體的文件,可以根據不同的需要,存放大不同的介質上,如磁盤陣列,以減少IO竟爭。指定文件名時,必須爲絕對地址,不能使用相對地址。
3、extent management local:存儲區管理方法
在Oracle 8i以前,可以有兩種選擇,一種是在字典中管理(dictionary),另一種是本地管理(local),從9I開始,只能是本地管理方式。因爲local管理方式有很多優點。在字典中管理(dictionary): 將數據文件中的每一個存儲單元做爲一條記錄,所以在做DM操作時,就會產生大量的對這個管理表的Delete和Update操作。做大量數據管理時,將會產生很多的DM操作,嚴得的影響性能,同時,長時間對錶數據的操作,會產生很多的磁盤碎片,這就是爲什麼要做磁盤整理的原因。本地管理(local): 用二進制的方式管理磁盤,有很高的效率,同進能最大限度的使用磁盤。
同時能夠自動跟蹤記錄臨近空閒空間的情況,避免進行空閒區的合併操作。
4、segment space management:磁盤擴展管理方法:
◆segment space management: 使用該選項時區大小由系統自動確定。由於 Oracle 可確定各區的最佳大小,所以區大小是可變的。
◆uniform segment space management:指定區大小,也可使用默認值 (1 MB)。
5、段空間的管理方式:
◆auto: 只能使用在本地管理的表空間中。 使用LOCAL管理Oracle表空間時,數據塊中的空閒空間增加或減少後,其新狀態都會在位圖中反映出來。位圖使 Oracle 管理空閒空間的行爲更加自動化,併爲管理空閒空間提供了更好的性,但對含有LOB字段的表不能自動管理。
◆nanual: 目前已不用,主要是爲向後兼容。
- --第二種
- create tablespace stu_data
- datafile 'D:\oracle\product\10.2.0\oradata\orcl\stu_data.dbf'
- size 800M
- autoextend on
- next 50M
- maxsize unlimited
- --maxsize unlimited 是大小不受限制
<span style="font-size:18px;">--第二種
create tablespace stu_data
datafile 'D:\oracle\product\10.2.0\oradata\orcl\stu_data.dbf'
size 800M
autoextend on
next 50M
maxsize unlimited
--maxsize unlimited 是大小不受限制 </span>
- --第三種
- create tablespace stu_data
- datafile 'D:\oracle\product\10.2.0\oradata\orcl\stu_data.dbf'
- size 800M
- autoextend on
- next 50M
- maxsize 1000M
- extent management local uniform;
- --unform表示區的大小相同,默認爲1M
<span style="font-size:18px;">--第三種
create tablespace stu_data
datafile 'D:\oracle\product\10.2.0\oradata\orcl\stu_data.dbf'
size 800M
autoextend on
next 50M
maxsize 1000M
extent management local uniform;
--unform表示區的大小相同,默認爲1M </span>
- --第四種
- create tablespace stu_data
- datafile 'D:\oracle\product\10.2.0\oradata\orcl\stu_data.dbf'
- size 800M
- autoextend on
- next 50M
- maxsize 1000M
- extent management local uniform size 500K;
- --unform size 500K表示區的大小相同,爲500K
<span style="font-size:18px;">--第四種
create tablespace stu_data
datafile 'D:\oracle\product\10.2.0\oradata\orcl\stu_data.dbf'
size 800M
autoextend on
next 50M
maxsize 1000M
extent management local uniform size 500K;
--unform size 500K表示區的大小相同,爲500K </span>
- --第五種
- create tablespace stu_data
- datafile 'D:\oracle\product\10.2.0\oradata\orcl\stu_data.dbf'
- size 800M
- autoextend on
- next 50M
- maxsize 1000M
- extent management local autoallocate;
- --autoallocate表示區的大小由隨表的大小自動動態改變,大表使用大區小表使用小區
<span style="font-size:18px;">--第五種
create tablespace stu_data
datafile 'D:\oracle\product\10.2.0\oradata\orcl\stu_data.dbf'
size 800M
autoextend on
next 50M
maxsize 1000M
extent management local autoallocate;
--autoallocate表示區的大小由隨表的大小自動動態改變,大表使用大區小表使用小區 </span>
- --第六種
- create tablespace stu_data
- datafile 'D:\oracle\product\10.2.0\oradata\orcl\stu_data.dbf'
- size 800M
- autoextend on
- next 50M
- maxsize 1000M
- temporary;
- --temporary創建字典管理臨時表空間
<span style="font-size:18px;">--第六種
create tablespace stu_data
datafile 'D:\oracle\product\10.2.0\oradata\orcl\stu_data.dbf'
size 800M
autoextend on
next 50M
maxsize 1000M
temporary;
--temporary創建字典管理臨時表空間 </span>
爲表空間增加數據文件
- alter tablespace stu_data add
- datafile 'D:\oracle\product\10.2.0\oradata\orcl\stu_data.dbf'
- size 800M
- autoextend on
- next 50M
- maxsize 1000M;
<span style="font-size:18px;">alter tablespace stu_data add
datafile 'D:\oracle\product\10.2.0\oradata\orcl\stu_data.dbf'
size 800M
autoextend on
next 50M
maxsize 1000M;</span>
創建臨時表空間
(創建臨時表空間stu_temp,tempfile指定臨時表空間的存儲文件的位置,是臨時文件)
- --創建方式和創建數據表空間相同,只是把datafile改爲tempfile
- create temporary tablespace stu_temp
- tempfile 'D:\oracle\product\10.2.0\oradata\orcl\stu_temp01.dbf'
- size 32m
- autoextend on
- next 32m maxsize 2048m
- extent management local;
<span style="font-size:18px;">--創建方式和創建數據表空間相同,只是把datafile改爲tempfile
create temporary tablespace stu_temp
tempfile 'D:\oracle\product\10.2.0\oradata\orcl\stu_temp01.dbf'
size 32m
autoextend on
next 32m maxsize 2048m
extent management local;</span>
創建用戶 並指定表空間
(創建用戶stu_test,密碼爲abcdef,指定其默認表空間爲stu_data,臨時表空間爲stu_temp)
- create user stu_test identified by abcdef
- default tablespace stu_data
- temporary tablespace stu_temp;
<span style="font-size:18px;">create user stu_test identified by abcdef
default tablespace stu_data
temporary tablespace stu_temp; </span>
給用戶授權
- grant connect,resource to stu_test;
<span style="font-size:18px;">grant connect,resource to stu_test;</span>
用戶常用權限:connect resource dba exp_full_database imp_full_database
改變用戶的默認表空間
- alter user stu_test default tablespace stu_data;
<span style="font-size:18px;">alter user stu_test default tablespace stu_data; </span>
刪除用戶以及用戶所有的對象
- drop user stu_test cascade;
- --cascade參數是級聯刪除該用戶所有對象,經常遇到如用戶有對象而未加此參數則用戶刪不了的問題,所以習慣性的加此參數
<span style="font-size:18px;">drop user stu_test cascade;
--cascade參數是級聯刪除該用戶所有對象,經常遇到如用戶有對象而未加此參數則用戶刪不了的問題,所以習慣性的加此參數</span>
刪除表空間
前提:刪除表空間之前要確認該表空間沒有被其他用戶使用之後再做刪除
- drop tablespace stu_data including contents and datafiles cascade onstraints;
- --including contents 刪除表空間中的內容,如果刪除表空間之前表空間中有內容,而未加此參數,表空間刪不掉,所以習慣性的加此參數
- --including datafiles 刪除表空間中的數據文件
- --cascade constraints 同時刪除tablespace中表的外鍵參照
<span style="font-size:18px;">drop tablespace stu_data including contents and datafiles cascade onstraints;
--including contents 刪除表空間中的內容,如果刪除表空間之前表空間中有內容,而未加此參數,表空間刪不掉,所以習慣性的加此參數
--including datafiles 刪除表空間中的數據文件
--cascade constraints 同時刪除tablespace中表的外鍵參照
</span>
如果刪除表空間之前刪除了表空間文件,解決辦法:
如果在清除表空間之前,先刪除了表空間對應的數據文件,會造成數據庫無法正常啓動和關閉。
可使用如下方法恢復(此方法已經在oracle9i中驗證通過):
下面的過程中,filename是已經被刪除的數據文件,如果有多個,則需要多次執行;tablespace_name是相應的表空間的名稱。
- $ sqlplus /nolog
- SQL> conn / as sysdba;
- --如果數據庫已經啓動,則需要先執行下面這行:
- SQL> shutdown abort
- SQL> startup mount
- SQL> alter database datafile 'filename' offline drop;
- SQL> alter database open;
- SQL> drop tablespace tablespace_name including contents;
<span style="font-size:18px;">$ sqlplus /nolog
SQL> conn / as sysdba;
--如果數據庫已經啓動,則需要先執行下面這行:
SQL> shutdown abort
SQL> startup mount
SQL> alter database datafile 'filename' offline drop;
SQL> alter database open;
SQL> drop tablespace tablespace_name including contents;</span>
oracle數據庫的導入導出命令:
Oracle數據導入導出imp/exp就相當於oracle數據還原與備份。exp命令可以把數據從遠程數據庫服務器導出到本地的dmp文件, imp命令可以把dmp文件從本地導入到遠處的數據庫服務器中。 利用這個功能可以構建兩個相同的數據庫,一個用來測試,一個用來正式使用
導出數據庫文件(開始--運行--cmd)
1、用戶名爲stu_test,密碼爲abcdef,數據庫爲orcl,file=.....爲導出後存放位置
- exp stu_test/abcdef@orcl file=d:/a.dmp
<span style="font-size:18px;">exp stu_test/abcdef@orcl file=d:/a.dmp</span>
2、將數據庫中system用戶與sys用戶的表導出
- exp system/system@orcl file=d:/a.dmp owner=(system,sys)
<span style="font-size:18px;">exp system/system@orcl file=d:/a.dmp owner=(system,sys)</span>
3、將數據庫中的表t1、t2導出
- exp zyna/zyna@orcl file=d:/a.dmp tables=(t1,t2)
<span style="font-size:18px;">exp zyna/zyna@orcl file=d:/a.dmp tables=(t1,t2)</span>
4、將數據庫中的表table1中的字段filed1以"00"打頭的數據導出
- exp system/system@orcl file=d:/a.dmp tables=(table1) query=" where filed1 like '00%'"
<span style="font-size:18px;">exp system/system@orcl file=d:/a.dmp tables=(table1) query=" where filed1 like '00%'"</span>
導入數據庫文件(開始--運行--cmd )
1、用戶名是stu_test,密碼是abcdef,數據庫是orclfile=....是要導入的數據庫文件的存放位置
- imp stu_test/abcdef@orcl file=d:/a.dmp full=y
<span style="font-size:18px;">imp stu_test/abcdef@orcl file=d:/a.dmp full=y</span>
- imp stu_test/abcdef@orcl file=d:/a.dmp full=y ignore=y
- --上面可能有點問題,因爲有的表已經存在,然後它就報錯,對該表就不進行導入。
- --在後面加上 ignore=y 就可以了。
<span style="font-size:18px;">imp stu_test/abcdef@orcl file=d:/a.dmp full=y ignore=y
--上面可能有點問題,因爲有的表已經存在,然後它就報錯,對該表就不進行導入。
--在後面加上 ignore=y 就可以了。
</span>
2、將d:/a.dmp中的表table1 導入
- imp system/system@orcl file=d:/a.dmp tables=(table1)
<span style="font-size:18px;">imp system/system@orcl file=d:/a.dmp tables=(table1)</span>
注意:用戶要有導入導出權限