数据库、安装等

初始化参数

  • MAX_ENABLED_ROLES:用户拥有的有效角色的最大值
  • DB_CACHE_SIZE:数据库缓存大小

建立数据库

建立数据库之前需要考虑以下条件。

  • 拥有SYSDBA权限
  • 若使用操作系统认证,则需要建立相关操作系统帐户, 若使用密码文件认证,则需要建立密码文件
  • 足够的内存
  • 足够的磁盘空间

建立数据库时执行的脚本:

sql.bsq建立数据字典的表建立数据库时由Oracle自动执行
catalog.sql建立数据字典视图建立数据库之后由管理者手动执行

数据库模板

  • 仅包括数据库结构的模板
    • 表空间
    • 数据文件
    • 初始化参数
  • 包括数据库结构和用户数据的模板
    • 表空间
    • 数据文件
    • 初始化参数
    • 用户schema
    • 用户数据

OFA

Optimal Flexible Architecture,Oracle推荐的目录结构, 将数据文件、控制文件、日志等分散在多个磁盘中。好处:

  • 能轻易地区分数据文件和系统文件
  • 可以简单地识别控制文件、数据文件、日志等
  • 同一台服务器上建立多个Oracle数据库时降低管理难度
  • 通过分散数据文件,减少读写文件时的冲突,提高性能

Oracle Universal Installer

启动之前需要建立拥有 Oracle 的系统帐户(oracle用户、dba组、oinstall组)

监察(audit)

使监察有效:设置初始化参数 AUDIT_TRAIL=DB OS NONE
  • DB: 监察记录写到 SYS.AUD$
  • OS: 监察记录写道操作系统日志中

控制文件

使用 CREATE CONTROLFILE 命令建立控制文件。

使用OMF(Oracle-Managed Files)管理文件时也能用CREATE CONTROLFILE命令建立控制文件, 但必须要指定 DATAFILE 和 LOGFILE。

可以过以下方法察看控制文件:

  • V$CONTROLFILES
  • V$PARAMETERS
  • show parameters 命令

控制文件在以下情况下更新。

数据文件和REDO日志文件的名称和位置数据库中添加、更改或删除数据文件和REDO日志文件时
表空间信息添加或删除表空间时
REDO日志的历史记录日志切换时
备份日志的位置和状态日志备份发生时
备份的位置和状态由Recovery Manager记录
现在的日志序号日志切换时
checkpoint信息checkpoint执行时

自动段(Segment)管理

  • 自动管理 PCTUSED、FREELISTS、FREELIST GROUPS参数
  • 提高空间利用率、提高并行数据插入的性能
  • 使用位图(而不是空闲列表)管理段内的空闲空间,插入数据时通过位图查找大小合适的数据块。
  • 不能保存LOB段和包含LOB列的表

段类型

  • 表(Table)
  • 分区表(Partition Table)
  • 簇(Cluster)
  • 索引(Index)
  • 索引组织表(Index-organized Table, IOT)
  • 分区索引(Partition Index)
  • UNDO段
  • 临时段:查询和建立索引时排序用
  • LOB
  • 嵌套表(Nested Table)
  • bootstrap:打开数据库时初始化数据字典时使用的段

其中UNDO段和临时段为系统建立,不属于 schema 对象。

rollback 段

包括系统rollback段非系统rollback段延迟rollback段三种。

  • 系统rollback段: 创建数据库时创建,仅当系统表空间内的对象发生变化时使用
  • 非系统rollback段: 自动管理、手动管理
  • 延迟rollback段: 事务进行时,表空间以 NORMAL 以外的方式脱机,事务信息将被保存在延迟rollback段中以便表空间联机时恢复事务。由oracle自动管理。

范围(extent)

范围(extent)管理

手动分配

