名词解释与约定表空间(Tablespace) 为数据库提供使用空间的逻辑结构 其对应物理结构是数据文件 一个表空间可以包含多个数据文件
创新互联-专业网站定制、快速模板网站建设、高性价比博望网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式博望网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖博望地区。费用合理售后完善,十年实体公司更值得信赖。
本地管理表空间(Locally Managed Tablespace简称LMT) i以后出现的一种新的表空间的管理模式 通过本地位图来管理表空间的空间使用
字典管理表空间(Dictionary Managed Tablespace简称DMT) i以前包括以后都还可以使用的一种表空间管理模式 通过数据字典管理表空间的空间使用
段(Segment) 数据库一种逻辑结构 如表段 索引段 回滚段等 段存在于表空间中 并对应一定的存储空间
区间 可以简称区(Extent) 段的存储可以分成一个或多个区间 每个区间占用一定数量的数据块(block) 在本地管理的表空间中 表空间的Extent就对应段的Extent 块(Block) 数据库最小的存储单位 在本文中Block的大小约定为 字节
位(Bit) 本地管理表空间的空间管理单位 一个位可能等于一个区间 也可能多个位组成一个区间
本地管理表空间 语法在Oracle I的版本中 Oracle推出了一种全新的表空间管理方式 本地化管理的表空间 所谓本地化管理 就是指Oracle不再利用数据字典表来记录Oracle表空间里面的区的使用状况 而是在每个表空间的数据文件的头部加入了一个位图区 在其中记录每个区的使用状况 每当一个区被使用 或者被释放以供重新使用时 Oracle都会更新数据文件头部的这个记录 反映这个变化
本地化管理的表空间的创建过程 语法 CREATE TABLESPACE 表空间名字 DATAFILE 数据文件详细信息 [EXTENT MANAGEMENT { LOCAL {AUTOALLOCATE | UNIFORM [SIZE INTETER [K|M] ] } } ]关键字EXTENT MANAGEMENT LOCAL 指定这是一个本地化管理的表空间 对于系统表空间 只能在创建数据库的时候指定EXTENT MANGEMENT LOCAL 因为它是数据库创建时建立的第一个表空间
在 i中 字典管理还是默认的管理方式 当选择了LOCAL关键字 即表明这是一个本地管理的表空间 当然还可以继续选择更细的管理方式 是AUTOALLOCATE 还是 UNIFORM 若为AUTOALLOCATE 则表明让Oracle来决定区块的使用办法 若选择了UNIFORM 则还可以详细指定每个区块的大小 若不加指定 则为每个区使用 M大小
本地管理优点 本地化管理的表空间避免了递归的空间管理操作 而这种情况在数据字典管理的表空间是经常出现的 当表空间里的区的使用状况发生改变时 数据字典的表的信息发生改变 从而同时也使用了在系统表空间里的回滚段
本地化管理的表空间避免了在数据字典相应表里面写入空闲空间 已使用空间的信息 从而减少了数据字典表的竞争 提高了空间管理的并发性 区的本地化管理自动跟踪表空间里的空闲块 减少了手工合并自由空间的需要
表空间里的区的大小可以选择由Oracle系统来决定 或者由数据库管理员指定一个统一的大小 避免了字典表空间一直头疼的碎片问题
从由数据字典来管理空闲块改为由数据文件的头部记录来管理空闲块 这样避免产生回滚信息 不再使用系统表空间里的回滚段 因为由数据字典来管理的话 它会把相关信息记在数据字典的表里 从而产生回滚信息
由于这种表空间的以上特性 所以它支持在一个表空间里边进行更多的并发操作 并减少了对数据字典的依赖
本地管理表空间管理机制表空间是一种为段(表 索引等)提供空间的逻辑结构 所以 当在表空间中增加 删除段的时候 数据库就必须跟踪这些空间的使用
如下例所示 假定一个新创建的表空间包含了五个表表一……表二……表三……表四……表五……未用空间当我们删除表四的时候 就有如下结果表一……表二……表三……空闲空间段……表五……未用空间很明显 ORACLE需要有一个机制来管理表空间中各数据文件的这些分配的或未分配的空间 为了跟踪这些可以使用的空间(包括未分配使用的和可以重复使用的) 对于每一个空间 我们必须知道 这个可用空间位于什么数据文件 这个空间的尺寸是多大 如果它在用了 是哪一个段占用的这个空间直到 i之前 所有的表空间都是采用字典管理模式 为了确保能保存以上的信息 ORACLE用了两个数据字典表 UET$(已使用的区间)或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)都在该表中对应了一行 它的工作方式是当一个段被删除的时候 ORACLE就移动UET$中相应的行到FET$ 这个过程的发生是连续的 而且可能发生等待 当并发性很高的时候 数据字典的争用就来了 另外有一个问题就是 当表的空间很不连续或表空间有大量的碎片引起这两个表的增大 那么也就会引起数据库性能上的下降
本地管理表空间正是为了解决这一问题来的 在表空间的空间管理上 ORACLE将存储信息保存在表空间的头部的位图中 而不是保存在数据字典中 通过这样的方式 在分配回收空间的时候 表空间就可以独立的完成操作也不用与其它对象关系
下面就让我们进入到本地管理表空间的内部 看看ORACLE是怎么实现这一工作的
用Uniform方式的本地管理表空间 当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注意 我实验环境block为 k 所以uniform size至少为 k 当storage参数中的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 注意 建表时没有存储参数initial时 初始化区与下一个区的大小都是 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(*)
注意 在该段中 产生一个区
当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参数的 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(*)
当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时 初始化区的大小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(*)
注意 此时分配的区已经不是 个了 是 个 在这种情况下initial就有起做作用 分配区的数量为 取整(initial/uniform size) +
结论 在uniform size时 initial不管为多少时 这个段的每一个区大小都为uniform size的大小
用autoallocate方式的本地管理表空间 当storage参数中的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当自动分配时 发现开始第一个区分配 个块( K) 到 区开始 每个区分配 个块(大小 M) 我做过实验当initial足够大时 第一个区的大小不一定都是 K 可以是 M M M 甚至是 M 当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(*)
当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(*)
结论 ORACLE通过强制性的手段使本地管理表空间中的所有Extent是同样大小的 尽管可能自定义了不同的存储参数 在自动分配的本地管理的表空间中 区间尺寸可能由以下尺寸组成 K M M M 甚至是 M 但是不管多大 都有一个通用尺寸 k 所以 K就是该表空间的位大小
检查uet$与fet$是否有数据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(*)
采用本地管理的表空间 这两张视图中没有数据 下面就通过Dump块的信息 来进一步分析本地管理表空间的特点
Dump数据文件中位图信息(第 个块到第 个块)
dump第三个块数据文件的前两个块是文件头 所以dump第 个块 从第 个块到第 个块是该数据文件的数据文件的位图区 如果db_block_size为 那么占用的空间为 K 文也用另一种不是很严谨的方法验证了占用 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 这句话说明该块还是位图区( 块都这样子 可dump每个块出来验证)
RelFno BeginBlock Flag First Free F F (共 行)
……
End dump data blocks tsn file# minblk maxblk
共 行 每行 个字节 每个字节 位 共有位数 * * = 前面两节的内容是 F F = = 个位为 与下面通过user_extents算出来的一样 还有空闲区共有 = (注意 位大小为 的个数与extent个数相等 只是一个巧合 因为位图管理中位大小为 对应的是 个block的使用情况 当一个区的分配大小不为 个block时 比如 个block时 两者就不会相等了 )
可看表空间DEMO 中已经用了几个区
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
前面两节的内容是 F F = = 个位为 说明通过语句 alter table demotab allocate extent 又增加了一个区的分配
Dump数据文件中数据信息(比如第 个块)
查看dba_extents视图 也可以发现表DEMOTAB 从第 个块开始分配第一个区
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第 个块 这个块相当表头的信息
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) 查看数据文件:
SQL select * from v$datafile;
(3) 查看tablespace 和data files之间的对应关系(通过表空间的号连接在一起):
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 里将表空间分为系统表空间和非系统表空间。
(1) 系统表空间包括系统表,数据字典,以及系统回滚段等信息。
查看系统回滚段:
SQL select * from dba_rollback_segs;
(2) 非系统表空间用来分离段(分开临时数据和永久性数据,索引和表放在不同的表空间等等)可以给系统的性能带来
好处,同时可以控制分配给用户的空间限额。
控制用户对空间的使用:
SQL alter user HR
2 quota 10m on users;
用户已更改。
(3) 如何创建表空间:([]均表示可选)
create tablespace xxx
[datafile 'xxx']---OMF时可以不指定
[size xxx--kb,mb]
[extent management local/dictionary]
[default storage(xxx)]
dictionary-managed tablespaces在oracle 9i 里已经不建议使用。
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;
表空间已创建。
如果表空间管理指定为Local型,则不能使用default storage。此时不会和数据字典表打交道,不会和系统表产生
资源争用,也不会产生回滚数据(因为不涉及修改系统表),其次也不会有递归的资源争用。
SQL create tablespace ice1
2 datafile 'e:\oracle\oradata\xiner\ice1.dbf' size 5m
3 extent management local
4 uniform size 1m;
表空间已创建。
SQL create tablespace ice2
2 datafile 'e:\oracle\oradata\xiner\ice2.dbf' size 5m
3 extent management local autoallocate;
表空间已创建。
(4) Undo 表空间用来存储undo段,不能包括其他的数据对象,使用locally管理。
undo 段主要用来保存数据改变的旧值,可以回滚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
表空间已创建。
不能在回滚表空间建立表对象(不能放其他的数据对象):
SQL create table tt1
2 (id int)
3 tablespace ice3;
create table tt1
*
ERROR 位于第 1 行:
ORA-30022: 无法在撤消表空间中创建段
(5) 临时表空间用来支持排序,不能包括永久的数据对象,建议使用locally管理。
SQL create temporary tablespace ice4
2 tempfile 'e:\oracle\oradata\xiner\ice4.ora' size 5m
3 extent management local;
表空间已创建。
SQL create table tt1
2 (id int)
3 tablespace ice4;
create table tt1
*
ERROR 位于第 1 行:
ORA-02195: 尝试创建的PERMANENT对象在TEMPORARY表空间中
(6) 缺省的临时表空间:
SQL alter database default temporary tablespace ice4
数据库已更改。
临时表空间不可以被置为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状态:对数据文件改名or搬动数据文件的位置or对数据库进行部分的修复
(7) offline状态:对数据文件改名or搬动数据文件的位置or对数据库进行部分的修复
SQL alter tablespace users offline;
表空间已更改。
SQL alter tablespace users online;
表空间已更改。
不可以置为offline状态的表空间包括:system表空间(如果要对系统表空间的文件进行改变则要关闭数据库);
包括active undo 段的表空间;缺省的临时表空间
(8) read only 表空间:对表空间只能进行读操作;数据对象可以从表空间删除
SQL alter tablespace users read only;
表空间已更改。
(9) 删除表空间:
SQL create table tt1
2 (id int)
3 tablespace ice;
表已创建。
SQL drop tablespace ice1;
表空间已丢弃。
SQL drop tablespace ice2
2 including contents and datafiles;
表空间已丢弃。
(10) resize表空间:自动扩张(autoextend on)、手动(resize)
3. 管理数据文件
(1) 移动data files:
表空间必须是offline(使用alter tablespace xxx rename datafile 'xx' to 'xx');
目标数据文件必须已经存在;
如果是不能处于offline状态的表空间则要关闭数据库,将其启动到mount状态,同时目标数据文件必须已经存在。
(使用alter database rename file 'xx' to 'xx')
(2) 配置OMF文件来创建表空间的时候DB_CREATE_FILE_DEST会将数据文件存放在缺省的位置。如果想要更改位置则用
alter system set db_create_file_dest='xx';
用OMF创建表空间:create tablespace xxx; 删除:drop tablespace xxx;
工具/材料
ORACLE SQL Developer
01
首先我们打开ORACLE SQL Developer工具,来看一下我们接下来要操作的表的结构,如下图所示
02
然后先执行的是数据的插入操作,在ORACLE中,插入数据用insert语句,如下图所示
03
如果查询数据就需要使用select语句了,如下图所示,运用select语句的时候可以指定列名
04
接下来看一下如何更新数据,在Oracle中更新数据可以运用update语句,如下图所示,更新的时候需要限定更新条件
05
在进行更新的时候,如果你没有指定更新条件的话,那么就会进行全表数据的更新,如下图所示
06
接下来看一下数据的删除操作,删除操作运用delete语句即可,需要通过where条件指定删除哪些数据,如下图所示
07
最后要提醒大家,如果进行删除的时候不指定where条件的话,就会把整张表的数据都删除掉了,如下图所示
我们将通过介绍命令的方式 谈谈Oracle用户权限表的管理方法 希望对大家有所帮助
我们将从创建Oracle用户权限表 开始谈起 然后讲解登陆等一般性动作 使大家对Oracle用户权限表有个深入的了解
一 创建
sys;//系统管理员 拥有最高权限
system;//本地管理员 次高权限
scott;//普通用户 密码默认为tiger 默认未解锁
sys;//系统管理员 拥有最高权限
system;//本地管理员 次高权限
scott;//普通用户 密码默认为tiger 默认未解锁
二 登陆
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;//在管理员帐户下 创建用户zhangsan
alert user scott identified by tiger;//修改密码
create user zhangsan;//在管理员帐户下 创建用户zhangsan
alert user scott identified by tiger;//修改密码
四 授予权限
默认的普通用户scott默认未 解锁 不能进行那个使用 新建的用户也没有任何权限 必须授予权限
/*管理员授权*/
grant create session to zhangsan;//授予zhangsan用户创建session的权限 即登陆权限
grant unlimited session to zhangsan;//授予zhangsan用户使用表空间的权限
grant create table to zhangsan;//授予创建表的权限
grante drop table to zhangsan;//授予删除表的权限
grant insert table to zhangsan;//插入表的权限
grant update table to zhangsan;//修改表的权限
grant all to public;//这条比较重要 授予所有权限(all)给所有用户(public)
/*管理员授权*/
grant create session to zhangsan;//授予zhangsan用户创建session的权限 即登陆权限
grant unlimited session to zhangsan;//授予zhangsan用户使用表空间的权限
grant create table to zhangsan;//授予创建表的权限
grante drop table to zhangsan;//授予删除表的权限
grant insert table to zhangsan;//插入表的权限
grant update table to zhangsan;//修改表的权限
grant all to public;//这条比较重要 授予所有权限(all)给所有用户(public)
oralce对权限管理比较严谨 普通用户 之间也是默认不能互相访问的 需要互相授权
/*oralce对权限管理比较严谨 普通用户之间也是默认不能互相访问的*/
grant select on tablename to zhangsan;//授予zhangsan用户查看指定表的权限
grant drop on tablename to zhangsan;//授予删除表的权限
grant insert on tablename to zhangsan;//授予插入的权限
grant update on tablename to zhangsan;//授予修改表的权限
grant insert(id) on tablename to zhangsan;
grant update(id) on tablename to zhangsan;//授予对指定表特定字段的插入和修改权限 注意 只能是insert和update
grant alert all table to zhangsan;//授予zhangsan用户alert任意表的权限
/*oralce对权限管理比较 严谨 普通用户之间也是默认不能互相访问的*/
grant select on tablename to zhangsan;//授予zhangsan用户查看指定表的权限
grant drop on tablename to zhangsan;//授予删除表的权限
grant insert on tablename to zhangsan;//授予插入的权限
grant update on tablename to zhangsan;//授予修改表的权限
grant insert(id) on tablename to zhangsan;
grant update(id) on tablename to zhangsan;//授予对指定表特定字段的插入和修改权限 注意 只能是insert和update
grant alert all table to zhangsan;//授予zhangsan用户alert任意表的权限
五 撤销权限
基本语法同grant 关键字为revoke
基本语法同grant 关键字为revoke
六 查看权限
select * from user_sys_privs;//查看当前用户所有权限
select * from user_tab_privs;//查看所用用户对表的权限
select * from user_sys_privs;//查看当前用户所有权限
select * from user_tab_privs;//查看所用用户对表的权限
七 操作表的用户的表
/*需要在表名前加上用户名 如下*/
select * from zhangsan tablename
/*需要在表名前加上用户名 如下*/
select * from zhangsan tablename
八 权限传递
即用户A将权限授予B B可以将操作的权限再授予C 命令如下
grant alert table on tablename to zhangsan with admin option;//关键字 with admin option
grant alert table on tablename to zhangsan with grant option;//关键字 with grant option效果和admin类似
grant alert table on tablename to zhangsan with admin option;//关键字 with admin option
grant alert table on tablename to zhangsan with grant option;//关键字 with grant option效果和admin类似
九 角色
角色即权限的集 合 可以把一个角色授予给用户
create role myrole;//创建角色
grant create session to myrole;//将创建session的权限授予myrole
grant myrole to zhangsan;//授予zhangsan用户myrole的角色
drop role myrole;删除角色
/*但是有些权限是不能授予给角色的 比如unlimited tablespace和any关键字*/
lishixinzhi/Article/program/Oracle/201311/17543
1.首先使用ORACLE系统用户登录PL/SQL管理工具。
2.在SQL脚本中,编写和执行SQL语句来删除表空间的表空间名称。
3.如果希望清理用户下的所有数据库表,可以执行以下语句,删除用户名cascade。
4.当执行上述语句时,它将显示在它正在执行的级别以下。
5.执行之后,可以使用删除的用户登录PL/SQL。
6.如果有弹出提示,说明删除成功。
一、创建分区表
1、范围分区
根据数据表字段值的范围进行分区
举个例子,根据学生的不同分数对分数表进行分区,创建一个分区表如下: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) --优秀)创建完分区表后向表中添加一些数据: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;
查询分区表:--分别查询所有的,不及格的,中等的,优秀的成绩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) ;当我们的查询语句不指定分区的时候,如果分区字段出现在where条件之后,Oracle会自动根据字段值的范围扫描响应的分区:
select * from range_fraction where fraction30; 这句SQL执行的时候只会扫描不及格的分区select * from range_fraction where fraction80; 这句SQL执行的时候会扫描不及格和中等两个分区2、散列分区在范围分区中,分区字段的连续值通常出现在一个分区内,而在散列分区中,连续的字段值不一定存储在相同的分区中。散列分区把记录分布在比范围分区更多的分区上,这减少了I/O争用的可能性。
为了创建一个散列分区,应该用partition by hash语句代替partition by range子句,如下所示:
第一种为各个分区指定不同的表空间,表空间数量不用等于分区数量,当表空间数量大于分区数量的时候会循环写入各个表空间:
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)
第二种为每个分区指定一个分区名称并为其指定表空间: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、列表分区
还可以使用列表分区代替范围分区和散列分区。在列表分区中,告诉Oracle所有可能的值,并指定应当插入相应行的分区。
我们将1、2、3、4班级的数据放在一个分区,将6、7、8的数据放在一个分区,将其他的再放在一个分区,建表如下:
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、组合分区(创建子分区)
即分区的分区。例如可以先进行范围分区,再对各个范围分区创建列表分区。
对于非常大的表来说,这种组合分区是一种把数据分成可管理和可调整的组成部分的有效方法。
举个例子:按照分数范围分区后再将ID散列分区:
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) --优秀)二、索引分区
在分区表上可以建立三种类型的索引:1和普通表一样的全局索引;2.全局分区索引;3.本地分区索引1.建立普通的索引create index index_fraction on range_fraction(fraction);2.建立本地分区索引(就是一个索引分区只能对应一个表分区)?
create index local_index_fraction on range_fraction(fraction) local;3.建立全局分区索引(属于散列索引分区,就是一个索引分区可能指向多个表分区)?
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)
);
三、管理分区表
1、增加分区
对于范围分区来说,添加一个分区,必须该分区划定的界限高于原来的最大界限,也就是说只能往上加,不能往下加。那么对于用maxvalue关键字创建的范围分区就不能增加分区了举例:
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) --优秀)对于该分区我们增加一个分区:
ALTER TABLE range_fraction ADD PARTITION fraction_100 VALUES LESS THAN (100);为列表分区添加一个分区:
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分区新增两个表分区值:
ALTER TABLE range_fraction MODIFY PARTITION p3 ADD VALUES(9,10);然后再将p3分区的表分区值中的10删掉:
ALTER TABLE range_fraction MODIFY PARTITION p3 DROP VALUES(10);为哈希分区添加一个子分区:
ALTER TABLE TABLENAME ADD PARTITION PARTNAME;添加一个子分区的格式:
ALTER TABLE TABLENAME MODIFY PARTITION PARTNAME ADD SUBPARTITION SUBPARTNAME;2、删除分区删除分区比较简单,格式如下:
ALTER TABLE ... DROP PARTITION part_name;3、分区合并合并父分区格式:ALTER TABLE TABLENAME MERGE PARTITIONS p1-1, p1-2 INTO PARTITION p1 UPDATE INDEXES;如果省略了UPDATE INDEXES 的话需要为受影响的分区重建索引合并子分区的格式:
ALTER TABLE TABLENAME
MERGE SUBPARTITIONS part_1_sub_2, part_1_sub_3 INTO SUBPARTITION part_1_sub_2 UPDATE INDEXES;4、转换分区可以将分区表转换成非分区表,或者几种不同分区表之间的转换。如下:
CREATE TABLE hash_part02 AS SELECT * FROMhash_example WHERE 1=2;ALTER TABLE hash_example EXCHANGE PARTITIONpart02 WITH TABLE hash_part02;这时,分区表hash_example中的part02分区的资料将被转移到hash_part02这个非分区表中。