suixinsuoyu 2019-12-29
标准视图
内联视图
物化视图
创建视图的语法
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'
内联视图:
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;
物化视图
语法
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 树索引
create index rs_course on registered_students(course)
位图索引
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;
数据分区技术
数据分区存储的优点
适合分区的场景
四种分区方法
create table <table_name> (column_name data type, column_name data type, ...) partition by range (column_list) (partition <partition name> values less than <value_list>, partition <partition name> values less than <value_list> );
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 );
基于散列的分区
-- 将表 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)
维护分区表
增加分区
-- 给表 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)
用户的类型
创建用户一般包括以下几个方面:
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 选项会从数据字典中删除该用户、该用户的相关模式及模式中包含的所有模式对象 -- 不能删除当前已经连接到数据库的用户
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 有两类级别的权限
部分系统级权限
-- 授予系统权限 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';
-- 查询角色 -- 预定义角色的细节可以从 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 的工具导出逻辑数据到二进制文件,在数据库恢复时导入到数据库。
备份策略
备份与恢复的方法
冷备份
热备份