ALTER TABME emp ALLOCATE EXTENT [(SIZE size DATAFILE 'filename)]

表空间

默认表空间

创建表时如果不指定表空间,则建立在schema规定的默认表领域中。

临时表空间

  • 创建:CREATE TEMPORARY TABLESPACE 语句,默认使用字典方式管理
  • 更改默认临时表空间:ALTER DATABSE DEFAULT TEMPORARY TABLESPACE 语句。

表空间管理

local表空间管理方式不能更改其存储参数(STORAGE)。 字典管理方式下可以更改存储参数。

Oracle9i中默认管理方式为local管理,8i 为字典管理。 9i中可以通过 EXTENT MANAGEMENT DICTIONARY 来指定字典管理方式。

使用 ALTER TABLESPACE user01 OFFLINE NORMAL 将表空间设置为OFFLINE的动作 会同时被记录到控制文件和数据字典中。

索引

索引

通过 ALTER INDEX … REBUILD 语句重新建立索引有以下特征:

  • 根据原有索引来建立新索引
  • 不需要排序
  • 建立时需要有足够的空间来容纳新旧索引。建立完毕后旧索引会被删除
  • 建立的索引中不包括已删除的数据
  • 建立过程中依然可以通过旧索引进行查询

监视索引

通过下面的方法来监视索引是否被使用。

ALTER INDEX ... MONITORING USAGE;

之后通过 V$OBJECT_USAGE 来确认索引的使用情况。例如

ALTER INDEX numb_oe_index MONITORING USAGE;     -- 监视开始
SELECT inde_name, usage FROM v$object_usage;    -- 确认使用情况
SELECT COUNT(*) FROM numbers WHERE odd_even='E';  -- 在numbers表上执行查询
SELECT inde_name, usage FROM v$object_usage;    -- 确认使用情况
ALTER SESSION SET optimizer_mode=first_rows;    -- 修改优化器为cost base
SELECT COUNT(*) FROM numbers WHERE odd_even='E';  -- 在numbers表上执行查询
SELECT inde_name, usage FROM v$object_usage;    -- 确认使用情况
ALTER INDEX numb_oe_index NOMONITORING USAGE;   -- 监视停止

临时表

临时表仅在当前会话或者当前事务中存在。 其生命期由 CREATE GLOBAL TEMPORARY TABLE语句的参数决定。

  • ON COMMIT DELETE ROWS:(默认)事务范围内存在
  • ON COMMIT PRESERVE ROWS:会话范围内存在

特性

  • 针对临时表的DML操作不锁定、不生成REDO日志
  • 可以针对临时表建立索引、视图、触发器。
  • 可以通过工具导入/导出其定义,但无法导出数据。

创建表时的注意事项

  • rollback segment、临时段、索引等放在不同的表空间,防止出现碎片
  • 尽可能少地分配 extent 以减少碎片
  • 尽量使用 local 管理以降低 overhead

表约束

约束延迟

创建约束时通过 [NOT] DEFERRABLE INITIALLY {IMMEDIATE|DEFERRED} 来设置延迟。 延迟即为事务提交时检查约束,反之则在语句执行时检查约束。

  • NOT DEFERRABLE 不能延迟
  • DEFERRABLE INITIALLY IMMEDIATE 能够延迟,但默认情况下为不延迟。DEFERRABLE 情况下的的默认设置
  • DEFERRABLE INITIALLY DEFERRABLE 能够延迟,默认情况下为延迟

修改延迟设置:

  • ALTER SESSION SET CONSTRANT[S] = {IMMEDIATE DEFERRED DEFAULT}
  • SET CONSTRANT[S] {constrant_name ALL} {IMMEDIATE DEFERRED}

一致性

读取一致性

默认情况下是语句级别读取一致性。 通过 SET TRANSACTION READ ONLY 可以使用事务级读写一致性。

日志(REDO Log)

checkpoint的发生条件

  • 日志切换
  • SHUTDOWN ABORT以外的方式终止实例
  • 由于FAST_START_MTTR_TARGET参数导致的强制执行
  • ALTER SYSTEM CHECKPOINT命令执行
  • OFFLINE NORMALREAD ONLYBEGIN BACKUP选项的 ALTER TABLESPACE命令

日志的archive

  • ARCHIVELOG模式:过去的日志文件被archive之后,才会被覆盖
  • ARCHIVELOG模式、NOARCHIVELOG模式:checkpoint结束之后过去的日志才会被覆盖

UNDO

建立

建立数据库时建立:

CREATE DATABASE ... UNDO TABLESPACE undo01 DATAFILE '...';

建立数据库之后建立:

CREATE UNDO TABLESPACE undo01 DATAFILE '...';

UNDO表空间管理

如果系统中有事务正在执行,那么切换UNDO表空间

ALTER SYSTEM SET undo_tablespace=undotbs2

会造成

  • 新的 UNDO 表空间中的 UNDO 段成为ONLINE状态
  • 旧 UNDO 表空间中包含事务的 UNDO 段成为 PENDING OFFLINE 状态

自动UNDO表空间管理的参数

UNDO_MANAGEMENTauto=自动管理 manual=手动管理
UNDO_TABLESPACE指定有效的undo表空间
UNDO_RETENTIONUNDO数据的保存时间(秒)
UNDO_SUPPRESS_ERRORS设置为true可以禁止显示 ORA_30019 错误信息

数据字典

数据字典

DBA_TAB_PRIVS对象权限
DBA_COL_PRIVS列权限
DBA_SYS_PRIVS系统权限
SESSION_PRIVS当前会话可以使用的系统权限
DBA_ROLLBACK_SEGS所有的rollback段的信息,但不包括OPTIMAL值
DBA_FREE_SPACES数据文件内可分配的连续空间的信息
DBA_USERS包含用户的角色信息

数据字典视图由 catalog.sql 脚本建立。

动态性能视图

使用动态性能视图可以获得以下信息。

V$DATAFILE数据文件
V$INSTANCE数据库状态
V$LOCK, V$LOCKED_OBJECT锁信息
V$SESSION会话信息
V$ROLLSTAT 有效rollback段的信息
V$ROLLNAME 仅包含rollback段id和名称,通常和V$ROLLSTAT结合使用

权限管理

用户

创建用户时使用 IDENTIFIED GLOBALLY AS ‘external’ 可以用企业目录服务(Enterprise Directory Service)进行用户认证。

操作系统认证

OS_AUTHENT_PREFIX参数值 + OS用户名 = Oracle用户名

角色

修改角色的条件:用户需要拥有 ALTER ANY ROLE 权限,或者以 WITH ADMIN OPTION 被赋予某个角色。

权限

DDL的系统权限在取消时不会连锁。例如 A -> B with admin option, B -> C,那么 A 在 revoke B 时 B 赋予 C 的权限不会被自动取消。

密码

  • PASSWORD_REUSE_TIME: 重复使用旧密码的最小间隔日数
  • PASSWORD_REUSE_MAX: 重复使用旧密码之前,最少需要修改几次密码
  • FAILED_LOGIN_ATTEMPTS: 密码错误超过规定次数以上则锁定帐户
  • PASSWORD_LOCK_TIME: 帐户锁定时间
  • PASSWORD_LIFE_TIME: 密码有效期限
  • PASSWORD_GRACE_TIME: 密码过期后多长时间内必须修改密码
  • PASSWORD_VERIFY_FUNCTION: 检查密码复杂度的函数

执行 utlpwdmg.sql 可以建立默认的复杂度检查函数。

策略(profile)

创建策略:

CREATE PROFILE dev_prof LIMIT
  IDLE_TIME 60
  SESSIONS_PER_USER 2
  CONNECT_TIME 30

创建策略时的参数:

CPU_PER_SESSION会话使用的CPU时间(单位0.01秒)
SESSIONS_PER_USER用户可以同时进行的会话数
CONNECT_TIME允许连接时间(分钟)
IDLE_TIME允许空闲时间(分钟)
LOGICAL_READS_PER_SESSION一次会话中能够进行的逻辑读次数(单位为数据块)
PRIVATE_SGA私有SGA的大小(单位为数据块)
CPU_PER_CALL一次调用(SQL语句)允许使用的CPU时间最大值(0.01秒)
LOGICAL_READS_PER_CALL一次调用(SQL语句)能够进行的逻辑读次数(单位为数据块)

如何使策略有效

  • 设置初始化参数 RESOURCE_LIMIT=TRUE
  • 用ALTER SYSTEM命令动态变更

SQL*Plus

确认表或视图的结构:

  • DESCRIBE 命令
  • DICT_COLUMNS 视图