Oracle DBA学习笔记
数据库、安装等
初始化参数
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 NORMAL
、READ ONLY
、BEGIN 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_MANAGEMENT | auto=自动管理 manual=手动管理 |
UNDO_TABLESPACE | 指定有效的undo表空间 |
UNDO_RETENTION | UNDO数据的保存时间(秒) |
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 视图