ORACLE 数 据 库 维 护 ORACLE 数 据 库 维 护 0 1. ORACLE 数 据 库 启 动 与 关 闭 2 1.1 打 开 和 关 闭 数 据 库 ( 手 工 2 1.1.1 sqlplus 连 接 2 1.1.2 打 开 数 据 库 2 1.1.3 启 动 oracle listener 2 1.1.4 关 闭 oracle listener 2 1.1.5 关 闭 数 据 库 2 2. 数 据 库 备 份 3 2.1 冷 备 份 3 2.2 用 exp imp 命 令 做 逻 辑 备 份 3 2.3 用 tar 命 令 做 物 理 备 份 4 2.4 备 份 控 制 文 件 4 2.5 联 机 全 备 份 + 日 志 备 份 5 2.5.1 设 置 5 2.5.2 步 骤 6 2.5.3 恢 复 6 2.5.3.1 磁 盘 全 部 损 坏, 仅 保 存 上 次 联 机 全 备 份 和 每 天 日 志 备 份 6 2.5.3.2 丢 失 某 数 据 文 件 7 2.5.3.3 文 件 损 坏 或 丢 失, 又 无 备 份, 7 2.5.4 注 意 要 点 7 3. 数 据 库 的 扩 充 8 3.1 增 加 一 个 表 空 间 8 3.1.1 创 建 表 空 间 8 3.1.2 增 加 某 个 表 空 间 的 大 小 9 3.2 增 加 oracle 的 用 户, 并 给 用 户 授 权 9 3.2.1 增 加 oracle 的 用 户, 并 给 用 户 授 权 9 3.2.2 增 加 oracle 的 角 色 9 3.2.3 中 断 用 户 同 oracle 的 连 接 9 3.3 表 视 图 索 引 约 束 10 3.3.1 表 和 视 图 10 3.3.1.1 管 理 表 10 3.3.1.1.1 建 立 表 10 3.3.1.1.2 表 的 命 名 规 则 11 3.3.1.1.3 从 其 它 表 中 建 立 表 11 3.3.1.1.4 更 改 表 定 义 11 3.3.1.2 管 理 视 图 13 3.3.1.2.1 建 立 视 图 14 3.3.1.2.2 从 视 图 中 获 得 数 据 14 3.3.1.2.3 插 入 更 新 删 除 数 据 15 3.3.1.2.4 删 除 视 图 15 3.3.2 索 引 15
3.3.2.1 B-Tree 索 引 15 3.3.2.2 位 图 索 引 16 3.3.2.3 修 改 索 引 16 3.3.2.4 重 建 索 引 16 3.3.3 序 列 (Sequences 16 3.3.3.1 创 建 序 列 17 3.3.3.2 删 除 序 列 17 3.4 网 络 管 理 17 3.4.1 Net8 server 端 配 置 18 3.4.1.1 listener.ora 文 件 的 样 本 : 18 3.4.1.2 启 动 listener 19 3.4.2 Net 8 client 端 配 置 19 3.4.3 sqlnet.ora 20 3.4.4 网 络 连 通 性 测 试 20 3.4.5 常 见 NET8 错 误 21 3.4.5.1 服 务 器 端 诊 断 21 3.4.5.2 客 户 端 诊 断 22 3.4.5.3 常 见 错 误 24 4. ORACLE8i 与 系 统 管 理 有 关 的 新 特 性 28 4.1 本 地 化 管 理 表 空 间 28 4.2 FBI 索 引 29 4.3 在 线 索 引 创 建 和 重 建 32 4.4 使 用 可 传 输 的 表 空 间 实 现 数 据 在 数 据 库 间 的 移 动 32 1. ORACLE 数 据 库 启 动 与 关 闭 1.1 打 开 和 关 闭 数 据 库 ( 手 工 1.1.1 sqlplus 连 接 #su - oracle #sqlplus /nolog 1.1.2 打 开 数 据 库 sql> connect sys/oracle as sysdba; sql> startup [nomount mount] 等 待 十 几 秒 左 右, 当 看 到 oracle instances started, database mounted, database opened 的 时 候,oracle 数 据 库 打 开 成 功 备 注 : 打 开 数 据 库 startup 可 带 三 个 参 数, 分 别 是 SQL > startup nomount 仅 启 动 instances SQL > startup mount 启 动 instances, 连 上 (mount 数 据 库 SQL > startup normal 启 动 instances, 连 上 (mount 数 据 库 ( 推 荐 打 开 (open 数 据 库
startup 缺 省 参 数 是 normal 1.1.3 启 动 oracle listener #su - oracle #lsnrctl start 如 果 出 错 检 查 环 境 变 量 是 否 设 好, 及 lsnrctl 文 件 的 内 容 和 执 行 属 性 1.1.4 关 闭 oracle listener #su - oracle #lsnrctl stop 1.1.5 关 闭 数 据 库 sql> connect sys/oracle as sysdba; sql> shutdown 关 闭 数 据 库 ( 推 荐 等 待 几 秒 左 右, 当 看 到 database closed database dismounted oracle instances shut down 的 时 候,oracle 数 据 库 关 闭 成 功 备 注 : 关 闭 数 据 库 shutdown 可 带 三 个 参 数, 分 别 是 SQL > shutdown abort 非 正 常 立 刻 关 机 等 于 忽 然 停 电 SQL > shutdown immediate 做 回 滚 操 作, 立 刻 关 机 SQL > shutdown normal 正 常 关 机 ( 推 荐 shutdown 缺 省 参 数 是 normal 2. 数 据 库 备 份 2.1 冷 备 份 关 闭 数 据 库 时 作 的 备 份 称 为 冷 备 份 关 闭 数 据 库, 将 所 有 和 本 实 例 有 关 的 文 件, 包 括 datafile,controlfile,redolog,archiv ed redolog,initora.ora 等 全 部 备 份 恢 复 时 只 要 将 这 些 文 件 放 回 从 前 的 目 录,startup 数 据 库 即 可 数 据 库 处 于 归 档 非 归 档 状 态 均 可 2.2 用 exp imp 命 令 做 逻 辑 备 份 EXP: 有 三 种 主 要 的 方 式 ( 完 全 用 户 表 1 完 全 : exp system/manager buffer=64000 file=/backup/full.dmp full=y 如 果 要 执 行 完 全 导 出, 必 须 具 有 角 色 EXP_FULL_DATABASE 2 用 户 模 式 : exp system/manager buffer=64000 file=/backup/bill.dmp owner=bill 这 样 用 户 bill 的 所 有 对 象 被 输 出 到 文 件 中 3 表 模 式 : exp system/manager buffer=64000 file=/backup/area.dmp owner=bill tables=area 这 样 用 户 bill 的 表 area 就 被 导 出 到 文 件 中 需 要 注 意 的 参 数 是 Inctype, 这 个 参 数 可 以 取 一 下 三 个 值 : Complete( 全 备 份 : 把 数 据 库 中 所 有 数 据 对 象 导 出 到 dump 文 件 中, 只 有 具 有 Exp_fu ll_database 的 用 户 有 使 用 这 个 参 数 的 权 限 Incremental( 增 量 备 份 : 把 数 据 库 中 所 有 上 次 备 份 后 修 改 的 表 备 份 出 来
Cumulative( 累 计 备 份 : 把 数 据 库 中 所 有 全 备 份 或 者 累 计 备 份 以 后 修 改 的 表 备 份 出 来 IMP: 具 有 三 种 模 式 ( 完 全 用 户 表 1 完 全 : imp system/manager buffer=64000 file=/backup/full.dmp full=y 如 果 要 执 行 完 全 导 入, 必 须 具 有 角 色 IMP_FULL_DATABASE 2 用 户 模 式 : imp system/manager buffer=64000 file=/backup/area.dmp fromuser=bill touser=billbak 文 件 中 用 户 bill 的 所 有 对 象 被 导 入 到 用 户 billbakk 中 必 须 指 定 fromuser touser 参 数 3 表 模 式 : imp system/manager buffer=64000 file=/backup/area.dmp fromuser=bill touser=billbak tables=area 文 件 中 用 户 bill 的 表 area 就 被 导 入 到 用 户 billbak 中 2.3 用 tar 命 令 做 物 理 备 份 1 #su - oracle 2 % tar cvf /dev/rmt0. 把 oracle 路 径 下 所 有 文 件 备 份 到 磁 带 机 上 3 % tar xvf /dev/rmt0 把 备 份 磁 带 上 所 有 文 件 恢 复 进 oracle 当 前 路 径 4 % tar tvf /dev/rmt/0 查 看 磁 带 上 有 些 什 么 文 件 2.4 备 份 控 制 文 件 控 制 文 件 是 Oracle 数 据 库 中 非 常 重 要 的 文 件 它 记 录 着 oracle 数 据 库 的 物 理 结 构 信 息, 比 如 数 据 文 件, 日 值 文 件 的 数 量 和 位 置 等 在 数 据 库 启 动 过 程 中, 需 要 读 取 控 制 文 件 如 果 控 制 文 件 损 坏 或 丢 失, 数 据 库 就 无 法 启 动 因 此, 做 好 控 制 文 件 的 备 份 十 分 重 要 一 般 的 数 据 库 配 置 都 会 有 多 个 控 制 文 件 这 些 控 制 文 件 是 完 全 相 同 的, 分 别 存 放 在 不 同 的 位 置 ( 最 好 在 不 同 的 磁 盘 上, 他 们 之 间 互 为 备 份 数 据 库 启 动 过 程 中, 必 须 保 证 所 有 控 制 文 件 都 是 一 致 的, 否 则 数 据 库 不 能 启 动 在 oracle 数 据 库 的 参 数 文 件 (initsid.o ra 中 指 定 控 制 文 件 的 位 置 如 果 部 分 控 制 文 件 损 坏, 可 以 在 参 数 文 件 中 去 掉 相 应 的 控 制 文 件, 即 可 启 动 数 据 库 每 次 数 据 库 物 理 结 构 发 生 改 变 时, 必 须 及 时 备 份 控 制 文 件 $sqlplus SQL>connect internal SQL>alter database backup controlfile to / /test.ctl ; 也 可 以 把 控 制 文 件 备 份 成 脚 本, 在 必 要 的 时 候 重 建 控 制 文 件 SQL>alter database backup controlfile to trace; 2.5 联 机 全 备 份 + 日 志 备 份 2.5.1 设 置 ORACLE 数 据 库 有 两 种 运 行 方 式 : 一 是 归 档 方 式 (ARCHIVELOG, 归 档 方 式 的 目 的 是 当 数 据 库 发 生 故 障 时 最 大 限 度 恢 复 所 有 已 提 交 的 事 物 ; 二 是 不 归 档 方 式 (NOARCHIVELOG, 恢
复 数 据 库 到 最 近 的 回 收 点 这 两 种 方 式 将 对 备 份 方 法 产 生 较 大 的 影 响 1. 改 变 不 归 档 方 式 为 为 归 档 方 式 2. 关 闭 数 据 库, 备 份 已 有 的 数 据 3. 改 变 数 据 库 的 运 行 方 式 是 对 数 据 库 的 重 要 改 动, 所 以 要 对 数 据 库 做 备 份, 对 可 能 出 现 的 问 题 作 出 保 护 4. 启 动 Instance,Mount 数 据 库 但 不 打 开 数 据 库, 来 改 变 归 档 方 式 #sqlplus sql>connect internal sql>startup mount sql>alter database archivelog; 5. 使 能 自 动 存 档 在 初 始 化 文 件 init*.ora( 一 般 放 ORACLE 根 目 录 的 下 层 目 录 dbs 下 加 参 数 : log_archive_start=true 6. 指 定 存 档 的 重 做 登 录 文 件 名 和 存 放 的 位 置 同 样 是 在 初 始 化 文 件 init*.ora 中 加 入 下 面 的 参 数 : log_archive_format=%s.arc log_archive_dest=/arch12/arch (arch12 是 日 志 文 件 存 放 的 目 录 7. 关 闭 数 据 库, 重 新 启 动 数 据 库, 归 档 方 式 转 换 完 成 8. 可 用 archive log list 查 看 状 态, 去 除 归 档 日 志 功 能 的 命 令 为 alter database noarchivelog 2.5.2 步 骤 联 机 全 备 份 : 数 据 库 处 于 open 状 态, 依 次 对 各 个 表 空 间 备 份 sqlplus "/ as sysdba" SQL>alter tablespace system begin backup; 复 制 此 tablespace 各 个 datafile SQL>alter tablespace system end backup; 注 意 :begin backup 是 对 tablespace 冻 结 写 入,end backup 是 解 除 冻 结, 因 此 复 制 dataf ile 的 过 程 不 宜 过 长 备 份 controlfile SQL>alter database backup controlfile to. ; 日 志 备 份 : sqlplus "/ as sysdba" SQL>alter system archive log stop; 移 去 日 志 目 录 下 的 所 有 archived redolog SQL>alter system archive log start; 2.5.3 恢 复 数 据 库 处 于 shutdown 状 态 2.5.3.1 磁 盘 全 部 损 坏, 仅 保 存 上 次 联 机 全 备 份 和 每 天 日 志 备 份 这 是 最 坏 情 况 解 决 硬 件 故 障, 配 置 系 统 软 件 及 环 境 oracle 用 户, 将 全 备 份 和 日 志 备 份 转 移 至 相 应 目 录, 根 据 initsid.ora 中 controlfile 的 配 置, 将 备 份 控 制 文 件 复 制 到 响 应 目 录 下 sqlplus "/ as sysdba"
SQL>startup mount SQL>recover database until cancel using backup controlfile; 逐 个 确 认 待 恢 复 的 archived redolog, 待 最 后 一 个 完 成 后, 键 入 cancel, 使 恢 复 结 束 SQL>alter database open resetlogs; 注 意 : 由 于 日 志 已 经 重 置, 所 以 应 尽 快 做 一 次 联 机 全 备 份 2.5.3.2 丢 失 某 数 据 文 件 只 要 将 此 文 件 从 上 次 联 机 全 备 份 中 复 制 至 其 目 录, 并 将 自 上 次 联 机 全 备 份 以 来 所 有 日 志 备 份 移 至 归 档 目 录 sqlplus "/ as sysdba" SQL>startup mount SQL>alter database recover datafile path/file ; 或 者 简 单 些 recover database; SQL>alter database open; 2.5.3.3 文 件 损 坏 或 丢 失, 又 无 备 份, 这 种 情 况 只 能 将 此 文 件 脱 机, 将 数 据 exp 出 来, 重 建 表 空 间, 再 imp 进 去 sqlplus "/ as sysdba" SQL>connect internal SQL>startup mount SQL>alter database datafile path/file offline; SQL>alter database open; 2.5.4 注 意 要 点 无 论 有 多 少 把 握, 恢 复 前 先 做 冷 备 份, 此 为 第 一 原 则 不 这 样 做, 便 是 无 路 可 退, 一 旦 失 误, 后 果 十 分 严 重 1.rollback 段 损 坏 这 是 非 常 严 重 的 问 题, 可 在 initora.ora 中 写 入 _corrupted_rollback_segments=(rxx, 启 动 时 避 开 损 坏 的 rollback 段, 这 只 是 权 宜 之 计 如 数 据 库 处 于 archivelog, 应 从 上 一 次 全 备 份 起 利 用 备 份 的 日 志 进 行 恢 复 ; 如 数 据 库 处 于 noarchivelog, 应 尽 快 将 全 部 数 据 e xport 出 来, 重 建 数 据 库, 再 import 进 去 所 有 操 作 之 前, 应 做 冷 备 份 2. 数 据 库 异 常 中 止 处 理 通 过 手 工 shutdown abort 操 作 中 止 数 据 库, 不 会 产 生 大 的 问 题, 通 常 直 接 startup 无 需 使 用 介 质 恢 复 命 令 如 果 由 于 机 器 崩 溃 引 起 的 中 止, 则 情 况 严 重 得 多, 有 可 能 要 使 用 到 上 面 提 到 的 恢 复 方 法, 不 过 这 种 现 象 并 不 多 见 一 般 需 要 显 式 使 用 介 质 恢 复 命 令, 如 下 : sqlplus "/ as sysdba" SQL>startup mount; SQL>recover database; SQL>alter database open; 3. 数 据 库 的 扩 充 3.1 增 加 一 个 表 空 间 3.1.1 创 建 表 空 间 命 令 示 例 : SQL>create tablespace application datafile /usr/oracle/dbs/application.dbf size 3M 针 对 具 体 情 况 增 加 回 滚 和 临 时 表 空 间 命 令 示 例 :
SQL>create rollback segment rbs8 tablespace rbs storage(initial 1m next 4m SQL>CREATE TABLESPACE TEMP DATAFILE "/usr/oracle/dbs/temp.dbf " SIZE 32M REUSE AUTOEXTEND ON NEXT 640K MINIMUM EXTENT 64K DEFAULT STORAGE ( INITIAL 64K NEXT 64K MINEXTENTS 1 MAXEXTENTS UNLIMITED PCTINCREASE 0 TEMPORARY; 回 滚 和 临 时 表 空 间 用 完 后, 可 删 除 或 使 它 offline SQL>drop tablespace rbs8; SQL>drop tablespaces billtemp; SQL>alter tablespace rbs offline; SQL>alter tablespace billtemp offline; 3.1.2 增 加 某 个 表 空 间 的 大 小 当 一 个 表 空 间 的 大 小 不 能 满 足 工 作 需 要 时, 应 该 扩 充 表 空 间 举 例 : SQL>alter tablespace system add datafile /usr/oracle/dbs/sys338.dbf size 3M; 3.2 增 加 oracle 的 用 户, 并 给 用 户 授 权 3.2.1 增 加 oracle 的 用 户, 并 给 用 户 授 权 举 例 : SQL>create user newuser identified by userpasswd default tablespace application temporary tablespace billtemp; SQL>grant connect to newuser; SQL>grant resource to newuser; SQL>grant update on emp to newuser; 3.2.2 增 加 oracle 的 角 色 oracle 的 缺 省 角 色 有 connect resource dba 它 是 一 组 可 以 分 配 给 其 它 role 或 用 户 的 权 限 总 和,connect 有 8 个 权 限,resource 有 5 个 权 限,dba 有 77 个 权 限 给 一 般 连 接 用 户 赋 connect, 给 一 般 编 程 人 员 赋 connect 加 resource, 只 有 数 据 库 管 理 员 才 有 dba 的 权 限 1 创 建 一 个 角 色 SQL>create role newrole identified by rolepasswd; 2 给 角 色 赋 权 限 SQL>grant select on all table to newrolle; SQL>grant connect to newrole with admin option; 3.2.3 中 断 用 户 同 oracle 的 连 接 当 oracle 数 据 库 要 关 机 或 某 个 用 户 占 有 的 大 量 的 资 源 需 要 被 释 放 时,dba 需 中 断 用 户 同 o racle 的 连 接 1 SQL>select sid,serial#,username from v$session;
2 SQL>alter system kill session interger1,interger2 ; interger1,interger2 分 别 对 应 于 sid 和 serial# 3.3 表 视 图 索 引 约 束 Oracle 数 据 库 数 据 对 象 中 最 基 本 的 是 表 和 视 图, 其 他 还 有 约 束 序 列 函 数 存 储 过 程 包 触 发 器 等 对 数 据 库 的 操 作 可 以 基 本 归 结 为 对 数 据 对 象 的 操 作 3.3.1 表 和 视 图 Oracle 中 表 是 数 据 存 储 的 基 本 结 构 ORACLE8 引 入 了 分 区 表 和 对 象 表,ORACLE8i 引 入 了 临 时 表, 使 表 的 功 能 更 强 大 视 图 是 一 个 或 多 个 表 中 数 据 的 逻 辑 表 达 式 本 文 我 们 将 讨 论 怎 样 创 建 和 管 理 简 单 的 表 和 视 图 3.3.1.1 管 理 表 3.3.1.1.1 建 立 表 表 可 以 看 作 有 行 和 列 的 电 子 数 据 表, 表 是 关 系 数 据 库 中 一 种 拥 有 数 据 的 结 构 用 CREATE TABLE 语 句 建 立 表, 在 建 立 表 的 同 时, 必 须 定 义 表 名, 列, 以 及 列 的 数 据 类 型 和 大 小 例 如 : CREATE TABLE products ( PROD_ID NUMBER(4, PROD_NAME VAECHAR2(20, STOCK_QTY NUMBER(5,3 ; 这 样 我 们 就 建 立 了 一 个 名 为 products 的 表, 关 键 词 CREATE TABLE 后 紧 跟 的 表 名, 然 后 定 义 了 三 列, 同 时 规 定 了 列 的 数 据 类 型 和 大 小 在 创 建 表 的 同 时 你 可 以 规 定 表 的 完 整 性 约 束, 也 可 以 规 定 列 的 完 整 性 约 束, 在 列 上 普 通 的 约 束 是 NOT NULL, 关 于 约 束 的 讨 论 我 们 在 以 后 进 行 在 建 立 或 更 改 表 时, 可 以 给 表 一 个 缺 省 值 缺 省 值 是 在 增 加 行 时, 增 加 的 数 据 行 中 某 一 项 值 为 null 时,oracle 即 认 为 该 值 为 缺 省 值 下 列 数 据 字 典 视 图 提 供 表 和 表 的 列 的 信 息 :. DBA_TABLES. DBA_ALL_TABLES. USER_TABLES. USER_ALL_TABLES. ALL_TABLES. ALL_ALL_TABLES. DBA_TAB_COLUMNS. USER_TAB_COLUMNS. ALL_TAB_COLUMNS 3.3.1.1.2 表 的 命 名 规 则 表 名 标 识 一 个 表, 所 以 应 尽 可 能 在 表 名 中 描 述 表,oracle 中 表 名 或 列 名 最 长 可 以 达 30 个 字 符 串 表 名 应 该 以 字 母 开 始, 可 以 在 表 名 中 包 含 数 字 下 划 线 # $ 等 3.3.1.1.3 从 其 它 表 中 建 立 表 可 以 使 用 查 询 从 基 于 一 个 或 多 个 表 中 建 立 表, 表 的 列 的 数 据 类 型 和 大 小 有 查 询 结 果 决 定 建 立 这 种 形 式 的 表 的 查 询 可 以 选 择 其 他 表 中 所 有 的 列 或 者 只 选 择 部 分 列 在 CREATE TABLE 语 句 中 使 用 关 键 字 AS, 例 如 : SQL>CREATE TABLE emp AS SELECT * FROM employee TABLE CREATED
SQL> CREATE TABLE Y AS SELECT * FROM X WHERE no=2 需 要 注 意 的 是 如 果 查 询 涉 及 LONG 数 据 类 型, 那 么 CREATE TABLE...AS SELECT... 将 不 会 工 作 3.3.1.1.4 更 改 表 定 义 在 建 立 表 后, 有 时 候 我 们 可 能 需 要 修 改 表, 比 如 更 改 列 的 定 义, 更 改 缺 省 值, 增 加 新 列, 删 除 列 等 等 ORACLE 使 用 ALTER TABLE 语 句 来 更 改 表 的 定 义 3.3.1.1.4.1 增 加 列 语 法 :ALTER TABLE [schema.] table_name ADD column_definition 例 : ALTER TABLE orders ADD order_date DATE; 对 于 已 经 存 在 的 数 据 行, 新 列 的 值 将 是 NULL. 3.3.1.1.4.2 更 改 列 语 法 : ALTER TABLE [schema.] table_name MODIFY column_name new_attributes; 例 : ALTER TABLE orders MODITY (quantity number(10,3,status varchar2(15; 这 个 例 子 中 我 们 修 改 了 表 orders, 将 STATUS 列 的 长 度 增 加 到 15, 将 QUANTITY 列 减 小 到 10,3 ; 修 改 列 的 规 则 如 下 : 可 以 增 加 字 符 串 数 据 类 型 的 列 的 长 度, 数 字 数 据 类 型 列 的 精 度 减 少 列 的 长 度 时, 该 列 应 该 不 包 含 任 何 值, 所 有 数 据 行 都 为 NULL 改 变 数 据 类 型 时, 该 列 的 值 必 须 是 NULL. 对 于 十 进 制 数 字, 可 以 增 加 或 减 少 但 不 能 降 低 他 的 精 度 3.3.1.1.4.3 删 除 数 据 列 优 化 ORACLE 数 据 库, 唯 一 的 方 法 是 删 除 列, 重 新 建 立 数 据 库 在 ORACLE8i 中 有 很 多 方 法 删 除 列, 你 可 以 删 除 未 用 数 据 列 或 者 可 以 标 示 该 列 为 未 用 数 据 列 然 后 删 除 删 除 数 据 列 的 语 法 是 : ALTER TABLE [schema.] table_name DROP {COLUM column_names (column_names}[cascade CONSTRAINS] 要 注 意 的 是 在 删 除 列 时 关 于 该 列 的 索 引 和 完 整 性 约 束 也 同 时 删 除 注 意 关 键 字 CASCADE CONSTRAINS, 如 果 删 除 的 列 是 多 列 约 束 的 一 部 分, 那 么 这 个 约 束 条 件 相 对 于 其 他 列 也 同 时 删 除 如 果 用 户 担 心 在 大 型 数 据 库 中 删 除 列 要 花 太 多 时 间, 可 以 先 将 他 们 标 记 为 未 用 数 据 列, 标 记 未 用 数 据 列 的 语 法 如 下 : ALTER TABLE [schema.] table_name SET UNUSED {COLUM column_names (column_names}[cascade CONSTRAINS] 这 个 语 句 将 一 个 或 多 个 数 据 列 标 记 为 未 用 数 据 列, 但 并 不 删 除 数 据 列 中 的 数 据, 也 不 释 放 占 用 的 磁 盘 空 间 但 是, 未 用 数 据 列 在 视 图 和 数 据 字 典 中 并 不 显 示, 并 且 该 数 据 列 的 名 称 将 被 删 除, 新 的 数 据 列 可 以 使 用 这 个 名 称 基 于 该 数 据 列 的 索 引 约 束, 统 计 等 都 将 被 删 除 删 除 未 用 数 据 列 的 语 句 是 : ALTER TABLE [schema.] table_name DROP {UNUSED COLUM COLUMN CONTINUE} 3.3.1.1.4.4 删 除 表 和 更 改 表 名 删 除 表 非 常 简 单, 但 它 是 一 个 不 可 逆 转 的 行 为
语 法 : DROP TABLE [schema.] table_name [CASCADE CONSTRAINTS] 删 除 表 后, 表 上 的 索 引 触 发 器 权 限 完 整 性 约 束 也 同 时 删 除 ORACLE 不 能 删 除 视 图, 或 其 他 程 序 单 元, 但 oracle 将 标 示 他 们 无 效 如 果 删 除 的 表 涉 及 引 用 主 键 或 唯 一 关 键 字 的 完 整 性 约 束 时, 那 么 DROP TABLE 语 句 就 必 须 包 含 CASCADE CONSTRAINTS 子 串 更 改 表 名 RENAME 命 令 用 于 给 表 和 其 他 数 据 库 对 象 改 名 ORACLE 系 统 自 动 将 基 于 旧 表 的 完 整 性 约 束 索 引 权 限 转 移 到 新 表 中 ORACLE 同 时 使 所 有 基 于 旧 表 的 数 据 库 对 象, 比 如 视 图 程 序 函 数 等, 为 不 合 法 语 法 :RENAME old_name TO new_name; 例 :SQL> RENAME orders TO purchase_orders; 3.3.1.1.4.5 截 短 表 TRUNCATE 命 令 与 DROP 命 令 相 似, 但 他 不 是 删 除 整 个 数 据 表, 所 以 索 引 完 整 性 约 束 触 发 器 权 限 等 都 不 会 被 删 除 缺 省 情 况 下 将 释 放 部 分 表 和 视 图 空 间, 如 果 用 户 不 希 望 释 放 表 空 间,TRUNCATE 语 句 中 要 包 含 REUSE STORAGE 子 串 TRUNCATE 命 令 语 法 如 下 : TRUNCATE {TABLE CLUSTER} [schema.] name {DROP REUSE STORAGE} 例 :SQL> TRUNCATE TABLE t1; 3.3.1.2 管 理 视 图 视 图 是 一 个 或 多 个 表 中 的 数 据 的 简 化 描 述, 用 户 可 以 将 视 图 看 成 一 个 存 储 查 询 (stored query 或 一 个 虚 拟 表 (virtual table. 查 询 仅 仅 存 储 在 oracle 数 据 字 典 中, 实 际 的 数 据 没 有 存 放 在 任 何 其 它 地 方, 所 以 建 立 视 图 不 用 消 耗 其 他 的 空 间 视 图 也 可 以 隐 藏 复 杂 查 询, 比 如 多 表 查 询, 但 用 户 只 能 看 见 视 图 视 图 可 以 有 与 他 所 基 于 表 的 列 名 不 同 的 列 名 用 户 可 以 建 立 限 制 其 他 用 户 访 问 的 视 图 3.3.1.2.1 建 立 视 图 CREATE VIEW 命 令 创 建 视 图, 定 义 视 图 的 查 询 可 以 建 立 在 一 个 或 多 个 表, 或 其 他 视 图 上 查 询 不 能 有 FOR UPDATE 子 串, 在 早 期 的 ORACLE8i 版 本 中 不 支 持 ORDER BY 子 串, 现 在 的 版 本 中 CREATE VIEW 可 以 拥 有 ORDER BY 子 串 例 : SQL> CREATE VIEW TOP_EMP AS SELECT empno EMPLOYEE_ID,ename EMPLOYEE_NAME,salary FROM emp WHERE salary >2000 用 户 可 以 在 创 建 视 图 的 同 时 更 改 列 名, 方 法 是 在 视 图 名 后 立 即 加 上 要 命 名 的 列 名 重 新 定 义 视 图 需 要 包 含 OR REPLACE 子 串 SQL> CREATE VIEW TOP_EMP (EMPLOYEE_ID,EMPLOYEE_NAME,SALARY AS SELECT empno,ename,salary FROM emp WHERE salary >2000 如 果 在 创 建 的 视 图 包 含 错 误 在 正 常 情 况 下, 视 图 将 不 会 被 创 建 但 如 果 你 需 要 创 建 一 个 带 错 误 的 视 图 必 须 在 CREATE VIEW 语 句 中 带 上 FORCE 选 项 如 :CREATE FORCE VIEW ORDER_STATUS AS SELECT * FROM PURCHASE_ORDERS WHERE STATUS= APPPOVE ;
SQL>/ warning :View create with compilation errors 这 样 将 创 建 了 一 个 名 为 ORDER_STATUS 的 视 图, 但 这 样 的 视 图 的 状 态 是 不 合 法 的, 如 果 以 后 状 态 发 生 变 化 则 可 以 重 新 编 译, 其 状 态 也 变 成 合 法 的 3.3.1.2.2 从 视 图 中 获 得 数 据 从 视 图 中 获 得 数 据 与 从 表 中 获 得 数 据 基 本 一 样, 用 户 可 以 在 连 接 和 子 查 询 中 使 用 视 图, 也 可 以 使 用 SQL 函 数, 以 及 所 有 SELECT 语 句 的 字 串 3.3.1.2.3 插 入 更 新 删 除 数 据 用 户 在 一 定 的 限 制 条 件 下 可 以 通 过 视 图 更 新 插 入 删 除 数 据 如 果 视 图 连 接 多 个 表, 那 么 在 一 个 时 间 里 只 能 更 新 一 个 表 所 有 的 能 被 更 新 的 列 可 以 在 数 据 字 典 USER_UPDATETA BLE_COLUMNS 中 查 到 用 户 在 CREATE VIEW 中 可 以 使 用 了 WITH 子 串 WITH READ ONLY 子 串 表 示 创 建 的 视 图 是 一 个 只 读 视 图, 不 能 进 行 更 新 插 入 删 除 操 作 WITH CHECK OPTION 表 示 可 以 进 行 插 入 和 更 新 操 作, 但 应 该 满 足 WHERE 子 串 的 条 件 这 个 条 件 就 是 创 建 视 图 WHERE 子 句 的 条 件, 比 如 在 上 面 的 例 子 中 用 户 创 建 了 一 个 视 图 TOP_EMP, 在 这 个 视 图 中 用 户 不 能 插 入 salary 小 于 200 0 的 数 据 行 3.3.1.2.4 删 除 视 图 删 除 视 图 使 用 DROP VIEW 命 令 同 时 将 视 图 定 义 从 数 据 字 典 中 删 除, 基 于 视 图 的 权 限 也 同 时 被 删 除, 其 他 涉 及 到 该 视 图 的 函 数 视 图 程 序 等 都 将 被 视 为 非 法 例 :DROP VIEW TOP_EMP; 3.3.2 索 引 索 引 是 一 种 可 以 提 高 查 询 性 能 的 数 据 结 构, 在 这 一 部 分 我 们 将 讨 论 索 引 如 何 提 高 查 询 性 能 的 ORACLE 提 供 了 以 下 几 种 索 引 : B-Tree 哈 希 (hash 位 图 (bitmap 等 索 引 类 型 基 于 原 始 表 的 索 引 基 于 函 数 的 索 引 域 (Domain 索 引 实 际 应 用 中 主 要 是 B-Tree 索 引 和 位 图 索 引, 所 以 我 们 将 集 中 讨 论 这 两 种 索 引 类 型 3.3.2.1 B-Tree 索 引 B-Tree 索 引 是 最 普 通 的 索 引, 缺 省 条 件 下 建 立 的 索 引 就 是 这 种 类 型 的 索 引 B-Tree 索 引 可 以 是 唯 一 或 非 唯 一 的, 可 以 是 单 一 的 ( 基 于 一 列 或 连 接 的 ( 多 列 B-Tree 索 引 在 检 索 高 基 数 数 据 列 ( 高 基 数 数 据 列 是 指 该 列 有 很 多 不 同 的 值 时 提 供 了 最 好 的 性 能 对 于 取 出 较 小 的 数 据 B-Tree 索 引 比 全 表 检 索 提 供 了 更 有 效 的 方 法 但 当 检 查 的 范 围 超 过 表 的 10% 时 就 不 能 提 高 取 回 数 据 的 性 能 正 如 名 字 所 暗 示 的 那 样,B-Tree 索 引 是 基 于 二 元 树 的, 由 枝 干 块 (branch block 和 树 叶 块 (leaf block 组 成, 枝 干 块 包 含 了 索 引 列 ( 关 键 字 和 另 一 索 引 的 地 址 树 叶 块 包 含 了 关 键 字 和 给 表 中 每 个 匹 配 行 的 ROWID CREATE UNIQUE INDEX scott.ord_ord_no_idx ON scott.ord(ord_no REVERSE PCTFREE 30 STORAGE(INITIAL 200K NEXT 200K PCTINCREASE 0 MAXEXTENTS 50 TABLESPACE indx01;
3.3.2.2 位 图 索 引 位 图 索 引 主 要 用 于 决 策 支 持 系 统 或 静 态 数 据, 不 支 持 行 级 锁 定 位 图 索 引 可 以 是 简 单 的 ( 单 列 也 可 以 是 连 接 的 ( 多 列, 但 在 实 践 中 绝 大 多 数 是 简 单 的 位 图 索 引 最 好 用 于 低 到 中 群 集 (cardinality 列, 在 这 些 列 上 多 位 图 索 引 可 以 与 AND 或 OR 操 作 符 结 合 使 用 位 图 索 引 使 用 位 图 作 为 键 值, 对 于 表 中 的 每 一 数 据 行 位 图 包 含 了 TRUE(1 FALSE(0 或 NULL 值 位 图 索 引 的 位 图 存 放 在 B-Tree 结 构 的 页 节 点 中 B-Tree 结 构 使 查 找 位 图 非 常 方 便 和 快 速 另 外, 位 图 以 一 种 压 缩 格 式 存 放, 因 此 占 用 的 磁 盘 空 间 比 B-Tree 索 引 要 小 得 多 CREATE BITMAP INDEX scott.ord_region_id_idx ON scott.ord(region_id PCTFREE 30 STORAGE(INITIAL 200K NEXT 200K PCTINCREASE 0 MAXEXTENTS 50 TABLESPACE indx01; 3.3.2.3 修 改 索 引 ALTER INDEX scott.ord_region_id_idx ALLOCATE EXTENT (SIZE 200K DATAFILE DISK6/indx01.dbf ; 重 建 索 引 对 于 频 繁 更 新 的 表, 索 引 会 变 得 层 次 很 深, 效 率 变 低 这 时 需 要 重 建 索 引 ALTER INDEX scott.ord_region_id_idx REBUILD TABLESPACE indx02; 3.3.3 序 列 (Sequences Oracle 序 列 是 一 个 连 续 的 数 字 生 成 器 序 列 常 用 于 人 为 的 关 键 字, 或 给 数 据 行 排 序 否 则 数 据 行 是 无 序 的 像 约 束 一 样, 序 列 只 存 在 于 数 据 字 典 中 序 列 号 可 以 被 设 置 为 上 升 下 降, 可 以 没 有 限 制 或 重 复 使 用 直 到 一 个 限 制 值 3.3.3.1 创 建 序 列 创 建 序 列 使 用 SET SEQUENCE 语 句 CREATE SEQUENCE [schema] sequence KEYWORD KEYWORD 包 括 下 面 的 值 : KEYWORD 描 述 START WITH 定 义 序 列 生 成 的 第 一 个 数 字, 缺 省 为 1 INCREMENT BY 定 义 序 列 号 是 上 升 还 是 下 降, 对 于 一 个 降 序 的 序 列 INCREMENT BY 为 负 值 MINVALUE 定 义 序 列 可 以 生 成 的 最 小 值, 这 是 降 序 序 列 中 的 限 制 值 缺 省 情 况 下 该 值 为 NOMINVALUE,NOMINVALUE, 对 于 升 序 为 1, 对 于 降 序 为 -10E26. MAXVALUE 序 列 能 生 成 的 最 大 数 字 这 是 升 序 序 列 中 的 限 制 值, 缺 省 的 MAXVALUE 为 NOMAXVALUE,NOMAXVALUE, 对 于 升 序 为 10E26, 对 于 降 序 为 -1
CYCLE 设 置 序 列 值 在 达 到 限 制 值 以 后 可 以 重 复 NOCYCLE 设 置 序 列 值 在 达 到 限 制 值 以 后 不 能 重 复, 这 是 缺 省 设 置 当 试 图 产 MAXVALUE+1 的 值 时, 将 会 产 生 一 个 异 常 CACHE 定 义 序 列 值 占 据 的 内 存 块 的 大 小, 缺 省 值 为 20 NOCACHE 在 每 次 序 列 号 产 生 时 强 制 数 据 字 典 更 新, 保 证 在 序 列 值 之 间 没 有 间 隔 当 创 建 序 列 时,START WITH 值 必 须 等 于 或 大 于 MINVALUE 3.3.3.2 删 除 序 列 删 除 序 列 使 用 DROP SEQUENCE 语 句 DROP SEQUENCE sequence_name 3.4 网 络 管 理 3.4.1 Net8 server 端 配 置 3.4.1.1 listener.ora 文 件 的 样 本 : CONNECT_TIMEOUT_LISTENER = 0 LOGGING_LISTENER = OFF LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = # Local connections. (ADDRESS_LIST = (ADDRESS = (PROTOCOL = IPC(KEY = icache (DESCRIPTION = # General TCP connections. (ADDRESS = (PROTOCOL = TCP(HOST = dbsvr(port = 1521 # For secure connections over SSL, uncomment the following lines. # # (DESCRIPTION = # Secure TCP connections. # (ADDRESS = # (PROTOCOL = TCPS(HOST = dbsvr(port = 2484 # # (DESCRIPTION = # IIOP Connections.
(PROTOCOL_STACK = (PRESENTATION = GIOP (SESSION = RAW (ADDRESS = (PROTOCOL = TCP(HOST = dbsvr(port = 2481 # For secure IIOP connections over SSL, uncomment the following lines. # # (DESCRIPTION = # Secure IIOP Connections. # (PROTOCOL_STACK = # (PRESENTATION = GIOP # (SESSION = RAW # # (ADDRESS = (PROTOCOL = TCPS(HOST = dbsvr(port = 2482 # SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (GLOBAL_DBNAME = s450 (ORACLE_HOME = /home1/ias/app/oracle/product/1.0.2 (SID_NAME = s450 (SID_DESC = (ORACLE_HOME = /home1/ias/app/oracle/product/1.0.2 (SID_NAME = icache_extproc (PROGRAM = extproc 3.4.1.2 启 动 listener 在 响 应 的 端 口 上 设 置 并 启 动 listener 手 工 启 动 listener: 1. >lsnrctl start 查 看 状 态 2. >lsnrctl status 3.4.2 Net 8 client 端 配 置 Net 8 client 端 常 用 的 配 置 方 法 为 tns 方 式 使 用 图 形 配 置 工 具 进 行 配 置 开 始 -> 程 序 ->Oracle-> Network Administration->Net8 Assistant. 1 选 本 地 -> 概 要 文 件 加 入 tnsnames
2 选 本 地 -> 服 务 命 名 新 建 一 个 连 接 串, 包 括 主 机 名 端 口, 协 议 3 选 文 件 -> 保 存 网 络 配 置 直 接 配 置 $ORACLE_HOME/network/admin/tnsnames.ora 1. 备 份 tnsnames.ora 2. 按 照 示 例 对 连 接 串 做 拷 贝 3. 改 变 连 接 串 的 名 字, 主 机 名, 端 口, 协 议,SID 等 参 数 4. 保 存 文 件 nttest = (DESCRIPTION= (ADDRESS= (PROTOCOL=tcp (HOST=localserver (PORT=1521 (CONNECT_DATA=(sid=oradb 3.4.3 sqlnet.ora 3.4.4 网 络 连 通 性 测 试 sqlplus tnsping ping,netstat 1. sqlplus system/manager @gis 注 意 :gis 是 刚 才 设 置 的 新 的 连 接 串 2. 在 客 户 端 >Tnsping gis, 并 且 检 查 tnsnames.ora 中 的 配 置 是 否 与 server 端 的 $ORACLE_HOME/network/admin/listen er.ora 中 的 配 置 是 否 一 致 1. Ping server IP 地 址, 查 看 网 络 连 通 性 3.4.5 常 见 NET8 错 误 故 障 排 除 是 每 个 系 统 管 理 人 员 必 要 面 对 的 工 作 下 面 给 出 几 种 故 障 分 析 和 排 除 方 法 3.4.5.1 服 务 器 端 诊 断 任 务 1: 数 据 库 系 统 是 否 启 动 确 定 数 据 库 系 统 是 否 已 启 动, 只 要 用 SQL*PLUS 登 录 即 可 : SQLPLUS system/manager 如 果 收 到 下 面 信 息, 则 数 据 库 还 不 能 用 ORA-1017: invalid U/P
ORA-1034: Oracle not available 任 务 2: 执 行 绕 弯 测 试 为 了 确 认 listener.ora, tnsnames.ora sqlnet.ora 文 件 的 存 在, 有 效 要 在 服 务 器 端 UNIX 在 : $ORACLE_HOME/network/admin Windows NT 在 :ORACLE_HOME\network\admin a. 这 些 文 件 是 否 在 工 作 b. TNS_ADMIN 变 量 有 效 性 使 用 Net8 Assistant 进 行 绕 弯 测 试 : 1. 启 动 Net8 Assistant: 在 UNIX, 从 $ORACLE_HOME/bin. 目 录 来 运 行 netasst 在 NT, choose Start > Programs > Oracle - HOME_NAME >Network Administration > Net8 Assistant. 2. 在 导 航 器 扩 展 Directory 或 Local > Service Naming. 3. 选 择 net service name 或 database service. 4. 选 命 令 > Test Net Service. 3.4.5.2 客 户 端 诊 断 当 服 务 器 已 经 通 过 一 般 的 SQL*PLUS 测 试 和 绕 弯 测 试 后, 可 以 进 行 客 户 端 的 测 试, 步 骤 如 下 : 1. 检 查 所 安 装 的 协 议 是 否 与 服 务 器 端 一 致 ; 在 UNIX, 可 以 运 行 $ORACLE_HOME/bin 目 录 下 的 adapters 来 确 认 结 果 显 示 : Installed Net8 Tranport Protocols are: IPC TCP/IP BEQueath SSL RAW... 2. 检 查 所 有 Net8 软 件 在 客 户 端 已 经 安 装 3. 确 认 客 户 端 机 器 $ORACLE_HOME/network/admin 目 录 下 的 tnsnames.ora 和 sqlnet.ora 文 件 的 内 容 : a. 当 前 的 工 作 目 录 b. TNS_ADMIN 环 境 变 量 在 NT 中, 如 果 TNS_ADMIN 环 境 变 量 没 有 注 册, 就 要 进 行 注 册 c. 用 FTP, TELNET 及 PING 检 查 网 络 的 连 接 情 况 4. 用 TNSPING TRCROUTE 实 用 程 序 或 Net8 Assistant 进 行 测 试 TNSPING:
tnsping net_service_name [count] CDS. net service name: 在 tnsnames.ora 或 名 字 服 务 上 得 使 用 如 : NIS 或 DCE 的 count ( 可 选 : 实 验 次 数 例 1: 使 用 spotdb 服 务 名 进 行 测 试 : tnsping spotdb 可 能 提 示 : TNS Ping Utility for SunOS: Copyright (c Oracle Corporation 1998. All rights reserved. Attempting to contact (ADDRESS=(PROTOCOL=TCP(HOST=spot(PORT=1521 OK (50msec 例 2: 用 TNSPING 测 试 10 次 : tnsping stprd 10 可 能 提 示 : TNS Ping Utility for SunOS: Copyright (c Oracle Corporation 1998. All rights reserved. Attempting to contact (ADDRESS=(PROTOCOL=TCP(HOST=spot(PORT=1521 OK (290 msec OK (100 msec OK (70 msec OK (70 msec OK (60 msec OK (70 msec OK (70 msec OK (80 msec OK (180 msec OK (340 msec 5. 如 果 连 接 失 败, 可 以 进 行 下 面 操 作 : 查 找 原 因 用 下 面 站 点 与 Oracle 联 系 : http://support.oracle.com 与 Oracle Worldwide Support 联 系 3.4.5.3 常 见 错 误 ORA-12154: TNS:could not resolve service name 原 因 : 在 tnsnames.ora,net8 不 能 定 位 到 服 务 器 上
措 施 : 1. 确 定 tnsnames.ora 文 件 存 在 2. 确 定 不 要 有 多 个 tnsnames.ora 3. 确 认 tnsnames.ora 文 件 的 服 务 名 的 正 确 性 4. 确 认 不 要 有 多 个 sqlnet.ora 5. 如 果 使 用 域 名, 确 认 sqlnet.ora 包 含 NAMES.DEFAULT_DOMAIN 参 数 如 果 该 参 数 不 存 在, 必 须 在 连 接 字 串 中 指 定 域 名 如 果 没 有 使 用 域 名, 而 NAMES.DEFAULT_DOMAIN 参 数 存 在, 则 删 掉 它 或 注 释 掉 6. 如 果 从 对 话 框 进 行 连 接, 要 带 @ 号 7. 启 动 客 户 端 的 跟 踪 功 能, 再 连 接 ORA-12198: TNS:could not find path to destination ORA-12203:TNS:unable to connect to destination 原 因 : 在 客 户 端 找 不 到 目 标 数 据 库 措 施 : 1. 所 输 入 的 网 络 服 务 名 是 否 正 确 2. 确 认 tnsnames.ora 文 件 中 的 ADDRESS 参 数 是 否 正 确 3. 确 认 tnsnames.ora 文 件 是 否 在 正 确 的 目 录 上 4. 确 认 远 程 监 听 器 是 否 启 动 : 输 入 : lsnrctl lsnrctl> status listener_name listener_name 缺 省 LISTENER. 如 果 没 有 启 动, 则 启 动 : lsnrctl> start listener_name 5. 如 果 从 对 话 框 连 接, 不 要 忘 记 加 @ 号 ORA-12203: TNS:unable to connect to destination ORA-12203 是 一 般 的 错 误, 可 以 检 查 $ORACLE_HOME/network/log 目 录 的 sqlnet.log 文 件 原 因 : 所 安 装 的 协 议 不 正 确 可 能 与 下 面 原 因 一 样 : ORA-12203 ORA-12538 ORA-00508 措 施 : 检 查 安 装 的 Oracle 协 议 在 UNIX 下, 运 行 $ORACLE_HOME/bin 目 录 下 的 adapters 程 序 应 该 输 出 : Installed Net8 Tranport Protocols are:
IPC TCP/IP BEQueath SSL RAW... ORA-12203 原 因 : 不 正 确 的 服 务 名 HOST 或 SERVICE 正 确? PORT 正 确? ORA-12203 另 外 原 因 : Net8 在 tnsnames.ora 文 件 中 没 有 找 到 服 务 描 述 符 措 施 : 用 下 面 命 令 确 认 数 据 库 是 否 在 运 行 : lsnrctl lsnrctl> status listener_name listener_name 不 是 必 须 的, 缺 省 LISTENER 如 果 系 统 提 示 没 有 运 行, 则 用 下 面 命 令 启 动 : lsnrctl> start listener_name 2. 确 认 tnsnames.ora 文 件 的 正 确 位 置 ORA-12203 另 外 原 因 : 目 标 系 统 的 监 听 没 有 工 作 措 施 : 确 包 远 程 系 统 的 监 听 在 工 作, 输 入 : lsnrctl lsnrctl> status listener_name 如 果 确 实 没 有 工 作, 则 输 入 : lsnrctl> start listener_name ORA-12203 另 外 原 因 : 存 在 潜 在 的 事 务 问 题 措 施 : 确 保 实 用 程 序 支 持 目 前 的 网 络 协 议, 如 TCP/IP 用 PING 试 ORA-12203 另 外 原 因 : tnsnames.ora 文 件 没 有 放 对 地 方 ( 目 录 Action: 确 保 tnsnames.ora 文 件 在 正 确 的 位 置 ORA-12203 另 外 原 因 : TCP/IP 地 址 (HOST=server_name 参 数 TCP/IP 或 SPX 地 址 参 数 (SERVICE=tns_application 与 客 户 端 不 一 致 措 施 : 确 认 这 些 参 数 使 用 相 同 的 名 字 对 于 TCP/IP, 确 保 listener.ora 文 件 的 HOST 和 tnsnames.ora 文 件 指 到 相 同 的 名 字 或 名 字 转 换 到 相 同 的 IP 地 址 对 于 SPX, 在 客 户 端 的 名 字 必 须 相 同
ORA-12224: TNS:no listener 原 因 : 由 于 监 听 没 有 工 作 而 连 接 请 求 不 能 完 成 措 施 : 1. 确 认 支 持 的 目 标 地 址 与 数 据 库 之 一 匹 配 2. 检 查 版 本 问 题 ORA-12533: TNS:illegal ADDRESS parameters 原 因 : 在 tnsnames.ora 文 件 的 ADDRESS 节 指 定 不 正 确 措 施 : 根 据 ADDRESS 语 法 进 行 改 正 ORA-12545: TNS:name lookup failure 原 因 : 远 程 节 点 不 能 连 接 措 施 : 1. tnsnames.ora 文 件 的 ADDRESS 和 listener.ora 文 件 的 正 确 性 2. 确 认 远 程 节 点 已 经 启 动 输 入 : lsnrctl lsnrctl> status listener_name 如 果 没 有 启 动, 则 输 入 : lsnrctl> start listener_name ORA-12560: TNS:protocol adapter error 原 因 : 监 听 不 能 启 动 措 施 : 1. 调 整 后 再 运 行 2. 分 析 跟 踪 文 件 的 内 容 ORA-3113: TNS:End of file on communication channel 原 因 : 一 个 无 法 预 料 文 件 结 束 在 通 信 通 道 里 被 处 理 可 能 是 通 信 连 接 被 临 时 地 停 止 了 措 施 : 需 要 修 改 发 射 次 数 等 ORA-3121: No interface driver connection -function not performed 原 因 :SQL*NET 版 本 引 起 措 施 : 不 要 使 用 下 面 前 缀 进 行 连 接 : T: X: P: 4. ORACLE8i 与 系 统 管 理 有 关 的 新 特 性
Oracle8i 引 入 了 几 项 崭 新 的 特 性, 可 简 化 对 ORDBMS 的 管 理, 并 使 其 更 易 操 作 和 使 用 4.1 本 地 化 管 理 表 空 间 在 Oracle8I 以 前, 表 空 间 的 使 用 状 况 都 是 通 过 数 据 字 典 来 完 成 的, 称 为 Dictionary- Managed Tablespace. 在 Oracle8I 推 出 以 前, 这 一 直 都 是 唯 一 的 表 空 间 管 理 方 式 自 从 O racle8i 以 后,Oracle 又 增 加 了 一 种 新 的 表 空 间 管 理 方 式 :Locally Managed Tablespace( 本 地 化 管 理 的 表 空 间 在 传 统 的 数 据 字 典 管 理 的 表 空 间 里,Oracle 在 数 据 字 典 的 表 里 面 记 录 了 每 个 表 空 间 的 每 个 区 的 使 用 状 况 : 每 当 一 个 区 被 使 用 或 被 释 放 时,Oracle 都 在 数 据 字 典 里 面 更 新 相 应 的 信 息, 并 产 生 相 应 的 redo 信 息 在 Oracle8I 里, 这 仍 然 是 默 认 的 表 空 间 管 理 方 式 在 Oracle8I 的 版 本 中,Oracle 推 出 了 一 种 全 新 的 表 空 间 管 理 方 式 : 本 地 化 管 理 的 表 空 间 所 谓 本 地 化 管 理, 就 是 指 Oracle 不 再 利 用 数 据 字 典 的 表 来 记 录 Oracle 表 空 间 里 面 的 区 的 使 用 状 况, 而 是 在 每 个 表 空 间 的 数 据 文 件 的 头 部 加 入 了 一 个 记 录 块, 在 其 中 记 录 每 个 区 的 使 用 状 况 每 当 一 个 区 被 使 用, 或 者 被 释 放 以 供 重 新 使 用 时,Oracle 都 会 更 新 数 据 文 件 头 部 的 这 个 记 录, 反 映 这 个 变 化 本 地 化 管 理 的 表 空 间 的 创 建 过 程 : 语 法 :CREATE TABLESPACE 表 空 间 名 字 DATAFILE 数 据 文 件 详 细 信 息 [EXTENT MANAGEMENT { DICTIONARY LOCAL {AUTOALLOCATE UNIFORM [SIZE INTETER [K M] ] } } ] 解 释 : 关 键 字 EXTENT MANAGEMENT LOCAL 指 定 这 是 一 个 本 地 化 管 理 的 表 空 间 对 于 系 统 表 空 间, 只 能 在 创 建 数 据 库 的 时 候 指 定 EXTENT MANGEMENT LOCAL, 因 为 它 是 数 据 库 创 建 时 建 立 的 第 一 个 表 空 间 若 为 DICTIONARY, 则 表 明 这 是 一 个 传 统 的 数 据 字 典 管 理 的 表 空 间, 这 是 个 默 认 选 项 当 选 择 了 LOCAL 关 键 字, 即 表 明 这 是 这 是 一 个 本 地 化 管 理 的 表 空 间 后, 还 可 以 继 续 选 择 更 细 的 管 理 方 式 : 是 AUTOALLOCATE 还 是 UNIFORM. 若 为 AUTOALLOCATE, 则 表 明 让 Oracle 来 决 定 区 块 的 使 用 办 法 ; 若 选 择 了 UNIFORM, 则 还 可 以 详 细 指 定 每 个 区 块 的 大 小, 若 不 加 指 定, 则 为 每 个 区 使 用 1M 大 小 是 本 地 化 管 理 的 表 空 间 还 是 创 建 数 据 字 典 管 理 的 表 空 间 只 能 在 创 建 表 空 间 的 时 候 指 定 在 表 空 间 已 经 创 建 以 后, 则 不 能 再 把 本 地 化 管 理 的 表 空 间 和 数 据 字 典 管 理 的 表 空 间 再 相 互 转 换 在 创 建 临 时 表 空 间 时, 也 可 以 在 CREATE TEMPORARY TABLESPACE 中 指 定 EXT ENT MANAGEMENT LOCAL 来 指 定 这 是 一 个 本 地 化 管 理 的 表 空 间 本 地 化 管 理 表 空 间 的 优 点 : 1. 本 地 化 管 理 的 表 空 间 避 免 了 递 归 的 空 间 管 理 操 作 而 这 种 情 况 在 数 据 字 典 管 理 的 表 空 间 是 经 常 出 现 的, 当 表 空 间 里 的 区 的 使 用 状 况 发 生 改 变 时, 数 据 字 典 的 表 的 信 息 发 生 改 变, 从 而 同 时 也 使 用 了 在 系 统 表 空 间 里 的 回 滚 段 2. 本 地 化 管 理 的 表 空 间 避 免 了 在 数 据 字 典 相 应 表 里 面 写 入 空 闲 块 已 使 用 块 的 信 息, 从 而 减 少 了 数 据 字 典 表 的 竞 争 3. 区 的 本 地 化 管 理 自 动 跟 踪 表 空 间 里 的 空 闲 块, 减 少 了 手 工 合 并 自 由 空 间 的 需 要 4. 表 空 间 里 的 区 的 大 小 可 以 选 择 由 Oracle 系 统 来 决 定, 或 者 由 数 据 库 管 理 员 指 定 一 个 统 一 的 大 小 5. 从 由 数 据 字 典 来 管 理 空 闲 块 改 为 由 数 据 文 件 的 头 部 记 录 来 管 理 空 闲 块, 这 样 避 免 产 生 回 滚 信 息, 不 再 使 用 系 统 表 空 间 里 的 回 滚 段 因 为 由 数 据 字 典 来 管 理 的 话, 它 会 把
相 关 信 息 记 在 数 据 字 典 的 表 里, 从 而 产 生 回 滚 信 息 由 于 这 种 表 空 间 的 以 上 特 性, 所 以 它 支 持 在 一 个 表 空 间 里 边 进 行 更 多 的 并 发 操 作, 并 减 少 了 对 数 据 字 典 的 依 赖 当 然 本 地 化 管 理 的 表 空 间 也 不 是 对 所 有 的 数 据 库 和 数 据 库 对 象 都 是 适 用 的 首 先, 它 不 能 指 定 存 储 特 性, 无 STORAGE 子 句 可 供 使 用 其 次, 它 不 适 用 于 存 储 较 小 的 数 据 库 对 象 总 的 来 说,oracle8I 提 供 了 这 种 全 新 的 表 空 间 管 理 方 式, 给 了 我 们 更 多 的 选 择 对 于 用 来 存 储 大 对 象 的 表 空 间 和 临 时 表 空 间 来 说, 用 本 地 化 管 理 的 表 空 间 组 织 方 式 不 失 为 一 个 较 好 的 选 择 4.2 FBI 索 引 Oracle8i 的 很 重 要 的 一 个 新 特 性 就 是 增 加 了 function-based index 这 种 索 引 类 型 ( 后 面 简 称 为 FBI 有 了 这 个 特 性 后,Oracle DBA 就 可 以 在 索 引 中 使 用 函 数 或 者 表 达 式 了 这 些 函 数 可 以 使 Oracle 自 己 的 函 数, 也 可 以 使 用 户 自 己 的 PL/SQL 函 数 等 DBA 在 SQL 语 句 调 优 的 过 程 中 遇 到 的 一 个 很 常 见 的 问 题 就 是, 如 何 优 化 那 些 在 WHERE 子 句 中 使 用 了 函 数 的 语 句 因 为 在 以 前, 在 WHERE 子 句 中 使 用 函 数 会 使 在 这 个 表 上 创 建 的 索 引 没 法 利 用, 从 而 难 以 提 高 这 个 语 句 的 性 能 例 子 : 使 用 基 于 成 本 的 优 化 器, 索 引 为 标 准 的 B 树 索 引, 建 立 在 SURNAME 列 上 SQL>create index non_fbi on sale_contacts (surname; SQL>analyze index non_fbi compute statistics; SQL>:analyze table sale_contacts compute statistics; SQL>SELECT count(* FROM sale_contacts WHERE UPPER(surname = ELLISON ; Execution Plan ---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=CHOOSE (Cost=3 Card=1 Bytes=17 1 0 SORT (AGGREGATE 2 1 TABLE ACCESS (FULL OF SALES_CONTACTS (Cost=3 Card=16 Bytes=272 从 SQL*PLUS 的 autotrace 产 生 的 执 行 路 径 可 以 看 到, 虽 然 我 们 在 WHERE 子 句 中 用 到 的 S URNAME 列 上 创 建 了 索 引, 但 是 仍 然 执 行 的 是 全 表 扫 描 如 果 这 张 表 很 大 的 话, 这 回 消 耗 大 量 的 时 间 现 在 我 们 试 着 建 立 一 个 FBI 索 引 : SQL>create index fbi on sale_contacts (UPPER(surname; SQL>analyze index fbi compute statistics; SQL>analyze table sale_contacts compute statistics; SQL>SELECT count(* FROM sale_contacts WHERE UPPER(surname = ELLISON ; Execution Plan ---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=1 Bytes=17 1 0 SORT (AGGREGATE 2 1 INDEX (RANGE SCAN OF FBI (NON-UNIQUE (Cost=2 Card=381
Bytes=6477 从 SQL*Plus 返 回 的 执 行 计 划 我 们 可 以 看 到, 这 次,Oracle 对 表 不 再 全 表 扫 描, 而 是 先 扫 描 索 引, 因 为 优 化 器 可 以 知 道 FBI 索 引 得 存 在 使 用 FBI 索 引 所 能 够 带 来 的 性 能 提 升 取 决 于 表 的 大 小 表 中 重 复 记 录 的 量 在 WHERE 子 句 中 使 用 的 列 等 因 素 有 一 点 需 要 清 楚,FBI 索 引 并 不 真 正 在 索 引 里 边 存 储 了 表 达 式 的 结 果, 而 是 使 用 了 一 个 " 表 达 树 "(expression tree 由 优 化 器 来 对 SQL 语 句 中 的 表 达 式 进 行 解 析, 并 且 和 FBI 索 引 上 面 的 表 达 式 进 行 对 比 这 里,SQL 函 数 的 大 小 写 时 敏 感 的 因 此 要 求 SQL 语 句 中 使 用 的 函 数 和 创 建 FBI 索 引 得 时 候 的 那 个 SQL 函 数 的 大 小 写 一 致, 否 则 无 法 利 用 这 个 FBI 索 引 因 此, 在 编 程 的 时 候 要 有 一 个 良 好 的 编 程 风 格 Init.ora 里 边 需 要 修 改 的 参 数 下 面 这 几 个 参 数 必 须 在 init.ora 里 边 指 定 : QUERY_REWRITE_INTEGRITY = TRUSTED QUERY_REWRITE_ENABLED = TRUE COMPATIBLE = 8.1.0.0.0 (or higher 授 权 : 要 使 一 个 用 户 能 够 创 建 FBI 索 引, 他 必 须 被 授 予 以 下 权 限 :CREATE INDEX 和 QUERY REWRITE, 或 者 CREATE ANY INDEX 和 GLOBAL QUERY REWRITE 这 两 个 权 限 索 引 的 使 用 者 必 须 能 够 有 那 个 FBI 索 引 上 使 用 的 那 个 函 数 的 执 行 权 限 如 果 没 有 相 应 的 权 限, 那 么 这 个 FBI 索 引 得 状 态 将 变 成 DISABLED(DBA_INDEXES 如 果 那 个 FBI 索 引 得 状 态 是 DISABLED, 那 么 DBA 可 以 这 样 来 处 理 : A: 删 除 并 重 建 B:ALTER INDEX index_name ENABLED 这 个 Enabled 只 能 对 FBI 索 引 使 用 C:ALTER INDEX UNUSABLE; 注 意 : 如 果 一 个 查 询 中 使 用 到 了 这 个 索 引, 但 是 这 个 FBI 索 引 的 状 态 是 DISABLED, 但 是 优 化 器 选 择 了 使 用 这 个 索 引, 那 么 将 会 返 回 一 个 Oracle 错 误 例 子 : ORA error: ERROR at line 1: ORA-30554: function-based index MYUSER.FBI is disabled. 而 且, 一 旦 这 个 FBI 索 引 的 状 态 是 Disabled, 那 么 这 张 表 上 所 有 涉 及 索 引 列 的 DML 操 作 也 将 失 败 除 非 这 个 索 引 得 状 态 变 成 UNUSABLE, 而 且 在 初 始 化 参 数 里 边 指 定 SKIP_UNUS ABLE_INDEXES 为 TRUE 一 些 例 子 : SQL>CREATE INDEX expression_ndx ON mytable ((mycola + mycolc * mycolb; SQL>SELECT mycolc FROM mytable WHERE (mycola + mycolc * mycolb <= 256; 复 合 索 引 的 例 子 : SQL>CREATE INDEX example_ndx ON myexample (mycola, UPPER(mycolb, mycolc; SQL>SELECT mycolc FROM myexample
WHERE mycola = 55 AND UPPER(mycolb = JONES ; 限 制 和 规 则 总 结 : 对 于 下 面 这 些 限 制, 不 能 创 建 FBI 索 引 : a LOB 列 b REF c Nested table 列 d 包 含 上 面 数 据 类 型 的 对 象 FBI 索 引 必 须 遵 守 下 面 的 规 则 : a 必 须 使 用 基 于 成 本 的 优 化 器, 而 且 创 建 后 必 须 对 索 引 进 行 分 析 b 不 能 存 储 NULL 值 因 为 任 何 函 数 在 任 何 情 况 下 都 不 能 返 回 NULL 值 c 如 果 一 个 用 户 定 义 的 PL/SQL 例 程 失 效 了, 而 且 这 个 例 程 被 FBI 索 引 用 到 了, 那 么 相 应 的 这 个 FBI 索 引 会 变 成 DISABLED d 创 建 FBI 索 引 得 函 数 必 须 是 确 定 性 的 即, 对 于 指 定 的 输 入, 总 是 会 返 回 确 定 的 结 果 e 索 引 的 属 主 如 果 没 有 了 在 FBI 索 引 里 面 使 用 的 函 数 的 执 行 权 限, 那 么 这 个 FBI 索 引 会 变 成 DISABLED. f 在 创 建 索 引 得 函 数 里 面 不 能 使 用 SUM 等 总 计 函 数 g 要 把 一 个 DISABLED 了 的 索 引 重 新 变 成 ENABLED, 这 个 函 数 必 须 首 先 是 ENABLED 的 才 可 以 4.3 在 线 索 引 创 建 和 重 建 索 引 创 建 与 重 建 在 Oracle8i 中 可 联 机 实 现, 而 不 必 中 断 对 基 表 可 能 实 施 插 入 更 新 或 删 除 操 作 创 建 与 重 建 索 引 是 一 件 非 常 耗 时 的 工 作, 尤 其 当 基 表 很 大 时 在 Oracle8i 之 前, 在 索 引 创 建 与 重 建 期 间, 不 允 许 对 其 基 表 进 行 任 何 DML 操 作 在 线 创 建 索 引 : CREATE INDEX EMP_NO ON EMP (EMPNO TABLESPACE INDEX1 PCTFREE 10 STORAGE (INITIAL 1M NEXT 1M PCTINCREASE 0 ONLINE; 在 线 重 建 索 引 : ALTER INDEX EMP_NO REBUILD ONLINE; 注 : 在 线 索 引 构 建 期 间, 尽 管 能 UPDATE( 更 新 基 表, 但 根 据 Oracle 的 建 议, 最 好 不 要 采 取 会 影 响 到 大 部 分 数 据 行 的 操 作 4.4 使 用 可 传 输 的 表 空 间 实 现 数 据 在 数 据 库 间 的 移 动 对 于 可 传 输 的 表 空 间 这 一 特 性 来 说, 允 许 我 们 把 一 个 或 多 个 表 空 间 从 一 个 数 据 库 移 动 或 复 制 到 另 一 个 数 据 库 可 传 输 的 表 空 间 有 下 面 几 点 限 制 : 源 和 目 标 数 据 库 必 须 处 于 同 一 个 硬 件 平 台 源 和 目 标 数 据 库 的 数 据 库 块 大 小 必 须 一 样, 而 且 必 须 采 用 同 一 个 字 符 集 如 果 表 空 间 名 和 目 标 数 据 库 上 的 表 空 间 名 雷 同, 这 个 表 空 间 就 不 能 被 传 输 到 目 标 数 据 库
数 据 库 表 空 间 迁 移 的 基 本 过 程 是 : 令 表 空 间 为 只 读, 并 复 制 相 应 的 数 据 文 件, 然 后 利 用 E XP/IMP, 从 数 据 字 典 中 卸 载 元 数 据, 并 把 它 装 载 到 目 标 数 据 库 表 空 间 迁 移 前 首 先 要 检 测 待 迁 移 的 表 空 间 是 否 自 包 含 我 们 可 以 通 过 执 行 内 置 的 PL/SQL 过 程 DBMS_TTS.TRANSPORT_SET_CHECK 判 断 表 空 间 是 否 自 包 含 : EXECUTE DBMS_TTS.TRANSPORT_SET_CHECK( SALEDAT,SALESIDX,TRUE; SELECT * FROM TRANSPORT_SET_VOILATIONS; 其 中, SALEDAT,SALESIDX 是 表 空 间 名 若 TRANSPORT_SET_VOILATIONS 没 有 记 录, 则 说 明 待 迁 移 的 表 空 间 是 自 包 含 以 下 是 表 空 间 迁 移 的 操 作 步 骤,1-5 步 操 作 在 源 数 据 库 表 空 间 操 作 完 成,6 7 8 步 在 目 的 数 据 库 表 空 间 操 作 完 成 1. 用 数 据 库 管 理 员 (INTERNAL 身 份 登 录 ORACLE,(CONNECT INTERNAL/****** 2. 将 源 tablsspace_name 表 空 间 置 为 READ ONLY, 使 得 表 空 间 下 的 数 据 文 件 置 为 READ ONLY 状 态, 可 以 进 行 操 作 系 统 级 的 拷 贝,(ALTER TABLESPACE tablsspace_name READ ONLY 如 果 是 生 产 系 统 请 注 意 选 择 好 进 行 此 操 作 的 时 间 3. 利 用 EXP 工 具 进 行 数 据 库 表 空 间 的 迁 移,(EXP INTERNAL/****** FILE=filename.DMP LOG=logname.LOG TRANSPORT_TABLESPACE=Y TABLESPACES=tablsspace_name BUFFER=1024000 4. 将 待 迁 移 的 表 空 间 下 的 所 有 数 据 文 件 进 行 操 作 系 统 级 的 拷 贝, 复 制 到 目 的 数 据 库 操 作 系 统 硬 盘 下 5. 将 源 tablsspace_name 表 空 间 置 为 READ WRITE, 使 得 表 空 间 下 的 数 据 文 件 置 为 READ WRITE 状 态,(ALTER TABLESPACE tablsspace_name READ WRITE 6. 在 目 的 数 据 库 上 建 立 相 应 的 用 户 user_name 并 赋 予 CREATE SESSION 权 限 7. 在 目 的 数 据 库 上 利 用 IMP 工 具 进 行 数 据 库 表 空 间 的 迁 移,(IMP INTERNAL/****** FILE=filename.DMP LOG=logname.LOG TRANSPORT_TABLESPACE=Y TABLESPACES=tablsspace_name DATAFILES=datafile_name1,datafile_name2 8. 在 目 的 数 据 库 上 将 目 的 tablsspace_name 表 空 间 置 为 READ WRITE, 使 得 表 空 间 下 的 数 据 文 件 置 为 READ WRITE 状 态,(ALTER TABLESPACE tablsspace_name READ WRITE