名詞解釋與約定表空間(Tablespace) 為數(shù)據(jù)庫提供使用空間的邏輯結(jié)構(gòu) 其對應(yīng)物理結(jié)構(gòu)是數(shù)據(jù)文件 一個表空間可以包含多個數(shù)據(jù)文件
創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價比博望網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式博望網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋博望地區(qū)。費用合理售后完善,十年實體公司更值得信賴。
本地管理表空間(Locally Managed Tablespace簡稱LMT) i以后出現(xiàn)的一種新的表空間的管理模式 通過本地位圖來管理表空間的空間使用
字典管理表空間(Dictionary Managed Tablespace簡稱DMT) i以前包括以后都還可以使用的一種表空間管理模式 通過數(shù)據(jù)字典管理表空間的空間使用
段(Segment) 數(shù)據(jù)庫一種邏輯結(jié)構(gòu) 如表段 索引段 回滾段等 段存在于表空間中 并對應(yīng)一定的存儲空間
區(qū)間 可以簡稱區(qū)(Extent) 段的存儲可以分成一個或多個區(qū)間 每個區(qū)間占用一定數(shù)量的數(shù)據(jù)塊(block) 在本地管理的表空間中 表空間的Extent就對應(yīng)段的Extent 塊(Block) 數(shù)據(jù)庫最小的存儲單位 在本文中Block的大小約定為 字節(jié)
位(Bit) 本地管理表空間的空間管理單位 一個位可能等于一個區(qū)間 也可能多個位組成一個區(qū)間
本地管理表空間 語法在Oracle I的版本中 Oracle推出了一種全新的表空間管理方式 本地化管理的表空間 所謂本地化管理 就是指Oracle不再利用數(shù)據(jù)字典表來記錄Oracle表空間里面的區(qū)的使用狀況 而是在每個表空間的數(shù)據(jù)文件的頭部加入了一個位圖區(qū) 在其中記錄每個區(qū)的使用狀況 每當(dāng)一個區(qū)被使用 或者被釋放以供重新使用時 Oracle都會更新數(shù)據(jù)文件頭部的這個記錄 反映這個變化
本地化管理的表空間的創(chuàng)建過程 語法 CREATE TABLESPACE 表空間名字 DATAFILE 數(shù)據(jù)文件詳細信息 [EXTENT MANAGEMENT { LOCAL {AUTOALLOCATE | UNIFORM [SIZE INTETER [K|M] ] } } ]關(guān)鍵字EXTENT MANAGEMENT LOCAL 指定這是一個本地化管理的表空間 對于系統(tǒng)表空間 只能在創(chuàng)建數(shù)據(jù)庫的時候指定EXTENT MANGEMENT LOCAL 因為它是數(shù)據(jù)庫創(chuàng)建時建立的第一個表空間
在 i中 字典管理還是默認(rèn)的管理方式 當(dāng)選擇了LOCAL關(guān)鍵字 即表明這是一個本地管理的表空間 當(dāng)然還可以繼續(xù)選擇更細的管理方式 是AUTOALLOCATE 還是 UNIFORM 若為AUTOALLOCATE 則表明讓Oracle來決定區(qū)塊的使用辦法 若選擇了UNIFORM 則還可以詳細指定每個區(qū)塊的大小 若不加指定 則為每個區(qū)使用 M大小
本地管理優(yōu)點 本地化管理的表空間避免了遞歸的空間管理操作 而這種情況在數(shù)據(jù)字典管理的表空間是經(jīng)常出現(xiàn)的 當(dāng)表空間里的區(qū)的使用狀況發(fā)生改變時 數(shù)據(jù)字典的表的信息發(fā)生改變 從而同時也使用了在系統(tǒng)表空間里的回滾段
本地化管理的表空間避免了在數(shù)據(jù)字典相應(yīng)表里面寫入空閑空間 已使用空間的信息 從而減少了數(shù)據(jù)字典表的競爭 提高了空間管理的并發(fā)性 區(qū)的本地化管理自動跟蹤表空間里的空閑塊 減少了手工合并自由空間的需要
表空間里的區(qū)的大小可以選擇由Oracle系統(tǒng)來決定 或者由數(shù)據(jù)庫管理員指定一個統(tǒng)一的大小 避免了字典表空間一直頭疼的碎片問題
從由數(shù)據(jù)字典來管理空閑塊改為由數(shù)據(jù)文件的頭部記錄來管理空閑塊 這樣避免產(chǎn)生回滾信息 不再使用系統(tǒng)表空間里的回滾段 因為由數(shù)據(jù)字典來管理的話 它會把相關(guān)信息記在數(shù)據(jù)字典的表里 從而產(chǎn)生回滾信息
由于這種表空間的以上特性 所以它支持在一個表空間里邊進行更多的并發(fā)操作 并減少了對數(shù)據(jù)字典的依賴
本地管理表空間管理機制表空間是一種為段(表 索引等)提供空間的邏輯結(jié)構(gòu) 所以 當(dāng)在表空間中增加 刪除段的時候 數(shù)據(jù)庫就必須跟蹤這些空間的使用
如下例所示 假定一個新創(chuàng)建的表空間包含了五個表表一……表二……表三……表四……表五……未用空間當(dāng)我們刪除表四的時候 就有如下結(jié)果表一……表二……表三……空閑空間段……表五……未用空間很明顯 ORACLE需要有一個機制來管理表空間中各數(shù)據(jù)文件的這些分配的或未分配的空間 為了跟蹤這些可以使用的空間(包括未分配使用的和可以重復(fù)使用的) 對于每一個空間 我們必須知道 這個可用空間位于什么數(shù)據(jù)文件 這個空間的尺寸是多大 如果它在用了 是哪一個段占用的這個空間直到 i之前 所有的表空間都是采用字典管理模式 為了確保能保存以上的信息 ORACLE用了兩個數(shù)據(jù)字典表 UET$(已使用的區(qū)間)或FET$(空閑空間) SQL desc UET$ Name????? Type?? Nullable Default Comments
SEGFILE#? NUMBER SEGBLOCK# NUMBER EXT#????? NUMBER TS#?????? NUMBER FILE#???? NUMBER BLOCK#??? NUMBER LENGTH??? NUMBER
SQL desc FET$ Name?? Type?? Nullable Default Comments
TS#??? NUMBER FILE#? NUMBER BLOCK# NUMBER LENGTH NUMBER查詢該表可以看到 每個使用空間或空閑空間(不一定是一個extent 可以是多個extent)都在該表中對應(yīng)了一行 它的工作方式是當(dāng)一個段被刪除的時候 ORACLE就移動UET$中相應(yīng)的行到FET$ 這個過程的發(fā)生是連續(xù)的 而且可能發(fā)生等待 當(dāng)并發(fā)性很高的時候 數(shù)據(jù)字典的爭用就來了 另外有一個問題就是 當(dāng)表的空間很不連續(xù)或表空間有大量的碎片引起這兩個表的增大 那么也就會引起數(shù)據(jù)庫性能上的下降
本地管理表空間正是為了解決這一問題來的 在表空間的空間管理上 ORACLE將存儲信息保存在表空間的頭部的位圖中 而不是保存在數(shù)據(jù)字典中 通過這樣的方式 在分配回收空間的時候 表空間就可以獨立的完成操作也不用與其它對象關(guān)系
下面就讓我們進入到本地管理表空間的內(nèi)部 看看ORACLE是怎么實現(xiàn)這一工作的
用Uniform方式的本地管理表空間 當(dāng)uniform size值太小時SQL create tablespace demo datafile /oradata/ltest/demo dbf size m extent management local uniform size k ORA Uniform size for auto segment space managed tablespace should have at least blocks注意 我實驗環(huán)境block為 k 所以uniform size至少為 k 當(dāng)storage參數(shù)中的initial為空時SQL create tablespace demo datafile /oradata/ltest/demo dbf size m extent management local uniform size k Tablespace created SQL select a initial_extent / INIT_EXTENT(K) ?????????? a next_extent / NEXT_EXTENT(K) ???? from user_tablespaces a ??? where a tablespace_name = DEMO INIT_EXTENT(K) NEXT_EXTENT(K)
SQL create table demotab (x number) tablespace demo Table created SQL select a table_name ?????????? a initial_extent / INIT_EXTENT(K) ?????????? a next_extent / NEXT_EXTENT(K) ???? from user_tables a ??? where a table_name = DEMOTAB TABLE_NAME???????????????????? INIT_EXTENT(K) NEXT_EXTENT(K)
DEMOTAB ??????????????????????????????????? ?????????????? 注意 建表時沒有存儲參數(shù)initial時 初始化區(qū)與下一個區(qū)的大小都是 k 與uniform size的大小一樣的
SQL select a bytes / INIT_EXTENT(K) from user_extents a where a segment_name = DEMOTAB and a extent_id = INIT_EXTENT(K)
SQL select count(*) from user_extents where segment_name = DEMOTAB COUNT(*)
注意 在該段中 產(chǎn)生一個區(qū)
當(dāng)initial uniform size時SQL create table demotab _ (x number) tablespace demo storage (initial K next k) Table created SQL select a table_name ?????????? a initial_extent / INIT_EXTENT(K) ?????????? a next_extent / NEXT_EXTENT(K) ???? from user_tables a ??? where a table_name = DEMOTAB _ TABLE_NAME???????????????????? INIT_EXTENT(K) NEXT_EXTENT(K)
DEMOTAB _ ????????????????????????????????? ??????????????? 注意 此時INIT_EXTENT為 不是initial參數(shù)的 SQL select a bytes / INIT_EXTENT(K) from user_extents a where a segment_name = DEMOTAB _ and a extent_id = INIT_EXTENT(K)
SQL select count(*) from user_extents where segment_name = DEMOTAB _ COUNT(*)
當(dāng)initial uniform size時SQL create table demotab _ (x number) tablespace demo storage (initial K next k) Table created SQL select a table_name ?????????? a initial_extent / INIT_EXTENT(K) ?????????? a next_extent / NEXT_EXTENT(K) ???? from user_tables a ??? where a table_name = DEMOTAB _ TABLE_NAME???????????????????? INIT_EXTENT(K) NEXT_EXTENT(K)
DEMOTAB _ ????????????????????????????? ?????????????? 注意 initial uniform size時 初始化區(qū)的大小initial的大小
SQL select a bytes / INIT_EXTENT(K) from user_extents a where a segment_name = DEMOTAB _ and a extent_id = INIT_EXTENT(K)
SQL select count(*) from user_extents where segment_name = DEMOTAB _ COUNT(*)
注意 此時分配的區(qū)已經(jīng)不是 個了 是 個 在這種情況下initial就有起做作用 分配區(qū)的數(shù)量為 取整(initial/uniform size) +
結(jié)論 在uniform size時 initial不管為多少時 這個段的每一個區(qū)大小都為uniform size的大小
用autoallocate方式的本地管理表空間 當(dāng)storage參數(shù)中的initial為空時SQL create tablespace demoa datafile /oradata/ltest/demoa dbf size m extent management local autoallocate Tablespace created SQL select a initial_extent / INIT_EXTENT(K) ?????????? a next_extent / NEXT_EXTENT(K) ???? from user_tablespaces a ??? where a tablespace_name = DEMOA INIT_EXTENT(K) NEXT_EXTENT(K)
SQL create table demoatab(x number) tablespace demoa Table created SQL select a table_name ?????????? a initial_extent / INIT_EXTENT(K) ?????????? a next_extent / NEXT_EXTENT(K) ???? from user_tables a ??? where a table_name = DEMOATAB TABLE_NAME??????????????????? INIT_EXTENT(K) NEXT_EXTENT(K)
DEMOATAB??????????????????????????????????? SQL select count(*) from user_extents where segment_name = DEMOATAB COUNT(*)
SQL select a segment_name a bytes a blocks from user_extents a where a segment_name = DEMOATAB_ SEGMENT_NA????? BYTES???? BLOCKS
DEMOATAB_ ????? ????????? DEMOATAB_ ??? ??????? rows selected當(dāng)自動分配時 發(fā)現(xiàn)開始第一個區(qū)分配 個塊( K) 到 區(qū)開始 每個區(qū)分配 個塊(大小 M) 我做過實驗當(dāng)initial足夠大時 第一個區(qū)的大小不一定都是 K 可以是 M M M 甚至是 M 當(dāng)initial uniform size時SQL create table demoatab_ (x number) tablespace demoa storage (initial K next k) Table created SQL select a table_name ?????????? a initial_extent / INIT_EXTENT(K) ?????????? a next_extent / NEXT_EXTENT(K) ???? from user_tables a ??? where a table_name = DEMOATAB_ TABLE_NAME???????????????????? INIT_EXTENT(K) NEXT_EXTENT(K)
DEMOATAB_ ????????????????????????????????? SQL select a bytes / INIT_EXTENT(K) from user_extents a where a segment_name = DEMOATAB_ and a extent_id = INIT_EXTENT(K)
SQL select count(*) from user_extents where segment_name = DEMOATAB_ COUNT(*)
當(dāng)initial uniform size時SQL create table demoatab_ (x number) tablespace demoa storage (initial K next k) Table created SQL select a table_name ?????????? a initial_extent / INIT_EXTENT(K) ?????????? a next_extent / NEXT_EXTENT(K) ???? from user_tables a ??? where a table_name = DEMOATAB_ TABLE_NAME????????????????????? INIT_EXTENT(K) NEXT_EXTENT(K)
DEMOATAB_ ??????????????????????????????? SQL select a bytes / INIT_EXTENT(K) from user_extents a where a segment_name = DEMOATAB_ and a extent_id = INIT_EXTENT(K)
SQL select count(*) from user_extents where segment_name = DEMOATAB_ COUNT(*)
結(jié)論 ORACLE通過強制性的手段使本地管理表空間中的所有Extent是同樣大小的 盡管可能自定義了不同的存儲參數(shù) 在自動分配的本地管理的表空間中 區(qū)間尺寸可能由以下尺寸組成 K M M M 甚至是 M 但是不管多大 都有一個通用尺寸 k 所以 K就是該表空間的位大小
檢查uet$與fet$是否有數(shù)據(jù)SQL select file# name from v$datafile FILE# NAME—— /oradata/LTEST/datafile/o _mf_system_ q w_ dbf /oradata/LTEST/datafile/o _mf_undotbs _ q ct_ dbf /oradata/LTEST/datafile/o _mf_sysaux_ q _ dbf /oradata/LTEST/datafile/o _mf_users_ q do_ dbf /oradata/LTEST/datafile/o _mf_example_ q jt _ dbf /oradata/LTEST/datafile/o _mf_bigtbs_ ct vw x_ dbf /oradata/ltest/demo dbf /oradata/ltest/demo dbf /oradata/ltest/demoa dbf rows selected可以檢查uet$與fet$ SQL select count(*) from uet$ where file# = COUNT(*)
SQL select count(*) from fet$ where file# = COUNT(*)
采用本地管理的表空間 這兩張視圖中沒有數(shù)據(jù) 下面就通過Dump塊的信息 來進一步分析本地管理表空間的特點
Dump數(shù)據(jù)文件中位圖信息(第 個塊到第 個塊)
dump第三個塊數(shù)據(jù)文件的前兩個塊是文件頭 所以dump第 個塊 從第 個塊到第 個塊是該數(shù)據(jù)文件的數(shù)據(jù)文件的位圖區(qū) 如果db_block_size為 那么占用的空間為 K 文也用另一種不是很嚴(yán)謹(jǐn)?shù)姆椒炞C了占用 K大小的問題
SQL alter system dump datafile block System altered Dump出來的信息如下 Start dump data blocks tsn file# minblk maxblk buffer tsn rdba x ( / )
scn x ee d seq x flg x tail xee d e frmt x cval x e type x e=KTFB Bitmapped File Space Bitmap Hex dump of block st= typ_found= Dump of memory from x EFC to x F C EFC A E EE D ? [……] EFC E C ? [ C……] EFC F F ? [……] EFC FF ? [……] EFC ? [……] Repeat times F BF EE D E ? [……] File Space Bitmap Block BitMap Control ????????????????????????????????? 這句話說明該塊還是位圖區(qū)( 塊都這樣子 可dump每個塊出來驗證)
RelFno BeginBlock Flag First Free F F ??? (共 行)
……
End dump data blocks tsn file# minblk maxblk
共 行 每行 個字節(jié) 每個字節(jié) 位 共有位數(shù) * * = 前面兩節(jié)的內(nèi)容是 F F = = 個位為 與下面通過user_extents算出來的一樣 還有空閑區(qū)共有 = (注意 位大小為 的個數(shù)與extent個數(shù)相等 只是一個巧合 因為位圖管理中位大小為 對應(yīng)的是 個block的使用情況 當(dāng)一個區(qū)的分配大小不為 個block時 比如 個block時 兩者就不會相等了 )
可看表空間DEMO 中已經(jīng)用了幾個區(qū)
SQL select count(*) from user_extents a where a tablespace_name = DEMO COUNT(*)
先擴展后 再dump第三個塊SQL alter table demotab allocate extent Table altered SQL alter system dump datafile block System altered
Dump出來的信息如下 Start dump data blocks tsn file# minblk maxblk buffer tsn rdba x ( / )
scn x fc f seq x flg x tail xfc f e frmt x cval x type x e=KTFB Bitmapped File Space Bitmap Hex dump of block st= typ_found= Dump of memory from x EFC to x F C EFC A E FC F ? [……O……] EFC C ? [……] EFC F F ? [……] EFC FF ? [……] EFC ? [……] Repeat times F BF FC F E ? [……O ] File Space Bitmap Block BitMap Control RelFno BeginBlock Flag First Free F F ……
End dump data blocks tsn file# minblk maxblk
前面兩節(jié)的內(nèi)容是 F F = = 個位為 說明通過語句 alter table demotab allocate extent 又增加了一個區(qū)的分配
Dump數(shù)據(jù)文件中數(shù)據(jù)信息(比如第 個塊)
查看dba_extents視圖 也可以發(fā)現(xiàn)表DEMOTAB 從第 個塊開始分配第一個區(qū)
SQL select a segment_name a file_id a block_id a extent_id from dba_extents a where a segment_name = DEMOTAB SEGMENT_NAME?????? FILE_ID?? BLOCK_ID?? EXTENT_ID
DEMOTAB ??????????????? ??????????? ??????????? DEMOTAB ??????????????? ?????????? ???????????
Dump第 個塊 這個塊相當(dāng)表頭的信息
SQL alter system dump datafile block System altered Dump出來的信息如下 Start dump data blocks tsn file# minblk maxblk buffer tsn rdba x ( / )
scn x fc f seq x flg x tail xfc f frmt x cval x aaf type x =FIRST LEVEL BITMAP BLOCK Hex dump of block st= typ_found= Dump of memory from x EFC to x F C EFC A FC F ? [ ……O……] EFC AAF ? [ Z……] EFC ? [……] Repeat times EFC ? [……] EFC FFFFFFFF D ? [……] EFC ? [……] EFC ? [……] EFC C ? […… ……] EFC A ? [……] EFCA C ? [……] EFCB ? [……] EFCC CE D ? [m……] EFCD ? [……] EFCE ? [……] EFCF ? [……] Repeat times EFD ? [……] EFD ? [……] Repeat times F BF FC F ? […… O ] Dump of First Level Bitmap Block
nbits nranges ???????? parent dba ? x a?? poffset unformatted ????? total ??????? first useful block owning instance instance ownership changed at Last successful Search Freeness Status ? nf ????? nf ????? nf ????? nf
Extent Map Block Offset First free datablock Bitmap block lock opcode Locker xid ???? ? x c Inc # Objd HWM Flag HWM Set Highwater ? x c? ext# ????? blk# ????? ext size #blocks in seg hdr s freelists #blocks below mapblk? x ? offset
DBA Ranges
x ? Length ????? Offset x ? Length ????? Offset
Metadata?? Metadata?? Metadata?? unformatted unformatted?? unformatted?? unformatted?? unformatted unformatted?? unformatted?? unformatted?? unformatted unformatted?? unformatted?? unformatted?? unformatted
lishixinzhi/Article/program/Oracle/201311/16723
SQL conn sys/xin as sysdba
已連接。
SQL set wrap off
SQL set linesize 100
1. 一些基本的操作
(1) 查看表空間:
SQL select * from v$tablespace;
(2) 查看數(shù)據(jù)文件:
SQL select * from v$datafile;
(3) 查看tablespace 和data files之間的對應(yīng)關(guān)系(通過表空間的號連接在一起):
SQL select t1.name,t2.name
2 from v$tablespace t1, v$datafile t2
3 where t1.ts#=t2.ts#
4 ;
(4) 更改表空間
SQL alter tablespace users
2 add datafile 'E:\ORACLE\ORADATA\XINER\USERS02.DBF' size 10m;
表空間已更改。
2. 管理表空間
在oracle 里將表空間分為系統(tǒng)表空間和非系統(tǒng)表空間。
(1) 系統(tǒng)表空間包括系統(tǒng)表,數(shù)據(jù)字典,以及系統(tǒng)回滾段等信息。
查看系統(tǒng)回滾段:
SQL select * from dba_rollback_segs;
(2) 非系統(tǒng)表空間用來分離段(分開臨時數(shù)據(jù)和永久性數(shù)據(jù),索引和表放在不同的表空間等等)可以給系統(tǒng)的性能帶來
好處,同時可以控制分配給用戶的空間限額。
控制用戶對空間的使用:
SQL alter user HR
2 quota 10m on users;
用戶已更改。
(3) 如何創(chuàng)建表空間:([]均表示可選)
create tablespace xxx
[datafile 'xxx']---OMF時可以不指定
[size xxx--kb,mb]
[extent management local/dictionary]
[default storage(xxx)]
dictionary-managed tablespaces在oracle 9i 里已經(jīng)不建議使用。
SQL create tablespace ice
2 datafile 'e:\oracle\oradata\xiner\ice.dbf' size 5m
3 extent management dictionary
4 default storage(
5 initial 100k
6 next 100k
7 pctincrease 10)
8 offline;
表空間已創(chuàng)建。
如果表空間管理指定為Local型,則不能使用default storage。此時不會和數(shù)據(jù)字典表打交道,不會和系統(tǒng)表產(chǎn)生
資源爭用,也不會產(chǎn)生回滾數(shù)據(jù)(因為不涉及修改系統(tǒng)表),其次也不會有遞歸的資源爭用。
SQL create tablespace ice1
2 datafile 'e:\oracle\oradata\xiner\ice1.dbf' size 5m
3 extent management local
4 uniform size 1m;
表空間已創(chuàng)建。
SQL create tablespace ice2
2 datafile 'e:\oracle\oradata\xiner\ice2.dbf' size 5m
3 extent management local autoallocate;
表空間已創(chuàng)建。
(4) Undo 表空間用來存儲undo段,不能包括其他的數(shù)據(jù)對象,使用locally管理。
undo 段主要用來保存數(shù)據(jù)改變的舊值,可以回滾transcation(rollback)。
SQL show parameter undo
SQL create undo tablespace ice3
2 datafile 'e:\oracle\oradata\xiner\ice3.ora' size 5m
3 extent management local
4 uniform size 1m; //此時不能定義uniform size
uniform size 1m
*
ERROR 位于第 4 行:
ORA-30024: CREATE UNDO TABLESPACE 的說明無效
SQL del 4
SQL run
1 create undo tablespace ice3
2 datafile 'e:\oracle\oradata\xiner\ice3.ora' size 5m
3* extent management local
表空間已創(chuàng)建。
不能在回滾表空間建立表對象(不能放其他的數(shù)據(jù)對象):
SQL create table tt1
2 (id int)
3 tablespace ice3;
create table tt1
*
ERROR 位于第 1 行:
ORA-30022: 無法在撤消表空間中創(chuàng)建段
(5) 臨時表空間用來支持排序,不能包括永久的數(shù)據(jù)對象,建議使用locally管理。
SQL create temporary tablespace ice4
2 tempfile 'e:\oracle\oradata\xiner\ice4.ora' size 5m
3 extent management local;
表空間已創(chuàng)建。
SQL create table tt1
2 (id int)
3 tablespace ice4;
create table tt1
*
ERROR 位于第 1 行:
ORA-02195: 嘗試創(chuàng)建的PERMANENT對象在TEMPORARY表空間中
(6) 缺省的臨時表空間:
SQL alter database default temporary tablespace ice4
數(shù)據(jù)庫已更改。
臨時表空間不可以被置為offline,也不能指定為read only,不可以被刪除,除非用另外一個表空間代替它。
SQL alter talbespace ice4 offline
alter talbespace ice4 offline
*
ERROR 位于第 1 行:
ORA-00940: 無效的 ALTER 命令
SQL alter tablespace ice4
2 read only;
alter tablespace ice4
*
ERROR 位于第 1 行:
ORA-03217: 變更 TEMPORARY TABLESPACE 無效的選項
(7) offline狀態(tài):對數(shù)據(jù)文件改名or搬動數(shù)據(jù)文件的位置or對數(shù)據(jù)庫進行部分的修復(fù)
(7) offline狀態(tài):對數(shù)據(jù)文件改名or搬動數(shù)據(jù)文件的位置or對數(shù)據(jù)庫進行部分的修復(fù)
SQL alter tablespace users offline;
表空間已更改。
SQL alter tablespace users online;
表空間已更改。
不可以置為offline狀態(tài)的表空間包括:system表空間(如果要對系統(tǒng)表空間的文件進行改變則要關(guān)閉數(shù)據(jù)庫);
包括active undo 段的表空間;缺省的臨時表空間
(8) read only 表空間:對表空間只能進行讀操作;數(shù)據(jù)對象可以從表空間刪除
SQL alter tablespace users read only;
表空間已更改。
(9) 刪除表空間:
SQL create table tt1
2 (id int)
3 tablespace ice;
表已創(chuàng)建。
SQL drop tablespace ice1;
表空間已丟棄。
SQL drop tablespace ice2
2 including contents and datafiles;
表空間已丟棄。
(10) resize表空間:自動擴張(autoextend on)、手動(resize)
3. 管理數(shù)據(jù)文件
(1) 移動data files:
表空間必須是offline(使用alter tablespace xxx rename datafile 'xx' to 'xx');
目標(biāo)數(shù)據(jù)文件必須已經(jīng)存在;
如果是不能處于offline狀態(tài)的表空間則要關(guān)閉數(shù)據(jù)庫,將其啟動到mount狀態(tài),同時目標(biāo)數(shù)據(jù)文件必須已經(jīng)存在。
(使用alter database rename file 'xx' to 'xx')
(2) 配置OMF文件來創(chuàng)建表空間的時候DB_CREATE_FILE_DEST會將數(shù)據(jù)文件存放在缺省的位置。如果想要更改位置則用
alter system set db_create_file_dest='xx';
用OMF創(chuàng)建表空間:create tablespace xxx; 刪除:drop tablespace xxx;
工具/材料
ORACLE SQL Developer
01
首先我們打開ORACLE SQL Developer工具,來看一下我們接下來要操作的表的結(jié)構(gòu),如下圖所示
02
然后先執(zhí)行的是數(shù)據(jù)的插入操作,在ORACLE中,插入數(shù)據(jù)用insert語句,如下圖所示
03
如果查詢數(shù)據(jù)就需要使用select語句了,如下圖所示,運用select語句的時候可以指定列名
04
接下來看一下如何更新數(shù)據(jù),在Oracle中更新數(shù)據(jù)可以運用update語句,如下圖所示,更新的時候需要限定更新條件
05
在進行更新的時候,如果你沒有指定更新條件的話,那么就會進行全表數(shù)據(jù)的更新,如下圖所示
06
接下來看一下數(shù)據(jù)的刪除操作,刪除操作運用delete語句即可,需要通過where條件指定刪除哪些數(shù)據(jù),如下圖所示
07
最后要提醒大家,如果進行刪除的時候不指定where條件的話,就會把整張表的數(shù)據(jù)都刪除掉了,如下圖所示
我們將通過介紹命令的方式 談?wù)凮racle用戶權(quán)限表的管理方法 希望對大家有所幫助
我們將從創(chuàng)建Oracle用戶權(quán)限表 開始談起 然后講解登陸等一般性動作 使大家對Oracle用戶權(quán)限表有個深入的了解
一 創(chuàng)建
sys;//系統(tǒng)管理員 擁有最高權(quán)限
system;//本地管理員 次高權(quán)限
scott;//普通用戶 密碼默認(rèn)為tiger 默認(rèn)未解鎖
sys;//系統(tǒng)管理員 擁有最高權(quán)限
system;//本地管理員 次高權(quán)限
scott;//普通用戶 密碼默認(rèn)為tiger 默認(rèn)未解鎖
二 登陸
sqlplus / as sysdba;//登陸sys帳戶
sqlplus sys as sysdba;//同上
sqlplus scott/tiger;//登陸普通用戶scott
sqlplus / as sysdba;//登陸sys帳戶
sqlplus sys as sysdba;//同上
sqlplus scott/tiger;//登陸普通用戶scott
三 管理用戶
create user zhangsan;//在管理員帳戶下 創(chuàng)建用戶zhangsan
alert user scott identified by tiger;//修改密碼
create user zhangsan;//在管理員帳戶下 創(chuàng)建用戶zhangsan
alert user scott identified by tiger;//修改密碼
四 授予權(quán)限
默認(rèn)的普通用戶scott默認(rèn)未 解鎖 不能進行那個使用 新建的用戶也沒有任何權(quán)限 必須授予權(quán)限
/*管理員授權(quán)*/
grant create session to zhangsan;//授予zhangsan用戶創(chuàng)建session的權(quán)限 即登陸權(quán)限
grant unlimited session to zhangsan;//授予zhangsan用戶使用表空間的權(quán)限
grant create table to zhangsan;//授予創(chuàng)建表的權(quán)限
grante drop table to zhangsan;//授予刪除表的權(quán)限
grant insert table to zhangsan;//插入表的權(quán)限
grant update table to zhangsan;//修改表的權(quán)限
grant all to public;//這條比較重要 授予所有權(quán)限(all)給所有用戶(public)
/*管理員授權(quán)*/
grant create session to zhangsan;//授予zhangsan用戶創(chuàng)建session的權(quán)限 即登陸權(quán)限
grant unlimited session to zhangsan;//授予zhangsan用戶使用表空間的權(quán)限
grant create table to zhangsan;//授予創(chuàng)建表的權(quán)限
grante drop table to zhangsan;//授予刪除表的權(quán)限
grant insert table to zhangsan;//插入表的權(quán)限
grant update table to zhangsan;//修改表的權(quán)限
grant all to public;//這條比較重要 授予所有權(quán)限(all)給所有用戶(public)
oralce對權(quán)限管理比較嚴(yán)謹(jǐn) 普通用戶 之間也是默認(rèn)不能互相訪問的 需要互相授權(quán)
/*oralce對權(quán)限管理比較嚴(yán)謹(jǐn) 普通用戶之間也是默認(rèn)不能互相訪問的*/
grant select on tablename to zhangsan;//授予zhangsan用戶查看指定表的權(quán)限
grant drop on tablename to zhangsan;//授予刪除表的權(quán)限
grant insert on tablename to zhangsan;//授予插入的權(quán)限
grant update on tablename to zhangsan;//授予修改表的權(quán)限
grant insert(id) on tablename to zhangsan;
grant update(id) on tablename to zhangsan;//授予對指定表特定字段的插入和修改權(quán)限 注意 只能是insert和update
grant alert all table to zhangsan;//授予zhangsan用戶alert任意表的權(quán)限
/*oralce對權(quán)限管理比較 嚴(yán)謹(jǐn) 普通用戶之間也是默認(rèn)不能互相訪問的*/
grant select on tablename to zhangsan;//授予zhangsan用戶查看指定表的權(quán)限
grant drop on tablename to zhangsan;//授予刪除表的權(quán)限
grant insert on tablename to zhangsan;//授予插入的權(quán)限
grant update on tablename to zhangsan;//授予修改表的權(quán)限
grant insert(id) on tablename to zhangsan;
grant update(id) on tablename to zhangsan;//授予對指定表特定字段的插入和修改權(quán)限 注意 只能是insert和update
grant alert all table to zhangsan;//授予zhangsan用戶alert任意表的權(quán)限
五 撤銷權(quán)限
基本語法同grant 關(guān)鍵字為revoke
基本語法同grant 關(guān)鍵字為revoke
六 查看權(quán)限
select * from user_sys_privs;//查看當(dāng)前用戶所有權(quán)限
select * from user_tab_privs;//查看所用用戶對表的權(quán)限
select * from user_sys_privs;//查看當(dāng)前用戶所有權(quán)限
select * from user_tab_privs;//查看所用用戶對表的權(quán)限
七 操作表的用戶的表
/*需要在表名前加上用戶名 如下*/
select * from zhangsan tablename
/*需要在表名前加上用戶名 如下*/
select * from zhangsan tablename
八 權(quán)限傳遞
即用戶A將權(quán)限授予B B可以將操作的權(quán)限再授予C 命令如下
grant alert table on tablename to zhangsan with admin option;//關(guān)鍵字 with admin option
grant alert table on tablename to zhangsan with grant option;//關(guān)鍵字 with grant option效果和admin類似
grant alert table on tablename to zhangsan with admin option;//關(guān)鍵字 with admin option
grant alert table on tablename to zhangsan with grant option;//關(guān)鍵字 with grant option效果和admin類似
九 角色
角色即權(quán)限的集 合 可以把一個角色授予給用戶
create role myrole;//創(chuàng)建角色
grant create session to myrole;//將創(chuàng)建session的權(quán)限授予myrole
grant myrole to zhangsan;//授予zhangsan用戶myrole的角色
drop role myrole;刪除角色
/*但是有些權(quán)限是不能授予給角色的 比如unlimited tablespace和any關(guān)鍵字*/
lishixinzhi/Article/program/Oracle/201311/17543
1.首先使用ORACLE系統(tǒng)用戶登錄PL/SQL管理工具。
2.在SQL腳本中,編寫和執(zhí)行SQL語句來刪除表空間的表空間名稱。
3.如果希望清理用戶下的所有數(shù)據(jù)庫表,可以執(zhí)行以下語句,刪除用戶名cascade。
4.當(dāng)執(zhí)行上述語句時,它將顯示在它正在執(zhí)行的級別以下。
5.執(zhí)行之后,可以使用刪除的用戶登錄PL/SQL。
6.如果有彈出提示,說明刪除成功。
一、創(chuàng)建分區(qū)表
1、范圍分區(qū)
根據(jù)數(shù)據(jù)表字段值的范圍進行分區(qū)
舉個例子,根據(jù)學(xué)生的不同分?jǐn)?shù)對分?jǐn)?shù)表進行分區(qū),創(chuàng)建一個分區(qū)表如下:create table range_fraction(
id number(8),
name varchar2(20),
fraction number(3),
grade number(2)
)
partition by range(fraction)
(
partition fraction_60 values less than(60), --不及格partition fraction_80 values less than(85), --及格partition fraction_100 values less than(maxvalue) --優(yōu)秀)創(chuàng)建完分區(qū)表后向表中添加一些數(shù)據(jù):declarename varchar2(10);
fraction number(5);
grade number(5);
i number(8):=1;
begin
for i in 1..100000 LOOP
SELECT CHR (ROUND (DBMS_RANDOM.VALUE (97, 122))) INTO NAME FROM DUAL;SELECT ABS(MOD(DBMS_RANDOM.RANDOM,101)) into fraction FROM DUAL;SELECT ABS(MOD(DBMS_RANDOM.RANDOM,10))+1 into grade FROM DUAL;insert into range_fraction values(seq_range_fraction.nextval ,name,fraction,grade);END LOOP;end;
查詢分區(qū)表:--分別查詢所有的,不及格的,中等的,優(yōu)秀的成績select * from range_fraction;select * from range_fraction partition(fraction_60) ;select * from range_fraction partition(fraction_80) ;select * from range_fraction partition(fraction_100) ;當(dāng)我們的查詢語句不指定分區(qū)的時候,如果分區(qū)字段出現(xiàn)在where條件之后,Oracle會自動根據(jù)字段值的范圍掃描響應(yīng)的分區(qū):
select * from range_fraction where fraction30; 這句SQL執(zhí)行的時候只會掃描不及格的分區(qū)select * from range_fraction where fraction80; 這句SQL執(zhí)行的時候會掃描不及格和中等兩個分區(qū)2、散列分區(qū)在范圍分區(qū)中,分區(qū)字段的連續(xù)值通常出現(xiàn)在一個分區(qū)內(nèi),而在散列分區(qū)中,連續(xù)的字段值不一定存儲在相同的分區(qū)中。散列分區(qū)把記錄分布在比范圍分區(qū)更多的分區(qū)上,這減少了I/O爭用的可能性。
為了創(chuàng)建一個散列分區(qū),應(yīng)該用partition by hash語句代替partition by range子句,如下所示:
第一種為各個分區(qū)指定不同的表空間,表空間數(shù)量不用等于分區(qū)數(shù)量,當(dāng)表空間數(shù)量大于分區(qū)數(shù)量的時候會循環(huán)寫入各個表空間:
create table range_fraction1
(
id number(8),
name varchar2(20),
fraction number(3),
grade number(2)
)
partition by hash(fraction)
partitions 8
store in (users,tbs_haicheng)
第二種為每個分區(qū)指定一個分區(qū)名稱并為其指定表空間:create table range_fraction1(
id number(8),
name varchar2(20),
fraction number(3),
grade number(1)
)
partition by hash(fraction)
(
partition p1 tablespace tbs_haicheng ,
partition p2 tablespace users
);
3、列表分區(qū)
還可以使用列表分區(qū)代替范圍分區(qū)和散列分區(qū)。在列表分區(qū)中,告訴Oracle所有可能的值,并指定應(yīng)當(dāng)插入相應(yīng)行的分區(qū)。
我們將1、2、3、4班級的數(shù)據(jù)放在一個分區(qū),將6、7、8的數(shù)據(jù)放在一個分區(qū),將其他的再放在一個分區(qū),建表如下:
create table range_fraction1
(
id number(8),
name varchar2(20),
fraction number(3),
grade number(2)
)
partition by list(grade)
(
partition p1 values(1,2,3,4) tablespace tbs_haicheng ,partition p2 values(5,6,7,8) tablespace users,?
1
partition p3 values(default)
4、組合分區(qū)(創(chuàng)建子分區(qū))
即分區(qū)的分區(qū)。例如可以先進行范圍分區(qū),再對各個范圍分區(qū)創(chuàng)建列表分區(qū)。
對于非常大的表來說,這種組合分區(qū)是一種把數(shù)據(jù)分成可管理和可調(diào)整的組成部分的有效方法。
舉個例子:按照分?jǐn)?shù)范圍分區(qū)后再將ID散列分區(qū):
create table range_fraction1
(
id number(8),
name varchar2(20),
fraction number(3),
grade number(1)
)
partition by range(fraction)
subpartition by hash(id)
subpartitions 4
(
partition fraction_60 values less than(60), --不及格partition fraction_80 values less than(85), --及格partition fraction_100 values less than(maxvalue) --優(yōu)秀)二、索引分區(qū)
在分區(qū)表上可以建立三種類型的索引:1和普通表一樣的全局索引;2.全局分區(qū)索引;3.本地分區(qū)索引1.建立普通的索引create index index_fraction on range_fraction(fraction);2.建立本地分區(qū)索引(就是一個索引分區(qū)只能對應(yīng)一個表分區(qū))?
create index local_index_fraction on range_fraction(fraction) local;3.建立全局分區(qū)索引(屬于散列索引分區(qū),就是一個索引分區(qū)可能指向多個表分區(qū))?
create index global_index_fraction on range_fraction(fraction)GLOBAL partition by range(fraction)(
part_01 values less than(1000),
part_02 values less than(MAXVALUE)
);
三、管理分區(qū)表
1、增加分區(qū)
對于范圍分區(qū)來說,添加一個分區(qū),必須該分區(qū)劃定的界限高于原來的最大界限,也就是說只能往上加,不能往下加。那么對于用maxvalue關(guān)鍵字創(chuàng)建的范圍分區(qū)就不能增加分區(qū)了舉例:
create table range_fraction
(
id number(8),
name varchar2(20),
fraction number(3),
grade number(2)
)
partition by range(fraction)
(
partition fraction_60 values less than(40), --不及格partition fraction_80 values less than(60), --及格partition fraction_100 values less than(80) --優(yōu)秀)對于該分區(qū)我們增加一個分區(qū):
ALTER TABLE range_fraction ADD PARTITION fraction_100 VALUES LESS THAN (100);為列表分區(qū)添加一個分區(qū):
create table range_fraction
(
id number(8),
name varchar2(20),
fraction number(3),
grade number(2)
)
partition by list(grade)
(
partition p1 values(1,2,3) tablespace tbs_haicheng ,partition p2 values(4,5,6) tablespace users);ALTER TABLE range_fraction ADD partition p3 VALUES (7,8);我們再為p3分區(qū)新增兩個表分區(qū)值:
ALTER TABLE range_fraction MODIFY PARTITION p3 ADD VALUES(9,10);然后再將p3分區(qū)的表分區(qū)值中的10刪掉:
ALTER TABLE range_fraction MODIFY PARTITION p3 DROP VALUES(10);為哈希分區(qū)添加一個子分區(qū):
ALTER TABLE TABLENAME ADD PARTITION PARTNAME;添加一個子分區(qū)的格式:
ALTER TABLE TABLENAME MODIFY PARTITION PARTNAME ADD SUBPARTITION SUBPARTNAME;2、刪除分區(qū)刪除分區(qū)比較簡單,格式如下:
ALTER TABLE ... DROP PARTITION part_name;3、分區(qū)合并合并父分區(qū)格式:ALTER TABLE TABLENAME MERGE PARTITIONS p1-1, p1-2 INTO PARTITION p1 UPDATE INDEXES;如果省略了UPDATE INDEXES 的話需要為受影響的分區(qū)重建索引合并子分區(qū)的格式:
ALTER TABLE TABLENAME
MERGE SUBPARTITIONS part_1_sub_2, part_1_sub_3 INTO SUBPARTITION part_1_sub_2 UPDATE INDEXES;4、轉(zhuǎn)換分區(qū)可以將分區(qū)表轉(zhuǎn)換成非分區(qū)表,或者幾種不同分區(qū)表之間的轉(zhuǎn)換。如下:
CREATE TABLE hash_part02 AS SELECT * FROMhash_example WHERE 1=2;ALTER TABLE hash_example EXCHANGE PARTITIONpart02 WITH TABLE hash_part02;這時,分區(qū)表hash_example中的part02分區(qū)的資料將被轉(zhuǎn)移到hash_part02這個非分區(qū)表中。