ORACLE 10G OCP DBA II 学习记录



------------------------L1 ORACLE数据库体系架构

ORACLE DATABASE 10G为网格计算设计的数据库
--自动存储管理
--可移植集群件
--REAL APPLICATION CLUSTERS和自动工作量管理
--资源管理器
--ORACLE STREAMS
--使用ORACLE ENTERPRISE MANAGER GRID CONTROL进行集中管理
--ORACLE DATABASE 10G新增的自我管理功能

数据库体系结构:概述
---内存结构
-系统全局区SGA
共享池,流池,大型池,JAVA池,数据库缓冲区高速缓存,重做日志缓冲区
-程序全局区PGA

---进程结构
-用户进程
-服务器进程
-后台进程
系统监视器--SMON
进程监视器--PMON
数据库写进程--DBWn
检查点--CKPT
日志写进程--LGWR
归档程序--ARCn

---存储结构
-逻辑结构
数据库,方案,表空间,段,区,ORACLE块

-物理结构
控制文件
数据文件
联机重做日志文件
参数文件
备份文件
归档日志文件
口令文件
预警和跟踪日志文件

--概述ORACLE实例管理
1.启动数据库实例
2.用户进程建立连接
3.服务器进程建立连接
4.用户更新了某一行数据
5.服务器接收该语句,查看BUFFER CACHE中是否有该语句的数据
6.如果没有,为语句分配一个共享区,并从数据库中获取数据
7.将数据放入共享缓冲区
8.写入重做日志文件
9.将数据写入数据文件

ORACLE MANAGERD FILES(OMF)
按照数据库对象而不是文件名指定文件操作
参数                说明
DB_CREATE_FILE_DEST        定义数据文件和临时文件默认文件系统目录的位置
DB_CREATE_ONLINE_LOG_DEST_n    定义重做日志文件和控制文件的创建位置
DB_RECOVERY_FILE_DEST        定义RMAN备份的位置

ALTER SYSTEM SET DB_CREATE_FILE_DEST='/u01/oradata';
CREATE TABLESPACE tbs_1;

逻辑和物理数据库结构
逻辑            物理
数据库            
方案--表空间        数据文件


ORACLE数据块        操作系统块



-----------------------L2 配置ORACLE RECOVERY MANAGER

备份和恢复:概述
"数据库管理|课程"中包含的与备份和恢复相关的主题主要有
--可能发生的故障类型
-语句,会话,实例,介质等
--如何配置ARCHIVELOG模式
--如何自动执行备份
--如何进行增量备份
--如何执行和优化实例恢复

RMAN为执行以下操作提供了一种灵活的方式
--备份数据库,包括数据文件,控制文件和归档重做文件,SPFILE
--管理备份和恢复任务
--执行增量块级备份和块级介质恢复
--在备份过程中检测损坏的块 V$BACKUP_CURRUPTION
--创建备份时使用二进制压缩

使用catlog数据库
不会产生更多的日志
可以备份到磁带机
支持并行的备份和恢复

通道
磁盘,快速恢复区,MML介质管理层(磁带)

配置RMAN的步骤
1.确定资料档案库的位置:控制文件和恢复目录
2.定义数据库和环境变量
3.启动RMAN并连接到目标数据库或恢复目录数据库
4.配置永久性设置


RMAN资料档案库数据存储:选项比较

控制文件
--管理较简单
--默认选项

恢复目录
--复制控制文件数据
--空间可存储更多的数据
--可服务于许多目标
--可存储RMAN脚本

set oracle_sid=catdb
sqlplus /nolog
conn / as sysdba
grant dba to rman identified by rman

grant recovery_catalog_owner to rman
rman catalog ramn/rman
create catalog tablespace users
exit

set oracle_sid=myoracle
rman target / catalog rman/rman@catdb

register database;
--恢复目录建立完成

同步控制文件信息到恢复目录数据库中

DB_RECOVERY_FILE_DEST='/u01/oracle/fra'
DB_RECOVERY_FILE_DEST_SIZE=2G

sqlplus
conn / as sysdba
show parameter db_recovery

rman target /
backup datafile 4;

使用EM监视快速恢复区

快速恢复区空间使用情况
--将保留策略配置为适合数据库的最小值
--定期备份归档日志文件,并在完成备份后删除这些文件
--使用RMAN REPORT OBSOLETE和DELETE OBSOLETE命令删除不再需要的备份和文件副本

show all

desc

select file_type,percent_space_used as used,
percent_space_reclainmable as reclainmable,
number_of_files as number
from v$flash_recovery_area_usage;

set oracle_sid=myoracle
rman target /
crosscheck backupset;

delete expired backupset;

使用快速恢复区的好处
对与恢复相关的文件使用快速恢复区
--可简化数据库备份的位置
--可自动管理为恢复文件分配的磁盘空间
--不需要更改现有的脚本
--可将数据库备份、归档日志和控制文件备份均放入快速恢复区

设置影响RMAN的参数
--CONTROL_FILE_RECORD_KEEP_TIME
--DB_RECOVERY_FILE_DEST
  DB_RECOVERY_FILE_DEST_SIZE

--NLS_DATE_FORMAT
--NLS_LANG

set NLS_DATE_FORMAT=yyyy-mm-dd

RMAN使用注意事项
资源:共享内存,多进程
授予用户的权限
--数据库:SYSDBA
--操作系统:访问设备的权限
远程操作
--设置口令文件
--确保口令文件已备份

UNIX:oracle_sid=db01;export=db01
rman target /

WINDOWS:set oracle_sid=db01
rman target /

远程启动RMAN
rman target sys/gull@myoracle

--将RMAN输出写入日志文件
rman targrt sys/oracle
log=$HOME/oradata/u03/rman.log.APPEND
--调用RMAN执行命令文件
rman target sys/oracle
CMDFILE=$HOME/scripts/my_rman_script.rcv
--启动RMAN时建立数据库连接
rman target sys/sys_pwd@orac catalog
rman/rman@rcat

rman target / log=c:\aa.log
backup datafile 4;

配置RMAN的永久性设置
--RMAN预设有一些默认的配置设置
--使用CONFIGURE命令可以:
-配置自动通道
-指定备份保留策略
-指定要创建的备份副本数
-将默认备份类型类型设置为BACKUPSET或COPY
-限制备份集的大小
-从备份中免除某个表空间
-启用和禁用备份优化
-配置控制文件的自动备份

configure retention policy to redundancy 2;
configure controlfile autobackup on;

configure controlfile autobackup clear;

保留策略
--保留策略描述哪些备份将被保留以及保留时间
--有以下两种类型的保留策略
-恢复窗口:建立一个时间段,在该时段内必须可以进行时间点恢复
-冗余:建立必须保留的固定数量的备份
--这些策略互相排斥,并且都可以使用CONFIGURE命令进行设置

show all;
show exclude;
show encryption for database;
show controlfile autobackup format;

run{
allocate channel t1 device type sbt;}

run{
allocate channel t1 device type disk;}

手动通道和自动通道分配
--自动通道是预配置的通道,用于后续命令。要更改自动通道分配的默认设备类型:可使用
configure default device type to sbt
--手动分配的通道是可覆盖自动通道的通道,对于以下运行块,该通道将覆盖自动通道
run{
allocate channel c1 device type disk;
backup datafile '/u01/oradata/user01.dbf';
}

--配置并行度
configure device type disk parallelism 3;
--指定备份片段大小的最大值
configure channel device type disk
maxpiecesize 2g;
--定义所生成备份文件的名称格式
run{
allocate channel d1 device type disk
format '/disk1/backups/%U';
backup database plus archivelog;
}





-----------------------------L3

发出ORACLE RECOVREY MANAGER 命令
--交互式客户机
-在RMAN提示符下输入命令
-执行分析时或运行报告或存储脚本时使用
--批处理模式
-与自动作业配合使用
-启动RMAN时指定命令文件
-指定日志文件名来捕获会话日志
--管道接口
-指定PIPE命令行参数
-用于在会话之间或在RMAN与外部应用程序之间传递数据

run{
allocate chanel c1 device type disk;
backup datafile 4;
}

RMAN命令的类型
RMAN命令包含以下类型
--独立命令
在RMAN提示符下单独执行
不能为RUN内的子命令
--作业命令
必须位于RUN命令的大括号内
以组的形式执行
一些命令级可以作为独立命令执行,也可以作为作业命令执行

作业命令:示例
作业命令显示在RUN命令块内:
RUN{
BACKUP AS BACKUPSET --按照备份集来备份
FORMAT '/u01/db01/backup/%d_%s_%p' --指定备份路径和名字%d数据库名字,%s备份集名字,%p备份片
DURAYION 10:00 MINIMIZE LOAD --时间限制,以最小负载运行
(DATABASE)
SQL 'alter system archive log current'; --内嵌SQL语句
}

--备份约束条件
数据库必须已装载或打开
不能备份联机重做日志
在NOARCHIVELOG模式下仅可使用"干净"备份
在ARCHIVELOG模式下仅可使用"当前"数据文件备份


并行备份集
为提高性能,分配多个通道并将文件分配给特定通道
数据文件1,数据文件2,数据文件3---------通道MML-----------备份片段1

RUN{
ALLOCATE CHANEL C1 DEVICE TYPE DISK;
ALLOCATE CHANEL C2 DEVICE TYPE DISK;
BACKUP DATABASE FORMAT 'd:\db_%U.bak'
(datafile 1,4 chanel c1)
(datafile 2,3 chanel c1);
}

压缩备份
BACKUP AS
COMPRESSED BACKUPSET DATAFILE 4;

BACKUP AS
COMPRESSED BACKUPSET DATAFILE 4 FORMAT 'D:\DB4.BAK';

configure device type disk parallelism 1 backup type to  compressed backupset;

映像副本
BACKUP AS COPY
DATAFILE '/ORADATA/users_01_db01.dbf'
FORMAT '/BACKUP/users01.dbf';

BACKUP AS COPY
ARCHIVELOG LIKE 'arch)1060.arc'
FORMAT 'arch_1060.bak';

--配置压缩的备份
configure device type disk parallelism 1 type to compressed backupset;


备份和影响副本的标记
标记是分配给备份集和映像副本的逻辑名
month_full_backup
week_full_backup

