Oracle表空間sql
表空間是數據庫的邏輯組成部分,從物理上講,數據庫數據存放在數據文件中數據庫
從邏輯上講,數據庫則是存放在表空間中,表空間由一個或多個數據文件組成session
數據庫的邏輯結構oracle
oracle中邏輯結構包括表空間、段、區和塊ide
說明一下數據庫由表空間構成,而表空間又是由段構成,而段又是由區構成,而函數
區又是由oracle塊構成的這樣的一種結構,能夠提升數據的效率工具
表空間用於從邏輯上組織數據庫的數據。數據庫邏輯上是由一個或是多個表空間組成的性能
經過表空間能夠達到如下做用:this
一、控制數據庫佔用的磁盤空間spa
二、dba能夠將不一樣數據類型部署到不一樣的位置,這樣有利於提升I/O性能,同時
利於備份和恢復等管理操做
創建表空間
創建表空間是使用create tablespace命令完成的,須要注意的是,通常狀況下,創建表空間
是特權用戶或是dba來執行的,若是用其餘用戶來建立表空間,則用戶須要具備create tablespace
的系統權限
創建數據表空間
在創建數據庫後,爲便於管理表,最好創建本身的表空間
SQL> create tablespace data01 datafile '/oracle/datafile/data01.dbf' size 10m uniform 128k;
create tablespace data01 datafile '/oracle/datafile/data01.dbf' size 10m uniform 128k
*
ERROR at line 1:
ORA-02180: invalid option for CREATE TABLESPACE
報錯區域在uniform 128k,區大小設置錯誤
SQL> create tablespace data01 datafile '/oracle/datafile/data01.dbf' size 10m;
Tablespace created.
查看錶空間信息
[oracle@aliyun_test oracle]$ ll datafile/data01.dbf
-rw-r----- 1 oracle oinstall 10493952 Sep 27 09:54 datafile/data01.dbf
使用數據表空間(若是不帶表空間,默認會放到system表空間)
建立一張表,並將表空間data01給建立的這張表
SQL> create table mydept(deptno number(2),dname varchar2(14),loc varchar2(13)) tablespace data01;
Table created.
建立好的表空間如何查詢呢?由表的信息dab_tablespaces來進行查詢,先查看錶結構以及字段說明
SQL> desc dba_tablespaces;
Name Null? Type
----------------------------------------- -------- ----------------------------
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
MAX_SIZE 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)
PREDICATE_EVALUATION VARCHAR2(7)
ENCRYPTED VARCHAR2(3)
COMPRESS_FOR VARCHAR2(12)
查看錶空data01:
SQL> select * from dba_tablespaces where tablespace_name='DATA01';
TABLESPACE_NAME BLOCK_SIZE INITIAL_EXTENT NEXT_EXTENT MIN_EXTENTS MAX_EXTENTS MAX_SIZE PCT_INCREASE MIN_EXTLEN STATUS CONTENTS LOGGING FORCE_LOGGING EXTENT_MANAGEMENT ALLOCATION_TYPE PLUGGED_IN SEGMENT_SPACE_MANAGEMENT DEF_TAB_COMPRESSION RETENTION BIGFILE PREDICATE_EVALUATION ENCRYPTED COMPRESS_FOR
------------------------------ ---------- -------------- ----------- ----------- ----------- ---------- ------------ ---------- --------- --------- --------- ------------- ----------------- --------------- ---------- ------------------------ ------------------- ----------- ------- -------------------- --------- ------------
DATA01 8192 65536 1 2147483645 2147483645 65536 ONLINE PERMANENT LOGGING NO LOCAL SYSTEM NO AUTO DISABLED NOT APPLY NO HOST NO
能夠詳細清楚的查詢該表空間的詳細信息
修改表空間的狀態
當創建表空間時,表空間處於online狀態,此時該表空間時能夠訪問的,而且該表空間時能夠讀寫的
既能夠查詢該表空間的數據,並且還能夠在表空間執行各類語句。可是在進行系統維護或是數據
維護時,可能須要改變表空間的狀態。通常狀況下由特權用戶或是dba來操做
一、使表空間脫機
alter tablespace data01 offline; data01就是表空間名稱
二、使表空間聯機
alter tablespace data01 online;
三、將表空間設爲只讀狀態
當創建表空間時,表空間能夠讀寫,若是不但願在該表空間上執行update,delete,insert
等操做,那麼能夠將表空間修改成只讀表空間
alter tablespace data01 read only;
事例以下:
上述已經使用了表空間在表mydept上面,因而向裏面插入數據
SQL> insert into mydept values (1,'xiaohuang','wuhan');
1 row created.
而後將表空間設置爲只讀狀態
SQL> alter tablespace data01 read only;
Tablespace altered.
而後再向表mydept插入數據,看下是否成功
SQL> insert into mydept values (2,'xiaobai','shanghai');
insert into mydept values (2,'xiaobai','shanghai')
*
ERROR at line 1:
ORA-00372: file 5 cannot be modified at this time
ORA-01110: data file 5: '/oracle/datafile/data01.dbf'
提示出錯,表示不能修改表空間的數據文件
如何恢復呢,只需再將表空間設置爲可讀可寫就行,見以下操做
SQL> alter tablespace data01 read write;
Tablespace altered.
而後再向裏面插入數據便可
SQL> insert into mydept values (2,'xiaobai','shanghai');
1 row created.
插入數據成功
刪除表空間
通常狀況下,由特權用戶或是dba操做,若是是其餘用戶操做,須要具備drop tablespace系統權限
drop tablespace '表空間名' including contents and datafiles;
說明:including contents表示刪除表空間的同時刪除該表空間的全部數據庫對象,而datafiles
表示將數據庫文件也刪除
SQL> drop tablespace data01 including contents and datafiles;
Tablespace dropped.
表示刪除表空間操做完成,下面查看是否已經刪除
SQL> select * from dba_tablespaces where tablespace_name='DATA01';
no rows selected 由dba_tablespaces表查詢並無查詢到,即已經刪除
[oracle@aliyun_test ~]$ ll /oracle/datafile/
total 0 能夠看出數據文件也已經刪除掉了
一、知道表空間名,顯示該表空間包括的全部表
再次建立表空間data01來使用
SQL> create tablespace data01 datafile '/oracle/datafile/data01.dbf' size 10m;
Tablespace created.
建立一張表使用該表空間
SQL> create table mydept(deptno number(2),dname varchar2(14),loc varchar2(13)) tablespace data01;
Table created.
而後經過表空間名data01如何來查詢到什麼表使用了它呢?
使用到的表爲all_tables
SQL> desc all_tables;
Name Null? Type
----------------------------------------- -------- ----------------------------
OWNER NOT NULL VARCHAR2(30)
TABLE_NAME NOT NULL VARCHAR2(30)
TABLESPACE_NAME VARCHAR2(30)
能夠查詢到有一個tablespace_name的字段,因而以下操做
SQL> select tablespace_name,table_name from all_tables where tablespace_name='DATA01';
TABLESPACE_NAME TABLE_NAME
------------------------------ ------------------------------
DATA01 MYDEPT
查詢到使用的表以及對應的表空間
如上,知道了表名稱也能夠知道表空間
SQL> conn scott/redhat@test;
Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.1.0
Connected as scott@test
SQL> select tablespace_name,table_name from user_tables where table_name='MYDEPT';
TABLESPACE_NAME TABLE_NAME
------------------------------ ------------------------------
DATA01 MYDEPT
下面使用system用戶查詢的
SQL> select tablespace_name,table_name from all_tables where table_name='MYDEPT';
TABLESPACE_NAME TABLE_NAME
------------------------------ ------------------------------
DATA01 MYDEPT
經過2,能夠了解到scott.emp表是在system這個表空間上,若是將表空間system改成只讀
可是不會成功,由於system是系統表空間,若是是普通表空間,就能夠修改成只讀
擴展表空間
表空間是由數據文件組成的,表空間的大小實際就是數據文件相加後的大小,假定表emp存放在
data01表空間上,初始大小爲2m,當數據滿2m後,若是再向表emp插入數據,這樣就會顯示空間不足的錯誤
因此就須要擴展表空間?
一、增長數據文件
alter tablespace data01 add datafile '/oracle/datafile/data02.dbf' size 20m;
SQL> alter tablespace data01 add datafile '/oracle/datafile/data02.dbf' size 20m;
Tablespace altered.
[oracle@aliyun_test ~]$ ll /oracle/datafile/
total 30736
-rw-r----- 1 oracle oinstall 10493952 Sep 27 14:05 data01.dbf
-rw-r----- 1 oracle oinstall 20979712 Sep 27 14:06 data02.dbf
二、增長數據文件的大小
alter tablespace data01 '/oracle/datafile/data01.dbf' resize 20m;
三、設置文件的自動增加
alter tablespace data01 '/oracle/datafile/data01.dbf' autoextend on next 10m maxsize 500m;
如何遷移表空間的數據文件?
一、肯定數據文件所在的表空間
select tablespace_name from dba_data_files where file_name='/oracle/datafile/data01.dbf';
TABLESPACE_NAME
------------------------------
DATA01
知道了表空間後,而後使表空間狀態脫機
二、使表空間脫機
確保數據文件的一致性,將表空間轉變爲offline狀態
alter tablespace data01 offline;
三、使用命令移動數據文件到指定的目標位置
sql>host move /oracle/datafile/data01.dbf /test/oracle/datafile/data01.dbf;
四、執行alter tablespace命令,數據文件重命名
在物理上移動了數據後,還必須執行alter tablespace命令對數據庫文件進行邏輯修改
alter tablespace data01 rename datafile '/oracle/datafile/data01.dbf' to '/test/oracle/datafile/data01.dbf';
五、使表空間聯機狀態
在移動了數據文件後,爲了使用戶能夠訪問該表空間,必須將其轉變爲online狀態
alter tablespace data01 online;
至此遷移表空間的數據文件完成
顯示錶空間信息
查詢數據字典視圖dba_tablespaces,顯示錶空間的信息
select tablespace_name from dba_tablespaces;
顯示錶空間所包含的數據文件
查詢數據字典視圖dba_data_files,可顯示錶空間所包含的數據文件
select file_name,bytes from dba_data_files where tablespace_name='表空間名';
其餘表空間
除了經常使用的數據表空間外,還有其餘類型的表空間
一、索引表空間
二、undo表空間
三、臨時表空間
四、非標準塊表空間
數據的完整性
數據的完整性用於確保數據庫聽從必定的商業和邏輯規則,在oracle中,數據完整性可使用約束
觸發器、應用程序(過程、函數)三種方法來實現,在這三種方法中,由於約束易於維護而且具備
最好的性能,因此做爲維護數據完整性的首選
約束
約束用於確保數據庫數據知足特定的商業規則,在oracle中,約束包括:not null、unique、primary key、foreign key和check五種。
not null:非空,若是在列上定義了not null,那麼插入數據時,必須爲列提供數據
unique:惟一鍵,當定義了惟一的約束,該列的值是不能重複的,可是能夠爲null
primary key:主鍵,用於惟一的標識錶行的數據,當定義主鍵約束後,該列不但不能重複並且不能爲null一張表最多隻能有一個主鍵,可是能夠有多個惟一鍵
foreign key:外鍵,用於定義主表和從表之間的關係,外鍵約束要定義在從表上,主表則必須具備主鍵約束或是unique約束,當定義外鍵約束後,要求外鍵列數據必須在主表的主鍵列存在或是爲null
check:用於強制行數據必須知足的條件,假定在sal列上定義了check約束,並要求sal列值在1000~2000之間,若是不在1000~2000之間就會提示錯誤
SQL> create table goods(goodid char(8) primary key,--主鍵
2 goodname varchar2(30),
3 unitprice number(10,2) check (unitprice > 0),--單價必須大於0
4 category varchar2(8),
5 provider varchar2(30))
6 ;
SQL> create table customer(customerid char(8) primary key, --主鍵
2 name varchar2(20) not null,--不爲空
3 address varchar2(20),
4 email varchar2(20) unique,--不容許重複,惟一鍵
5 sex char(4) default '男' check(sex in ('男','女')),---默認爲男,不是男就是女
6 cardid char(18))
7 ;
SQL> create table purchase(customerid char(8) references customer(customerid),---因爲這是外鍵,必須關聯到主表的字段
2 goodid char(8) references goods(goodid),--同上,數據類型必須和主表一致
3 nums number(5) check(nums between 1 and 30)) --數量必須在1~30之間
4 ;
若是在建表時忘記創建必須的約束,則能夠在建表後使用alter table命令爲
表增長相應的約束。可是注意:增長not null約束是修改null約束,即便用關鍵字
modify選項,而增長其餘的約束則使用add關鍵字選項
alter table goods modify gooname not null;
alter table customer add constraint cardunique(約束名) unique(cardid(char);
alter table customer add constraint addresscheck check(address in ('東城','西城'));
刪除約束
當不須要某個約束時,能夠進行刪除
alter table 表名 drop constraint 約束名稱;
當刪除主鍵約束的時候,可能會報錯
alter table 表名 drop primary key;
這是由於若是在兩張表存在主從關係,那麼刪除主表的主鍵約束時,必須帶上cascade選項,例
alter table 表名 drop primary key cascade; 至關於破壞了主外鍵關係
顯示約束信息
一、顯示約束信息
經過查詢數據字典視圖user_constraint,能夠顯示當前用戶的全部的約束信息
select constraint_name,constraint_type,status,validated from user_constraints where table_name='表名';
二、顯示約束列
經過查詢數據字典視圖user_cons_columns,能夠顯示約束所對用的表列信息
select column_name,position from user_cons_columns where constraint_name='約束名';
三、固然也有容易的方法,使用pl/sql工具查看
定義約束有以下方式:
列級定義
列級定義是在定義列的同時定義約束
如在department表定義主鍵約束
create table department(dept_id number(2) constraint pk_department primary key,name varchar(12),loc varchar2(12));
關鍵字:constraint 約束名稱:pk_department 約束類型:primary key
表級定義
表級定義是指在定義了全部列後,在定義約束,not null約束只能在列級上定義
create emp2(emp_id number(4),name varchar2(15),dept_id number(2),constraint pk_emp primary key(emp_id),constraint
fk_department foreign key(dept_id) references department(dept_id));
索引是用於加速數據存取的數據對象,合理的使用索引能夠大大下降I/O次數,從而提升數據訪問性能
建立索引
單列索引是基於單個列所創建的索引
create index 索引名 on 表名(列名)
以name字段查詢:select * from customer where name='sp';若是常常這樣查就能夠將name字段建立索引,提升查詢速度
create index name_index on customer(name);---給name字段創建index
複合索引
複合索引是基於兩列或是多列的索引,在同一張表上能夠有多個索引,可是要求列的組合必須不一樣
create index emp_index1 on emp(ename,job);select * from customer where ename='sp' and job='MANAGER';建立聯合索引
create index emp_index1 on emp(job,ename);
使用原則
一、在大表上創建索引纔有意義
二、在where字句或是鏈接條件上常常引用 的列上建立索引
三、索引的層次不要超過4層(多級索引不要超過4層)
索引的缺點
一、創建索引,系統要佔用大約爲表的1.2倍的硬盤和內存空間來保存索引
二、更新數據的時候,系統必需要有額外的實際來同時對索引進行更新,以維持數據和索引的一致性
以下字段創建索引是不恰當的
一、不多或從不引用的字段
二、邏輯型的字段,如男或女等,提升查詢速率是以消耗必定的系統資源爲代價的,索引不能盲目的創建
顯示錶的全部索引
在同一張表上能夠有多個索引,經過查詢數據字典視圖dba_indexes和user_indexes,能夠顯示索引信息其中dba_indexes
用於顯示數據庫全部的索引信息,而user_indexs用於顯示當前用戶的索引信息
select index_name,index_type fom user_indexes where table_name='表名';
顯示索引列
經過查詢數據字典視圖user_ind_columns,能夠顯示索引對應的列的信息
select table_name,column_name fom user_ind_columns where index_name='索引名';
管理權限和角色
系統權限介紹
系統權限是指執行特定類型sql命令的權利,它用於控制用戶能夠執行的一個或是一組數據庫操做。好比當用戶
具備create table權限時,能夠在其方案中建表,當用戶具備100中系統權限
經常使用的有:
create session鏈接數據庫 create table建表
create view建視圖 create public sysnonym:鍵贊成詞
create procedure創建過程、函數、包 create trigger建觸發器
create cluster建簇
顯示系統權限
oracle提供了多條系統權限,並且oracle的版本越高,提供的系統權限就越多
select * from system_privilege_map order by name;
授予系統權限
通常狀況下,授予系統權限是由dba完成的,若是其餘用戶來授予系統權限,則要求該用戶必須具備grant any privilege
的系統權限,能夠帶有with admin option選項,被授予的用戶或是角色還能夠將該系統權限授予其餘用戶
一、建立兩個用戶ken,tom
create user ken identified by redhat;
二、給用戶key受權
grant create session,Crete table to ken with admin option;
grant create view to ken;
三、給tom受權
grant create session,create table to tom;這是登陸的系統權限
revoke create session from tom;
授予數據對象權限
角色不能帶有with grant option(授予角色)
只修改某張表的某一列(字段)
grant update on emp(sal) to monkey;只能在表中的字段sal上修改
grant select on emp(ename,sal) to monkey;能在字段ename,sal上查詢
grant index on emp to monkey;容許monkey能在表emp上建立索引