分类: Oracle
2010-03-24 19:18:40
段 segment,区 extent ,块 block 逻辑概念
table.A-> heap ,堆表,比较慢(heap 表的记录没有次序)
每个block的头有 SCN,尾部也写有一些数据,(如果坏掉了,整个block就会变得无法标识)
如果有个 12K的表,它将被分配到两个块上去。
TABLESPACE的作用: Are a repository for schema object data;
datafile:ORACLE 自动把表存在这个地方(table 不能指定到 datafile,只能指定到 tablespace)
OMF
DB_CREATE_FILE_DEST
如果设置了DB_CREATE_FILE_DEST_N: 指定镜像 到多个位置
DB_RECOVERY_FILE_DEST:闪回恢复区域
extent 管理
本地管理 :通过位图来管理
dictionary管理; 通过 Fet$,vet$ 表插入数据。 (有可能出现产生 SYS RECURSIVE SQL,影响系统功能的情况)
如果本地管理,就不会产生上面的 SYS RECURSIVE SQL
当没有指定某个用户的永久表空间时,users会被指派为默认的永久表空间。
v$tablespace 有几种形式:
大表空间:一个表空间只能有一个datafile
Extent 分配: 1>automatic 自动
2>uniform 统一大小
选择自动的 extent 分配,前面16个盘区为64KB,8*1M,?*8MB
segment 管理方式:
1>Automatic :位图块来管理
2>Manual:freelist
一般选择第一种管理方式,automatic 管理方式有更好的并发性,这种管理方式叫自动段空间管理(ASSM)
当置于某个tablespace 处于logging 模式
1>update,delete (仍产生redolog)
2>create table t1 as select * from ***; 不会产生redo
可以设定表级别的logging和unlogging,,如果不指定这个表级别 logging,则自动从tablespace级别继承是否logging。
alter tablespace offline = alter tablespace offline normal (这时会发生完全检查点,部分的完全检查点,只写回一个表空间的脏数据)
alter tablespace immediate; 不发生检查点 ,下次启动必须做将media recovery;
alter tablespace temporary;(如果能 normal down掉下来,则先做完全检查点之后再 normal down 下去(类似normal);
如果文件坏掉了,则会发生强制offline(类似immediate)
建立tablespace需要注意的情况:
建立tablespace 名字的时候,推荐不要用“”来指定文件名,否则以后都会大小写敏感了。
如果指定 reuse 参数,如果datafile名字一样,则覆盖原来的tablespace。
数据库里由字典管理的表空间,我们可以通过调用一个plsql包,通过里面的存储过程,把它变成本地的管理方式。
dba_tablespace:被存储在系统表空间,数据库位于open状态的时候才能看
v$tablespace:动态视图 ,不同状态可以看不同的内容,但没dba_tablespace内容 详细。
盘区映射图:
storage->tablespace->察看表空间内容->extent map
一个数据库理论上有最多有 65000的datafile.
ASM; File system.Volume manager ( I/O 情况下状态平衡)
(ASM instance 掉了之后 ,数据能找回来吗)
能,oracle support有这种软件,读组成 asm盘的裸盘的header,然后恢复它.把asm instance 起起来.
对一个block插入,
用户数据从下往上插入,系统数据从上往下插入。
一个库里的大表空间可以有多少? 没有限制.
权限的授予和回收:
Grant,revoke
profile的两个作用:口令管理,资源管理
sys用户system用户比较:
sys的属性:DBA ACCOUNT,ADMIN OPTION,有对DATA DICTIONARY 管理的权限,AWR报告的权限
SYSTEM:用户会拥有一些额外的工具视图.
用户: sys 拥有DBA权限,SYSDBA 权限.
system:拥有 DBA的权限.(是系统权限) SYSTEM没有权限关闭数据库,因为它仅有DBA权限.
dba与sysdba的区别:
权限:dba 角色权限是复合的
sysdba: 权限是原子的,不能分割(是系统权限)
passwd的认证方式
1>password (data dictionary 里)
2>external (OS 认证)
3>global (SSO 单点认证,)
普通用户,管理员用户
如果有操作系统帐号tsmith,在数据库中存在一个用户 OPS$tsmith,则这个用户可以直接采用操作系统登陆方式登陆.
操作系统验证优先于口令文件认证.
操作系统认证的内容:
因为ORACLE属于oinstall 成员,(sysdba)oracle可以通过操作系统命令来登陆.
通过下面命令来查看所有有sysdba权限的用户:
SQL>select * from v$pwfile_users;
可以看到默认 system没有sysdba系统权限的.
但是我们可以通过grant 命令来给system 权限.
用户权限分为 1> system系统权限(open shutdown)
2> object 对象权限(update,delete)
系统权限 的关系 : A B C 不级连 ,A 赋予B 权限D,B赋予C权限D (open shutdown)
A可以从B 拿走权限,但是不会顺带把C的权限拿走
对象权限: A B C级连
如果 A从B拿走权限d,则顺带把从c的权限拿走吧 (update,delete)
一个角色的最终权限是它所有权限的集合
版本不同:
9i和10G比,9i的connect 有了更多的connect 权限.
resource 有无限制的空间配额.
缺省角色;默认角色
SET ROLE vocationdba;
分配角色给用户
create user u1 identified by u1 quota 10m on users;
create role r1;
grant create table to r1;
grant r1 to u1;
非默认角色(事后打开)
sql>alter user u1 default role none;( u1默认角色是没有被激活的)
但用户可以自己激活这个角色.
sql>conn u1/u1
sql>set role r1;
用户的概要文件的两个作用 :1>控制文件
2>限制资源(防止黑客)
CPU 时间,连机时间,服务器控制时间
如果数据库处于共享连接模式,则 session占用的SGA,就是私有的.
在设置profile的前提是,
必须先设置 系统参数 resource_limit, alter system set resource_limit=true;
这样profile的资源限制才能生效.
不推荐用保留字,空格来做对象名.
db_link最长可以到128个字节.
""对于对象用双引号,则大小写敏感了
''日期,字符单引号
varchar2 :比varchar更加增加空间
nunmber: 数字类型
timestamp:对日期时间扩展千万分之一秒(比date 更精细)
clob:大字符串类型
Blob:照片作为数据文件存储数据,照片文件直接存入数据文件
BFILE:文件名称的引用
external table:
约束: 1>主键约束:主键列不允许有空值,重复值(主键约束=特殊的check约束)
2>unique约束,某列只能有一个
3>check约束, 比如限制员工的岁数在14-18岁之间
4>主键,外键约束
干掉部门无法干掉(必须先移除对他作了索引的外键才行)
201 页,
禁用约束(Disable Novalidate 不检查约束)数据插完之后再检查.
如果对某表有 disable validate 设置,无法对此表做DML操作.
缺省的约束是 非延时约束.
drop table hr.employees purge(不加'purge'则回到回收站,加了它就是完全删除)
只有主键列和unique列可以被作为别的表的外键.
truncate (属于ddl,每个语句作为一个独立事务隐含提交,不能加where条件,只删除表的数据,保留结构)
delete(可回滚,属于dml)
drop(删除整个表,包含表结构,是ddl语句)
drop 和truncate相比耗资源差不多,都是ddl操作.
索引包含两个内容.[key和row pointer]
两种类型的索引,位图索引和B-TREE索引
B-Tree索引的 ROWID 包括:文件名,对象名,块号,行偏移,
如果利用ROWID来查找数据,我们只需要一个 io即可操作它
位图索引:重复值比较多的情况下建议使用位图索引。(比如一个列值建立索引,它是表示颜色的,那么一种颜色就可以用一行来表示,这样,如果要查找红蓝色的所有列,则可以把它们对应的行做一个 或 的操作即可)
位图索引的缺点在于,跟新一个列就会锁定整个index表,所以位图索引只适合查询系统,(重复值比较多的查询系统)。
oracle默认对外键是不建立索引的,只有主键和唯一键才建立索引。
反键索引:
命令类似于 alter index reverse.
如果对 1001,1002,1003,1004块插入数据,这样会在索引的文件块中产生热点块,可能会拖延查询,
我们把键值翻过来之后,变成1001,2001,3001,4001,这样索引文件中各自的块会放在不同的位置。
避免了索引中热点块的出现。
反键索引的缺点在于对范围查询支持不好,(因为反键索引中对应数据不是顺序存储的) 用在等值查询则比较块。
如果此时做范围查询,则会变成全表扫描。
建立索引的语法: create index my_index on table()
这时会建立索引,默认类型是 b-tree索引。
函数索引:
建立函数索引的原因是:索引都被放在函数里,无法被使用。
例如:
create index indx1 on hr.employees(upper(last_name));
这是无法利用索引的,
为了解决这个问题,我们可以用函数索引。
视图的概念:
为了隐藏某些敏感信息,可以对某些基表的某些选项开放(敏感信息保留),建立一个视图。
如果我们对这个视图进行修改,将会直接修改下面基表对应的内容。
物化视图则是在基表 上综合数据,产生一个实际的表,对物化视图的修改不会影响基表。
224 面
序列对象:sequence 只针对当前对象来使用的
sequence current:针对当前的sequence值
sequnnce.nextval:针对全局的sequence值
for example:
create sequence s1 start with 1;(如果没写增量,则每次sequence以一来递增)
select s1.currval from dual;察看会话的当前sequence
insert into t1 values(s1.nextval,'limin');
序列对象产生后,只能保证它是唯一的,但是不能保持是连续的。
(一个会话产生一个 sequence,如果rollbak,或者掉电,这个sequence 序列号都会消失)
临时表:
临时表可以产生undo,但不会产生redo。
temp表里,发生commit之后,只会删除表里的记录,定义会保存下来。
for example:
create global temporary table t_dept as select * from departments;
这样会建立一个table ,t_dept,但是里面不会有数据。因为上面是一个完整的会话。
create global temporary table t_dept as select * from departments on commit reserve (基于会话的,只有断掉会话时才释放)
视图:
DBA_ 只有管理员才能看
ALL_ 每个人都可以看
USER_ 用户才可以看
试题:以管理员的角度,察看hr帐号下的所有表
select table_name from dba_tables where owner='HR';
for example
su - oracle
conn hr/hr
create table dept as select * from departments;
create table emp as select * from employees;
create table ** as select ** from **
建立这些表的时候只会把原表的非空约束拷贝过来,其他约束都不会拷贝过来。
练习:
通过EM建立约束:
TABLES->EDIT->TABLE->CONSTRAINTS
建立复合索引(无关键字)
建立函数索引。
create index indx1 on emp(upper(last_name));
查处emp 表有哪些索引,以及索引的类型。
select index_name,index_type from user_indexes;
DML 语言 merge= update+insert(有条件的更新)合并
oracle 事务的开始和结束:
从第一条DML语句隐含开始
事物到commit ,rollbak结束
for example:
1.select
2.insert
3.update
4.create table t1(DDL)
在执行第4个语句的时候,它会默认检查前面一个语句,如果没有发生提交,则它会产生一个隐含提交工作。
使用isqlplus的步骤:
isqlplus start
%ORACLE_HOME/install/port.lst
/5560/isqlplus
从浏览器里面浏览的方法:
edsir2p0.us.oracle.com:5560/isqlplus