BACKUP命令选项
--检查物理块损坏
--扫描逻辑损坏和物理损坏
--对中止前所允许检测到的损坏数量设置阈值
--执行备份操作前验证目标输入文件
--对备份集进行双重备份
--覆盖现有备份集或映像文件
--将对存储设备与磁盘上数据文件之间数据传输的控制传递给介质管理层
--加密备份文件

RMAN备份类型
--完全备份包含所有使用的数据文件块
--级别为0的增量备份相当于已标记为级别0的完全备份
--级别为1的累积增量备份仅包含自上次级别为0的增量备份以来修改的块
--级别为1的差异增量备份仅包含自上次增量备份以来修改的块

差异与积累
--差异增量备份包含自上次增量备份以来更改的所有块
--累积增量备份包含自上次级别为0的增量备份以来更改的所有块

backup datafile 4; 完全备份
backup incremental level 0 datafile 4; 0级增量备份
backup incremental level 1 datafile 4;1级增量备份
backup incremental level 0 cumulative datafile 4; 累计增量备份


块更改跟踪
启用块更改跟踪可简化备份过程,其可以:
--在更改跟踪文件中记录更改的块
--由RMAN自动使用(如果启用此选项)
--通过避免备份过程中的完全数据文件扫描来优化增量备份
sqlplus / as sysdba;
alter dtaabase enable block change tracking using 'd:\users01.dbf';

LIST命令
--列出数据文件的备份集和副本
LIST BACKUP OF DATABASE;
LIST BACKUP OF DATAFILE "/db01/ORADATA/u03/users01.dbf";
--列出指定表空间的任何数据文件的备份集和副本
LIST COPY OF TABLESPACE "SYSTEM";
--列出包含指定范围的归档日志的备份集和副本
LIST COPY OF DATABASE ARCHIVELOG FROM TIME 'SYSDATE-7'


REPORT命令
--生成资料档案库的详细分析
--生成报告以回答以下问题
数据库中包含哪些数据文件
哪些文件需要备份
哪些备份可以删除
哪些文件不可恢复

REPPRT NEED BACKUP命令
--列出需要备份的所有数据文件
--假设还原过程中使用最新的备份
--提供四个选项
增量
天数
冗余
恢复窗口
--如果未指定选项则使用当前保留策略配置

REPPRT NEED BACKUP:示例
--需要三个以上增量备份以进行恢复的文件:
REPORT NEED BACKUP INCREMENTAL 3;
--三天以来尚未备份的文件
REPORT NEED BACKUP DAYS 3;
--如果不具备两个或更多个备份则需要进行备份
REPORT NEED BACKUP redundancy 2;
--需要进行备份以恢复到三天前的数据状态
REPORT NEED BACKUP recovery window of 3 days;

REPORT OBSOLETE和DELETE OBSOLETE
--查找根据当前保留策略设置应视为作为的所有恢复文件
REPORT OBSOLETE;
--如果需要备份不多于两个,列出作废的恢复文件
REPORT OBSOLETE REDUNDANCY 2;
--删除备份集键为4的备份集
DELETE BACKUPSET 4;
--删除由于已存在两个以上的备份而视为作为的恢复文件
DELETE OBSOLETE REDUNDANCY 2;


RMAN动态视图
V$ARCHIVED_LOG
V$BACKUP_CURRUPTION
V$BACKUP_DEVICE
V$BACKUP_FILES
V$BACKUP_PIECE
V$BACKUP_REDOLOG
V$BACKUP_SET
V$BACKUP_SPFILE
V$COPY_CORRUPTION
V$RMAN_CONFIGURATION

监视RMAN备份
--使用SET COMMAND ID 命令将服务器会话与通道相关联
--查询V$PROCESS和V$SESSION以确定会话与RMAN通道的对应关系
--查询V$SESSION_LONGOPS以监视备份和副本的进度
使用操作系统使用程序监视进程和线程


------------------------L4 恢复非关键性丢失

文件丢失的原因
--用户错误
--应用程序故障
--介质故障

关键性与非关键性
发生非关键性文件丢失时,数据库仍可继续运行
可通过采取以下措施之一来修复该问题
--创建一个新文件
--重建文件
--恢复丢失或损坏的文件

丢失TEMPFILE
如果丢失任何一个临时文件,则需要TEMP空间来执行的SQL语句都将失败
create temporary tablespace temp2 tempfile='d:\temp2.dbf' size 10M;
alter database default temporary tablespace temp2;

日志组状态:概述
在任何给定事件,重做日志组都会是以下值之一:
--CURRENT:LGWR进程当前正在向重做日志组写入重做数据
--ACTIVE:不再向重做日志组写入数据,但是仍需要它来进行实例恢复
--INACTIVE:不再向重做日志组写入数据,且不再需要它来进行实例恢复.

丢失重做日志组成员
丢失重做日志文件时,预警日志和归档进程ARCn跟踪文件将记录一条错误消息

重新创建重做日志文件
ALTER DATABASE DROP LOGFILE MEMBER
'/u01/app/oracle/oradata/orcl/redo02b.log'

!rm /u01/app/oracle/oradata/orcl/redo02b.log

ALTER DATABASE ADD LOGFILE MENBER
'/u01/app/oracle/oradata/orcl/redo02b.log'
TO GROUP 2;

重新创建索引
使用以下选项缩短创建索引所花费的时间:
--PARALLEL
--NOLOGGING

CREATE INDEX rname_idx
ON hr.regions(region_name)
PARALLEL 4 nologing;

alter INDEX rname_idx
rebuild online
PARALLEL 4 nologing;

数据库管理员的验证方法
远程数据库管理            本地数据库管理
是否具有安全连接--------是------是否希望使用OS验证------是    使用OS验证
    |---------------否        |---------------否    使用口令文件


重新创建口令验证文件
1.使用OS验证登录到数据库
2.将REMOTE_LOGIN_PASSWORDFILE参数设置为NONE并重新启动数据库
3.使用orapwd重新创建口令文件
$ orapwd file=$ORACLE_HOME/dbs/orapwORCL
  password=admin entries=5
4.将REMOTE_LOGIN_PASSWORDFILE设置为EXCLUSIVE
5.向口令文件添加用户并向每隔用户分配适当的权限
6.重新启动实例
show parameter remote
alter system set remote_login_passwordfile=none scope=spfile

orapwd file=e:\oracle\database\10.2.0\db_01\database\pwdocp password=admin entries=5;


-------------------L5 数据库恢复

两种执行恢复的方法
--用户管理的恢复
必须收到维护文件并将其移动到位
使用SQL*PLUS命令
--RMAN恢复
自动管理文件
使用RMAN功能,包括所有资料档案库维护和报告功能
可以通过ORACLE ENTERPRISE MANAGER来完成
ORACLE CORPORATIONN建议使用此方法

用户管理的恢复:RECOVER 命令
--从备份还原所有数据库文件,然后恢复数据库:
RECOVER DATABASE
--从备份还原损坏的数据文件,然后恢复数据文件
RECOVER TABLESPACE index_tbs
RECOVER DATAFILE '/oradata/indx01.dbf'

RMAN恢复:RESTORE和RECOVER命令
run{
sql "ALTER TABLESPACE inv_tbs OFFLINE IMMEDIATE";
    RESTORE TABLESPACE inv_tbs;
    RECOVER TABLESPACE inv_tbs DELETE ARCHIVELOG;
    sql "ALTER TABLESPACE inv_tbs ONLINE";
}


完全恢复与不完全恢复
恢复可分为以下两类
--完全恢复是将数据库恢复到当前最新状态,包括直至请求恢复时进行的所有数据更改.
--不完全恢复是将数据库恢复到请求恢复操作之前的指定的过去时间点.

--完全恢复
1.还原的数据文件
2.应用更改
3.数据文件包含已提交和未提交的事务处理
4.打开数据库
5.应用还原
6.恢复的数据文件

--不完全恢复
1.还原的数据文件(自所需的过去时间点开始)
2.应用更改直至时间点(PIT)
3.数据文件包含直至PIT的已提交和未提交的事务处理
4.打开数据库
5.应用还原
6.PIT恢复的数据文件

需要不完全恢复的情况
--完全恢复由于归档日志文件丢失而失败
--丢失了数据文件和一个或多个未归档重做日志文件
--使用控制文件的备份打开或恢复数据库

不完全恢复的类型
不完全恢复有以下四种类型:
--基于时间的恢复 指定恢复的时间点
--基于取消的恢复 恢复过程中输入cancle取消恢复
--基于更改的恢复
--日志序列恢复   

执行用户管理的不完全恢复
--将数据库恢复到某一时刻:
RECOVER DATABASE UNTIL TIME '2005-12-14 12:10:03';
--恢复数据库直到取消操作
RECOVER DATABASE UNTIL CANCAL;
--使用备份控制文件进行恢复
RECOVER DATABASE UNTIL TIME '2005-12-14 12:10:03'
USING BACKUP CONTROLFILE;

要执行用户管理的不完全恢复请按以下步骤进行操作:
1.关闭数据库
2.还原数据文件
3.装载数据库
4.恢复数据库
5.使用RESETLOGS选项打开数据库

用户管理的基于时间的恢复:示例
--情况如下--某个作业出错,必须取消其结果和影响
--该操作发生在15分钟前,并且在此之后数据库活动很少。
--您决定执行不完全恢复,将数据库还原到15分钟前的状态

