视图
标准视图
- 普通视图,又称为关系视图
内联视图
- 在使用SQL语句编写查询时临时构建的一个嵌入式的视图,又称内嵌视图
物化视图
- 存储查询的结果,之前称为快照
创建视图的语法
create [or replace][force | noforce] view
[(alias[, alias]...)]
as subquery
[with check option [constraint]]
[with read only [constraint]]
创建一个只读视图
create view CS_Students
as
select ID, first_name, last_name, major, current_credits from students where major='Computer Science'
with read only
创建带 with check option 的视图
create or replace view his_classes
as
select department, course, description, max_students, current_students, num_credits, room_id from classes where department='his'
with check option
多表视图
create view class_building
as
select department, course, classes.room_id, building, room_number from classes, rooms where classes.room_id = rooms.room_id
可更新的视图
- 键保留表
- 所有可更新的列必须为键保留表中的列
- 增、删、改操作再同一时刻只能修改视图中的一个基本表
- 尽量避免在多表视图上进行更新操作
select * from user_updatable_columns where table_name='class_building'
内联视图:
- 内联视图是一种临时视图,不存储到数据字典中
- 便于执行查询
- 查询中包含临时的内联视图时,视图中的 select 语句先被执行,得到一个结果集,然后由外层查询语句查询内联视图的结果
- 一个查询可以嵌入多个内联视图
create table students(
id number(5) primary key,
first_name varchar2(20),
last_name varchar2(20),
major varchar2(30),
current_credits number(3)
);
create table registered_students(
student_id number(5) not null,
department char(3) not null,
course number(3) not null,
grade char(1),
constraint rs_grade check(grade in ('A', 'B', 'C', 'D', 'E')),
constraint rs_student_id foreign key (student_id) references students(id),
constraint rs_department_course foreign key (department, course) references classes(department, course)
);
select s.id, s.first_name, s.last_name, s.major, stu_count.totalcourse from students s,(select student_id, count(*) totalcourse from registered_students group by student_id) stu_count where s.id = stu_count.student_id;
物化视图
- 又称实体化视图
- 物化视图与普通视图的区别在于物化视图保存了查询的结果,而普通视图仅保存进行查询的 sql 语句
- 由于物化视图存储了查询的结果,频繁访问试图时,可以大幅度提升查询的性能,减少查询的时间
- 常用于数据仓库环境、复杂的汇总和聚合环境
语法
create materialized view [view_name]
referesh [fast|complete|force]
[
on [commit|demand]
start with (start_time) next (next_time)
]
[build immediate|build deferred]
as {sql statement}
比如
create materialized view mv_view
refresh force on demand
start with sysdate
next to_date(concat(to_char(sysdate+1,'dd-mm-yyy'),'22:00:00'),'dd-mm-yyyy hh24:mi:ss')
as
select * from table_name;
索引
在 Oracle 数据表中,每张表都会自动具有一个 ROWID 伪列,这个伪列由 Oracle 自动生成。用来唯一标志一条记录所在物理位置的一个 ID 号。数据一旦添加到数据库表中,ROWID 就生成并且固定了,对数据库表操作的过程中不会被改变。但是在表存储位置发生变化或者是表空间变化时,由于产生物理位置变化时,ROWID 的值才会发生改变。
索引分类
B 树索引
- Oracle 之中默认的索引就是此类型索引。一般 B 树索引再检索高基数列(该列上的重复内容较少或者没有)的时候可以提供高性能的检索操作
create index rs_course on registered_students(course)
位图索引
- 如果某一列上的数据属于低基数(Low - Cardinality)列的时候可以利用位图索引来提升查询的性能。
- 为索引列的每个取值创建一个位图(bit 位),对表中的每行使用 1 位(取值为 0 或 1) 来表示该行是否包含该位图的索引列的取值。
create bitmap index rs_department on registered_students(department)
函数索引
- 索引的取值不直接来自列,而是来自包含有列的函数或表达式
CREATE TABLE classes (
department CHAR(3),
course NUMBER(3),
description VARCHAR2(2000),
max_students NUMBER(3),
current_students NUMBER(3),
num_credits NUMBER(1),
room_id NUMBER(5),
CONSTRAINT classes_department_course
PRIMARY KEY (department, course),
CONSTRAINT classes_room_id
FOREIGN KEY (room_id) REFERENCES rooms (room_id)
);
create index cla_stu on classes(max_students - current_students);
set AUTOTRACE TRACEONLY EXPLAIN;
select * from classes where max_students-current_students>20;
查询索引
select * from user_indexes;
数据分区
数据分区技术
- 分数是指把一张表或索引划分为若干小块
- 各个分区必须具有相同的逻辑属性,但是可以有不同的物理属性
- 在创建表的结构时应考虑好分区方案,选择表中的某一列或多列数据作为分区关键字
- 分区关键字中包含的列的数据类型可以为 number、date、varchar2、char
- oracle 对分区进行管理,新插入的数据自动存储到对应的分区
数据分区存储的优点
- 由于数据分区,硬件故障只影响局部数据
- 提高数据查询速度,可只对特定分区查询
- 提供了对大型数据库的数据分散管理能力
- 对于表的所有操作均适应于分区表的每个分区
- DBA 可以定于每个分区的属性
- DBA 可以操作表空间,控制分区的数据可用性
- 可以将分区分离或合并,以平衡 I/O
适合分区的场景
- 表的大小超过 2GB
- 表中包含历史数据,新的数据被增加到新的分区中
四种分区方法
- 基于范围的分区
- 分区关键字可为多列
- 所插入的数据自动分配到相应分区
- 所插数据不得大于 less than 中的最大值
- 可以使用 maxvalue
- 在分区表中不能包含 LONG、LOB 和对象列类型
- 聚集表不能分区
- 可以为每个分区指定表空间。不指定表空间时,则使用该用户的默认表空间
create table
(column_name data type, column_name data type, ...)
partition by range (column_list)
(partition values less than ,
partition values less than
);
RS_audit表用来记录对registered_students表所进行的修改。假如为了提高查询的速度,DBA将2018年上半年与下半年的记录分别存放在分区ts1和ts2中。
create table rs_audit(
change_type char(1) not null,
...
)
partition by range(timestamp)
(partition rsaudit_201301
values less than (to_date('20180701', 'YYYYMMDD'))
tablespace ts1,
partition rsaudit_201302
values less than (to_date('20190101', 'YYYYMMDD'))
tablespace ts2
);
基于散列的分区
- 根据散列函数来计算某条记录应插入到哪个分区中
- 使用散列分区,只需指定分区的数量 n 即可
- 或者对散列分区进行名,并将其存储在待定的表空间中
-- 将表 students 中的记录分别存储在4个分区中 create table students( id number(5) primary key, first_name varchar2(20), last_name varchar2(20), major varchar2(30), current_credits number(3) ) partition by hash(id) partitions 4 store in (stu1, stu2, stu3, stu4);
create table hash_table ( col number(8), inf varchar2(100) ) partition by hash(col) ( partition part01 tablespace hash_ts01, partition part02 tablespace hash_ts02, partition part03 tablespace hash_ts03 )
基于列表的分区
- 通过建立离散的值列表告诉数据库特定的值属于哪一个分区
- 分区关键字只能为单列
-- 把学生基本信息表 student 按照专业 major 的不同取值进行分区 create table students ( id NUMBER(5) PRIMARY KEY, first_name VARCHAR2(20), last_name VARCHAR2(20), major VARCHAR2(30), current_credits NUMBER(3) ) PARTITION BY LIST (major) ( PARTITION engineering VALUES ('Computer Science', 'Chemistry', 'Mechanics'), PARTITION history VALUES (' History ', ' Economics '), PARTITION music VALUES ('Music'), PARTITION nutrition VALUES ('Nutrition'));
组合分区
- 组合分区是一种混合分区模式
- 可分为两种:
- 范围-散列组合分区
- 范围-列表组合分区
- 组合分区首先对表进行范围分区,然后用散列或列表分区技术对每个范围分区再次分区。
-- 将rooms表首先按照教室编号room_id进行范围分区,编号30000以下的在一个分区,编号在30000以上、60000以下的在一个分区,编号大于60000的在一个分区。然后再把每个分区按照座位数量分为两个子hash分区。 CREATE TABLE rooms ( room_id NUMBER(5) PRIMARY KEY, building VARCHAR2(15), room_number NUMBER(4), number_seats NUMBER(4), description VARCHAR2(50) ) PARTITION BY RANGE (room_id) SUBPARTITION BY HASH (number_seats) SUBPARTITIONS 2 (PARTITION rooms_1 VALUES LESS THAN (30000), PARTITION rooms_2 VALUES LESS THAN (60000), PARTITION rooms_3 VALUES LESS THAN (maxvalue));
查询分区表
- 在分区表中插入记录时,记录基于指定的分区键,与预先定义的分区边界进行比较,从而被分配到表的分区中
- 对分区表进行查询时,可以针对整张表进行查询,也可以对某个分区进行查询
select * from students
select * from students partition(history)
select * from students partition(history) ss where ss.current_credits=12
复制表的分区,即把表的某个分区复制到另一张表中
create table music_students as select * from students partition(music)
维护分区表
增加分区
- 分区需加载最后一个分区高值之后
- 使用 maxvalue 时,该表不可增加分区
-- 给表 rs_audit 增加一个分区 alter table rs_audit add partition rsaudit_201401 values less than (to_date('20140701', 'YYYYMMDD')) tablespace ts3; --将分区 rsaudit_201301 删掉 alter table rs_audit drop partition rsaudit_201301
修改分区
- 可以对分区重新命名
- 可以修改分区的存储参数
-- 将表 rooms 的分区 rooms_1 改名为 rooms_30000 alter table rooms rename partition rooms_1 to rooms_30000
移动分区数据
-- 将分区 rasudit_201302 中的数据移动到表中间 bak_201302 上
alter table rs_audit move partition rsaudit_201302 tablespace bak_201302
- 分区拆分
-- 将表rooms的分区rooms_2拆为两个分区,将room_id在30000至45000之间的记录划分到分区rooms_21中,room_id在45000至60000之间的记录划分到分区rooms_22中
alter table rooms split partition rooms_2 at (45000) into (partition rooms_21, partition rooms_22)
用户
oracle 用户
用户的类型
- 超级用户
- 创建新的数据库
- 启动和关闭数据库
- 修改数据库运行模式
- 完成数据库的备份与恢复
- 修改数据库的结构
- 创建用户、权限管理等
- 数据库管理员
- 具有 DBA 角色的用户,可以执行数据库内部的任意操作
- 其它用户
- 可以进行数据库开发、创建任何实体
创建用户一般包括以下几个方面:
- 用户名
- 验证方式
- 指定默认表空间
- 用户创建模式对象时,如果没有指明表空间,那么对象在缺省表空间中创建
- 分配表空间限额
- 决定用户在每个表空间中可以使用的最大尺寸
- 指定临时表空间
- 为有要求磁盘空间作排序或数据汇总的 sql 语句提供存储空间
- 指定环境资源文件
- 通过 profile 文件指明 CPU 时间、逻辑读个数、每个用户勇士可连接对话个数、一个对话的空闲时间
- 设置默认角色
create user user_name identified by passward
[default tablespace 表空间名]
[temporary tablespace 表空间名]
[quota [整数][unlimited] on 表空间名]
[profile 环境文件名]
create user ITryagain
identified by 123456
default tablespace data_ts
temporary tablespace data_ts
quota 10M on data_ts
quota 20M on system
profile pITryagain;
查看表空间
-- 查看系统默认表空间
select property_value from database_properties where property_name='default_permanent_tablespace'
-- 查看用户表空间
select default_tablespace, temporaty_tablespace from dba_users where username='C##ITRYAGAIN'
修改用户
-- 将用户 ITryagain 的密码更改为 T#0908,在 data_ts 表空间中分配50M空间,并取消在 SYSTEM 中的表空间。
alter user ITryagain
identified by T#0908
default tablespace data_ts
temporary tablespace temp_ts
quota 50M on data_ts
quota 0M on system
profile pITryagain;
删除用户
drop user user_name [cascade]
-- 使用 cascade 选项会从数据字典中删除该用户、该用户的相关模式及模式中包含的所有模式对象
-- 不能删除当前已经连接到数据库的用户
资源管理
- profile 是一个规定了资源限度的数据库实体,它可以限制一个单独的调用或整个会话所需要的资源
- 当一个环境资源被分配给一个用户时,它在该用户上实施这些限制
create profile profile_name limit limit(s) range
create profile pITryagain limit FAILED_LOGIN_ATTEMPTS 3
常用限制的名称及含义
-- 查询 profile 文件
select profile, resource_name, limit from dba_profiles prder by profile
select * from dba_profiles where profile='DEFAULT'
-- 修改 profile 文件
-- 资源文件一旦建立,可以分配个数据库用户
-- 一个环境资源文件可以分配给多个用户,但一个用户在任何时候都只有一个环境资源文件
-- 环境资源文件一旦建立,可以使用 alter profile 命令来修改参数
alter profile pITryagain limit
PASSWORD_REUSE_TIME 7
IDLE_TIME 20
-- 删除 profile 文件
-- 具有系统权限 drop profile 的用户可以通过语句 drop profile 删除环境资源文件
-- cascade 选项表示撤销文件的分配,使用该选项可以删除当前分配给用户的环境资源文件
drop profile profile_name [cascade]
权限
oracle 有两类级别的权限
- 系统级权限
- 即在系统级别上执行特定动作的权限,例如,连接数据库、在数据库中创建表空间和创建用户都属于系统级权限。在 oracle 中定义了100多种系统级权限。
- 对象级权限
- 值某个用户可以访问其它用户对象的权限,即在各种模式对象上,如表、视图、序列、过程、函数或包上执行特定动作的权限。不同类型的对象也具有不同的权限种类。
部分系统级权限
-- 授予系统权限
grant [系统级权限名][角色] to [用户名][角色][public][with admin option]
grant create session to ITryagain with admin option;
-- 撤销系统权限
revoke [系统级权限名][角色] from [用户名][角色][public][with admin option]
revoke create session from ITryagain;
-- 查看系统权限
-- 数据库管理员可以使用 dba_sys_privs 数据字典视图产看所有系统权限的授权信息
-- 用户也可以使用 user_sys_privs 数据字典视图查看自己具有的系统权限
-- 以用户 ITryagain 身份登录
select * from user_sys_privs;
对象级权限
-- 授予对象权限
grant select on students to ITryagain
grant ALL on students to ITryagain
grant update(number_seats) on rooms to ITryagain
-- 查看对象权限
-- 用户可以通过查询 user_tab_privs dba_tab_privs 等数据字典视图查看童虎的对象权限信息
select table_name, priviege from dba_tab_privs where grantee='ITRYAGAIN';
角色
- 角色是一个已命名的权限集合,使用角色可以将这个集合中的权限同时授予或撤销
- 一个角色可以组合多个权限和角色
- 角色可以分为预定义角色和自定义角色两类
- 常用的系统预定义角色
- connect
- resource
- dba
-- 查询角色
-- 预定义角色的细节可以从 dba_sys_privs 数据字典视图中查询到
select * from dba_sys_privs where grantee='connect'
select * from dba_sys_privs where grantee='resource'
-- 创建自定以角色
create role 角色名 [not identified] [identified [by 口令][externally]]
create role ITryagain
-- identified by 字句说明了在位一个已经被授予该角色的用户启用角色之前进行验证时使用的口令
-- 删除角色
-- 删除角色时,并不会删除分配了这个角色的用户
drop role role_name
-- 授予角色权限
-- 新创建的角色没有任何相关的权限,为使一个新角色与权限相关联,必须给该角色授予权限或其他角色
-- 在同一个 grant 语句中,不能将系统权限和对象权限一起授予
grant create table, create view to ITryagain
-- 给用户指派角色
-- 一个角色可以指派多个用户,一个用户也可以具有多个橘色
-- 当把角色指派给用户时,赋予该角色的权限也自动分配给用户
grant create procedure, create trigger, ITryagain to user1;
-- 撤销用户角色
revoke ITryagain from user1;
查看角色信息
备份与恢复
数据库故障分类
- 事务内部故障
- 可预期
- 不可预期
- 系统故障
- 指造成系统停止运转的任何时间,使得系统要重新启动
- 影响正在运行的所有事务,但不破坏数据库
- 介质故障
- 指外存故障
- 将破坏数据库或部分数据库,并影响正在读取这部分数据的所有事务
备份
备份包括物理备份
和逻辑备份
物理备份:数据库文件拷贝的备份,用来备份组成数据库的物理文件,这些文件包含数据文件、控制文件和归档重做日志文件等。物理备份就是在其它的位置存放数据库物理文件的部分,比如脱机的磁盘或磁带备份。分为冷备份和热备份。
逻辑备份:值备份数据库中的逻辑数据,比如表或存储过程,可以使用 oracle 的工具导出逻辑数据到二进制文件,在数据库恢复时导入到数据库。
备份策略
- 使用大容量磁盘阵列,通过磁盘映像技术使每一个数据库文件自动分布于每个物理磁盘
- 使用双服务器,在另一个服务器上保留备份数据库
- 在多个不同的物理磁盘上保持多个控制文件的备份
- 尽量使数据库运行在归档方式下
- 每晚进行一次练级备份操作,备份所有数据文件、所有归档日志文件、一个控制文件
- 每周进行依次输出(Export)操作
备份与恢复的方法
- 物理备份
- 使用 RMAN 恢复管理器进行备份和恢复:RMAN 是 oracle 内置的备份恢复程序,无需额外安装,通常以命令行方式使用
- 手工进行备份与恢复:这种方式是使用操作系统命令对数据库文件进行备份与恢复
- 逻辑备份
- 可以备份重要的数据,并实现在不同操作系统或不同的 oracle 版本之间的数据传输
冷备份
- 冷备份也称脱机备份,是指数据库关闭时的物理备份,步骤为
- 编写一个要备份的数据库文件列表
- 用 shutdown 命令正常关闭 oracle 例程
- 用操作系统的备份工具,备份所有的数据文件、日志文件、控制文件、文本参数文件 pfile、服务器参数文件 spfile
- 重启 oracle 历程
热备份
- 也称联机备份,是在数据库运行时的物理备份
- 热备份要求数据库在归档模式下操作
- 在备份一个数据文件之前,要将它所在的表空间设置为备份模式,备份完成之后,再将表空间恢复为正常状态。
- 步骤为
- 逐个备份表空间中的数据文件
- 设置表空间为备份状态
- 备份表空间的数据文件
- 恢复表空间为正常状态
- 备份归档重做日志文件
- 强制日志切换
- 备份归档的重做日志文件
- 备份控制文件
- 逐个备份表空间中的数据文件
故障恢复
- 事务内部故障,其恢复是由系统自动完成的
- 系统故障的恢复是由系统在重复启动时自动完成的
- 介质故障的恢复方法是重装数据库,然后重做已完成的事务,介质故障的恢复通常需要管理员人工干预
- oracle 数据库的恢复过程分两步进行,首先将存放在重做日志文件中的所有数据库更新操作 REDO 到数据文件,之后对所有未提交的事务进行回滚
- 数据库的恢复只能在发生故障之前的数据文件上进行重做(REDO)