SHUTDOWN IMMEDIATE
$ cp /BACKUP/* /u01/db01/ORADATA

STARTUP MOUNT
RECOVER DATABASE UNTIL TIME '2005-11-14 10:10:03';
ALTER DATABASE OPEN RESETLOGS;

用户管理的基于取消的恢复:示例
按以下步骤恢复数据库
1.关闭数据库
2.从最新备份还原所有数据文件
3.已经具有了有效,所以可以装载数据库
4.执行RECOVER DATABASE UNTIL CANCEL
5.执行ALTER DATABASE OPEN RESETLOGS以打开数据库


使用RMAN执行不完全恢复
1.装载数据库
2.分配多个通道以并行执行操作
3.还原所有数据文件
4.使用UNTIL TIME,UNTIL SEQUENCE或UNTIL SCN恢复数据库
5.使用RESETLOGS打开数据库


使用RMAN的基于时间的恢复:示例
RUN{
SET UNTIL TIME='2005-11-14 10:10:03';
RESTORE DATABASE;
RECOVER DATABASE;
ALTER DATABASE OPEN RESETLOGS;
}

select current_scn from v$database
startup mount
run{
set until scn 1621104;
restore database;
recover database;
alter database open resetlogs;
}
使用RMAN的基于日志序列恢复:示例
RUN{
SET UNTIL SEQUENCE=120 THREAD 1;
ALTER DATABSE MOUNT;
RESTORE DATABASE;
RECOVER DATABASE; #recovers through log 119
ALTER DATABASE OPEN RESETLOGS;
}


不完全恢复和预警日志
下面是在不完全恢复的情况下,有关预警日志的一些最佳方案:
--检查前后检测预警日志
--查找错误信息,提示和SCN
--确认过程中的个步骤都已成功完成


还原点
--用作SCN或特定事件点的别名
--存储在控制文件中
--可以与以下各项配合使用
RECOVER DATABASE
FLASHBACK DATABASE
FLASHBACK TABLE

1.SQL> CREATE RESTORE POINT before_load;
2.RMAN> RECOVER DATABASE UNTIL RESTORE POINT before_load;


不完全恢复:最佳方案
--提前计划和实践方案
--研究并确认不完全恢复是必要的
--认真执行所有步骤
--恢复后对整个数据库进行备份
--始终验证恢复是否已成功完成
--使用还原点


恢复控制文件自动备份
RMAN> RESTORE CONTROLFILE TO '/oradata/ctlfile.bak' FROM AUTOBACKUP;

RECOVER DATABASE;
ALTER DATABASE OPEN RESETLOGS;
ALTER TABLESPACE temp ADD TEMPFILE;

ALTER DATABASE BACKUP CONTROLFILE TO TRACE;


恢复只读表空间

用于恢复的控制文件备份(如果当前控制文件丢失)





------------------------------L6 闪回

闪回技术:查看
对象层        情况示例            闪回技术    使用        影响数据
数据库        截断表:执行了不必要的多表更改    数据库        闪回日志    TRUE
表        删除表                删除        回收站        TRUE
        使用错误的WHERE子句进行更新    表        还原数据    TRUE
        对当前数据与过去数据进行比较    查询        还原数据    FALSE
        对用一行的不同版本进行比较    版本        还原数据    FALSE
事务处理    调查数据的多个历史状态        事务处理    还原数据    FALSE

DROP TABLE employees;
FLASHBACK TABLE employees TO BEFORE DROP;

SHOW RECYCLEBIN;
FLASHBACK TABLE TEST TO BEFORE DROP;


从回收站还原表
--还原删除的表及相关对象
--如果多个回收站条目具有相同的原始名称,则:
使用唯一的系统生成名称还原特定版本
使用原始名称时,还原的表后进先出(LIFO)
--如果原始名称当前在使用中,则重命令该名称

从回收站删除表的时候使用先进先出(FIFO)

PURGE TABLE T1
PURGE TABLESPACE TBS
PURGE DBA RECYCLEBIN

DROP TABLE T1 PURGE;
DROP TABLESPACE TBS PURGE;


查询回收站
SELECT owner,original_name,object_name,type,ts_name,droptime,related,space
FROM dba_recyclebin
WHERE can_undrop='YES';

SELECT original_name,object_name,type,ts_name,droptime,related,space
FROM user_recyclebin
WHERE can_undrop='YES';

SQL> SHOW RECYCLEBIN;

闪回数据库体系结构
--配置闪回数据库
show parameter db_flash;
shutdown immediate;
startup mount exclusive;
alter system set db_flashback_retention_target=2880 scope=both;
alter database flashback on;
alter database open;
--关闭数据库闪回功能
alter database flashback off;

RMAN下:
flashback database to time="to_date('2009-11-22 12:22:12','yyyy-mm-dd hh24:mi:ss')";

flashback database to scn=243234;

flashback database to sequence=233 thread=1;

SQL下:
flashback database to timestamp(sysdate-1/24);

flashback database to scn 243234;

flashback database to restore point b4_load;

select current_scn from v$database;

flashback database to scn 243234;

alter database open resetlogs;--正常打开,允许DML

alter database open noresetlogs;--等于readonly状态

resetlogs会重新创建重做日志组

产生可靠还原点
create restore point before_load fuarantee flashback database;


---------------------------L7 处理数据库损坏

什么是块损坏
--只要对块执行读或写操作,就会执行下列一致性检查
块版本
高速缓存中的DBA(数据块地址)值与块缓冲区中的DBA值比较的结果
块校验和(如果启用)
--由于下列原因之一确定为损坏的块
介质损坏
逻辑(或软件)损坏

块损坏故障现象ORA-01578
--发现损坏的数据块时生成此信息
--始终返回绝对文件号和绝对块号
--返回到发布查询的会话(该查询在发现损坏时执行)
--在alert.log文件中显示

如何处理损坏
--检查预警文件和操作系统日志文件
--使用可用的诊断工具,找出损坏的类型
--多次运行检查功能,确定错误是否持续存在
--根据需要,从损坏的对象中恢复数据

如何处理损坏
--解决硬件问题
内存条
磁盘控制器
磁盘
--根据需要,从损坏的对象中恢复或还原数据

与损坏相关的功能
功能            检测到的损坏        修复损坏
DBVERIFY        物理            FALSE
ANALYZE            逻辑            FALSE
DB_BLOCK_CHECKING    逻辑            FALSE
DB_BLOCK_CHECKSUM    物理            FALSE
exp            物理            FALSE
闪回            逻辑            TRUE
DBMS_REPAIR        逻辑            TRUE
块介质恢复        无            TRUE

DBVERIFY实用程序
--只能检查数据文件,不能检查重做日志文件
--检查块一致性
--可以在打开数据库的情况下使用
--该实用程序的名称:dbv
$ dbv file=/u01/oradata/users01.dbf \blocksize=8192
  dbv file=E:\oracle\product\10.2.0\oradata\myoracle\users01.dbf
解释DBVERIFY输出
--一个"page"表示一个块
--如果块的头尾不匹配,DBVERIFY就会重新读取此块.如果块的头尾匹配,则报告一个流入块;否则报告一个块损坏.

ANALYZE命令
--执行逻辑块检查
--不将块标记为软损坏;只报告软损坏情况
--验证索引项和表项
SQL> ANALYZE TABLE T1 VALIDATE STRUCTURE;
SQL> ANALYZE TABLE T1 VALIDATE STRUCTURE CASCADE;

实时验证块完整性DB_BLOCK_CHECKING--默认为false
DB_BOLCK_CHECKING初始化参数
--在对每个块执行自我一致性检查时,控制检查的处理程度
--可防止内存和数据损坏
--可以使用ALTER SESSION或ALTER SYSTEM DEFERRED命令进行设置

实时验证块完整性DB_BLOCK_CHECKSUM--默认为true
DB_BOLCK_CHECKSUM初始化参数
--确定是否保持校验和,以及是否对每个块都进行验证
--可以防止由底层I/O系统引起的损坏

使用EXP检测损坏
可以使用常规导出来检测损坏
$ exp hr/hr tables=departments

使用闪回检查逻辑损坏

DBMS_REPAIR程序包
可用过程
--CHECK_OBJECT
--FIX_CORRUPT_BLOCKS
--DUMP_ORPHAN_KEYS
--REBUILD_FREELISTS
--SEGMENT_FIX_STATUS
--SKIP_CORRUPT_BLOCKS
--ADMIN_TABLES

SET SERVEROUTPUT ON;
BEGIN
dbms_repair.admin_tables(
table_name=>'REPAIR_TABLE',
table_type=>DBMS_REPAIR.REPAIR_TABLE,
action=>DBMS_REPAIR.CREATE_ACTION,
tablespace=>'USERS');
END;

BEGIN
dbms_repair.admin_tables(
table_name=>'ORPHAN_KEY_TABLE',
table_type=>DBMS_REPAIR.ORPHAN_TABLE,
action=>DBMS_REPAIR.CREATE_ACTION,
tablespace=>'USERS');
END;
DESC REPAIR_TABLE;--记录每个坏块的信息

DESC ORPHAN_KEY_TABLE;--与索引相关的行的损坏的记录

CREATE TABLESPACE T1 DATAFILE 'D:\T1.DBF' SIZE 1M;

CREATE TABLE T1(NO NUMBER) TABLESPACE T1;

INSERT INTO T1 SELECT ROWNUM RN FROM DBA_OBJECTS;

CREATE INDEX  T1_NO ON T1(NO);

ALTER SYSTEM FLUSH BUFFER_CACHE;

修改T1表空间的物理结构EDITPLUS修改

--定义REPAIR_TABLE,记录哪些块出现了损坏
DECLARE
RPR_COUNT INT;
BEGIN
RPR_COUNT:=0;
DBMS_REPAIR.CHECK_OBJECT(
SCHEMA_NAME=>'SYS',
OBJECT_NAME=>'T1',
REPAIR_TABLE_NAME=>'REPAIR_TABLE',
CORRUPT_COUNT=>RPR_COUNT);
DBMS_OUTPUT.PUT_LINE('REPAIR COUNT:' ||RPR_COUNT);
END;

SELECT * FROM REPAIR_TABLE;

--给坏块打上标记
DECLARE
FIX_COUNT INT;
BEGIN
FIX_COUNT:=0;
DBMS_REPAIR.FIX_CORRUPT_BLOCKS(
SCHEMA_NAME=>'SYS',
OBJECT_NAME=>'T1',
OBJECT_TYPE=>DBMS_REPAIR.TABLE_OBJECT,
REPAIR_TABLE_NAME=>'REPAIR_TABLE',
FIX_COUNT=>FIX_COUNT);
END;

SELECT OBJECT_NAME,BLOCK_ID,MARKED_CORRUPT FROM REPAIR_TABLE;

--通过ORPHAN_KEY保存索引对应的键值
DECLARE
KEY_COUNT INT;
BEGIN
KEY_COUNT:=0;
DBMS_REPAIR.DUMP_ORPHAN_KEYS(
SCHEMA_NAME=>'SYS',
OBJECT_NAME=>'T1_NO',
OBJECT_TYPE=>DBMS_REPAIR.INDEX_OBJECT,
REPAIR_TABLE_NAME=>'REPAIR_TABLE',
ORPHAN_TABLE_NAME=>'ORPHAN_KEY_TABLE',
KEY_COUNT=>KEY_COUNT);
END;

SELECT COUNT(*) FROM ORPHAN_KEY_TABLE;

BEGIN
DBMS_REPAIR.SKIP_CORRUPT_BLOCKS(
SCHEMA_NAME=>'SYS',
OBJECT_NAME=>'T1',
OBJECT_TYPE=>DBMS_REPAIR.TABLE_OBJECT,
FLAGS=>DBMS_REPAIR.SKIP_FLAG);
END;

SELECT TABLE_NAME,SKIP_CORRUPT
FROM USER_TABLES
WHERE TABLE_NAME='T1';

DROP INDEX T1_NO;
CREATE INDEX T1_NO ON T1(NO);


块介质恢复(BMR)
--降低平均恢复时间(MTTR)
--提高介质恢复区间的可用性
恢复期间数据文件保持联机状态
只有正在恢复的块是不可访问的
--可以通过RMAN使用BLOCKRECOVER命令进行调用
从可以备份中还原个别块
与服务器协调工作恢复块介质

RMAN BLOCKRECOVER命令
--识别包含要进行恢复的块的备份
--读取备份并将请求的块积累到内存缓冲区
--必要时,通过从备份中读取归档日志来管理块介质恢复会话
--不能用于不完全恢复
RMAN> BLOCKRECOVER DATAFILE 6 BLOCK 3;


使用BLOCKRECOVER的示例
--恢复一组损坏的块
--按还原类型限制块介质恢复
--按备份标记限制块介质恢复
--按时间,SCN或日志序列限制块介质恢复
RMAN> BLOCKRECOVER DATAFILE 2 BLOCK 12,13 DATAFILE 4 BLOCK 5;
 
RMAN> BLOCKRECOVER DATAFILE 3 BLOCK 3 FROM DATAFILECOPY;

RMAN> BACKUP DATAFILE 4 TAG 'AA';

RMAN> BLOCKRECOVER DATAFILE 5 BLOCK 3 FROM TAG 'AA';

RMAN> BLOCKRECOVER DATAFILE 3 BLOCK 13 RESTORE UNTIL SEQUENCE 17;

RMAN BMR接口
动态视图显示损坏的当前情况
--V$DATABASE_BLOCK_CORRUPTION视图显示当前损坏的数据库块的列表.
BLOCKRECOVER CORRUPT LIST RESTORE UNTIL TIME 'SYSDATE-10';
--V$BACKUP_CORRUPTION视图显示数据文件备份中损坏的块的列表
--V$COPY_CORRUPTION视图显示图像文件副本中损坏的块的列表

可以采用的替代操作
--表:损坏的块中的数据已丢失
删除然后重新创建表,再从导出转储中创建数据.
使用SQL或PL/SQL,将数据从该表移到一个新建的表.
--索引:删除然后从新创建索引


---------------------L8 监控和管理内存

内存管理:概览

DBA必须将内存管理视为其工作中直观重要的部分,因为
--可用内存空间量有限
--为某些类型的功能分配更多的内存可提高整体性能
--自动优化的内存分配通常是正确的配置,但特定环境甚至短期情况下可能需要特别注意.

ORACLE内存结构

--系统全局区SGA
共享池--SQL共享
流池--ORACLE STREAM
大型池--RMAN备份
JAVA池--JAVA虚拟机的代码
数据库缓冲区高速缓存--缓存从数据文件读入的数据
重做日志缓冲区
保留缓冲区高速缓存
循环缓冲区高速缓存
nK块大小缓冲区高速缓存


--程序全局区PGA
服务器进程
后台进程

缓冲区高速缓存--LRU算法
DB_BLOCK_SIZE
DB_CACHE_SIZE
DB_RECYCLE_CACHE_SIZE
DB_KEEP_CACHE_SIZE

SHOW PARAMETER CACHE_SIZE;
创建2K的表空间和表
ALTER SYSTEM SET DB_2K_CACHE_SIZE=10M SCOPE=BOTH;
CREATE TABLESPACE T_2K DATAFILE 'D:\T_2K.DBF' SIZE 10M BLOCKSIZE 2K;
CREATE TABLE TEST_2K(NO NUMBER) TABLESPACE T_2K;

使用多个缓冲区池
show parameter cache_size
alter system set db_keep_cache_size=8m scope=both;
alter system set db_recycle_cache_size=8m scope=both;

alter table test_2k storage(buffer_pool keep)
alter table test_2k storage(buffer_pool recycle)
alter table test_2k storage(buffer_pool default)

共享池
--大小通过SHARED_POOL_SIZE指定
--库高速缓存包含语句文本,已进行语法分析的代码和执行计划
--数据字典高速缓存包含数据字典表中个表,列和权限的定义
--用户全局区(UGA)包括会话信息(如果使用ORACLE共享服务器)

大型池
--可配置为SGA中单独的内存区
--大小由LARGE_POOL_SIZE参数指定
--用于在内存中为各项存储数据:
UGA,备份和还原操作,共享服务器的会话数据,并行查询消息传送

JAVA池
--可配置为SGA中一个单独的内存区
--大小由JAVA_POOL_SIZE参数指定
--用于将JVM中特定于会话的所有JAVA代码和数据存储在内存中

重做日志缓冲区


自动管理共享内存:概览
--自动根据工作量变化调整
--最大程序地提高内存利用率
--有助于消除内存不足的错误

自动管理内存的好处
SGA_TARGET----&gtSGA的总大小

ASSM的工作原理
--ASSM以MMAN在后台捕获的工作量信息为基础
--MMAN使用内存指导
--将内存移到最迫切需要的地方
--如果使用SPFILE(推荐)
在关闭时保持组件大小
保存的值用于引导程序组件大小
无需再确定最佳值

create pfile='d:\pfile.ora' from spfile

手动配置ASMM
要使某些内存组件具有最小大小,应手动配置这些组件大小
--如果字典计算得出的大小因某些原因不能满足您的需要
--如果所需内存中存在ASMM未检测到的短期峰值和谷值
--如果只想确保特定组件的最小内存量

SGA_TARGRT=8G
STATISTICS_LEVEL=TYPICAL
--设置为TYPICAL或ALL才可以实现自动内存管理

自动优化的SGA参数的行为
--未设置SGA_TARGET或将其设置为0时:
自动优化的参数行为正常
SHARED_POOL_SIZE可能需要根据早期数据库版本中使用的设置增加
select SUM(bytes)/1024/1024 size_mb from v$sgastat
where pool ='shared pool';

--SGA_TARGET设置为非0时:
自动优化的参数的默认值为0
指定的值用作最小大小
select component,current_size/1024/1024 size_mb
from v$sga_dynamic_components;

手动优化的SGA参数的行为
--有些组件不能自动优化
KEEP和RECYCLE缓冲区高速缓存
具备多个块大小的高速缓存
日志缓冲区
--这些组件必须使用数据库参数手动配置
--这些组件使用的内存会减少用于自动优化SGA的内存量

使用V$PARAMETER 视图
SELECT NAME,VALUE,ISDEFAULT FROM V$PARAMETER
WHERE NAME LIKE '%size';

修改SGA_TARGET参数
--SGA_TARGET初始化参数:
是动态参数
最大可增大到SGA_MAX_SIZE

SHOW PARAMETER SGA;
ALTER SYSTEM SET SGA_TARGET=150M SCOPE=BOTH;

禁用ASMM
--将SGA_TARGET设置为零可禁用自动优化功能
--自动优化的参数设置为其当前大小
--SGA大小总体上不受影响
show parameter sga;
show parameter size;

alter system set sga_target=0 scope=both;

show parameter size;

手动调整动态SGA参数的大小
--对于自动优化的参数,手动调整大小会:
导致组件大小立即调整(如果新值大于当前值)
更改最小大小(如果新值小于当前大小)
--调整手动优化的参数的大小只会影响SGA的可调部分

程序全局区(PGA)
专用SQL区,游标和SQL区,会话内存,工作区

专用连接
共享服务器连接

自动PGA内存管理
--根据PGA_AGGREGATE_TARGET参数,动态调整专用工作区的PGA内存量
--有助于最大限度地提高所有内存密集型SQL操作的性能
--默认情况下是启用的

PGA管理资源
--管理PGA_AGGREGATE_TARGET初始化参数的统计信息,如PGA告诉缓存命中百分比
--用于监视PGA工作区的视图包括
v$sql_workarea_histogram
v$pgastat
v$sql_workarea_active
v$sql_workarea
v$tempseg_usage
--用于调整PGA工作区大小的视图有:
v$pga_target_advice
v$pga_target_advice_histogram

有效使用内存:准则
--尽量使SGA适合物理内存
--优化以实现告诉缓冲区告诉缓存命中率,但是要注意以下几点
即使有效且必须的全表扫描也会降低命中率
可能存在因不必要地重复读取同一块而出现命中率虚升的情况
--使用内存指导

库高速缓存的内存优化准则
--为开发人员制定格式使用约定,以便SQL语句符合高速缓存的要求
--使用绑定变量
--消除不必要的重复SQL
--考虑使用CURSOR_SHARING
--尽可能使用PL/SQL
--缓存序列号
--连接库高速缓存中的对象

var aa number
exec :aa:=1934
select * from emp where emp_id:=aa;



-----------------------L9 自动性能管理
性能管理的三个活动为:
--性能规划
--实例规划
--SQL优化

性能规划
--投资选项
--系统体系结构
--可伸缩性
--应用程序设计原理
--工作量测试,建模和实施
--部署新的应用程序

实例优化
--有定义合理的目标
--将内存分配至数据库结构
--考虑数据库中各部分的I/O要求
--优化操作系统以获得最佳数据库性能

性能优化方法
--从上至下进行优化.
在优化应用程序代码之前先优化设计
在优化实例之前先优化代码
--优化那些可以带来最大潜在好处的方面
确定最长的等待时间
确定最大的服务次数
--达到目标时停止优化

收集统计信息
--性能优化取决于准确统计信息的收集
--有不同类型的统计信息:
优化程序统计信息
系统统计信息
--有不同的统计信息收集方法
使用GATHER_STATS_JOB自动收集
使用DBMS_STATS程序包手动收集
通过设置数据库初始化参数进行收集
通过从另一个数据库导入统计信息进行收集

ORACLE等待事件
--等待事件集合提供了由于各种原因而不得不等待或必须等待的会话或进程的有关信息.
-V$EVENT_NAME视图中列出了这些事件

V$SYSSTAT        记录所有系统资源统计信息
V$SYSTEM_WAIT_CLASS    等待类别分类汇总
V$SGASTAT        显示SGA内存组件情况
V$EVENT_NAME        记录所有等待事件的详细解释
V$SYSTEM_EVENT        记录所有系统等待的耗时


显示与会话有关的统计信息

V$SESSION
V$SESSSTAT

对于n层环境,由于会话统计信息并非十分有用,因此可以在下列视图中查看服务级别的统计信息
--V$SERVICE_EVENT:以每个事件为基础的每个服务的聚集等待计数和等待时间
--V$SERVICE_WAIT_CLASS:以等待类别为基础的每个服务的聚集等待计数和等待时间.

--故障排除和优化视图
实例/数据库
V$DATABASE
V$INSTANCE
V$PARAMETER
V$SPPARAMETER
V$SYSTEM_PARAMETER
V$PROCESS
V$BGPROCESS
V$PX_PROCESS_SYSSTAT
V$SYSTEM_EVENT
磁盘
V$DATAFILE
V$FILESTAT
V$LOG
V$LOG_HISTORY
V$DB_FILE
V$TEMPFILE
V$TEMPSEG_USAGE
V$SEGMENT_STATISTICS
内存
V$BUFFER_POOL_STATISTICS
V$LIBARYCACHE
V$SGAINFO
V$PGASTAT
争用
V$LOCK
V$UNDOSTAT
V$WAITSTAT
V$LATCH

字典视图
--以下字典视图和特殊视图提供了使用 DBMS_STATS程序包后生成的有用的统计信息:
DBA_TABLES,DBA_TAB_COLUMNS
DBA_CLUSTERS
DBA_INDEXES
DBA_TAB_HISTOGRAMS
--这些统计信息是静态的,直到再次执行DBMS_STATS中的相应过程

create table test as select * from dba_objects;

select table_name,blocks,last_analyzed from user_tables
where table_name='test';

exec dbms_stats.gather_table_stats('hr','test')

诊断挂起或速度异常慢的数据库
--直接访问SGA以监视性能(内存访问模式)
V$SESSION
V$SESSION_WAIT
V$SYSTEM_EVENT
V$SYSSTAT
使用Enterprise Manager进行挂起分析

切换到内存访问模式
使用挂起分析页,针对速度很慢的库

自动工作量资料档案库AWR
MMON每隔一小时收集快照
ADDM查找首要问题

AWR的所有信息都放在SYSAUX表空间中

设置收集快照的时间
select snap_interval,retention from dba_hist_wr_control;

begin
dbms_workload_repository.modify_snapshot_settings(
interval=>30,
retention=>7*24*60);
end;

--手工收集统计信息
exec DBMS_WORKLOAD_REPOSITORY.CREATE_snapshot();

AWR快照基线
DBMS_WORKLOAD_REPOSITORY.CREATE_BASELINE(
start_snap_id in number,
end_snap_id in number,
baseline_name in varchar2);

指导框架:概览
ADDM
SQL优化指导,
内存
SQL访问指导
空间


使用SQL优化直到:复习
--使用SQL优化指导分析SQL语句,并获得性能建议案
--SQL优化指导的分析来源:
顶级SQL:分析当前活动的顶级SQL语句
SQL优化集:分析用户提供的一套SQL语句
快照:分析快照
基线:分析基线

SQL访问指导:概览
工作量说明:
SQL语句,SQL优化集,SQL告诉缓存内容,统计信息,方案名称

建议案
索引,实体化视图,实体化视图日志


异步COMMIT
--默认COMMIT行为是一直等待,直到将重做操作保存在重做日志文件中
--现在,可以将默认行为更改为"not wait".
--异步COMMIT对于较高的事务处理吞吐量是非常有用处的.
--但是,事务处理可能会丢失
计算机崩溃
重做日志文件出现文件I/O问题


使用异步COMMIT
--可能的组合:
IMMEDIATE,WAIT(这是默认值)
IMMEDIATE,NOWAIT
BATCH,WAIT
BATCH,NOWAIT
--系统层或会话层的示例:
ALTER SYSTEM SET COMMIT_WRITE=IMMEDIATE,WAIT;
ALTER SYSTEM SET COMMIT_WRITE=IMMEDIATE,NOWAIT;
--COMMIT语句示例
COMMIT WRITE BATCH WAIT;--分批写入,等待
COMMIT WRITE BATCH NOWAIT;--分批写入,不等待


-------------------L10 管理方案对象

--表类型
类型                说明
普通(按堆组织的)表        数据以无序集合(堆)方式存储
分区表                数据被分为多个更小,更易管理的片段
按索引组织的表(IOT)        数据(包括非键值)按顺序存储在B树索引结构中
聚簇表                多个表中的相关数据存储在一起

分区:
--是"超大型"表或索引的片段
--存储在自己的段中
--用于提高性能和易管理性

分区的特性包括:
--相同的逻辑属性:列,约束条件和索引均相同
--不同的物理属性:存储在不同的表空间中
--对应用程序是透明的
--多种分区方法

分区方法
--范围分区:根据列值的逻辑范围(例如,一年中的月份)映射行
--散列分区:根据分区键的散列值映射行
--列表分区:根据DBA提供的离散值列表映射行
--范围-散列分区:根据范围方法映射行,然后在每个范围分区内创建散列子分区
--范围-列表分区:先根据某一范围的值映射行,然后根据离散值映射行
create table t_range(id number,no number)
partition by range(no)
(partition no1 values less than (10),
 partition no2 values less than (20),
 partition no2 values less than (maxvalue))

create table t_hash (id number,no number)
paratition by hash(no) partition 4;

create table t_list(id number,no number)
partition by list(no)
(partition no1 values (1,2,3),
 partition no1 values (4,5),
 partition no1 values (default));

create table t_range_hash(id number,no number)
partition by range(no)
subpartition by hash(id) subpartitions 4
(partition no1 values less than (10),
 partition no2 values less than (20),
 partition no3 values less than (maxvalue));

按索引组织的表(IOT)和堆表
--与堆表相比较,IOT:
可以基于键更快地访问表数据
不会复制主键值的存储区
要求存储的空间更少
使用二级索引和逻辑行ID
可用性更高,因为表重组时不会使二级索引失效
--IOT有以下限制
必须有一个不是DEFERRABLE的主键
不能聚簇
不能使用组合分区
不能包含类型为ROWID或LONG的列

create table country
(country_id char(2)
 CONSTRAINT country_id_nn not null,
 country_name varchar2(40),
 currency_name varchar2(25),
 currency_symbol varchar2(3),
 map BLOB,
 flag BLOB,
 CONSTRAINT country_c_id_pk primary key(country_id))
ORGANIZATION INDEX        --按索引组织的表
TABLESPACE indx
PCTTHRESHOLD 20           --超过20%的话,索引会存储在别处
OVERFLOW TABLESPACE users;--溢出段放在users表空间上

--簇类型
索引簇
散列簇
已排序的散列簇

create cluster emp_dept_cluster
(deptno number(2))
size 1024

create index emp_dept_cluster_idx
on cluster emp_dept_cluster

create table dept(
deptno number(2),
dname varchar(14),
loc varchar2(13))
cluster emp_dept_cluster(deptno)

create table emp(
empno number,
ename varchar(10),
job varchar2(9),
mgr number,
hiredate date,
sal number,
comm number,
deptno number(2))
cluster emp_dept_cluster(deptno)

簇的应用场合
条件                索引    散列    已排序的散列
同一键分布            X    X    X
均匀分布的键值            X    X
很少更新的键            X    X    X
经常连接的主从表        X   
键值的数量可预测            X    X
使用键的等式谓词进行查询        X    X
将数据插入顺序检索数据                X


已排序的散列簇
--新数据结构,用于存储按非主键列排序的数据
簇键值都已经过散列处理
对应与特定簇键值的行将根据排序键进行排序
--用于保证行顺序可按查询返回,而无需对数据进行排序
行按特定簇键值的升序或降序返回
按升序检索行时,ORDER BY 子句是不需要的

create cluster calls_cluster
(origin_number number,--簇
 call_timestamp number sort,--排序
 call_duration number sort) --排序
HASHKEYS 10000
SINGLE TABLE HASH IS origin_number
SIZE 50;

create table calls
(origin_number number,
 call_timestamp number,
 call_duration number,
 other_info varchar2(30))
 cluster calls_cluster(
 origin_number,call_timestamp,call_duration);


create cluster order_cluster
(customer_number number,
 order_number number sort)
 hashkeys 1000
 single table hash is customer_number size 500;

create table orders (
customer_number number,
order_number number,
customer_name varchar2(10))
cluster order_cluster(customer_number,order_number);

insert into orders values (1,51,'aa');
insert into orders values (2,32,'bb');
insert into orders values (3,34,'cc');
insert into orders values (4,12,'dd');
insert into orders values (5,21,'ee');


方案管理任务
--DBA任务包括
估计新表的大小
分析增长趋势
管理优化程序统计信息
联机重组方案对象

--SQLPLUS评估表的大小
set serveroutput on;
declare
i_used_bytes number;
i_alloc_bytes number;
begin
dbms_space.create_table_cost(
tablespace_name=>'USERS',
avg_row_size=>30,
row_count=>30000,
pct_free=>20,
used_bytes=>i_used_bytes,
alloc_byte=>i_alloc_bytes);
dbms_output.put_line('USED:'||i_used_bytes);
dbms_output.put_line('ALLOCATED:'||i_alloc_bytes);
end;


分析增长趋势
--由段指导使用
--收集到AWR中的空间使用量统计信息

联机重组方案对象
--修改方案对象(例如表或索引)的逻辑结构或物理结构
--对用户是透明的
--空间要求

手动联机重组的基本步骤
1.验证是否是联机重组的候选对象
2.创建一个临时表
3.启动重新定义过程
4.复制相关对象(该操作将对临时表自动创建所有触发器,索引,授权和约束条件)
5.查询DBA_REDEFINITION_ERRORS视图,检查是否有错误
6.同步临时表(可选)
7.完成重新定义
8.删除临时表

conn scott/tiger
--将DEPT表在线重定义为dept_tmp分区表
create table dept_tmp
(deptno number(2),
 dname varchar2(14),
 loc varchar2(13),
 partition by list(deptno)
 (partition dept_tmp1 values (10),
  partition dept_tmp2 values (20),
  partition dept_tmp3 values (30),
  partition dept_tmp4 values (default))

ALTER TABLE DEPT_TMP ADD PRIMARY KEY (DEPTNO);

exec dbms_redefinition.can_redef_table('SCOTT','DEPT_TMP')

EXEC DBMS_REDEFINITION.start_redef_table('SCOTT','DEPT','DEPT_TMP')

INSERT INTO DEPT VALUES (50,'AA','AA');
COMMIT;

分区特性包括:
--相同的逻辑属性:列,约束条件和索引均相同
--不同的物理属性:存储在不同的表空间中
--对应用程序是透明的
--多种分区方法

分区方法
--范围分区:根据列值的逻辑范围(例如,一年中的月份)映射行
--散列分区:根据分区键的散列值映射行
--列表分区:根据DBA提供的离散值列表映射行
--范围-散列分区:根据范围方法映射行,然后在每个范围分区内创建散列子分区
--范围-列表分区:先根据某一范围的值映射行,然后根据离散值映射行

select table_name from user_part_tables;

--结束在线重定义,将DEPT转化为分区表了。
exec dbms.redefinition.finish_redef_table('SCOTT','DEPT','DEPT_TMP');


----------------------L11 管理存储

空间管理:概览
空间由ORACLE数据库自动管理。ORACLE数据库能够生成有关潜在问题的报警,并推荐可能的解决方案.这些功能包括:
--ORACLE MANAGED FILES(OMF)
--用位图进行的空闲空间管理("本地管理")和数据文件自动扩展
--主动空间管理(默认阈值和服务器生产的预警)
--空间回收(收缩段,联机重新定义表)
--容量计划(增长报表)

空闲空间管理
--自动
--利用本地管理的表空间启用
--由段中的位图跟踪
优点:
--更灵活的空间使用情况
--运行时调整
--多进程搜索BMB

段的类型
段是为某个逻辑结构分配的一组区,不同类型的段包括;
--数据段
--索引段
--临时段
段由数据库动态分配

分配区
--搜索数据文件的位图,以便获取所需数目的相邻空闲块
--用以下存储子句调整区的大小
UNIFORM
AUTOALLOCATE
--查看区映射
--获得取消分配建议

行链接和移植
示例
--更新时:行的长度增加,超过了块中的可用空闲空间.
--需要将数据存储在新块中.
--将保留的原始物理标示符(ROWID).
--ORACLE数据库需要读取两个块以检测数据.
--"段指导"查找包含移植行的段.

阈值和解决空间问题
通过以下方法解决空间问题
--添加数据文件或调整数据文件大小
--设置AUTOEXTEND ON
--收缩对象
--减少UNDO_RETENTION
--检查临时表空间中是否存在长时间运行的查询

查看表空间的空闲空间
select tablespace_name,sum(bytes)/1024/1024 from dba_free_space
group by tablespace_name;
收缩数据文件
alter database datafile 4 resize 500M;

收缩段
ALTER TABLE employees SHRINK SPACE COMPACT;
ALTER TABLE employees SHRINK SPACE;

搜集表的统计信息
exec dbms.stats.gather_table_stats('SCOTT','T1');

select table_name,bolcks from user_tables where table_name='T1';

ALTER TABLE T1 ENABLE ROW MOVEMENT

ALTER TABLE T1 SHRINK SPACE;

收缩操作的结果
--改善性能和空间使用情况
--维护索引
--不执行触发器
--可以减少移植行数
--建议在IOT上重建辅助索引
在收缩操作后,要重新建立索引

用ASSM回收空间
--联机原地操作
--只适合用于位于ASSM表空间中的段
--候选段类型
按堆组织的表和按索引组织的表
索引
分区和子分区
实体化视图和实体化视图日志

使用SQL收缩段
ALTER TABLE employees ENABLE ROW MOVEMENT;
ALTER TABLE employees SHRINK SPACE CASCADE;
ALTER TABLE employees MODIFY LOB(resume) (SHRINK SPACE);
ALTER TABLE employees OVERFLOW SHRINK SPACE;

管理可恢复的空间分配
可恢复的语句有如下特性:
--使用可恢复的语句,您可以挂起大型操作,而不是收到错误。
--使用可恢复的语句,可以在挂起操作时解决问题,而无需重新开始
--在下列条件下,将挂起可恢复的语句
空间不足
达到了最大区数
超出了空间限额

使用可恢复的空间分配
--如果查询,DML操作和特定DDL操作遇到空间不足错误,则可恢复这些操作
--可以通过SQL,PL/SQL,SQL*Loader或ORACLE调用OCI来发出可恢复的语句.
--要运行可恢复的语句,必须先为会话启用可恢复的语句.
ALTER SESSION ENABLE RESUMABLE;
INSERT INTO SALES_NEW SELECT * FROM SH.SALES;
ALTER SESSION DISABLE RESUMABLE;


CREATE YABLESPACE TEST DATAFILE 'D:\TEST.DBF' SIZE 1M;

CREATE TABLE TT AS SELECT * FROM USER_TABLES;

ALTER TABLE TT MOVE TABLESPACE TEST;

INSERT INTO TT SELECT * FROM TT;

ALTER SESSION ENABLE RESUMABLE;

ALTER SESSION ENABLE RESUMABLE TIMEOUT 10;

移动表空间
概念:可跨平台移动的表空间
--简化数据仓库和数据集市之间的数据分发
--允许从一个平台向另一个平台移植数据库
--受支持的平台:
SOLARIS,HP-UX,WINDOWS,ZOS,LINUX,AIX,APPLE MAC

概念:最低兼容级别
--源数据库和目标数据库都必须将COMPATIBLE设置为10.0.0或更高.
--数据文件投能够识别平台
--在移动前,请确保所有只读文件和脱机文件能够识别平台.

可移动表空间过程

将表空间置于只读状态
使用"数据泵"提取元数据
目标
传送数据文件并将文件转储到目标
使用"数据泵"导入元数据
将表空间置于读写状态.

确定平台的Endian格式
SELECT TP.ENDIAN_FORMAT
FROM V$TRANSPORTABLE_PLATFORM. TP,V$DATABASE D
WHERE TP.PLATFORM_NAME=D.PLATFORM_NAME;

移动数据库
--概括可移动表空间功能
--可以轻松地从数据仓库环境向数据集市(数据集市通常在较小的平台上运行)分发数据
--数据库可以非常迅速地从一个平台移植到另一个平台

查看传输表空间不需要转换的平台
SELECT PLATFORM_NAME FROM V$TRANSPORTABLE_PLATFORM
WHERE ENDIAN_FORMAT='Little';

数据库移动过程:源系统转换
只读状态下:
RMAN>CONVERT TABLESPACE TO PLATFORM;
目标系统:
RMAN>CONVERT DATAFILE FROM PLATFORM;

数据库移动:注意事项
--在目标平台上创建口令文件
--移动在源数据库中使用的BFILE
--生成的pfile和移动脚本使用OMF
--使用nid DBNEWID来改变DBID


-----------------------L12 自动存储管理

自动存储管理:概述
--可移植的高性能集群文件系统
--管理ORACLE数据库文件
--数据分布到各个磁盘中以平衡负载
--跨磁盘的集成镜像
--解决了许多存储管理问题

ASM常规体系结构

RBAL进程 REBALANCE磁盘组
CSS服务 集群同步服务

      ASM实例
ASM磁盘组1    ASM磁盘组2

ASM实例任务
要使用ASM实例,必须能够完成以下任务
--创建ASM实例
--设置初始化参数
--启动ASM实例
--管理ASM实例
--关闭ASM实例

E:\oracle\product\10.2.0\Db_1\BIN\localconfig add

ASM实例初始化参数
INSTANCE_TYPE=ASM
DB_UNIQUE_NAME=+ASM
ASM_POWER_LIMIT=1 --控制重新平衡的速度
ASM_DISKSTRING='/dev/rdsk/*s2','/dev/rdsk/c1*'
ASM_DISKGROUPS=dgroupA,dgroupB
LARGE_POOL_SIZE=8M

数据库实例参数更改
INSTANCE_TYPE=RDBMS
LOG_ARCHIVE_FORMAT
DB_BLOCK_SIZE
DB_CREATE_ONLINE_LOG_DEST_n
DB_RECOVERY_FILE_DEST
......

启动ASM实例
$export ORACLE_SID='+ASM'
$sqlplus /nolog
SQL>startup

alter diskgroup groupa mount;

ASM磁盘组
--作为逻辑单元管理的磁盘组
--将磁盘总空间划分为同一大小的单元
--将各个文件平均分配到所有磁盘中
--根据文件类型使用粗粒度或细粒度的条带化
--管理的是磁盘组而非文件

故障组
RAID1镜像

磁盘组镜像
--在分配单元级别镜像
--在每个磁盘上混合主分配单元和镜像分配单元
--外部冗余:延迟硬件镜像
--正常冗余:双向镜像,至少两个故障组
--高冗余:三向镜像,至少三个故障组

磁盘组动态重新平衡
--无论存储配置何时发生更改,都会自动联机重新平衡
--仅按相应比例将数据移至添加的存储
--无需手动优化I/O
--联机一直到新的存储
--可在系统上使用ASM_POWER_LIMIT配置负载

管理磁盘组
CREATE DISKGROUP
ALTER DISKGROUP
DROP DISKGROUP

创建和删除磁盘组
create diskgroup groupA normal redundancy
failgroup controller1 disk
'/devices/A1' NAME diskA1 SIZE 120G FORCE,
'/devices/A2',
'/devices/A3'
failgroup controller2 disk
'/devices/B1',
'/devices/B2',
'/devices/B3'
drop diskgroup groupA including contents;


将磁盘添加至磁盘组
ALTER DISKGROUP groupA ADD DISK
'/dev/rdsk/c0t4d0s2' NAME A5,
'/dev/rdsk/c0t5d0s2' NAME A6,
'/dev/rdsk/c0t6d0s2' NAME A7,
'/dev/rdsk/c0t7d0s2' NAME A8;

ALTER DISKGROUP groupA ADD DISK '/devices/A*';

select name from v$asm_diskgroup;

drop diskgroup groupa including contents;

create diskgroup groupa normal redundancy
failgroup a1 disk
'd:\asmdisks\disk1',
'd:\asmdisks\disk2',
failgroup a2 disk
'd:\asmdisks\disk3',
'd:\asmdisks\disk4';

desc v$asm_disk;
col path format a20;
select group_number,path,name,failgroup from v$asm_disk;

alter diskgroup groupa add disk 'd:\asmdisks\disk5';

alter diskgroup groupa drop disk groupa_0004;


其他ALTER命令
从dgroupA中删除一个磁盘
ALTER DISKGROUP dgroupA DROP DISK A5;
在单个命令中添加和删除磁盘:
ALTER DISKGROUP dgroupA
DROP DISK A6
ADD FAILGROUP fred DISK '/dev/rdsk/c0t8d0s2' NAME A9;
取消磁盘删除操作:
ALTER DISKGROUP dgroupA UNDROP DISKS;

ASM文件
set oracle_sid=myoracle;
CREATE TABLESPACE sample DATAFILE '+dgroupA';



set oracle_sid=+asm;
set ORACLE_HOME=E:\oracle\product\10.2.0\db_1;
asmcmd
ASMCMD>ls
ASMCMD>cd groupa
ASMCMD>cd ocp
ASMCMD>cd datafile
CREATE TABLESPACE sample DATAFILE '+dgroupA';

--不由ASM管理的表空间创建方式
create tablespace test1 datafile '+groupa\ocp\test1.dbf' size 10M;

ASMCMD使用程序
mkdir,cd,du,find,ls,pwd,rm,lsct,lsdg,help
ASMCMD>help

将数据库移植到ASM存储区
1.完全关闭数据库
2.关闭数据库并修改服务器参数文件,以使用ORACLE MANAGED FILES(OMF)
3.编辑并执行以下RMAN脚本

STARTUP NOMOUNT;
RESTORE CUNTROLFILE FROM 'u1/c1.ctl';
ALTER DATABASE MOUNT;
BACKUP AS COPY DATABASE FORMAT '+dgroup1';
SWITCH DATABASE TO COPY;
SQL "ALTER DATABSE RENAME '/u01/log1' TO '+dgroup1' ";
#Repeat RENAME command for all online redo log members...
...
ALTER DATABASE OPEN RESETLOGS;
SQL "ALTER DATABASE TEMPFILE '/u01/temp1' DROP";



------------------------------L13 管理资源

数据库资源管理器:概览
资源管理器可用于:
--管理综合工作量
--控制系统性能

OLTP用户,DSS用户,批处理用户

数据库资源管理器概念
资源使用者组
资源计划
资源计划指令

--可以管理数据库和操作系统资源,例如
CPU占用率
并行度
活动会话数
还原发生
操作执行时间
空闲时间
--还可以指定标准,如果满足该标准,会话将自动切换到另一个使用者组

创建新的资源计划
DBMS_RESOURCE_MANAGER.SWITCH_PLAN
(PLAN_NAME=>'DAY_PLAN',
 SID=>'ORCL',
 ALLOW_SCHEDULER_PLAN_SWITCHES=>true);

访问资源计划   

--资源计划的资源分配方法
参数                可能值
CPU_MTH                EMPHASIS
                RATIO
PARALLEL_DEGREE_LIMIT_MTH    PARALLEL_DEGREE_LIMIT_ABSOLUTE
ACTIVE_SESS_POLL_MTH        ACTIVE_SESS_POOL_ABSOLUTE
QUEUING_MTH            FIFO_TIMEOUT

--EMPHASIS和RATIO的比较
EMPHASIS                RATIO   

该值指定某个使用者组可以        该值指定一个数字,此数字表示分配
使用的CPU资源的最大百分比        到使用者组的CPU资源比率

最多可以进行8种不同级别的资源分配    只能为一个级别指定值

任何给定级别的百分比总            必须使用整数值,但是对于
和必须小于等于100            值的总和没有限制

默认值为NULL                默认值为NULL


--最大估计执行时间
数据库资源管理器可以预先估计操作的执行时间
在资源使用者组级别,可以为操作指定最大估计执行时间
如果估计时间超过MAX_EST_EXEC_TIME,则操作不会启动.(ORA-07455)
此功能的好处是消除了使用过多系统资源的异常大的作业。
默认值为UNLIMITED.

--监视资源管理器
v$SESSION:包含显示会话的当前组的resource_consumer_group列
v$RSRC_PLAN:显示获得资源计划的视图
v$RSRC_CONSUMER_GROUP:包含所有活动组统计信息的视图


-----------------------L14 使用调度程序自动执行任务

--简化管理任务
在每月的最后一天执行一系列的月终任务
消息入队后立即运行出对过程
通过实体化视图刷新来复制表数据
运行每日作业来备份数据库
每天计算两次表和索引统计信息
文件到达文件系统后立即启动成批装入
每小时生产一个有关无效服务器访问尝试的报表
重建完当前索引后重建另一索引

主要组件和步骤
--要使用调度程序简化管理任务,请执行以下步骤
1.创建程序
2.创建并使用计划
3.创建并提交作业
4.监视作业

程序+计划+作业属性=作业

使用基于时间的和基于事件的作业

创建基于事件的计划
要创建基于时间的作业,必须设置:
--队列说明(应用程序在此消息入队以启动作业).
--时间条件(与ORACLE STREAMS AQ规则条件的语法相同),如果为TRUE则启动作业.

create table event_t(event_ varchar(100));

create or replace type t_event_q as object(
object_owner varchar2(50),event_name varchar2(50));

begin
dbms_aqadm.create_queue_table(
queue_table=>'event_q',
queue_payload_type=>'t_event_q',
multiple_consumers=>true);
end;

begin
dbms_aqadm.create_queue(
queue_name=>'e_q',
queue_table=>'event_q');
end;

exec dbms_aqadm.start_queue(queue_name=>'e_q')

declare
aa dbms_aq.enqueue_options_t;
bb dbms_aq.message_properties_t;
cc raw(16);
dd t_event_q;
begin
dd:=t_event_q('SYS','give_me_an_event');
dbms_aq.enqueue(
queue_name=>'e_q',
enqueue_options=>aa,
message_properties=>bb,
payload=>dd,
msgid=>cc);
end;

select * from event_t;

--基于事件的调度
时间类型:
--用户或应用程序生成的事件
--调度程序生成的事件
由调度程序作业引发的事件:
JOB_START,JOB_SUCCEEDED,JOB_FAILED,JOB_BROKEN,JOB_COMPLETED
JOB_STOPPED,JOB_DISABLED,JOB_CHAIN_STALLED,JOB_ALL_EVENTS.

--创建作业链
1.创建链对象
2.定义链步骤
3.定义链规则
4.启动链
启用链,创建指向链的作业

--监视作业链

--高级调度程序概念
资源使用者组
资源计划
窗口组
窗口
作业类--程序,作业,计划

--创建窗口
为十二月份创建一个使用END_OD_YEAR资源计划的窗口,
并且此窗口在每晚从东部标准时间(EST)下午6:00到第二天上午6:00有效.

BEGIN
 DBMS_SCHEDULER.CREATE_WINDOWS(
  window_name=>'DEC_NIGHTS',
  resource_plan=>'END_OF_YEAR',
  start_date=>'01-DEC-03 06.00.00 PM EST',
  repeat_interval=>'FREQ=DAILY; BYHOUR=18',
  duration=>'0 12:00:00',
  end_date=>'31-DEC-03 06.00.00 AM EST',
  comments=>'Every day at 6:00 PM');
END;

区分窗口内作业的优先级


----------------------L15 数据库安全性

ORACLE透明数据加密(TDE):概览
--安全信息的需要
--敏感信息的自动加密
内嵌于ORACLE数据库中
无需更改应用程序逻辑
加密数据和索引值
--使用加密密钥
整个数据库的主密钥
存储在ORACLE Wallet中

TDE加密过程
明文数据----外部安全模块----加密数据

实施透明数据加密
1.创建Wallet:自动创建或使用ORACLE Wallet Manager创建
sqlnet.ora条目示例
ENCRYPTION_WALLET_LOCATION=
(SOURCE=(METHOD=FILE)(METHOD_DATA=
(DIRECTORY=/opt/oracle/product/10.2.0/db_1/wallet)))

2.在实例中设置主密钥:
ALTER SYSTEM SET ENCRYPTION KEY IDENTIFIED BY ;

3.在实例中打开Wallet
ALTER SYSTEM SET ENCRYPTION WALLET OPEN
IDENTIFIED BY ;

4.创建包含加密列的表:
CREATE TABLE emp(
 first_name VARCHAR2(128),
 last_name VARCHAR2(128),
 empID NUMBER ENCRYPT NO SALT,--创建索引的列必须使用NO SALT
 salary NUMBER(6) ENCRYPT USING '3DES168',--加密列使用3DES168
 comm NUMBER(6) ENCRYPT);--加密列使用AES128

sys用户下所有对象都不支持加密
使用其他用户进行加密

现有表和TDE
--添加加密列
ALTER TABLE emp ADD(ssn VARCHAR(11) ENCRYPT);
--加密未加密列:
ALTER TABLE emp MODIFY(first_name ENCRYPT);
--禁用加密列
ALTER TABLE emp MODIFY(first_name DECRYPT);
--添加或删除salt
ALTER TABLE emp MODIFY(first_name ENCRYPT [NO]SALT);
--更改密钥和加密算法
ALTER TABLE emp REKEY USING '3DES168';

透明数据加密:注意事项
--不能加密SYS所拥有的表
--不支持LONG和LOB数据类型
--支持的加密算法有:
3DES168
AES128
AES192
AES256
--必须使用NO SALT加密索引列
--TDE使用索引执行等式搜索
--必须先解密加密数据,然后再执行表达式求值
--最佳方案提示:备份Wallet

Wallet对用户名和口令的支持
--Wallet现在可以持有多个证书
用户名和口令可以存储在Wallet中,而不必通过命令行提供。
--批处理作业处理
操作系统上列出进程时防止公开用户名和口令
--使用以下方法设置:
sqlnet.ora中的WALLET_LOCATION
mkstore实用程序

数据泵和透明数据加密
--在导出和导入期间,使用您自己提供的密钥:
ENCRYPTION_PASSWORD=
--对于外部表也是如此
CREATE TABLE emp_ext(
 first_name,last_name,empID,
 salary ENCRYPT IDENTIFIED BY "xIcf3T9u")
 ORGANIZATION EXTERNAL
 (TYPE ORACLE_DATAPUMP
  DEFAULT DIRECTORY "D_DIR"
  LOCATION('emp_ext.dat'))
 REJECT LIMIT UNLIMITED
 as select * from employees;


RMAN加密模式:概览
备份有一下三种加密模式:
--透明模式
需要ORACLE Walleet
最适合在同一位置执行的日常备份和还原操作
是默认的加密模式
--口令模式
需要提供口令
最适合在远程位置还原的备份
--双重模式
可以使用ORACLE Wallet或口令
最适合在本地和远程还原的备份

透明模式设置
1.创建Wallet:自动创建或使用ORACLE Wallet Manager创建
2.在实例中打开Wallet:
ALTER SYSTEM SET ENCRYPTION WALLET OPEN IDENTIFIED BY ;
3.在实例中设置主密钥:
ALTER SYSTEM SET ENCRYPTION KEY IDENTIFIED BY ;
4.将RMAN配置为使用透明加密:
CONFIGURE ENCRYPTION FOR DATABASE ON;
5.备份或恢复命令不会发生更改.
6.可以暂时覆盖永久配置:
SET ENCRYPTION OFF;

口令模式设置
1.将RMAN会话设置为使用口令加密:
SET ENCRYPTION ON IDENTIFIED BY password ONLY;
2.备份命令不会发生更改.
3.将RMAN会话设置为解密用口令加密的备份:
SET DECRYPTION IDENTIFIED BY password1 (,password2,...,passwordn)
4.恢复命令不会发生更改

双重模式设置
1.创建Wallet:自动创建或使用ORACLE Wallet Manager创建
2.在实例中打开Wallet:
ALTER SYSTEM SET ENCRYPTION WALLET OPEN IDENTIFIED BY ;
3.将RMAN会话设置为使用双模式加密:
SET ENCRYPTION ON IDENTIFIED BY password
4.备份命令不会发生更改
5.如果需要,将RMAN会话设置为口令解密备份;
SET DECRYPTION IDENTIFIED BY password1 (,password2,...,passwordn)
6.恢复命令不会发生更改.

RMAN加密备份:注意事项
--不能加密映像副本备份
--COMPATIBLE必须至少设置为10.2.0
--V$RMAN_ENCRYPTION_ALGORITHMS包含可能的加密算法列表.
--备份加密只适用于ORACLE DATABASE 企业版
--每个新的加密备份使用一个新加密密钥
--可以通过使用多个通道提高磁盘性能.
--可以随时更改主密钥,而不会影响以透明方式加密的备份

CONFIGURE ENCRYPTION ALGORITHM 'algorithmname'
SET ENCRYPTION ALGORITHM 'algorithmname'

手动RMAN设置备份的密码
set encryption on identified by "111" only
解密命令
set decryption identified by "111";

查看支持的加密的方式
select algorithm_name from v$rman_encryption_algorithms;


数据私密性的需要
示例:
--雇员:保护薪金与佣金百分比(在本课后面部分使用)
--联机银行业务:包含帐户访问
--Web商店:提供个人购物篮
--Web主机:只允许各客户查看自己的数据
--用于ORACLE SALESONLINE.COM和ORACLE PORTAL

术语定义和用法
--细粒度访问控制(FGAC):使用函数
--应用程序上下文:保留用户身份并用作应用程序属性和值的安全数据高速缓存
--应用程序属性:由详细访问策略使用

虚拟专用数据库:概览
--虚拟专用数据库(VPD)包括:
详细访问控制(FGAC)
安全应用程序上下文
--VPD使用策略向SQL语句添加保护敏感数据的条件
--VPD提供行级访问控制
--应用程序属性在应用程序上下文中定义,由详细访问策略使用

虚拟专用数据库:功能
--列级VPD根据所访问的安全列实施行级访问控制
--通过定制,可以定义静态和非静态策略
--使用共享策略,可以将一个策略与多个对象相关联
--策略类型可以为INDEX
--策略谓词文本字符串的大小可以为32KB

列级VPD:实例
--并不总是重写语句
--考虑使用策略来保护EMPLOYEES表的SALARY和COMMISSION_PCT列.详细访问控制(FGAC):
对于此查询,其实不需要:
SELECT last_name FROM employees;
对于一下查询则是强制的:
SELECT last_name,salary FROM employees;
SELECT * FROM employees;

创建列级策略
1.授予权限
2.创建函数
3.将策略应用于对象
BEEGIN
 dbms_rls.add_policy(
 object_schema=>'hr',
 object_name=>'employees',
 policy_name=>'hr_policy',
 function_schema=>'hr',
 policy_function=>'hrsec',
 statement_types=>'select,insert',
 sec_relevant_cols=>'salary,commission_pct');
END;



----------------------L16 全球化支持

每个DBA必备的知识
--什么是字符集
--如何使用字符集
--要避免的问题
--选择字符集
--获取字符集信息
--指定基于语言的行为
--使用语言搜索和排序
--使用数据转换

ORACLE数据库支持各种字符编码方案
--单字节字符集
7位
8位
--多字节字符集,包括Unicode
set wrap off
select * from database_properties;

了解Unicode
AL40UTF8        AL16UTF16

如何使用字符集
--ORACLE NET将客户机上的NLS_LANG设置与服务器上的字符集进行比较.
--如果需要会自动透明的转换

要避免的问题
客户机            服务器
WE8MSWIN1252        AL32UTF8

不发生转换,应为好像没有必要
问题 :在数据库中输入无效数据

选择字符集
--综合考虑
--选择满足当前和未来业务需求的正确字符集
--指定字符集
--在创建数据库之后改变字符集

数据库字符集和国家字符集
数据库字符集                国家字符集
创建时定义                创建时定义
只有重新创建时才可以更换,        可以交换
但是少数情况除外   
存储类型为CHAR,VARCHAR2,        存储类型为NCHAR,NVARCHAR2或NCLOB的数据列
CLOB,LONG的数
可以存储宽度不同的字符集        可以使用AL16UTF16或UTF8存储Unicode

获取字符集信息
SELECT parameter,value FROM nls_database_parameters
WHERE parameter LIKE '%CHARACTERSET%';

指定基于语言的行为
数据库服务器的初始化参数>>>客户机的环境变量>>>ALTER SESSION命令>>>SQL函数
SELECT sysdate FROM dual;
set nls_date_format=yyyymmdd
set nls_date_format='yyyy-mm-dd hh24:mi:ss'
SELECT sysdate FROM dual;


为会话指定基于语言的行为
--使用NLS_LANG环境变量指定区域设置行为:
语言
地区
字符集
NLS_LANG=FRENCH_CANADA.WE8ISO8859P1
--设置其他NLS环境变量,以便:
覆盖所有会话的数据库初始化参数设置
自定义区域设置行为
更改NLS库文件的默认位置
set nls_lang=chinese_china.zhs16gbk;
set nls_lang=_japan;


基于语言和地区的参数
参数            默认值
NLS_LANGUAGE            AMERICAN
 NLS_DATE_LANGUAGE        AMERICAN
 NLS_SORT            BINARY
NLS_TERRITORY            AMERICA
 NLS_CURRENCY            $
 NLS_DUAL_CURRENCY        $
 NLS_ISO_CURRENCY        AMERICA
 NLS_DATE_FORMAT        DD-MON-RR
 NLS_NUMERIC-CHARACTERS        .,
 NLS_TIMESTAMP_FORMAT        DD-MON-RRHH.MI.SSXFF AM
 NLS_TIMESTAMP_TZ_FORMAT    DD-MON-RRHH.MI.SSXFF AM TZR

语言搜索和排序
排序受以下因素影响
--区分大小写
--变音符号或重音符号
--被视为单个字符的字符组合
--音标或字符外观
--文化首选项

三种类型的排序
--二进制排序
根据编码字符的二进制值进行排序
--单词语言排序
根据为字符分配的主要值和次要值排两遍序
--多语语言排序
基于多语排序规则的ISO标准(ISO 14651)和Unicode 3.2标准
根据中文字符的笔画数,拼音或部首进行排序

使用语言搜索和排序
可以使用下列对象指定用于字符数据的排序类型:
--NLS_SORT参数
从NLS_LANG环境变量得到的默认值(如果没有设置的话)
可以为会话,客户机或服务器指定
--NLSSORT函数
在查询级别定义排序方法

不区分大小写和重音的搜索和排序
--指定语言名称:
NLS_SORT=[_AI | _CI]
--示例:
NLS_SORT=FRENCH_M_AI
NLS_SORT=XGERMAN_CI
--为WHERE子句和PL/SQL块指定排序操作:
NLS_COMP=BINARY | ANSI
--对移植的数据库非常有用
select value from v$nls_valid_values
where parameter='sort'
order by value;

SQL和函数支持的设置
--下列SQL子句支持NLS_SORT和NLS_COMP设置:
WHERE
ORDER BY
START WITH
HAVING
IN / NOT IN
BETWEEN
CASE-WHEN
--NLSSORT()函数支持不区分大小写和重音的功能

语言索引支持
--对语言排序值创建索引
--无需指定ORDER BY子句和NLSSORT即可快速查询数据
CREATE INDEX list_word ON
list(NLSSORT(word,'NLS_SORT=French_M'));
SELECT word FROM list;
--对NLS_SORT参数进行设置,使其与创建索引时要用于语言排序的语言定义相符.

自定义语言搜索和排序
可以为下列对象自定义语言排序
--可以忽略的字符
--压缩或扩展字符
--特殊组合字母或特殊字母
--扩展字符或特殊字母
--特殊的大小写字母
--上下文相关的字母
--反向辅助排序
--规范等同值

CLOB和NCLOB之间的隐式转换
下列操作支持透明的隐式转换:
查询和DML的SQL IN和OUT绑定变量
传递PL/SQL函数和过程参数
PL/SQL变量赋值

使用ORACLE实用程序进行NLS数据转换
--如果使用不同的字符集,将数据从一个数据库中导出并导入到另一个数据库时,可能会执行很多数据转换.
--外部表实用服务器上的NLS设置确定数据字符集
--SQL*Loader:
常规路径:将数据转换为NLS_LANG指定的会话字符集
直接路径:使用客户端指令转换数据

使用数据包进行NLS数据转换
--数据泵导出实用程序始终以与数据所来自的数据库相同的字符集保存数据
--如果需要,数据泵导入实用程序会将数据转换成目标数据库的字符集
--数据泵日志文件以NLS_LANG为启动数据泵的会话指定的语言进行编写

全球化支持功能
--语言支持
地区支持
字符集支持
语言排序
消息支持
日期和时间支持
数字支持
货币支持









 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/16313359/viewspace-682359/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/16313359/viewspace-682359/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值