第 13 章 升 级 SQL Server
有 人 可 能 认 为 , 升 级 到 Microsoft SQL Server 7 一 定 是 个 复 杂 而 困 难 的 过程 。 其 实 , 开 发 应 用 程 序 并 在 7.0 版 上 运 行 是 个 很 简 单 的 过 程 , 看 上 去 及 运 行过 程 与 在 以 前 版 上 几 乎 相 同 , 因 为 在 缺 省 设 置 时 与 用 户 当 前 的 以 前 版 本 是 兼 容的 。 然 而 , 新 版 本 需 要 的 磁 盘 空 间 要 大 一 倍 , 以 便 继 续 保 留 6.x 版 本 。 这 样 可在 多 出 的 空 间 进 行 开 发 和 充 分 利 用 7.0 版 的 新 功 能 。
升 级 后 也 可 以 把 兼 容 级 别 改 变 到 60(V6.0) 、 65(V6.5) 或 70(V7.0) 的 功 能 , 仍 可 获 得 7.0 版 的 功 能 ,例 如 ,可 获 得 最 低 成 本 的 锁 定 策 略 ( 运 行 时 根 据 从 Query Optimizer 的 输 入 的 行 、 页 或 表 ) 。 需 要 注 意 的 是 , 在 升 级 后 , model 系 统 数 据库 的 兼 容 级 别 为 70 。 这 就 是 说 , 如 果 不 执 行 sp_dbcmptlevel 数 据 库 存 储 过 程 , 并 把 model 系 统 数 据 库 的 兼 容 级 别 设 置 成 65 , 用 7.0 版 本 也 可 创 建 所 有 新 的 数据 库 。
SQL Server 的 升 级 过 程 的 主 要 特 性 之 一 , 是 两 种 版 本 可 并 行 存 放 在 一 台 计
算 机 上 。升 级 过 程 的 每 一 步 都 设 计 成 保 护 6.x 数 据 库 。然 而 ,安 装 Microsoft SQL Server 7 将 替 换 原 系 统 中 的 某 些 通 用 库 文 件 , 而 卸 载 7.0 版 本 时 又 不 能 自 动 返回 到 SQL Server 6.x 或 Windows NT Server 安 装 时 的 原 始 状 态 。
安 装 时 可 能 遇 到 问 题 的 是 这 类 应 用 程 序 , 它 们 是 直 接 参 照 系 统 表 的 应 用 程
序 和 使 用 SQL DMO 的 管 理 类 工 具 应 用 程 序 。 由 于 SQL DMO 的 原 因 , SQL Executive 中 的 任 务 、 复 制 和 许 多 配 置 设 置 都 发 生 了 变 化 。 如 果 用 户 的 应 用 程 序 正 在 动 态地 改 变 配 置 设 置 , 或 正 在 使 用 这 些 特 性 , 可 能 需 要 改 变 自 己 的 代 码 。 在 master 系 统 数 据 库 中 创 建 的 用 户 对 象 可 保 证 7.0 版 的 性 能 , 因 为 master 系 统 数 据 库 必须 在 功 能 上 正 确 地 保 持 SQL Server 7.0 的 兼 容 级 别 上 。 在 该 master 系 统 数 据库 中 不 能 改 变 这 种 兼 容 级 别 。
Microsoft 公 司 对 这 种 转 换 过 程 经 过 长 期 艰 苦 的 思 考 后 , 决 定 必 须 改 变 这 种体 系 结 构 , 以 便 在 质 量 、 性 能 、 可 量 测 性 和 灵 活 性 方 面 , 适 应 下 一 个 20 年 , 所以 用 户 数 据 库 从 V6.x 到 7 的 转 换 需 要 改 变 磁 盘 。 用 户 的 对 象 可 以 进 行 编 译 , 数据 也 可 以 从 6.x 的 磁 盘 格 式 移 到 7 磁 盘 格 式 , 因 为 该 数 据 页 的 尺 寸 已 经 从 6.x 版 的 2k 改 为 7.0 版 的 8k 。
何 时 升 级
最 好 是 一 得 到 新 的 服 务 软 件 包 和 新 软 本 就 尽 快 升 级 。 如 果 用 户 有 经 销 商 以外 开 发 的 应 用 程 序 , 并 且 该 经 销 商 迟 迟 才 转 向 新 服 务 软 件 包 或 新 版 本 , 那 么 升级 时 往 往 会 出 现 问 题 。 应 鼓 励 经 销 商 及 时 升 级 。 如 果 用 户 认 为 不 能 升 级 自 己 的生 产 系 统 , 那 么 可 升 级 自 己 的 测 试 系 统 , 甚 至 可 升 级 台 式 计 算 机 , 这 样 自 己 可保 持 处 在 新 的 技 术 前 沿 。 Microsoft SQL Server 数 据 库 技 术 正 在 飞 速 发 展 , 这些 改 进 正 是 Microsoft SQL Server 所 要 进 行 的 , 这 样 可 激 励 产 品 年 复 一 年 地 使
用 下 去 , 但 是 , 如 果 用 户 在 面 临 版 本 的 全 面 升 级 , 现 时 就 有 许 多 东 西 要 学 习 。
- 升 级 计 划
升 级 计 划 过 程 中 最 重 要 的 一 点 就 是 不 要 感 到 惊 讶 。 要 计 划 好 培 训 时 间 和 练习 地 点 , 以 使 自 己 熟 悉 升 级 过 程 , 确 定 自 己 的 应 用 程 序 是 否 存 在 问 题 , 如 参 照现 在 还 没 有 表 的 存 储 过 程 、 在 7 版 中 改 作 了 改 变 的 代 码 参 照 系 统 表 和 对 自 己 的应 用 程 序 非 常 特 别 的 其 他 任 何 问 题 。 自 己 要 准 备 足 够 的 时 间 来 辨 别 和 确 定 可 能会 发 生 的 任 何 问 题 。 虽 然 大 多 数 应 用 程 序 至 今 还 未 发 现 任 何 问 题 , 但 是 还 是 可与 Microsoft 技 术 支 持 联 系 以 解 决 任 何 问 题 。 Microsoft 在 其 1K Challenge 转换 程 序 中 已 经 转 换 了 1000 多 个 数 据 库 , 并 已 为 可 能 出 现 的 许 多 问 题 做 了 预 测 和编 码 。 SQL DMO 、 SQL Executive 中 的 任 务 、 复 制 和 许 多 配 置 设 置 都 已 做 了 改 变 , 所 以 最 好 是 建 立 测 试 系 统 , 如 有 可 能 , 可 在 非 生 产 性 机 器 上 通 过 升 级 来 运 行 。但 对 于 大 型 系 统 而 言 因 为 硬 件 冲 突 , 这 可 能 无 法 实 现 。 在 这 种 情 况 下 , 任 何 时候 都 可 以 用 原 来 的 6.x 环 境 放 弃 这 一 过 程 。 实 际 上 , 甚 至 可 在 过 程 中 间 也 可 以停 下 来 , 并 在 断 开 的 位 置 重 新 启 动 该 过 程 。
在 开 始 升 级 之 前 用 户 可 能 想 要 做 以 下 一 些 事 情 : 。
-
备份 SQL Server 6.x 环 境 。
-
保证 tempdb 系 统 数 据 库 在 6.x 版 中 至 少 为 25MB ;
-
保 证 SQL Server 6.x 版 具 有 足 够 的 内 存 以 有 效 地 运 行 DBCC
, 这 样 可 加
速 这 一 过 程 (7 版 的 内 存 大 小 是 动 态 的 ) ;
-
保 证 在 自 己 的 用 户 数 据 库 中 的 所 有 数 据 库 用 户 都 在 master 系 统 数 据 库中登 录 SQL Server , 并 更 正 “ 孤 立 ” 的 任 何 问 题 (sysusers 系 统 表 , 与 suid 连接的 syslogins 系 统 表 ) 。 还 需 检 查 sysalternates 系 统 表 输 入 项 。
-
保 证 MSSQLServer 服 务 启 动 帐 号 是 Domain 用 户 帐 号 ,而 不 是 供 两 种 SQL Server 版 本 共 享 的 LocalSystem 帐 号 。
-
保 证 SQLExecutive 和 SQLServerAgent 服 务 启 动 帐 号 是 域 用 户
帐 号 ,
而 不 是 LocalSystem 帐 号 。
-
保 证 至 少 有 200MB 的 自 由 磁 盘 空 间 , 以 执 行 Microsoft SQL Server 7 的安 装 和 升 级 , 并 有 足 够 的 自 由 空 间 拷 贝 升 级 选 择 数 据 库 中 的 对 象 和 数 据 。 详细情 况 请 参 阅 本 章 “ 并 行 ( 单机 ) ” 和 “ 机 到 机 ( 双机 ) ” 部 分 。
-
如 果 用 户 有 最 新 版 的 6.5 Service Pack 软 件 包 的 拷 贝 , 应 安 装 最 新 版 ,不要 安 装 拷 贝 , 并 使 logreader 保 持 空 。
-
保 证 在 最 小 模 式 下 运 行 Windows NT Server 4.0 , Service Pack
4 。
-
如 果 自 己 的 数 据 库 正 在 相 互 参 照 对 象 , 可 同 时 升 级 所
有 相 关 数 据 库 。
-
保 证 对 每 个 登 录 的 ID , 随 着 正 在 升 级 的 数 据 库 或 在 7.0 版 中 已 经 有 的缺 省 数 据 库 , 来 升 级 缺 省 数 据 库 。
-
在 开 始 升 级 过 程 之 前 , 关 闭 所 有 应 用 程 序 , 停 止 运 行
SQL Server 服 务
程 序 。
- 升 级 之 前
在 升 级 之 前 , 应 先 阅 读 下 面 这 部 分 内 容 , 这 些 内 容 可 应 用 到 当 前 正 在 运 行的 版 本 上 。
13.3.1 从 4.2.1 版 升 级
如 果 需 要 从 Microsoft SQL Server 4.2.1 版 升 级 , 在 升 级 到 7.0 版 之 前 必须 首 先 升 级 到 6.5 版 和 最 新 的 服 务 包 软 件 。 也 可 能 需 要 把 NT Server 4.0 升 级到 可 得 到 的 最 新 的 服 务 包 软 件 。
13.3.2 从 6.0 版 升 级
最 好 是 先 把 Microsoft SQL Server 6.0 安 装 程 序 升 级 到 Microsoft SQL Server 6.5 和 最 新 的 服 务 包 。 然 而 , 也 可 能 从 Microsoft SQL Server 6.0 直接 升 级 到 7.0 。用 6.0 中 可 正 常 工 作 的 GRANT / REVOKES 方 法 可 能 会 发 生 异 常 。正 如 用 户 所 知 , 7.0 版 中 有 一 个 sp_dbcmptlever 60 选 项 , 目 的 就 是 保 持 与 6.0 版 的 兼 容 性 。
13.3.3 从 |
6.5 版 升 级 |
|
---|---|---|
在 从用 最 新 的 |
Microsoft SQL Server 6.5 升 级 到SQL Server 服 务 包 。 |
7.0 版 时 , 在 开 始 升 级 之 前 必 须 应 |
- 版 本 升 级 实 用 程 序
采 用 Version Upgrade Utility 实 用 程 序 , 即 可 进 行 并 行 升 级 , 又 可 进 行双 机 升 级 。 Utility 实 用 程 序 是 SQL Server 7 的 安 装 选 项 , 可 在 NT Menu( 菜 单 ) 上 的 Microsoft SQL Server Program 程 序 组 中 进 行 选 择 。 这 种 类 型 的 实 用 程 序通 常 是 不 提 供 的 , 但 由 于 大 约 80 % 的 SQL Server 是为 7 版 编 写 的 , 并 且 许 多关 键 组 件 已 经 改 变 , 所 以 该 实 用 程 序 对 于 执 行 把 6.5 数 据 库 转 换 到 7.0 数 据 库这 种 复 杂 过 程 , 是 十 分 必 要 的 。 Version Upgrade Utility 非 常 有 用 , 特 别 是考 虑 到 整 个 数 据 库 以 及 所 有 相 关 数 据 都 必 须 写 成 Microsoft SQL Server 7 的 磁盘 格 式 。
所 需 要 的 磁 盘 空 间 量 影 响 将 要 使 用 的 升 级 情 况 。 另 外 , 如 果 使 用 复 制 , 就必 须 使 用 并 行 升 级 。 无 论 什 么 情 况 , 从 6.x 转 换 到 7.0 版 , 都 至 少 需 要 两 倍 当前 数 据 库 所 占 的 空 间 。 许 多 公 司 的 预 算 都 将 受 到 这 种 磁 盘 空 缩 需 求 的 影 响 , 除非 对 数 据 库 技 术 早 已 进 行 了 培 训 , 在 培 训 时 就 希 望 过 升 级 相 关 的 空 间 需 要 。
在 升 级 时 , 用 户 可 选 择 升 级 选 项 , 如 图 13.1 所 示 。 Export 和 Import 选 项 , 以 及 数 据 转 换 方 法 等 都 可 以 选 择 。
图 13.1SQL Server Upgrade Wizard | Data and Object Transfer
并 行 升 级 ( 单 机 )
并 行 升 级 是 指 在 已 经 有 Microsoft SQL Server 6.x 版 的 计 算 机 上 安 装Microsoft SQL Server 7.0 版 。 数 据 传 输 方 法 为 下 列 方 法 之 一 :
-
磁 盘 对 磁 盘 命 名 的 管 道 连 接
-
磁 带 驱 动 器 备 份
-
网 络 共 享
磁 盘 对 磁 盘 命 令 管 道 连 接 是 最 快 的 方 法 , 可 用 于 计 算 机 上 磁 盘 空 间 足 够 的情 况 , 可 直 接 通 过 命 名 管 道 连 接 传 输 数 据 。 如 果 要 使 用 磁 盘 对 磁 盘 命 名 管 道 连接 , 则 可 为 该 数 据 库 和 相 关 日 志 文 件 准 备 1.5 倍 的 磁 盘 空 间 大 小 。
如 果 磁 盘 空 间 不 足 , 对 于 磁 带 驱 动 器 或 网 络 共 享 可 使 用 Version Upgarde Wizard( 版 本 升 级 向 导 ) 输 出 6.x 版 日 志 (Catalog) 、数 据 、对 象 和 数 据 库 。Version Upgrade Wizard 删 去 SQL Server 6.x 驱 动 程 序 , 重 新 使 用 磁 盘 空 间 。 然 后 再次 运 行 Version Upgrade Wizard , 输 入 并 升 级 从 磁 带 驱 动 器 或 网 络 共 享 输 出 的数 据 、 对 象 和 数 据 库 。
进 行 并 行 升 级 时 应 按 以 下 步 骤 执 行 :
1. 从 SQL Server 7 程 序 组 中 选 择 Version Upgrade Wizard 。2. 在 向 导 屏 幕 上 单 击 Next 按 钮 。
- 从 屏 幕 上 的 Export From 6.x 和 Import To 7.0 块 上 选 择 Objects 和 Data
复 选 框 ( 这 些 选 择 已 标 记 为 缺 省 选 择 ) 。
-
单击 Named Pipe 或 Disk 或 Tape 作 为 数 据 传 输 方 法 。
-
单 击 Validate successful object data transfer 复 选 框 。 如 果 感
到 需要 运 行 Database Consistency Checker , 以 验 证 数 据 库 没 有 任 何 损 坏 , 可 单击Exhaustive data integrity verification 复 选 框 , 然 后 再 单 击 Next 按 钮 。
-
输入 Export 和 Import 服 务 器 的 Login 信 息 , 包 括 SA 口 令 。
在 Startup Command-Line Options 框 中 , 如 果 适 用 , 可 键 入 用 于 SQL Server 6.x 的 任 何跟 踪 标 志 或 启 动 参 数 , 然 后 单 击 Next 按 钮 , 如 图 13.2 所 示 。
图 13.2 为输入和输出服务器提供登录信息
- 6.5 版 和 7.0 版 之 间 的 SQL Server 开 关 ( 切换 ) 可 作 为 升 级
的 继 续 ( 如 图
13.3 所 示 )
图 13.3 升级过程中两个版本之间的 SQL Server 切换 ( 开关 )
-
Code Page Selection 屏 幕 显 示 提 示 输 入 代 码 页 ( 用 于 某 些
国 际 用 户 ) , 但 大 多 数 安 装 都 可 采 用 缺 省 安 装 。
-
排 除 用 户 不 想 升 级 到 7.0 版 的 数 据 库 ( 注 意 : 如 有 可 能
, 最 好 还 是 一 次 将它 们 升 级 。 否 则 , syslogins 系 统 表 中 的 登 录 的 缺 省 数 据 库 可 能 受 到 影 响 ) 。 然后 单 击 Next 按 钮 。
-
Database Creation 屏 幕 显 示 推 荐 的 7.0 版 数 据 库 的 布 局 ,
并 可 观 察 SQL Server 在 空 间 各 项 目 中 分 配 的 内 容 。 按 下 Edit 按 钮 查 看 7.0 新 版 数 据 库 的 图形 说 明 和 记 录 文 件 。 按 下 Advanced 按 钮 可 查 看 可 用 驱 动 器 空 间 的 布 局 和 摘 要 信息 。 在 图 13.4 所 示 的 Drive Summary 下 , 靠 近 驱 动 器 C: 有 一 个 图 标 , 指 示 要容 纳 所 有 数 据 库 文 件 空 间 不 够 大 。 必 在 升 级 进 程 中 还 可 以 查 看 SQL Server 将 减小 数 据 库 以 节 省 空 间 。
-
如 果 因 为 空 间 不 足 需 要 把 数 据 库 文 件 移 到 另 一 个 驱 动
器 , 可 双 击 相 应的数 据 库 文 件 。 这 样 系 统 允 许 编 辑 数 据 库 文 件 的 安 装 位 置 , 通 过 编 辑 该 屏 幕 区段来 改 变 其 他 数 据 库 文 件 的 特 性 。 一 直 保 持 改 变 驱 动 器 , 直 到 空 间 足 够 , Drive Summary 不 再 显 示 C: 旁 边 的 图 标 。
-
在 为 数 据 库 文 件 确 定 了 最 佳 位 置 后 , 按 下 Accept 按 钮
。
图 13.4Version Upgrade Utility | Database Creation | Edit | Advanced | Drive Summary 选项
-
选 择 自 己 想 要 传 输 的 System Objects 类 型 。
-
对 于 Quoted Identifier , 如 果 不 能 确 定 用 户 的 对 象 是
用QUOTED_IDENTIFIERS OFF 还 是 用 ON 创 建 的 , 可 选 择 Mixed 。 注 意 如 果 因 为 升 级期 间 Quoted_Identifiers 出 现 错 误 而 导 致 用 户 对 象 创 建 失 败 , 在 升 级 后 可 正 确设 置 选 项 重 新 执 行 适 当 的 文 件 ( 在 升 级 目 录 中 执 行 .prc 、 .viw 和 其 他 文 件 ) 。 检验 C: \ MSSQL7 \ Upgrade 目 录 中 的 文 件 ( 或 安 装 SQL Server 7 的 其 他 目 录 中 的文 件 ) 查 看 升 级 过 程 中 由 SQL Server 执 行 过 的 Transact-SQL 。
-
对 于 ANSI Nulls , 如 果 在 创 建 存 储 过 程 时 未 使 用 ANSI 空
位 , 可 选 择 缺省设 置 OFF ,如 果 使 用 了 ANSI 空 位 ,则 选 择 ON 。在 升 级 前 最 后 屏 幕 显 示 如 图 13.5 所示 。
图 13.5 升 级 开 始 前 SQL Server Upgrade Wizard 的最终屏幕显示
-
单 击 Finish 按 钮 。
-
升 级 开 始 , 随 着 升 级 到 Microsoft SQL Server 7 , 屏 幕 上 显
示 进 程 报告 ( 如 图 13.6 所 示 ) 。
图 13.6Version Upgrade Utility|Upgrade Completion 选 项
计 算 机 对 计 算 机 升 级 ( 双 机 )
如 果 计 算 机 通 过 网 络 相 连 , 可 以 实 施 双 机 升 级 。 数 据 移 动 方 法 为 下 列 方 法之 一 :
-
直 接 管 道 线
-
磁 带 驱 动 器 备 份
-
网 络 共 享
升 级 的 步 骤 与 前 一 节 中 并 行 升 级 介 绍 的 步 骤 相 同 , 只 是 要 命 名 Export 和Import 服 务 器 时 ( 如 图 13.2 所示 ) , 应 指 明 位 于 远 程 计 算 机 上 的 SQL Server 名称 。
- 复 制 和 升 级
用 户 将 能 够 升 级 自 己 的 复 制 服 务 器 , 甚 至 服 务 器 版 本 级 别 不 同 也 可 运 行 复制 。 然 而 , 如 果 用 户 的 复 制 拓 扑 包 括 6.x 和 7.0 SQL Server , 以 便 复 制 服 务 器能 够 在 安 装 在 相 应 版 本 上 , 那 么 必 须 应 用 某 些 规 则 。
- 如 果 正 在 从 7.0 服 务 器 发 布 到 6.x Subscriber , 就 必 须 运 行 脚 本 (C:
\ MSSQL7 \ Install \ Replp70.sql) , 然 后 在 6.x Subscriber 上 执 行 该 脚 本 安装 的 存 储 过 程 sp_addpublisher70 。
-
在 升 级 Publisher 之 前 , 必 须 先 升 级 distribution 数 据 库 。
如 果 7.0 分 布 器 和 6.5 Publisher 位 于 不 同 的 计 算 机 上 , 就 可 以 使 用 它 们 。
-
可 以 把 订 阅 物 从 7.0 Publisher 扩 展 到 (push) SQL Server 6.x 上
, 但不能 卸 除 它 们 。
-
7.0 安 装 可 以 在 不 同 代 码 页 的 服 务 器 之 间 进 行 复 制 ,
但 在 6.x 版 中 这 是不可 能 的 。
考 虑 到 安 装 规 则 , 如 果 用 户 仍 需 要 包 括 6.x SQL Server 可 以 选 择 如 何 设 置
自 己 的 复 制 拓 扑 。
如 果 按 并 行 升 级 法 进 行 升 级 , 事 务 复 制 应 该 正 确 转 换 。 检 查 第 9 章 “ SQL Server 7 的 强 化 复 制 ” 的 复 制 功 能 , 除 了 6.x 版 的 Log Reader Agent 和Distribution Agent 之 外 , 还 有 两 个 新 的 Replication Agents:Snapshot Agent 和 Merge Agent 。
- 升 级 后 的 工 作
在 结 束 向 Microsoft SQL Server 7 的 升 级 后 , 可 注 册 服 务 器 , 并 / 或 在Enterprise Manager 层 次 上 添 加 新 的 服 务 器 组 。 用 户 可 能 会 想 到 要 检 查 自 己 的配 置 设 置 , 并 改 变 自 以 为 必 要 的 任 何 东 西 。 要 执 行 任 何 升 级 后 变 化 , 可 使 用Enterprise Manager 或 SQL Server 安 装 程 序 。在 确 认 升 级 已 经 成 功 才 可 退 出 6.x SQL 安 装 程 序 。
13.6.1 服 务 包
Service pack( 服 务 包 ) 是 缺 陷 修 复 集 , 这 种 修 复 随 对 缺 陷 的 认 识 已 经 积 累了 一 段 时 期 。 重 要 的 是 在 系 统 变 得 可 用 时 , 通 过 应 用 服 务 包 来 保 持 系 统 的 当 前状 态 。 服 务 包 一 般 用 于 代 替 系 统 数 据 库 对 象 , 如 存 储 过 程 , 或 代 替 打 开 的 系 统文 件 , 如 SQL Server 可 执 行 程 序 文 件 。 服 务 包 的 应 用 非 常 方 便 , 在 运 行 应 用 服务 包 的 程 序 之 前 , 使 用 步 骤 通 常 由 备 份 数 据 库 和 停 止 SQL Server 服 务 两 部 分 组成 。 readme.txt 文 件 位 于 服 务 包 内 , 通 过 各 个 步 骤 对 用 户 进 行 指 导 , 使 用 户 了解 服 务 包 正 在 修 复 的 内 容 。
13.6.2Hotfix
hotfix 类 似 于 服 务 包 , 但 通 常 是 针 对 特 殊 安 装 时 已 经 发 现 的 特 殊 缺 陷 的 。hotfix 是 一 个 临 时 修 复 文 件 , 可 把 它 发 送 给 顾 客 , 直 到 包 含 缺 陷 修 复 的 服 务 包被 代 替 。 hotfix 应 用 十 分 方 便 , 相 当 于 数 据 库 对 象 的 快 速 替 换 或 操 作 系 统 文 件 。它 包 含 一 个 带 有 说 明 的 readme.txt 文 件 。 更 重 要 的 是 , 系 统 通 知 它 关 于 最 新 得到 的 hotfix ,以 便 决 定 用 户 是 否 需 要 把 它 应 用 到 SQL Server 。例 如 ,如 果 hotfix 用 于 复 制 , 而 自 己 又 不 使 用 复 制 , 那 么 可 以 选 择 等 待 , 直 到 下 一 个 服 务 包 。
升 级 并 不 是 一 个 困 难 的 任 务 , 一 般 会 为 用 户 提 供 新 的 功 能 和 关 于 数 据 库 的
平 滑 性 能 模 型 。 为 保 持 系 统 处 于 良 好 的 工 作 顺 序 , 用 最 佳 可 用 技 术 运 行 , 升 级是 最 佳 途 径 之 一 , 无 论 何 时 变 得 可 用 , 都 应 该 安 装 。
第 三 部 分 管 理
第 14 章 数 据 库 管 理
- 管 理 工 具 集
管 理 工 具 集 在 Microsoft SQL Server 7.0 中 已 经 作 了 扩 展 , 详 情 已 在 第 7 章 作 过 介 绍 。 数 据 库 管 理 员 可 用 的 7.0 工 具 清 单 如 下 :
-
SQL Server Query Analyzer
-
Data Transformation Package
-
SQL Server Profiler
-
Index Tuning Wizard
-
Replay SQL Server
-
Database Maintenance Plans
-
Web Assistant
-
SQL Mail
-
Enterprise Manager 内 置 的 Visual Database Tools
-
Replication Monitor
关 于 命 令 行 类 型 的 实 用 程 序 , 请 参 阅 第 8 章 , 如 块 拷 贝 (BCP) 和 OSQL , 新 的ISQL 型 的 命 令 行 实 用 程 序 , 该 实 用 程 序 使 用 ODBC 与 服 务 器 进 行 通 讯 。
- 系 统 存 储 过 程
编 写 SQL Server 系 统 存 储 过 程 的 目 的 , 是 提 供 可 执 行 所 有 数 据 库 管 理 任 务的 功 能 , 同 时 防 止 用 户 直 接 访 问 系 统 表 。 通 过 使 用 Enterprise Manager, 扩 展服 务 器 和 master 数 据 库 , 并 双 击 存 储 过 程 , 可 以 查 看 系 统 存 储 过 程 清 单 。
选 择 特 定 系 统 存 储 过 程 并 双 击 , 可 查 看 选 中 系 统 存 储 过 程 的 Transact-SQL 代 码 。 其 他 系 统 存 储 程 序 位 于 MSDB 系 统 数 据 库 中 , 可 以 使 用 同 样 的 方 法 访 问 , 但 要 扩 展 MSDB 数 据 库 , 而 不 是 master 数 据 库 。 如 果 其 他 复 制 系 统 存 储 过 程 已经 标 记 为 复 制 , 那 么 该 过 程 就 位 于 复 制 分 布 数 据 库 或 用 户 数 据 库 中 。
通 过 功 能 区 域 可 在 下 列 目 录 中 组 合 系 统 存 储 过 程 :
-
Catalog( 目 录 ) 数 据 词 典 功 能
-
Cursors( 游 标 ) 游 标 功 能
-
Distributed Queries( 分 布 式 查 询 ) 分 布 式 查 询 功 能
-
SQL Server Agent(SQL Server 代 理 ) 任 务 管 理 功 能
-
Replication( 复 制 ) 复 制 功 能
-
Security( 安 全 性 ) 安 全 性 管 理 功 能
-
System( 系 统 ) SQL Server 管 理 功 能
-
Web Assistant(Web 助 手 ) Web 功 能
-
Extended Procedures( 扩 展 过 程 ) SQL Server 与 外 部 程 序 的 接
口
-
OLE Automation(OLE 自 动 化 ) 在 Transact-SQL 内 的 OLE 自 动 化在 第 23 章 中 列 出 和 描 述 了 系 统 存 储 过 程 。
图 14.1 位 于 master 系统数据库中的系统存储过程
- 系 统 表
系 统 表 的 功 能 是 用 于 Microsoft SQL Server 的 目 录 或 数 据 词 典 。 关 于 SQL Server 、 每 个 数 据 库 和 其 他 数 据 库 对 象 的 信 息 都 存 放 在 系 统 表 中 。
确 定 是 否 在 不 使 用 系 统 存 储 过 程 时 进 行 特 定 升 级 的 配 置 选 项 称 为 allow
updates 。 该 选 项 缺 省 时 应 设 置 为 关 (0) , 此 时 可 防 止 特 定 升 级 到 系 统 表 。 记 住 , 在 allow updates 选 项 设 置 为 开 (1) 时 创 建 的 任 何 存 储 过 程 , 可 继 续 能 够 修 改 系统 表 。在 把 allow updates 设 置 为 开 或 真 (1) 之 前 ,最 好 是 以 单 用 户 模 式 启 动 SQL Server 。
特 定 修 改 到 系 统 表 的 语 法 是 : sp_configure ′ Allow Updates′ , 1 G O
RECONFIGURE WITH OVERRIDE G O
图 14.2 用于系统存储过程的 TransactSQL 代码
用 户 可 运 行 Enterprise Manager , 从 Tools Menu 上 选 择 Query Analyzer , 然 而 运 行 sp_configure 系 统 存 储 过 程 把 allow updates 选 项 设 置 成 真 (1) , 如图 14.3 所 示 。
图 14.3 允许修改到系统表
Microsoft SQL Server 中 的 每 个 数 据 库 都 包 含 某 种 系 统 表 。 master 系 统 数据 库 包 含 大 多 数 系 统 表 ( 如 图 14.4 所 示 ) , 但 每 个 数 据 库 都 包 含 一 系 列 本 身 的 系统 表 , 这 取 决 于 数 据 库 的 功 能 。 MSDB 系 统 数 据 库 包 含 具 有 作 业 编 序 功 能 的 SQL Server Agent 的 系 统 表 。 distribution 系 统 数 据 库 和 标 记 为 复 制 的 用 户 数 据 库包 含 关 于 复 制 的 系 统 表 。 所 有 系 统 数 据 库 和 用 户 数 据 库 都 包 含 master 数 据 库 中的 系 统 表 子 集 , 这 种 系 统 表 子 集 包 含 关 于 每 个 数 据 库 中 包 含 的 对 象 的 信 息 。 在第 22 章 “ 系 统 表 ” 中 列 出 并 描 述 了 系 统 表 。
图 14.4 主系统数据库中的系统表
- SQL 错 误 和 错 误 日 志
SQL 可 能 发 生 错 误 。 如 果 出 现 这 种 情 况 , 并 且 安 全 性 足 够 高 , 则 这 些 错 误 被写 入 SQL Server 错 误 日 志 。 错 误 日 志 是 确 定 SQL Server 的 运 行 良 好 状 态 的 重要 方 法 , 通 过 研 究 在 此 报 告 的 任 何 错 误 也 是 很 重 要 的 。 Microsoft SQL Server 和 SQL Server Agent 都 有 错 误 日 志 文 件 。 SQL Server Agent 错 误 日 志 包 含 了关 于 来 自 SQL Server Agent 服 务 的 作 业 和 任 务 的 错 误 信 息 。
SQL Server 错 误 日 志 在 安 装 SQL Server 时 位 于 所 选 择 的 位 置 。 缺 省 位 置 是C: \ Mssql7 \ Log \ Errorlog 。 SQL Server Agent 错 误 日 志 文 件 的 缺 省 位 置 是 C:
\ Mssql7 \ Log \ Sqlagent.out 。 每 次 启 动 SQL Server 时 都 要 创 建 新 的 错 误 日
志 文 件 。 六 代 错 误 日 志 文 件 进 行 累 加 , 扩 展 名 为 整 数 的 错 误 文 件 errorlog.1 、errorlog.2 、 errorlog.3 等 直 到 errorlog.6 都 存 放 在 安 装 时 选 中 的 或 缺 省 的位 置 , 如 果 不 再 改 变 的 话 。 观 察 错 误 日 志 至 少 有 两 种 方 法 :
-
SQL Server Enterprise Manager
-
用 文 本 编 辑 器 打 开 该 文 件
要 用 Enterprise Manager 观 察 SQL Server 的 错 误 日 志 , 在 选 择 了 服 务 器后 可 扩 展 Enterprise Manager 体 系 结 构 树 中 的 ErrorLogs 入 口 , 如 图 14.5 所示 。
图 14.5SQL Server 错误日志
使 用 Enterprise Manager, 选 择 了 服 务 器 , 然 后 右 击 Enterprise Manager 体 系 结 构 树 中 的 SQL Server Agent 项 , 可 观 察 SQL Server Agent 错 误 日 志 , 如 图 14.6 所 示 。
通 过 右 击 Enterprise Manager 体 系 结 构 树 中 的 SQL Server Agent 项 , 然后 再 从 快 捷 菜 单 中 选 择 Properties , 用 户 可 以 访 问 屏 幕 ,设 置 SQL Server Agent 错 误 日 志 的 选 项 。 可 以 设 置 的 选 项 如 下 :
-
SQL Server Agent 错 误 日 志 的 名 称 和 位 置
-
错 误 日 志 中 是 否 包 含 跟 踪 执 行 消 息
-
用 户 想 通 过 每 次 发 生 SQL Server Agent 错 误 时 在 其 计 算 机
上 的 网 络 发 送 而接 受 弹 出 式 消 息 的 人 的 NT 登 录 字 段
图 14.6 样本 SQL Server Agent 错误日志 (SQLAGENT.OUT)
在 如 图 14.7 所 示 的 屏 幕 上 , 可 以 看 到 能 改 变 SQL Server Agent 错 误 日 志的 名 称 和 位 置 的 字 段 。 允 许 在 SQL Server Agent 错 误 日 志 中 包 括 执 行 跟 踪 消 息 , 也 有 一 个 复 选 框 。 记 住 , 如 果 服 务 器 必 须 把 许 多 项 都 写 到 错 误 日 志 中 , 将 影 响整 体 性 能 。 错 误 日 志 在 某 些 环 境 下 具 有 以 惊 图 14.7 在 SQL Server Agent Properties 对 话 框 中 设 置 错 误 日 志 选 项 人 速 率 增 大 的 能 力 , 在 选 择 此 选 项 时 需要 引 起 注 意 。 这 并 非 只 是 一 个 不 检 查 和 忘 记 检 查 的 问 题 。 如 果 检 查 包 含 执 行 跟踪 消 息 选 项 , 可 监 测 SQL Server Agent 错 误 日 志 文 件 , 以 确 保 硬 盘 有 足 够 的 空间 来 支 持 该 文 件 的 膨 胀 。 如 果 决 定 通 过 网 络 发 送 来 发 送 弹 出 式 消 息 , 则 接 收 方一 般 是 计 算 机 操 作 员 或 数 据 库 管 理 员 , 他 们 担 负 着 在 与 SQL Server Agent 服 务有 关 的 工 作 流 中 解 决 错 误 的 责 任 。
图 14.7 在 SQL S erver Agent properties 对话框中设置错误日志选项
监 测 错 误 日 志
通 过 监 测 Microsoft SQL Server 错 误 日 志 来 确 定 SQL Server 上 正 在 发 生什 么 事 件 , 这 是 一 个 好 主 意 。 与 SQL Server 和 SQL Server Agent 有 关 的 事 件都 被 写 入 各 自 的 错 误 日 志 中 , 同 时 也 写 入 可 使 用 NT Event Viewer 来 观 察 的Windows NT 应 用 程 序 日 志 中 。 如 果 用 户 碰 到 问 题 , 不 仅 要 检 查 SQL Server 错误 日 志 或 SQL Server Agent 错 误 日 志 , 而 且 还 要 检 查 NT 应 用 程 序 错 误 日 志 。由 SQL Server 和 NT 操 作 系 统 生 成 的 所 有 信 息 的 汇 集 , 查 看 这 个 或 那 个 日 志 更能 对 问 题 给 出 完 整 的 标 识 。 两 种 日 志 对 所 有 记 载 的 事 件 都 打 上 时 间 戳 记 。
TechNet 和 Knowledge Base Articles
如 果 用 户 真 想 能 够 有 效 地 管 理 自 己 的 SQL Server 错 误 日 志 , Micrsooft TechNet Monthly Issues 是 一 种 必 不 可 少 的 资 源 。 TechNet(Technical Information Network , 技 术 信 息 网 ) 是 包 含 Microsoft 产 品 信 息 的 活 页 笔 记 本 , 全 部 装 有 CD-ROM , 其 中 包 括 Microsoft SQL Server 。 技 术 笔 记 、 情 况 研 究 、 资源 组 件 (kit) 、 产 品 情 况 以 及 Microsoft Knowledge Base 都 给 出 更 新 的 信 息 , 可 使 用 户 以 可 能 的 最 有 效 的 方 法 支 持 Microsoft SQL Server 。 用 户 不 必 依 靠 自己 的 雇 员 来 提 醒 自 己 访 问 这 些 信 息 。 TechNet 适 用 于 一 年 几 百 美 元 的 普 通 人 员 , 对 于 了 解 最 新 的 Microsoft 产 品 , 并 给 出 在 自 己 的 SQL Server 上 发 生 的 错 误 的
详 细 、 特 别 、 历 史 的 信 息 , 花 每 个 便 士 都 是 值 得 的 。
包 含 在 TechNet CD-ROM 中的 Knowledge Base 包 含 了 关 于 该 错 误 的 信 息 , 在 许 多 情 况 下 , 可 为 解 决 关 于 该 错 误 的 问 题 提 供 了 准 备 工 作 。 用 户 所 经 历 的 许多 错 误 在 世 界 各 地 的 其 他 SQL Server 上 都 发 生 过 , 并 已 向 Microsoft 公 司 作 了报 告 。 然 后 都 用 Knowledge Basearticles 把 错 误 及 解 决 方 案 进 行 归 档 , 对 经 历过 类 似 问 题 其 他 用 户 也 是 可 用 的 。 更 重 要 的 是 , 在 Knowledge Base 中 查 找 错 误并 按 照 在 文 章 中 找 到 的 推 荐 方 法 解 决 。
大 多 数 错 误 都 是 在 后 来 的 服 务 包 中 更 正 的 , 这 就 是 把 SQL Server 升 级 到 最新 可 用 的 服 务 包 为 什 么 重 要 的 原 因 。 服 务 包 都 由 Microsoft 内 部 商 务 应 用 程 序进 行 过 严 格 的 测 试 , 在 投 放 市 场 前 在 内 部 发 行 以 进 行 更 多 的 测 试 。 用 户 尽 管 放心 , 你 所 接 到 的 服 务 包 已 经 在 大 小 和 封 装 技 术 方 面 , 经 受 了 最 严 格 商 务 应 用 程序 的 经 验 。 在 Microsoft 内 部 逃 避 由 Sales 、 Finance 、 Web 和 SAP 应 用 程 序 对服 务 包 的 严 格 锤 炼 , 几 乎 是 不 可 能 的 。 笔 者 的 经 验 说 明 最 健 康 的 SQL Server 是用 新 升 级 版 升 级 过 的 SQL Server 。
M icrosoft 产 品 支 持 服 务
用 户 一 旦 回 顾 起 关 于 错 误 的 Knowledge Base 文 章 , 并 决 定 需 要 附 加 的 帮 助 , 或 已 经 进 入 还 未 有 人 报 告 的 状 态 , 需 要 与 Microsoft Product Support Service(PSS) 联 系 。 PSS Engineer 将 为 您 提 供 帮 助 , 要 求 您 提 供 关 于 运 行 环 境的 信 息 。 与 您 合 作 并 提 醒 您 提 供 信 息 , 请 设 法 向 PSS Engineer 提 供 问 题 和 状 况
的 详 细 完 整 的 说 明 。 要 确 保 您 有 办 法 向 Microsoft 发 送 大 文 件 , 这 些 问 题 可 能需 要 对 上 述 问 题 进 行 调 试 。 还 有 可 能 要 求 提 供 错 误 记 录 和 数 据 库 文 件 , 以 便 比较 并 向 Microsoft 提 供 解 决 该 问 题 需 要 的 途 径 。 这 将 大 大 有 利 于 及 时 找 到 问 题的 解 决 方 法 。
SQL Server 对 发 生 错 误 的 策 略
SQL Server 7.0 版 的 策 略 是 杀 死 有 问 题 并 在 错 误 日 志 中 记 录 了 错 误 的 进 程ID 。 这 样 可 防 止 引 起 可 能 触 发 SQL Server 缺 陷 或 中 断 过 程 处 理 规 则 的 过 程 可 能造 成 的 损 失 。 更 重 要 的 是 要 紧 紧 跟 踪 TechNet 和 Knowledge Base 文 章 , 以 找 到关 于 该 问 题 的 信 息 。 如 果 用 户 相 信 自 己 已 经 遇 到 新 的 未 报 告 的 缺 陷 , 应 该 向Microsoft 报 告 。
研 究 错 误
当 在 错 误 日 志 中 看 到 错 误 时 , 可 用 TechNet 的 Knowledge Base 搜 寻 错 误 号 。当 通 过 查 询 收 到 Knowledge Base 文 章 列 表 时 , 应 阅 读 全 部 Knowledge Base 文章 , 并 决 定 那 些 接 近 自 己 的 状 态 。 要 注 意 在 其 中 有 错 误 报 告 的 版 本 , 并 与 当 前版 本 进 行 比 较 。 然 后 按 相 应 条 款 中 建 议 的 方 法 去 处 理 。
如 果 未 找 到 该 错 误 , 或 需 要 附 加 的 帮 助 , 可 打 电 话 给 Microsoft Product
Suppart Services 报 告 该 错 误 , 随 后 即 可 得 到 帮 助 。 有 些 错 误 在 Microsoft 内部 的 Knowledge Base 文 章 中 , 而 有 关 信 息 尚 未 放 入 到 TechNet 中 。
辨 别 致 命 错 误
用 户 通 过 阅 读 Knowledge Base 文 章 和 寻 找 安 全 级 别 , 可 判 断 问 题 的 严 重 程度 。 在 错 误 日 志 中 一 旦 发 现 错 误 就 设 法 这 样 做 。 这 就 是 为 什 么 错 误 日 志 中 一 写入 错 误 ,就 要 尽 快 设 置 自 己 的 SQL Server ,以 使 用 SQL Server Agent 向 SQL Server 操 作 员 或 数 据 库 管 理 员 写 信 或 发 e-mail 。
周 期 运 行 的 SQL Server
如 果 周 期 运 行 ( 停 机 和 开 机 )SQL Server , 有 些 可 能 会 造 成 损 坏 的 错 误 可 以得 以 避 免 , 用 户 可 能 很 想 立 即 知 道 自 己 是 否 属 于 这 种 情 况 , 以 便 可 防 止 退 出 和启 动 SQL Server 可 能 造 成 进 一 步 损 失 时 做 出 自 己 的 选 择 。 Knowledge Base 允许 用 户 了 解 自 己 是 否 有 需 要 周 期 运 行 SQL Server 的 错 误 。
在 tempdb 系 统 数 据 库 内 多 次 会 发 生 问 题 , tempdb 系 统 数 据 库 是 当 停 止 和 启动 SQL Server 时 初 始 化 的 工 作 数 据 库 。 如 果 tempdb 系 统 数 据 库 报 告 发 生 故 障 , 此 时 是 周 期 运 行 SQL Server 的 最 佳 时 间 。
- 驱 动 器 管 理
对 于 安 装 有 关 键 商 务 应 用 程 序 的 大 型 SQL Server , 需 要 了 解 磁 盘 驱 动 器 的详 细 情 况 。 测 试 执 行 配 置 就 是 在 硬 件 层 次 上 运 行 RAID 。 费 用 较 低 的 配 置 是 在 操作 系 统 层 次 上 运 行 RAID 。
廉 价 磁 盘 的 冗 余 阵 列
如 有 可 能 , 在 硬 件 层 次 上 最 好 是 运 行 Redundant Array of Inexpensive Disks( 廉 价 磁 盘 冗 余 阵 列 , RAID) , RAID 是 磁 盘 拆 卸 的 方 法 , 这 种 方 法 可 通 过提 供 部 分 冗 余 信 息 , 在 RAID 的 1 ~ 5 层 次 上 提 供 故 障 允 许 值 。 数 据 分 散 在 多 个磁 盘 上 , 此 时 可 同 时 发 生 I / O 。 RAID-0 不 提 供 故 障 值 ; RAID-5 可 提 供 最 大 故障 允 许 值 。 最 好 是 将 RAID0,1 和 5 的 层 次 与 Microsoft SQL Server 联 合 使 用 。
数 据 库 文 件 : RAID-0 或 RAID-5
使 用 SQL Server 的 RAID 技 术 可 提 高 性 能 , 执 行 RAID 的 方 法 可 直 接 影 响 SQL Server 的 性 能 。 把 数 据 库 文 件 放 到 RAID-0 上 , 可 实 现 最 佳 性 能 ( 也 称 为 基 于 硬件 的 并 行 集 , 因 为 数 据 分 割 的 方 法 和 在 一 个 阵 列 上 通 过 整 个 磁 盘 放 置 ) 。 然 而 ,
如 果 一 个 磁 盘 失 效 , 整 个 RAID-0 并 行 集 都 变 得 不 可 访 问 , 无 法 调 整 失 效 磁 盘 上的 数 据 。
如 果 系 统 随 时 由 于 种 种 原 因 而 不 能 关 闭 , 但 仍 可 涉 及 到 性 能 , 可 使 用 RAID-
5 提 供 冗 余 , 因 为 数 据 和 奇 偶 性 总 是 存 放 在 不 同 的 磁 盘 上 。 RAID-5 类 似 于RAID-0 , 但 包 括 故 障 允 许 值 的 冗 余 , 此 时 奇 偶 性 可 通 过 所 有 磁 盘 写 入 。 使 用 在硬 件 层 次 上 为 数 据 库 文 件 执 行 的 RAID-5 , 可 节 省 处 理 器 计 算 奇 偶 性 的 工 作 量 , 因 此 可 提 高 处 理 器 的 性 能 。
事 务 日 志 文 件 : RAID-1 ( 磁 盘 镜 像 )
最 好 是 在 硬 件 层 次 上 对 包 含 数 据 库 事 务 记 录 文 件 的 驱 动 器 使 用 执 行 的 RAID- 1( 磁 盘 镜 像 ) , 因 为 RAID-1 的 冗 余 最 佳 。 RAID-1 使 用 镜 像 集 提 供 磁 盘 的 冗 余 拷贝 , 而 且 也 是 阅 读 数 据 的 优 秀 执 行 器 ; 然 而 , 它 将 降 低 磁 盘 的 写 入 速 度 。 如 果有 关 键 应 用 程 序 , 在 决 定 如 何 管 理 磁 盘 驱 动 器 时 , 必 须 冒 着 可 能 提 供 所 希 望 的性 能 的 风 险 。
并 行 集
记 住 , RAID 的 奇 偶 并 行 集 可 在 NT 操 作 系 统 层 次 ( 软 件 层 次 ) 以 及 硬 件 层 次 上执 行 。 然 后 假 设 处 理 器 循 环 运 行 , 处 理 器 要 求 执 行 奇 偶 性 检 查 , 如 果 用 户 涉 及
到 成 本 比 处 理 器 循 环 的 使 用 更 高 , 那 么 在 NT 操 作 系 统 层 次 上 执 行 RAID 就 比 较便 宜 , 并 且 仍 可 提 高 性 能 。 NT Windows RAID 并 行 集 对 于 热 衷 于 改 进 性 能 和 降低 成 本 的 人 是 一 种 良 好 的 解 决 方 案 。
- 移 动 数 据 库
当 面 临 把 数 据 库 移 到 另 一 个 服 务 器 的 任 务 时 , 须 考 虑 以 下 许 多 问 题 :
-
两 个 服 务 器 上 的 排 列 顺 序 和 字 符 集 都 相 同 吗
-
两 个 服 务 器 上 的 SQL Server Authentication Modes 相 同 吗 ?
-
设 置 了 Trace Flags 吗 ?
-
master 系 统 数 据 库 中 有 用 户 的 存 储 过 程 吗 ?
-
NT Registry 中 的 ANSI to OEM 选 项 是 打 开 还 是 关 闭 的 ?
-
两 个 服 务 器 的 内 存 和 版 本 兼 容 吗 ?
-
两 个 服 务 器 上 的 SQL Server 登 录 和 远 程 登 录 都 相 同 吗 ?
-
sysservers 表 相 同 吗 ?
-
目 录 服 务 器 上 有 特 别 的 警 告 吗 ?
-
目 标 服 务 器 上 安 装 了 要 运 行 的 作 业 或 任 务 吗 ?
-
两 个 服 务 器 上 的 NT 组 相 同 吗 ?
-
数 据 库 选 项 相 同 吗 ?
-
在 调 度 时 间 上 支 持 事 务 日 志 吗 ?
如 果 要 把 数 据 库 从 一 个 服 务 器 上 移 到 另 一 个 服 务 器 , 必 须 回 答 和 验 证 上 述所 有 问 题 。 数 据 库 必 须 先 移 到 某 个 环 境 中 , 该 环 境 应 与 源 服 务 器 相 兼 容 和 相 似 , 以 便 二 者 具 有 相 同 的 格 式 , 移 动 之 前 表 现 的 特 性 应 相 同 。
- 重 建 SQL Server
在 必 须 重 建 整 个 服 务 器 、 硬 件 和 全 部 设 置 的 情 况 下 , 如 果 需 要 移 到 一 个 较大 的 服 务 器 上 , 或 经 历 过 硬 件 的 灾 难 性 失 败 , 为 确 保 具 有 重 建 的 脚 本 , 每 天 都应 该 执 行 下 列 任 务 。 设 置 重 建 脚 本 需 要 使 用 SQL Server Agent 设 置 每 天 要 运 行的 下 列 任 务 。 这 样 就 会 有 重 建 SQL Server 的 基 本 文 件 。
- 每 天 运 行 系 统 存 储 过 程 sp_configure 、sp_helpdevice
、sp_helpntgroup , 并
把 运 行 结 果 保 存 在 不 同 于 以 此 定 位 master 数 据 库 的 磁 盘 驱 动 器 中 。
-
备 份 全 部 数 据 库 。
-
使 用 BCP 实 用 程 序 把 master 数 据 库 系 统 表 拷 贝 成 一 个 文
本 文 件 。
-
以 书 面 文 件 的 形 式 制 定 在 驱 动 器 上 位 置 的 标 准 。
-
以 书 面 文 件 的 形 式 , 制 定 安 装 NT 和 SQL Server 的 标 准 。一旦 有 了 这 些 基 本 文 件 , 就 可 以 按 以 下 步 骤 重 建 服 务 器 :
-
采 购 硬 件 。
-
根 据 标 准 安 装 NT( 这 些 标 准 应 书 面 记 下 来 ) 。
-
根 据 标 准 安 装 SQL Server( 这 些 标 准 应 书 面 记 下 来 ) 。
-
不 要 存 储 master 系 统 数 据 库 , 以 使 master 系 统 数 据 库 中
的 任 何 操 作 都 必 须重 建 。 用 户 要 了 解 master 数 据 库 的 内 容 , 通 常 情 况 下 , 在 master 系 统 数 据 库中 不 创 建 用 户 存 储 的 程 序 。
-
在 新 的 服 务 器 上 重 建 NT 组 。
-
通 过 检 查 文 本 文 件 的 内 容 重 建 master 系 统 表 , 该 文 本
文 件 已 经 被 读 出 , 并且 重 建 了 SQL Server 的值。在 6.5 版 中 , 笔 者 常 用 BCP 备 份 系 统 表 , 由 于 从 6.5 版 升 级 到 7.0 版 系 统 表 发 生 了 巨 大 变 化 , 外 来 的 关 键 关 系 可 能 不 同 , 所 以 此 时再 这 样 做 必 须 加 倍 谨 慎 。
-
恢 复 自 己 的 数 据 库 。
-
用 自 己 的 应 用 程 序 和 用 户 测 试 其 配 置 , 看 看 这 些 用 户
是 否 仍 能 登 录 , 能 否 运行 该 应 用 程 序 。
-
准 备 排 除 任 何 有 问 题 的 部 分 。
当 上 述 处 理 过 程 无 论 何 原 因 变 得 必 要 时 , 这 是 重 建 服 务 器 的 一 般 步 骤 。 运行 系 统 与 测 试 附 属 在 每 个 数 据 库 的 应 用 程 序 同 时 进 行 。
- 管 理 关 键 任 务 的 应 用 程 序
如 果 数 据 库 包 含 对 用 户 的 业 务 非 常 关 键 的 信 息 , 那 么 用 户 可 能 希 望 采 用 下 列 某些 方 法 , 以 便 获 关 于 自 己 的 服 务 器 的 容 错 、 冗 余 和 故 障 率 等 对 策 :
-
使 用 事 务 日 志 备 份 , 每 周 至 少 运 行 一 次 整 个 数 据 库 备
份 。
-
在 日 常 安 排 的 基 础 上 运 行 Database Consistency Check 实 用 程
序 ( 对 系 统 数据 库 每 天 运 行 一 次 , 对 用 户 数 据 库 至 少 每 周 运 行 一 次 ) 。
-
使 用 SQL Server Agent 把 严 重 的 ( 严 重 等 级 21-25)SQL Server 错
误 打 印 出报 告 , 以 便 对 致 命 的 错 误 能 立 即 作 出 反 应 。
-
使 用 包 含 数 据 库 文 件 的 驱 动 器 的 硬 件 等 级 RAID-5 。
-
使 用 包 含 了 事 务 日 志 文 件 的 驱 动 器 的 硬 件 等 级 RAID-1(
监 测 ) 。
-
对 故 障 排 出 对 策 考 虑 使 用 Microsoft Transaction Server(MTS)
。
-
对 故 障 排 出 对 策 考 虑 使 用 NT Clustering。
-
在 不 同 地 点 都 拥 有 备 份 服 务 器 , 并 复 制 到 该 备 份 服 务
器 。
真 诚 地 备 份 数 据 库 , 并 使 用 SQL Server Agent 对 严 重 错 误 进 行 报 警 是 特 别重 要 的 。 立 即 作 出 反 应 可 把 损 失 减 小 到 最 低 程 度 , 长 期 坚 持 执 行 这 种 过 程 会 使用 户 对 解 决 错 误 变 得 轻 车 熟 路 。
当 使 用 第 四 章 介 绍 的 SQL Server Agent 时 , 这 一 过 程 执 行 起 来 显 示 得 非 常方 便 。 随 着 时 间 的 延 长 , 用 户 将 会 对 所 遇 到 的 应 用 程 序 之 间 、 版 本 之 间 各 种 不同 的 错 误 变 得 熟 能 生 巧 。
- 管 理 特 大 型 数 据 库
特 大 型 数 据 库 ( 超 过 数 千 兆 字 节 ) 的 出 现 向 数 据 库 管 理 员 起 了 挑 战 , 因 为 日常 的 维 护 任 务 ( 如 备 份 ) 和 数 据 库 定 期 检 查 就 要 花 费 大 量 时 间 。 Microsoft SQL
Server 7.0 通 过 改 进 历 史 上 对 大 型 数 据 花 费 大 量 时 间 开 发 的 实 用 程 序 , 可 直 接解 决 这 些 问 题 。 DBCC 的 运 行 速 度 奇 迹 般 大 大 提 高 , 在 不 影 响 服 务 器 上 其 他 程 序运 行 , 或 不 降 低 性 能 的 前 提 下 即 可 进 行 数 据 库 备 份 。 现 在 备 份 工 作 只 占 不 到 5% 的 CPU 资 源 , 实 际 其 他 数 据 库 用 户 甚 至 感 觉 不 到 备 份 的 运 行 。
如 果 采 用 Very Large Database(VLDB) , 要 确 保 另 有 一 台 服 务 器 用 作 备 份 服务 器 , 在 备 份 服 务 器 上 可 运 行 数 据 库 的 常 规 检 查 和 进 行 测 试 。 如 果 硬 件 遇 到 灾难 性 的 故 障 , 通 过 备 份 也 可 以 提 供 一 个 新 起 点 , 这 对 于 从 当 前 服 务 器 取 出 数 据永 远 都 是 有 必 要 的 。
- 启 动 和 终 止 SQL Server
Microsoft SQL Server 既 可 以 自 动 启 动 , 也 可 以 手 动 启 动 , 所 有 启 动 方 法都 可 使 SQL Server 起 到 NT 的 作 用 , 只 有 在 命 令 行 提 供 下 运 行 带 有 -C 参 数 的sqlservr.exe 时 除 外 。 如 果 选 择 自 动 启 动 SQL Server, 在 安 装 SQL Server 或在 安 装 SQL Server 之 后 使 用 Enterprise Manager 时 , 均 可 以 指 定 自 动 启 动 , 通 过 右 击 Enterprise Manager 分 层 树 中 选 中 的 服 务 并 选 择 Properties 即 实 现自 动 启 动 。 如 果 在 NT 启 动 时 复 选 了 Auto Start SQL Server 复 选 框 , 在 下 次 启动 Windows NT 时 SQL Server 就 会 自 动 启 动 。
使 用 Enterprise Manager 和 选 中 的 Start 或 Stop 后 ,启 动 和 中 止 SQL Server 是 非 常 方 便 的 , 在 此 还 可 以 暂 停 SQL Server 的 运 行 。 这 意 味 着 不 允 许 生 产 新 的
登 录 , 但 允 许 已 经 存 在 的 登 录 继 续 运 行 。 如 果 SQL Server 已 经 从 带 有 -C 选 项的 命 令 被 启 动 , 那 么 就 无 法 使 用 上 述 方 法 。
手 工 启 动 和 终 止 SQL Server 的 另 一 种 方 法 , 以 及 类 似 于 SQL Server Agent 和 Distributed Transaction Coordinator 的 相 关 服 务 , 就 是 使 用 SQL Server Service Manager 。从 Windows NT Start 菜 单 中 选 择 SQL Server Service Manager 便 可 实 现 上 述 功 能 。 双 击 绿 色 灯 泡 可 启 动 SQL Server , 双 击 黄 色 灯 泡 可 暂 停 SQL Server 的 运 行 , 双 击 红 色 灯 泡 可 中 断 SQL Server 的 运 行 。 从 屏 幕 上 的 下 拉 列表 框 中 可 以 选 择 该 项 功 能 。
启 动 和 终 止 SQL Server 的 第 三 种 方 法 是 ,从 Control Panel 上 选 择 Services 可 观 察 运 行 在 计 算 机 上 的 服 务 列 表 , 然 后 选 择 MSSQL Server , 并 选 择 Start 或Stop 按 钮 即 可 。 用 Control Panel 法 也 可 以 启 动 和 终 止 SQL Server Agnet 服务 和 Microsoft Data Transaction Coordinator(MSDTC) 服 务 。
启 动 和 终 止 SQL Server 还 有 另 一 种 方 法 , 就 是 从 命 令 行 提 示 符 上 直 接 实 现 。
当 用 这 种 方 法 启 动 SQL Server 时, SQL Server 的 表 现 形 式 很 不 相 同 , 它 允 许传 递 参 数 , 以 防 止 SQL Server 的 服 务 运 行 , 并 可 以 单 用 户 模 式 或 最 低 配 置 启 动SQL Server 。 下 一 节 概 括 了 这 些 参 数 , 并 提 示 如 何 从 命 令 行 提 示 符 启 动 SQL Server 。
从 命 令 行 提 示 符 启 动 SQL Server
从 NT 启 动 菜 单 选 择 Run 并 键 入 以 下 三 个 命 令 , 可 以 从 命 令 提 示 符 下 启 动
Microsoft SQL Server : 命 令 的 语 法 为
net start mssqlserver
或
sqlservr
或
net start SQLServerAgent
缺 省 的 自 变 量 为 :
-
-dmaster_file_path 该 自 变 量 代 表 缺 省 安 装 的 master 数 据 库 文 件 的 路径 C: \ Mssql7 \ Data \ Master.mdf 。 如 不 指 定 此 自 变 量 , 可 使 用 NT Registry 中 的 值 。
-
-eerror_log_path 该 自 变 量 代 表 缺 省 安 装 的 错 误 日 志 文 件 的 路 径 C: \ Mssql7 \ Log \ Errorlog 。 如 不 指 定 此 自 变 量 , 可 使 用 NT Registry 中 的 值 。
-
-lmaster_log_path 该 自 变 量 代 表 缺 省 安 装 的 master 数 据 库
日 志 文 件 的
路 径 C: \ Mssql7 \ Data \ Mastlog.ldf 。其 他 启 动 变 量 为 :
- -c 该 变 量 可 启 动 SQL Server 不 能 作 为 Wndows NT 服 务 而 运 行
的 SQL
Server 。 所 有 的 系 统 信 息 都 显 示 在 启 动 SQL Server 的 窗 口 中 , 此 时 用 户 不 能 使用 SQL Server Enterprise Manager 、SQL Server Service Manager 、Control Panel 中 的 Services 应 用 程 序 或 任 意 网 络 命 令 来 暂 停 或 终 止 SQL Server 的 运 行 。 另
外 , 在 注 销 之 前 无 法 终 止 SQL Server 。
-
-f 该 变 量 可 用 不 执 行 CHECKPOINT 的 最 低 配 置 启 动 SQL Server 。 如 果 该服 务 器 因 为 此 配 置 选 项 设 置 太 高 而 不 能 启 动 , 则 可 以 这 样 启 动 。 该 自 变 量 对 于系 统 表 选 项 可 打 开 allow updates 选 项 , 并 可 以 单 用 户 模 式 启 动 SQL Server , 所 以 , 用 户 必 须 记 住 要 终 止 SQL Server Agent 的 运 行 , 或 占 用 用 户 的 唯 一 的 连接 。 对 内 存 的 用 法 、 用 户 的 连 接 、 开 放 的 数 据 库 、 锁 闭 和 打 开 的 对 象 、 高 速 缓冲 区 的 语 言 信 息 、 同 步 I / O 、 总 体 过 程 和 高 速 缓 存 的 改 变 , 都 可 设 置 到 最 低 值 。另 外 , 过 程 高 速 缓 存 可 设 置 到 50% , 使 远 程 访 问 和 向 前 读 均 失 效 , 启 动 存 储 程序 被 忽 略 。 改 变 用 户 需 要 改 变 的 东 西 , 重 新 以 正 常 方 式 启 动 SQL Server 。
-
-m 该 自 变 量 可 以 单 用 户 模 式 启 动 SQL Server , 终 止 SQL Server Agent 或 占 用 用 户 的 唯 一 的 连 接 , 只 有 单 一 用 户 可 以 连 接 。 可 打 开 allow updates 选项 , 意 味 着 如 果 需 要 升 级 系 统 表 , 并 且 当 allow updates 对 系 统 表 为 真 时 不 想别 人 登 录 到 SQL Server 。
-
-n 用 该 变 量 启 动 SQL Server 可 指 定 Windows NT 事 件 日 志 不
用 于 记 录 SQL Server 事 件 。 与 -e 变 量 一 起 使 用 , 否 则 SQL Server 事 件 也 不 记 入 SQL Server 错 误 日 志 。
-
-pprecision_level 该 变 量 可 用 来 确 定 十 进 制 数 据 和 公 制
数 据 类 型 的 最 大 精度 等 级 。 SQL Server 的 缺 省 值 为 28 , 如 果 不 用 -p 自 变 量 提 供 精 度 等 级 , 该 系统 可 使 用 的 最 高 精 度 等 级 为 38 。
-
-sregistry_key 使 用 该 变 量 可 以 通 过 使 用 来 自 存 储 在
registry_key(Server Subkey) 下 的 可 替 换 的 启 动 参 数 来 启 动 SQL Server,registry_key 可 多 次 作 为 以
前 定 义 的 启 动 配 置 。
-
/ Ttrace_number 该 大 写 字 母 变 量 以 指 定 的 跟 踪 标 志 启 动
SQL Server 。
-
-x 该 自 变 量 不 保 持 可 改 进 性 能 的 CPU 时 间 和 高 速 缓 存
影 响 的 比 率 统 计 。
终 止 SQL Server 运 行 的 另 一 种 方 法 是 , 在 Transact-SQL 对 话 期 间 使 用SHUTDOWN 命 令 。
SHUTDOWN 和 SHUTDOWN W ITH NOWAIT
通 过 运 行 来 自 OSQL 或 Query Analyzer 的 SHUTDOWN Transact-SQL 语 句 , 或 对 于 可 发 出 Transact-SQL 语 句 再 次 启 动 生 效 , 并 可 逐 点 检 查 每 个 数 据 库 。 因为 所 有 上 述 这 样 功 能 均 允 许 结 束 , 所 以 在 SQL Server 时 , 恢 复 时 间 缩 短 。 使 用SHUTDOWN WITH NOWAIT 不 会 结 束 任 何 操 作 , 并 且 SQL Server 的 运 行 可 立 即 终止 , 但 恢 复 时 间 延 长 。
如 果 用 户 时 间 充 足 , 终 止 SQL Server 的 最 佳 方 法 是 使 用 SHUTDOWN 语 句 , 因 为 所 有 登 录 均 告 失 效 , 任 何 正 在 执 行 的 Transact-SQL 语 句 都 允 许 结 束 , 每 个数 据 库 均 可 执 行 CHECKPOINT 语 句 。
- 归 档 处 理
数 据 库 管 理 的 另 一 个 重 要 主 题 是 , 通 过 把 旧 的 数 据 经 过 归 档 处 理 从 数 据 库
中 清 除 , 来 管 理 磁 盘 空 间 。 定 期 清 除 和 归 档 数 据 库 中 的 历 史 数 据 就 像 在 管 理 数据 库 时 启 动 和 终 止 数 据 库 一 样 重 要 , 并 且 这 样 可 改 善 性 能 。
更 为 重 要 的 是 , 通 过 归 档 功 能 建 立 自 己 的 应 用 程 序 , 并 从 开 始 就 引 入 到 设计 中 。 当 数 据 库 中 充 满 了 不 得 不 到 下 周 才 清 除 的 无 用 数 据 时 再 开 始 考 虑 归 档 已为 时 已 晚 。 归 档 任 务 计 划 和 设 计 , 尤 其 是 如 果 这 些 数 据 为 金 融 数 据 和 税 法 管 理数 据 , 还 必 须 保 留 一 定 时 间 。 这 并 非 是 一 个 容 易 解 决 的 问 题 , 毫 无 计 划 或 预 见地 去 完 成 这 一 艰 巨 的 任 务 可 能 会 造 成 更 大 的 问 题 , 使 数 据 库 管 理 员 和 整 个 公 司穷 途 未 路 。 数 据 库 结 构 及 其 中 所 包 含 的 关 系 可 能 会 超 时 变 化 , 不 足 以 把 数 据 放在 文 本 文 件 中 。 用 户 必 须 考 虑 到 其 中 的 关 系 , 采 取 合 适 的 始 终 需 要 恢 复 数 据 和了 解 数 据 的 良 好 策 略 。 遗 憾 的 是 , 由 于 应 用 程 序 在 建 立 时 受 时 间 限 制 , 在 产 生应 用 程 序 崩 溃 时 , 归 档 常 常 只 考 虑 到 最 不 重 要 的 事 情 。 实 际 上 , 在 应 用 程 序 的设 计 和 实 施 中 , 维 护 数 据 是 最 重 要 的 因 素 之 一 。
第 15 章 数 据 库 的 预 防 性 维 护
Microsoft SQL Server 7 通 过 提 供 Maintenance Plan Wizard , 使 数 据 库的 预 防 性 维 护 进 行 起 来 十 分 方 便 , Maintenance Plan Wizard 贯 穿 创 建 维 护 计划 的 各 个 步 骤 。 该 向 导 使 用 SQL Server Agent 的 作 业 方 案 功 能 , 并 允 许 用 户 重新 组 织 数 据 和 索 引 页 ,在 常 规 规 划 的 基 础 上 更 新 统 计 。Maintenance Plan Wizard 还 允 许 用 户 管 理 关 于 数 据 库 的 策 略 测 试 , 并 确 定 数 据 库 备 份 计 划 和 数 据 页 的 自由 空 间 百 分 比 , 可 以 将 结 果 报 告 生 成 为 一 个 文 件 或 一 个 Web 页 。 所 有 这 些 功 能都 可 引 入 到 包 含 Database Maintenance Plan Wizard 的 几 个 屏 幕 视 图 上 。 这 对数 据 库 管 理 员 是 一 个 十 分 惊 人 的 技 术 进 步 , 因 为 它 执 行 起 来 简 单 , 可 减 少 用Transact-SQL 对 此 功 能 进 行 编 码 的 工 作 量 。 数 据 库 维 护 计 划 可 能 无 法 回 答 用 户的 所 有 要 求 , 以 及 在 SQL Server Agent 作 业 中 使 用 sqlmaint 实 用 程 序 或 改 变在 此 提 供 的 功 能 性 的 多 项 选 择 。 关 于 sqlmain 实 用 程 序 已 在 第 8 章 “ 实 用 程 序改 变 ” 中 作 过 讨 论 。
- 更 新 统 计
UPDATE STATISTICS 是 可 添 加 到 Database Maintenance Plan 的 Transact- SQL 语 句 。 如 果 系 统 表 中 的 行 数 变 化 惊 人 , 那 么 运 行 该 语 句 可 以 更 新 系 统 表 中数 值 分 布 的 统 计 结 果 。
基 于 成 本 的 查 询 优 选 器 使 用 上 述 统 计 来 估 算 使 用 索 引 的 成 本 , 并 设 法 以 最低 成 本 使 用 该 索 引 。 当 向 系 统 表 增 加 行 数 或 从 中 删 去 行 数 时 , 或 当 列 中 的 值 的分 布 发 生 变 化 时 , 或 当 在 制 订 查 询 计 划 的 查 询 优 选 器 没 有 最 新 的 统 计 信 息 时 , 都 必 须 更 新 统 计 。 这 样 可 能 会 使 优 选 器 对 所 使 用 的 索 引 做 出 较 少 优 化 的 决 定 。如 果 统 计 信 息 指 示 为 0 行 ,甚 至 可 能 会 对 包 含 上 百 万 行 的 表 格 进 行 扫 描 。图 15.1 表 示 Database Maintenance Plan Wizard 。 利 用 Database Maintenance Plan Wizard , 用 户 可 以 对 额 外 大 型 表 格 指 明 应 采 样 的 行 数 或 表 格 的 百 分 数 。 如 果 输入 的 值 太 小 , SQL Server 将 根 据 表 中 的 行 数 更 正 输 入 的 数 值 , 并 使 用 最 低 的 数值 数 使 采 样 具 有 代 表 性 和 可 用 性 。 在 发 出 UPDATE STATISTICS 语 句 时 如 果 不 使用 FULLSCAN 自 变 量 , SQL Server 将 对 表 格 进 行 采 样 , 以 收 集 存 储 在 系 统 表 中的 统 计 信 息 , 查 询 优 选 器 需 要 系 统 表 制 订 查 询 计 划 。 这 对 大 型 表 格 可 以 节 省 时间 , 因 为 只 扫 描 样 本 行 便 可 收 集 统 计 信 息 , 并 不 需 扫 描 整 个 表 。
运 行 更 新 统 计 是 忽 略 数 据 库 维 护 任 务 最 普 遍 的 方 式 之 一 , 如 果 所 需 要 的 统计 在 制 订 查 询 计 划 时 不 能 更 新 , 运 行 更 新 统 计 可 能 会 影 响 SQL Server 查 询 性 能 。UPDATE STATISTICS 语 句 的 语 法 和 自 变 量 可 在 第 21 章 找 到 。
图 15.1Database Maintenance Plan Wizard
- 数 据 库 一 致 性 检 查 器
正 如 通 过 使 用 定 期 维 护 的 CHKDSK 实 用 程 序 运 行 检 查 硬 盘 很 有 必 要 一 样 , 通过 运 行 作 为 常 规 维 护 计 划 的 一 部 分 的 Database Consistency Checker(DBCC) 来检 查 数 据 库 , 并 验 证 其 逻 辑 和 物 理 一 致 性 也 是 很 有 必 要 的 。 在 备 份 数 据 库 之 前 , 最 好 是 先 运 行 一 下 DBCC CHECKCATALOG 和 DBCC CHECKDB , 这 样 可 以 确 保 不 会 用可 能 包 含 错 误 的 备 份 覆 盖 最 后 的 最 佳 备 份 , 然 后 再 检 查 DBCC 输 出 文 件 , 解 决 可能 出 现 的 任 何 错 误 , 最 后 再 备 份 数 据 库 。 并 计 划 在 用 户 不 在 系 统 中 时 运 行 DBCC 。如 果 用 户 的 数 据 库 包 含 大 型 表 格 , 或 数 据 库 大 于 5GB , 在 存 储 数 据 库 之 后 用 户可 能 想 运 行 DBCC 备 份 服 务 器 , 或 使 用 可 略 去 非 成 簇 索 引 的 扫 描 的 NO_INDEX 选项 。 但 用 户 仍 应 检 查 自 己 的 非 成 簇 索 引 , 但 也 许 检 查 频 度 小 于 数 据 页 和 成 簇 索引 。 关 于 DBCC 情 况 的 详 细 信 息 , 请 参 阅 第 8 章 。
DBCC CHECKDB 检 查 数 据 库 中 每 个 对 象 的 完 整 性 , 并 修 复 发 现 的 任 何 错 误 。如 果 运 行 DBCC CHECKDB , 就 一 定 不 要 运 行 DBCC CHECKALLOG 或 DBCC CHECKTABLE 。每 个 表 的 索 引 和 数 据 页 都 要 进 行 检 查 , 以 便 更 正 页 链 接 和 一 致 性 指 针 。 然 后 再进 一 步 检 查 索 引 , 确 保 输 入 项 分 类 正 确 , 每 页 的 偏 移 量 和 数 据 都 是 合 理 的 。 对于 所 有 页 都 要 检 查 每 个 表 的 文 本 尺 寸 、 ntext 和 图 像 , 以 及 页 分 配 。
DBCC CHECKCATALOG 用 于 检 查 系 统 表 看 是 否 一 致 性 , 每 次 预 定 在 数 据 库 上 运行 DBCC 时 ,都 应 该 运 行 DBCC CHECKCATALOG ,这 样 可 用 Systypes 检 查 Syscolumns 的 完 整 性 , 用 Syscolumns 检 查 Sysobjects 的 完 整 性 。 syscolumns 中 的 每 个 数
据 类 型 在 systypes 中 必 须 有 一 行 , 而 每 个 表 和 视 图 在 syscolumns 中 也 至 少 必须 有 一 列 。
在 Microsoft SQL Server 7 中 , DBCC 的 表 现 形 式 变 化 比 较 显 著 , 用 户 不 必再 运 行 DBCC DBREPAIR 来 删 除 标 记 为 有 疑 问 的 数 据 库 , 用 DROP DATABASE 就 可实 现 上 述 操 作 。另 外 ,应 该 使 用 DBCC SHRINKDATABASE ,而 不 使 用 DBCC SHRINKDB , 因 为 系 统 不 再 支 持 DBCC SHRINKDB。
如 果 发 现 错 误 , DBCC 也 具 有 修 复 数 据 库 的 能 力 。 DBCC CHECKTABLE 、 DBCC CHECKDB 和 DBCC CHECKALLOC 都 有 修 复 选 项 , 该 选 项 的 值 可 以 为 REPAIR_FAST 、REPAIR_REBUILD 和 ALOW_DATA_LOSS , 其 中 REPAIR_FAST 表 示 可 进 行 快 速 小 型 低风 险 的 修 复 , 如 非 聚 簇 索 引 中 的 额 外 空 间 ; REPAIR_REBUILD 表 示 , 包 括 FAST 快 速 修 复 再 加 上 较 长 时 间 的 修 复 , 仍 是 低 风 险 的 ; ALLOW_DATA_LOSS 表 示 , 包括 REPAIR_REBUILD 修 复 , 再 加 上 更 正 分 配 错 误 、 更 正 行 或 页 错 误 、 甚 至 包 括 删去 已 损 坏 的 文 本 对 象 等 。
DBCC 表 现 行 为 的 另 一 个 变 化 是 , 在 反 向 兼 容 性 上 都 支 持 DBCC NEWALLOC 和DBCC ROWLOCK 。 在 Microsoft SQL Server 7 中 , DBCC NEWALLOC 已 被 DBCC CHECKALLOC 所 代 替 ,用 户 可 以 删 除 所 有 DBCC ROWLOCK 语 句 ,因 为 在 Microsoft SQL Server 7 中 , 行 的 层 次 锁 定 已 成 为 标 准 特 性 。
Microsoft SQL Server 7 的 新 索 引 结 构 要 求 SQL Server 在 聚 簇 索 引 减 低 时应 重 建 对 表 格 的 全 部 非 聚 簇 索 引 。 减 低 成 簇 索 引 时 可 使 用 DBCC REINDEX , 不 要使 用 DROP INDEX 。 最 后 , 希 望 看 到 用 户 在 以 前 版 本 中 创 建 的 任 何 DBCC 输 出 发生 的 变 化 。 关 于 Microsoft SQL Server 7 的 DBCC CHECKDB 输 出 , 如 图 15.2 所
示 。
图 15.2DBCC CHECKDB 的输出
DBCC 错 误 的 修 复 技 术
首 先 要 向 Knowledge Base 咨 询 研 究 错 误 。 第 14 章 介 绍 了 TechNet 和Knowledge Base Articles ,其 中 包 括 了 该 主 题 的 详 细 信 息 。另 外 ,请 参 阅 图 15.3 , 该 图 表 示 Microsoft TechNet 中 的 一 系 列 关 于 Knowledge Base 的 文 章 。
图 15.3Microsoft TechNet 中的 Knowledge Base 文章
如 果 对 错 误 的 研 究 表 明 某 索 引 已 经 受 到 损 坏 , 修 复 对 减 低 和 重 建 该 索 引 是
比 较 简 单 的 。如 果 对 错 误 的 研 究 表 明 表 格 已 受 到 损 坏 ,那 么 经 常 使 用 SELECT INTO 把 该 数 据 移 到 另 一 个 表 中 可 挽 救 该 数 据 。 旧 的 表 格 可 以 放 弃 , 然 后 把 新 的 表 格改 名 为 旧 的 表 格 名 。 除 了 研 究 任 何 相 关 的 对 象 外 , 如 存 储 过 程 和 应 该 在 放 弃 该索 引 之 前 Scriptout() 的 许 可 外 , 还 可 以 重 建 索 引 。
设 法 使 用 BCP 实 用 程 序 把 数 据 输 出 到 某 个 操 作 系 统 文 件 也 是 很 有 用 的 。 如果 DBCC 能 够 识 别 受 损 数 据 的 指 定 行 或 列 , 最 好 的 方 法 也 许 是 删 除 该 行 , 或 更 新该 列 , 不 要 废 弃 整 个 表 格 。 如 果 用 户 请 教 了 Knowledge Base , 认 识 到 自 己 需 要附 加 帮 助 , 可 打 电 话 给 Microsoft Technical Support , 他 们 将 帮 助 更 正 错 误 。图 15.4 是对 2546 号 错 误 的 查 找 以 及 关 于 该 错 误 的 Knowledge Base 文 章 的 结 果列 表 。 这 些 信 息 帮 助 用 户 排 除 在 DBCC 输 出 文 件 中 可 能 看 到 的 错 误 。
图 15.4 查找 Knowledge Base 文章
DBCC UPDATEUSAGE
DBCC UPDATEUSAGE 是 可 在 运 行 Transact-SQL 语 句 的 任 何 地 方 都 能 够 运 行 的Transact-SQL 语 句 。 该 语 句 可 处 理 要 评 价 的 数 据 库 、 表 格 或 索 引 , 并 可 为 表 格和 聚 簇 索 引 更 正 Sysindexes 表 中 的 任 何 误 差 。 应 该 运 行 DBCC UPDATEUSAGE 的最 普 通 的 特 征 是 , 当 存 储 过 程 sp_spaceused 的 系 统 返 回 用 户 所 考 虑 的 问 题 时 的误 差 信 息 。 在 索 引 已 经 减 小 后 这 种 情 况 可 能 会 发 生 。 用 户 也 可 以 使 用 带sp_spaceused 的 自 变 量 updateusage , 该 自 变 量 在 把 使 用 信 息 的 空 间 释 放 之 前将 运 行 DBCC UPDATEUSAGE , 然 而 , 要 了 解 这 种 操 作 在 大 型 数 据 库 上 要 占 用 较 多的 时 间 。
DBCC OPENTRAN
DBCC OPENTRAN 可 用 来 检 测 运 行 时 间 较 长 的 事 务 , 该 事 务 可 防 止 事 务 日 志 被截 断 。 该 自 变 量 指 示 最 旧 分 布 式 和 非 分 布 式 的 标 记 为 复 制 的 事 务 。 开 放 式 事 务可 防 止 事 务 日 志 免 遭 被 清 除 , 使 日 志 保 持 完 整 , 甚 至 使 用 DUMP TRANSACTION 语句 也 不 能 清 除 该 日 志 。 当 这 种 情 况 发 生 时 , 必 须 先 了 解 哪 个 事 务 是 有 问 题 的 , 以 便 对 问 题 进 行 诊 断 和 修 复 , 所 以 可 不 必 使 用 该 自 变 量 , 并 使 SQL Server 恢 复到 正 确 的 功 能 状 态 。 长 时 间 运 行 查 询 和 开 放 事 务 的 原 因 可 能 是 缺 乏 优 秀 的 编 程技 术 员 ,使 SQL Server 存 在 缺 陷 。在 发 出 COMMIT TRANSACTION 之 前 ,SQL Server 不 会 清 除 开 放 的 事 务 , 如 用 未 定 的 COMMIT TRANSACTION 语 句 发 布 BEGIN TRANSACTION 的 事 务 。 如 果 记 录 中 存 在 开 放 的 事 务 , DBCC OPENTRAN 就 显 示 系 统
进 程 的 识 别 号 (SPID) , 以 便 可 以 “ 清 除 ” 此 进 程 。
如 果 使 用 WITH TABLERESULTS 自 变 量 , 可 把 DBCC OPENTRAN 语 句 的 输 出 累加 到 一 个 表 中 。 如 果 存 在 SQL Server 缺 陷 或 相 反 需 要 排 除 这 种 情 况 , 分 析 此 表可 提 供 关 于 问 题 事 务 的 信 息 , 并 可 修 复 编 码 问 题 , 或 找 到 工 作 区 。
- 可 疑 的 数 据 库
如 果 SQL Server 检 测 到 危 机 数 据 库 完 整 性 的 事 件 , 它 便 把 数 据 库 的 状 态 改为“ 可 疑 的 ”。 此 时 该 数 据 库 变 成 不 可 用 的 , 数 据 库 内 包 含 的 数 据 是 不 可 访 问 的 。
恢 复 可 疑 数 据 库
有 时 复 位 在 Sysdatabases 系 统 表 中 的 可 疑 状 态 , 取 消 数 据 库 的 可 疑 标 记 不失 为 明 智 之 举 。 在 某 些 情 况 下 , 数 据 库 是 可 恢 复 的 , 数 据 库 的 完 整 性 完 好 如 初 。例 如 , 如 果 在 SQL Server 启 动 之 前 , 操 作 系 统 文 件 的 备 份 锁 住 了 数 据 库 文 件 , SQL Server 可 把 关 于 该 文 件 的 数 据 库 状 态 改 为 “ 可 疑 的 ”, 因 为 它 不 能 打 开 数据 库 文 件 。 一 旦 数 据 库 文 件 解 除 锁 定 , 启 动 SQL Server 可 打 开 该 文 件 , 但 数 据库 仍 标 记 为 可 疑 状 态 , 在 该 状 态 消 失 之 前 不 能 访 问 。
这 种 情 况 的 另 一 个 例 子 是 , SQL Server 不 能 完 成 数 据 库 的 恢 复 , 因 为 该 数据 库 或 记 录 已 经 完 全 充 满 数 据 。 使 用 下 列 代 码 清 单 可 以 解 除 可 疑 的 数 据 库 :
EXEC SP_CONFIGURE ALLOW UPDATES ′ ,1 RECONFIGURE WITH OVERRIDE
BEGIN TRAN
UPDATE sysdatabases SET status = status - 256
WHERE name = databasename
AND status & 256=256 ROLLBACK TRAN
EXEC SP_CONFIGURE ′ ALLOW UPDATES ′ ,0
RECONFIGURE WITH OVERRIDE
使 用 ROLLBACK 语 句 可 检 查 更 新 的 行 是 否 多 于 一 行 。 如 果 只 有 一 行 被 更 新 , 可 再 次 运 行 UPDATE 语 句 , 并 使 用 COMMIT TRAN 语 句 代 替 ROLLBACK TRAN 语 句 , 这 样 可 确 认 对 数 据 库 的 改 变 。如 果 受 影 响 的 行 多 于 一 行 ,就 应 保 证 执 行 ROLLBACK TRAN 语 句 , 并 修 复 此 处 的 子 语 句 , 因 为 一 个 数 据 库 只 应 有 一 个 特 征 名 。
用 RESTORE 语 句 恢 复 可 疑 数 据 库
用 户 可 以 使 用 RESTORE 语 句 尝 试 恢 复 可 疑 数 据 库 。 RESTORE 语 句 的 FROM 子语 句 通 常 指 定 正 在 用 来 恢 复 备 份 设 备 。 这 里 介 绍 一 种 含 蓄 的 巧 妙 用 法 。 如 果 在发 出 RESTORE 语 句 时 还 未 使 用 FROM 子 语 句 , 恢 复 开 始 , 但 不 是 还 原 。 当 在 解 除数 据 的 可 疑 性 和 修 复 它 之 后 需 要 恢 复 数 据 库 时 , 可 以 使 用 此 法 , 也 可 以 使 用 这
-
技 术 恢 复 由 NORECOVERY 选 项 存 储 的 数 据 库 。 当 移 到 后 备 服 务 器 时 也 可 以 使 用这 一 技 术 。
- 遵 守 标 准
预 防 性 维 护 的 一 个 更 为 重 要 的 方 面 是 , 全 面 强 化 服 务 器 的 标 准 集 。 该 标 准集 可 以 包 括 下 列 内 容 :
-
目 录 结 构 ( 数 据 库 、 记 录 、 操 作 系 统 、 程 序 、 Internet 目 录 、 SQL 备 份以 及 应 用 程 序 相 关 文 件 的 存 放 位 置 )
-
磁 盘 驱 动 器 RAID 层 失 灵 及 冗 余
-
DBCC 和 BACKUP 维 护 程 序 的 频 率
-
在 DBCC 输 出 文 件 中 发 现 错 误 时 的 过 程
-
有 系 统 管 理 员 (SA) 的 组
-
有 数 据 库 拥 有 者 (DBO) 访 问 的 组
-
用 户 创 建 对 象 的 命 名 习 惯
-
字 符 集 和 分 类 顺 序
-
客 户 访 问
-
在 整 个 NT 组 和 域 帐 户 中 的 控 制 中 心 区
-
安 装 的 通 信 协 议
-
安 全 模 型
-
产 品 中 使 用 的 SQL Server 和 NT 的 版 本
-
口 令 改 变 时 间 间 隔
-
内存
-
IIS 标 准 (FTP 安 装 标 准 、 主 目 录 、 目 录 许 可 、 虚 拟 根 特 许 、 安 装 的 服 务 、成 员 服 务 器 相 对 于 主 服 务 器 或 备 份 域 服 务 器 )
标 准 化 可 简 化 数 据 库 的 维 护 过 程 , 并 且 有 助 于 提 高 效 率 和 组 织 操 作 。 标 准应 做 成 文 档 , 放 到 网 络 上 共 享 。 这 样 可 节 省 时 间 , 使 数 据 库 维 护 时 间 降 到 最 低 。
- 备 份 方 法
当 事 务 恢 复 防 护 措 施 不 能 抵 卸 防 护 挑 战 的 情 况 发 生 时 , 备 份 可 为 数 据 防 护提 供 附 加 级 别 。 维 护 当 前 备 份 文 件 提 供 第 二 级 数 据 防 护 , 是 数 据 库 维 护 责 任 的重 要 组 成 部 分 。
数 据 库 备 份
数 据 库 备 份 有 两 种 不 同 的 基 本 类 型 , 数 据 库 备 份 和 事 务 日 志 备 份 。
如 果 只 选 择 进 行 数 据 库 备 份 , 则 可 以 恢 复 到 数 据 库 备 份 的 最 后 时 刻 。 如 果 既 进行 数 据 库 备 份 , 又 进 行 事 务 日 志 备 份 , 则 可 把 数 据 恢 复 到 出 现 失 灵 前 的 时 刻 。后 一 种 方 法 的 防 护 性 更 强 一 些 。 恢 复 方 法 就 是 存 储 最 新 的 数 据 库 备 份 , 然 后 再
存 储 每 个 事 务 日 志 备 份 , 直 到 接 近 出 现 数 据 损 坏 或 丢 失 的 时 刻 。 利 用 Database Maintenance Plan Wizard 可 制 定 数 据 库 备 份 的 方 案 ( 请 参 见 图 15.5) 。 用 SQL Server Agent 可 编 制 事 务 日 志 备 份 方 案 , 本 章 在 “ 事 务 日 志 备 份 ” 一 节 将 对 此进 行 详 述 。
图 15.5 用 Database Maintenance Plan Wizard 制定数据库备份方案
差 分 数 据 库 备 份
差 分 备 份 是 BACKUP DATABASE 语 句 的 变 量 , 如 果 使 用 该 变 量 , 则 只 能 备 份从 最 后 数 据 库 完 整 备 份 以 来 发 生 变 化 的 部 分 。 这 样 通 常 使 备 份 文 件 较 小 , 对 于大 型 数 据 库 可 节 省 时 间 和 空 间 。 使 用 差 分 备 份 的 典 型 方 法 是 , 每 周 做 一 次 完 整备 份 , 每 天 增 补 备 份 。 当 然 , 这 些 备 份 间 隔 可 根 据 需 要 进 行 调 整 。
也 可 以 把 数 据 库 、 差 分 和 日 志 备 份 结 合 起 来 , 这 样 可 减 少 恢 复 花 费 的 时 间 。为 此 , 应 恢 复 最 后 数 据 库 的 完 整 备 份 、 恢 复 差 分 备 份 和 恢 复 差 分 备 份 之 后 创 建的 所 有 日 志 备 份 , 创 建 的 文 件 顺 序 一 定 要 正 确 。
使 用 完 整 数 据 库 备 份 和 差 分 备 份 数 据 库 时 可 利 用 下 列 语 法 :
BACKUP DATABASE database_name TO database_device1
WITH INIT G O
差 分 数 据 库 备 份 , 随 后 又 执 行 下 列 语 法 :
BACKUP DATABASE database_name TO database_devicel
WITH DIFFERENTIAL
如 果 后 来 遇 到 问 题 需 要 恢 复 , 首 先 恢 复 完 整 备 份 , 然 后 再 恢 复 差 分 备 份 , 这 样 可 利 用 下 面 的 语 法 恢 复 数 据 库 。 在 恢 复 了 差 分 备 份 后 , 如 果 存 在 日 志 需 要恢 复 , 可 使 用 NORECOVERY 变 量 , 如 果 不 需 要 恢 复 日 志 , 可 使 用 RECOVERY 变 量 。
完 整 数 据 库 的 RESTORE 语 法 为 : RESTORE DATABASE database_name FROM database_device1
WITH FILE = 1, NORECOVERY
差 分 数 据 库 的 RESTORE 语 法 为 : RESTORE DATABASE database_name FROM database_device1
WITH FILE = 2, NORECOVERY
如 果 没 有 要 恢 复 的 事 务 日 志 备 份 , 在 有 附 加 事 务 日 志 要 恢 复 ( 用 RESTORE 或RECOVERY) 时 , 可 使 用 NORECOVERY 。 使 用 下 一 节 概 述 的 语 法 , 对 于 事 务 日 志 备份 可 恢 复 任 何 可 以 有 的 事 务 日 志 。
如 果 未 使 用 设 备 备 份 数 据 库 或 日 志 文 件 , 但 使 用 了 磁 盘 或 磁 带 文 件 , 就 必须 使 用 FROM= 或 FROM TAPE= 语 法 指 明 把 数 据 恢 复 到 什 么 介 质 上 。 关 于 BACKUP 和RESTORE 语 句 的 完 整 和 详 细 语 法 请 参 阅 第 21 章 。
事 务 日 志 备 份
通 过 Database Maintenance Plan 或 使 用 SQL Server Agent , 可 以 运 行 事务 日 志 备 份 。 对 于 事 务 日 志 备 份 , 即 可 以 使 用 Database Maintenance Plan Wizard , 也 可 以 输 入 Transact-SQL 语 法 , 只 需 先 在 Enterprise Manager 中 右
击 SQL Server Agent 并 选 择 New , 然 后 从 快 捷 菜 单 上 选 择 Job 即 可 。 如 果 希 望保 存 事 务 日 志 供 以 后 恢 复 , 应 确 保 trunc.log on chkpt 数 据 库 选 项 为 假 。 通 过使 用 Microsoft SQL Server Agent 的 自 动 化 作 业 编 制 功 能 , 并 选 择 New Job 屏幕 视 图 内 的 Schedules Panel , 可 以 制 订 要 出 现 的 事 务 日 志 备 份 。 应 设 法 每 10 到 30 分 钟 备 份 一 次 事 务 日 志 , 并 根 据 新 事 务 的 编 号 和 希 望 的 恢 复 量 调 整 备 份 时间 间 隔 。 如 果 事 务 日 志 备 份 作 业 步 骤 失 败 , 也 可 以 对 作 业 步 骤 设 置 警 告 , 或 向数 据 库 管 理 员 发 送 e-mail 。图 15.6 所 示 为 New Job Step 屏 幕 画 面 。注 意 New Job Properties 窗 口 中 的 标 签 标 明 了 Schedules 和 Notifications 。 单 击 这 些 标 签可 输 出 管 理 作 业 的 方 案 , 设 置 作 业 失 败 或 成 功 事 件 的 注 意 事 项 。
图 15.6 用于事务日志备份的 New Job Properties 窗口
如 果 每 半 小 时 备 份 一 次 记 录 , 并 且 在 时 间 间 隔 备 份 失 败 , Microsoft SQL Server 7 允 许 用 户 使 用 RESTORELOG STOPAT= “ Mar 7 , 1998 12:00AM ” 变 量 ,
在 任 意 指 定 时 间 只 能 恢 复 在 备 份 失 败 前 的 部 分 事 务 日 志 。 如 果 恢 复 的 日 志 文 件多 于 一 个 ,除 了 最 后 一 个 日 志 文 件 外 ,必 须 使 用 RESTORE 语 句 的 WIHT NORECOVERY 变 量 , 对 最 后 一 个 日 志 文 件 必 须 使 用 WIHT RECOVERY 变 量 。 最 后 , 必 须 删 除 所有 数 据 库 用 户 以 恢 复 数 据 库 , 并 与 Sysadmin(SA) 联 系 。
使 用 存 储 过 程 的 sp_addumpdevice 系 统 可 添 加 数 据 库 备 份 设 备 , 或 使 用Enterprise Manager 扩 充 服 务 器 ,并 在 Enterprise Manager 分 层 树 中 右 击 Backup Devices 。 如 果 没 有 使 用 设 备 备 份 了 数 据 库 或 记 录 文 件 , 并 采 用 了 磁 盘 文 件 或 磁带 文 件 , 就 必 须 使 用 'FROM DISK=' 或 'FROM TAPE=' 语 法 指 明 恢 复 数 据 的 位 置 。关 于 BACKUP 和 RESTORE 语 句 的 完 整 和 详 细 语 法 , 请 参 阅 第 21 章 。
要 备 份 事 务 日 志 , 可 使 用 以 下 语 法 :
BACKUP LOG database_name TO LOG_device1
WITH INIT
用 完 整 数 据 库 备 份 和 事 务 日 志 进 行 恢 复 时 , 所 用 的 语 法 取 决 于 是 只 恢 复 一个 事 务 日 志 , 还 是 恢 复 多 个 事 务 日 志 。
如 果 只 恢 复 一 个 事 务 日 志 , 首 先 应 使 用 完 整 数 据 库 RESTORE 语 法 :
RESTORE DATABASE database_name FROM database_device1
然 后 只 对 一 个 事 务 日 志 使 用 事 务 日 志 RESTORE 语 法 :
RESTORE LOG database_name FROM log_device1
WITH RECOVERY
要 恢 复 多 个 事 务 日 志 , 必 须 首 先 进 行 完 整 数 据 库 恢 复 ( 如 前 例 ) , 然 后 再 使用 以 下 语 法 恢 复 第 一 个 事 务 日 志 :
RESTORE LOG database_name FROM log_device1
WITH NORECOVERY
然 后 再 使 用 以 下 语 法 恢 复 第 二 个 事 务 日 志 :
RESTORE LOG database_name FROM log_device2
WITH RECOVERY
就 会 明 白 , 在 多 个 事 务 日 志 的 情 况 下 对 第 一 个 文 件 使 用 WIHT NORESCOVERY , 但 要 恢 复 最 后 一 个 事 务 日 志 , 应 使 用 WIHT RECOVERY 。
对 于 使 用 事 务 备 份 要 权 衡 利 憋 。 在 失 败 时 能 够 将 其 恢 复 , 但 更 要 涉 及 到BACKUP 和 RESTORE 程 序 。 记 住 , 作 为 维 护 作 业 步 骤 的 组 成 部 分 , 每 次 进 行 完 整数 据 库 备 份 后 , 必 须 从 操 作 系 统 中 清 除 并 移 去 事 务 日 志 文 件 , 因 为 此 时 SQL Server 不 能 自 动 删 除 它 们 。 关 于 BACKUP 和 RESTORE 语 句 的 完 整 和 详 细 语 法 , 请 参 阅 第 25 章 。
使 用 多 个 备 份 设 备 进 行 备 份
如 果 数 据 库 非 常 大 , 如 果 通 过 网 络 复 制 备 份 文 件 , 或 如 果 想 加 快 BACKUP 和RESTORE 的 操 作 速 度 , 可 以 考 虑 使 用 多 台 备 份 设 备 进 行 多 卷 备 份 ( 拆 分 备 份 ) 。
这 样 可 充 分 利 用 SQL Server 的 能 力 通 过 IO 并 行 备 份 到 多 台 设 备 上 , 并 可 减 少数 据 库 备 份 或 恢 复 所 占 用 的 时 间 。 如 果 使 用 磁 带 介 质 并 使 用 多 台 备 份 设 备 , 应事 先 安 装 多 个 磁 带 驱 动 器 。 使 用 存 储 过 程 的 sp_addumpdevice 系 统 , 可 添 加 数据 库 备 份 设 备 , 或 使 用 Enterprise Manager 扩 充 服 务 器 , 并 在 Enterprise Manager 分 层 树 中 右 击 Backup Device 。
向 多 台 设 备 备 份 数 据 库 的 语 法 是 :
BACKUP DATABASE database_name
TO database_device1, database_device2, database_device3 ,... 从 多 台 设 备 恢 复 (RESTORE) 数 据 库 的 语 法 是 : RESTORE DATABASE database_name
FROM database_device1, database_device2, database_device3 ,...
BACKUP 和 RESTORE 语 句 的 完 整 和 详 细 语 法 , 请 参 阅 第 25 章 。
备 份 单 个 数 据 库 文 件 或 文 件 组
如 果 要 完 整 备 份 数 据 库 , 可 以 恢 复 单 个 文 件 和 文 件 组 , 不 只 是 可 以 备 份 单个 文 件 或 文 件 组 。 这 表 明 , 如 果 数 据 库 的 已 知 部 分 丢 失 , 并 知 道 其 上 保 留 的 文件 或 文 件 组 , 可 以 只 恢 复 单 个 文 件 或 文 件 组 , 不 恢 复 整 个 数 据 库 。 在 多 文 件 数据 库 遇 到 磁 盘 发 生 故 障 时 , 对 特 大 型 数 据 库 (VLDBs) 非 常 有 用 。 在 恢 复 文 件 后 要保 持 与 数 据 库 其 余 部 分 的 一 致 性 , 在 最 后 一 次 完 整 备 份 开 始 时 , 必 须 恢 复 事 务日 志 。 如 果 使 用 这 一 技 术 , 并 且 数 据 已 经 被 修 改 , 就 必 须 备 份 事 务 日 志 并 恢 复 ,
以 使 数 据 库 保 持 一 致 状 态 。 这 一 技 术 不 能 用 于 增 量 备 份 。
当 数 据 库 非 常 大 , 而 备 份 窗 口 又 很 小 时 , 可 采 用 这 些 类 型 的 恢 复 技 术 。 使用 单 个 文 件 和 文 件 组 备 份 , 一 夜 可 备 份 一 半 文 件 , 再 一 夜 备 份 另 一 半 文 件 。 如果 选 择 使 用 这 种 方 法 进 行 备 份 , 还 必 须 维 持 事 务 日 志 备 份 , 以 便 使 恢 复 的 文 件或 文 件 组 与 数 据 库 的 其 余 部 分 具 有 相 同 的 功 能 。
如 果 一 个 表 格 横 跨 多 个 文 件 或 文 件 组 , SQL Server 不 能 恢 复 只 包 含 部 分 表格 的 文 件 组 。 另 外 , 如 果 一 个 索 引 也 横 跨 多 个 文 件 或 文 件 组 , 必 须 同 时 恢 复 包含 该 索 引 的 所 有 文 件 和 文 件 组 。
如 果 通 过 数 据 库 处 理 文 件 和 文 件 组 , 可 考 虑 用 文 件 和 文 件 组 的 备 份 和 恢 复规 则 设 计 数 据 库 的 物 理 文 件 结 构 。
要 备 份 单 个 文 件 或 文 件 组 , 可 使 用 以 下 语 法 :
BACKUP DATABASE database_name file_or_filegroup , ...
TO backup_ file , ... WITH INIT
要 恢 复 单 个 文 件 或 文 件 组 , 可 使 用 以 下 语 法 :
RESTORE DATABASE database_name file_or_filegroup , ...
FROM backup_file , ...
保 持 数 据 库 的 一 致 性 状 态 , 还 必 须 从 最 后 的 数 据 库 或 文 件 / 文 件 组 备 份 恢复 事 务 日 志 文 件 , 也 可 以 从 完 整 数 据 库 备 份 恢 复 单 个 文 件 或 文 件 组 , 不 必 总 是处 理 单 个 文 件 或 文 件 组 。 关 于 BACKUP 和 RESTORE 语 句 的 完 整 详 细 的 语 法 , 请 参
阅 第 21 章 。
备 份 / 恢 复 磁 带 重 启 动 能 力
BACKUP 和 RESTORE 语 句 的 RESTART 变 量 可 提 供 重 启 动 BACKUP 和 RESTORE 操
作 的 能 力 , 只 要 该 能 力 不 被 损 坏 。 这 种 技 术 包 括 重 复 使 用 相 同 的 BACKUP 或RESTORE 语 句 , 添 加 RESTART 变 量 。 然 而 , 这 种 技 术 有 些 重 要 的 缺 陷 : 它 只 能用 于 磁 带 介 质 的 备 份 , 以 及 横 跨 多 卷 磁 带 的 备 份 。 如 果 在 磁 带 备 份 或 恢 复 的 中途 出 现 意 外 情 况 , 这 个 变 量 可 节 省 时 间 , 必 要 时 可 重 新 启 动 。
备 用 服 务 器
备 用 服 务 器 是 卸 防 数 据 丢 失 的 另 一 种 描 述 。 它 是 完 全 不 同 的 一 套 硬 件 , 具有 与 主 服 务 器 严 格 一 致 的 配 置 , 最 初 通 过 恢 复 完 整 数 据 库 备 份 保 持 运 行 , 然 后在 事 先 制 订 的 周 期 基 础 上 恢 复 事 务 日 志 ,以 与 主 服 务 器 保 持 同 步 ( 这 是 Microsoft SQL Server Agent 的 另 一 项 任 务 ) 。 在 事 务 日 志 未 运 行 时 , 可 使 用 服 务 器 支 持特 定 的 查 询 , 或 运 行 DBCC 检 查 。
在 发 生 失 败 时 , 恢 复 和 让 用 户 访 问 数 据 所 占 用 的 时 间 将 会 显 著 增 加 , 尤 其是 对 于 大 型 数 据 库 更 是 如 此 。 此 时 必 须 采 用 某 些 机 制 用 自 编 的 应 用 程 序 代 码 切换 到 备 用 服 务 器 ,因 为 服 务 器 名 和 IP 地 址 都 不 相 同 。Microsoft Cluster Server
使 用 SQL Server 为 这 种 失 败 提 供 支 持 。
如 果 正 在 使 用 备 用 服 务 器 , 可 使 用 BACKUP LOG 语 句 的 WITH NOTRUNCATE 变量 保 存 完 整 的 日 志 , 这 样 可 允 许 恢 复 到 失 败 前 的 时 刻 。 将 此 事 务 日 志 恢 复 到 服务 器 , 但 应 知 道 任 何 事 务 在 排 除 失 败 时 都 会 涉 及 到 。 当 主 服 务 器 可 用 时 , 必 须把 数 据 库 恢 复 到 主 服 务 器 上 。
记 住 , 事 务 日 志 备 份 得 越 频 繁 , 把 事 务 恢 复 到 备 用 服 务 器 所 用 的 时 间 就 越少 。 可 使 用 RESTORE 语 句 的 NORECOVERY 变 量 恢 复 数 据 库 , 使 用 RESTORE 语 句 的STANDBY 选 项 可 把 每 个 事 务 日 志 恢 复 到 备 用 服 务 器 , 使 用 RECOVERY 选 项 恢 复 来自 主 服 务 器 的 最 终 事 务 记 录 。 RESTORE 语 句 的 NORECOVERY 和 STANDBY 选 项 的 功能 是 不 用 检 验 点 , 所 以 没 必 要 在 备 用 服 务 器 上 的 数 据 库 中 设 置 no chkpt.on recovery 数 据 库 点 。
在 本 章 中 , 介 绍 了 数 据 库 预 防 性 维 护 和 数 据 保 护 的 概 念 。 Microsoft SQL Server Agent 和 Enterprise Manager 可 用 来 以 自 动 的 、 调 度 的 方 式 执 行 数 据库 维 护 任 务 。 充 分 利 用 Maintenance Plan 的 新 功 能 和 新 的 作 业 步 骤 以 及 SQL Server Agent 的 调 度 功 能 , 可 节 省 时 间 。
第 16 章 链 接 服 务 器 和 远 程 服 务 器
链 接 服 务 器 和 远 程 服 务 器 二 者 都 使 用 Microsoft 分 布 式 协 调 器 (Microsoft Distributed Transaction Coordinator , MS DTC) , 只 是 所 用 的 方 法 不 同 而 已 。如 果 支 持 OLE DB 分 布 式 事 务 接 口 , 链 接 服 务 器 就 使 用 OLE DB 提 供 者 和 数 据 源 , 反 之 就 调 用 远 程 服 务 器 上 的 存 储 过 程 , 该 远 程 服 务 器 使 用 ODBC CALL 消 除 顺 序或 Transact-SQL EXECUTE 语 法 。 在 远 程 服 务 器 的 两 种 机 理 中 , 因 为 速 度 更 快 , 从 而 更 喜 欢 使 用 ODBC CALL 消 除 顺 序 。
本 章 将 讨 论 Microsoft Distributed Transaction Coordinator , 包 括 通 过使 用 分 布 式 事 务 和 两 阶 段 提 交 , 如 何 执 行 向 链 接 服 务 器 和 远 程 服 务 器 的 升 级 。
- M icrosoft 分 布 式 事 务 协 调 器
Microsoft 分 布 式 事 务 协 调 器 (MS DTC) 是 Microsoft SQL Server 在 安 装 时增 加 到 Control Panel 的 一 个 服 务 项 目 , 它 可 以 在 跨 越 基 于 Microsoft Windows 的 网 络 系 统 中 协 调 服 务 , 并 可 升 级 多 个 SQL Server 或 OLE DB 数 据 源 上 的 数 据 。
MS DTC 的 优 点 是 , 在 事 务 包 含 来 自 不 同 SQL Server 或 OLE DB 数 据 源 ( 如 果
支 持 OLE DB 分 布 式 事 务 接 口 ) 的 许 多 数 据 源 时 , 它 可 以 保 证 事 务 的 完 整 性 。 另外 , 在 远 程 SQL Server 上 还 可 以 调 用 存 储 过 程 。 这 项 服 务 可 以 保 证 包 含 的 所 有数 据 源 都 能 得 到 修 改 , 或 保 证 如 果 发 生 错 误 或 整 个 事 务 的 整 体 行 不 完 整 , 其 中的 任 何 一 个 数 据 源 都 不 能 修 改 。
修 改 通 过 网 络 连 接 的 不 同 的 数 据 源 意 味 着 任 何 事 情 都 可 能 出 错 。 网 络 可 能关 闭 、 计 算 机 也 可 能 关 机 、 数 据 库 或 应 用 程 序 都 可 能 发 生 错 误 等 。 如 果 出 现 这些 情 况 , 应 用 程 序 必 须 能 够 保 持 事 务 完 好 的 整 体 性 。 应 用 程 序 编 程 人 员 可 能 不想 只 为 修 改 一 个 数 据 源 而 动 用 资 金 , 并 不 因 为 一 次 失 败 就 修 改 到 另 一 个 数 据 源 。程 序 员 不 仅 必 须 回 答 会 计 师 和 产 品 经 理 提 出 的 问 题 , 而 且 还 要 证 明 利 用 程 序 本身 从 数 据 整 体 性 的 丢 失 进 行 恢 复 是 非 常 困 难 的 。
如 果 编 写 应 用 程 序 采 用 Transact-SQL 、C 或 C + + ,使 用 DB-Library 或 ODBC ,
并 需 要 在 不 同 的 数 据 源 上 的 一 个 事 务 中 修 改 数 据 , MS DTC 可 以 使 事 情 得 到 简 化 。Visual Basic 应 用 程 序 也 通 过 调 用 Transact-SQL 存 储 过 程 , 使 用 MS DTC , Transact-SQL 存 储 过 程 的 目 的 就 是 针 对 MS DTC 接 口 技 术 的 。
Transact-SQL 应 用 程 序 可 以 使 用 Transact-SQL BEGIN DISTRIBUTED TRANSACTION 语 句 , 或 可 以 使 SQL Server 自 动 控 制 MS DTC 事 务 。 如 果 可 以 调用 其 他 某 些 SQL Server 上 的 远 程 存 储 过 程 , SQL Server 和 MS DTC 可 以 一 起 工作 , 自 动 协 调 引 用 在 该 事 务 中 连 续 调 用 存 储 过 程 的 所 有 远 程 服 务 器 的 参 与 。
如 果 一 个 远 程 存 储 过 程 调 用 了 其 他 远 程 存 储 过 程 , 所 有 引 用 的 SQL Server 可 自 动 落 在 分 布 式 事 务 的 保 护 之 中 。 不 论 远 程 存 储 过 程 是 否 使 用 Transact-SQL BEGIN DISTRIBUTED TRANSACTION 语 句 , 这 种 情 况 都 将 会 发 生 。 如 果 发 生 错 误 ,
并 且 不 能 实 现 连 续 调 用 SQL Server , 在 所 有 参 与 的 SQL Server 上 整 个 事 务 都将 重 新 运 行 。
即 使 SQL Server 和 MS DTC 可 以 自 动 协 调 用 Transact-SQL 编 写 的 应 用 程 序的 分 布 式 事 务 , Transact-SQL 编 程 语 言 也 不 能 直 接 访 问 MS DTC 事 务 对 象 。
对 于 对 DTC 事 务 对 象 的 高 级 控 制 , 应 用 程 序 需 要 使 用 C 或 C + + , 以 便 可 以选 择 事 务 协 调 程 序 , 事 务 选 项 对 象 可 以 设 置 事 务 的 超 时 值 , 可 以 给 出 对 事 务 的描 述 。 另 外 , 通 过 使 用 异 步 Commit 或 Abort 调 用 , 使 用 C 或 C + + 允 许 应 用 程序 避 免 阻 碍 调 用 线 程 。
在 NT Start Menu 上 的 Microsoft SQL Server 程 序 组 内 部 提 供 了 MS DTC
Administrative Console , 或 在 作 为 图 形 用 户 界 面 的 Enterprise Manager 中 可以 调 用 它 。 该 控 制 台 允 许 观 察 分 布 式 事 务 的 统 计 结 果 以 及 它 的 状 态 , 控 制 台 提供 了 停 止 和 启 动 这 项 服 务 的 能 力 。 用 户 可 以 观 察 当 前 正 在 运 行 的 所 有 事 务 、 停止 活 动 的 事 务 或 强 迫 事 务 提 交 或 重 新 运 行 。 甚 至 可 以 将 事 务 从 协 调 MS DTC 服 务器 的 事 务 日 志 中 删 除 。 MS DTC Administrative Console 的 面 板 如 图 16.1 所 示 。
图 16.1MS DTC Administrative Console
MS DTC Administrative Console 中的 Trace 面 板 显 示 事 件 记 录 和 跟 踪 信 息 , 并 具 有 通 过 严 重 等 级 过 滤 的 能 力 。
MS DTC Statistics 面 板 显 示 活 动 事 务 的 当 前 数 量 、 并 行 事 务 的 最 大 数 量 、已 提 交 、 终 止 、 可 疑 的 数 量 , 以 及 已 从 管 理 上 解 决 的 事 务 。 另 外 , MS DTC Administrative Console 面 板 上 还 显 示 在 MS DTC 已 处 理 事 务 的 总 数 、 事 务 响应 时 间 和 对 话 开 始 的 日 期 和 时 间 。
MS DTC Advanced 配 置 面 板 允 许 用 户 改 变 MS DTC 的 刷 新 频 率 和 检 查 点 以 及刷 新 计 时 器 。 它 还 允 许 用 户 指 定 显 示 的 规 定 时 间 的 事 务 和 MS DTC 记 录 文 件 的 位置 。
在 下 一 节 中 , 将 介 绍 Microsoft Distributed Transaction Coordinator 是 如 何 管 理 两 阶 段 提 交 的 。
- 两 阶 段 提 交
两 阶 段 提 交 是 一 个 协 议 , 当 事 务 中 包 含 的 数 据 源 多 于 一 个 时 , 它 可 以 产 生事 务 的 细 节 和 持 续 性 。 假 设 可 以 响 应 指 导 在 网 络 上 安 装 其 他 MS DTC , 用 其 本 地SQL Server 引 导 两 阶 段 提 交 协 议 , 则 可 通 过 用 一 次 MS DTC 安 装 的 每 次 MS DTC 安 装 对 两 阶 段 提 交 进 行 协 调 。
提 交 协 调 程 序 或 上 一 级 节 点 调 用 主 MS DTC 安 装 , 它 负 责 保 证 事 务 在 包 含 的所 有 服 务 器 上 提 交 或 终 止 , 并 通 知 应 用 程 序 该 事 务 已 经 提 交 或 需 重 新 运 行 。 提交 协 调 程 序 总 是 把 MS DTC 安 装 在 该 事 务 发 源 的 位 置 。
在 客 户 计 算 机 上 安 装 了 MS DTC 实 用 程 序 后 , 通 过 应 用 程 序 可 以 选 择 提 交 协
调 程 序 。 如 果 该 事 务 不 是 发 源 于 客 户 机 , 该 应 用 程 序 将 不 选 择 提 交 协 调 程 序 , 并 且 缺 省 的 提 交 协 调 程 序 将 是 在 客 户 计 算 机 的 本 地 系 统 注 册 表 中 引 用 的 提 交 协调 程 序 。 然 后 从 NT Control Panel 上 选 择 MS DTC 对 MS DTC 进 行 配 置 , 并 为 客户 机 选 择 缺 省 的 提 交 协 调 程 序 。
DB-Library 两 阶 段 提 交 功 能
DB-Library 两 阶 段 提 交 功 能 只 能 用 于 SQL Server 6.5 和 更 早 版 本 开 发 的 应用 程 序 。 向 Microsoft SQL Server 7 的 迁 移 应 该 包 括 计 划 使 用 Microsoft 分 布式 协 调 器 (MS DTC) , 不 要 使 用 DB-Lib 两 阶 段 提 交 功 能 。
在 下 一 节 中 , 将 介 绍 在 远 程 存 储 过 程 内 , MS DTC 在 Subscribing 和Publishing SQL Server 之 间 如 何 管 理 两 阶 段 提 交 。
MS DTC 、 复 制 和 更 新 Subscriber
Microsoft 分 布 式 事 务 协 调 器 (MS DTC) 在 SQL Server 远 程 存 储 过 程 调 用 内部 , 在 Subscriber 和 Publisher 之 间 使 用 Transact-SQL BEGIN DISTRIBUTED TRANSACTION 语 句 来 管 理 两 阶 段 提 交 。 无 论 BEGIN DISTRIBUTED TRANSACTION
语 句 是 否 在 远 程 存 储 过 程 中 直 接 编 程 , 使 用 SQL Server 远 程 过 程 , 都 可 自 动 支持 SQL Server 和 MS DTC 提 交 或 重 新 运 行 所 有 引 用 SQL Server 上 事 务 的 能 力 。
更 新 Subscriber 和 Publisher 的 冲 突 检 测
在 从 Subscribers 提 交 的 事 务 中 , 对 Publisher 的 冲 突 检 测 可 使 用 两 种 方
法 :
-
时 间 戳 冲 突 检 测
-
行 比 较 冲 突 检 测
在 已 发 布 表 中 有 一 栏 带 有 时 间 戳 日 期 类 型 时 , 可 使 用 时 间 戳 进 行 冲 突 检 测 。
Subscriber 把 时 间 戳 传 递 到 Publisher , 将 其 值 与 该 行 的 Publisher 上 的 当 前时 间 戳 进 行 比 较 。 如 果 这 些 值 相 同 , 就 意 味 着 Publisher 上 的 行 在 复 制 到Subscriber 后 没 有 变 化 , 该 事 务 可 以 提 交 。
当 已 发 布 表 中 没 有 时 间 戳 栏 时 , 可 使 用 行 比 较 冲 突 检 测 。 该 行 中 所 有Publisher 栏 的 值 都 与 更 新 的 Subscriber 进 行 比 较 。
对 时 间 戳 冲 突 检 测 的 回 环 检 测
事 务 一 旦 从 更 新 的 Subscriber 在 Publisher 上 进 行 提 交 , 就 没 有 必 要 使 用复 制 法 把 变 化 发 送 到 Subscriber。 只 有 当 该 列 中 有 时 间 戳 时 , SQL Server 才 使用 回 环 检 测 。 如 果 希 望 充 分 利 用 这 一 功 效 , 可 把 时 间 戳 栏 添 加 到 表 格 中 。
- 分 布 式 事 务
要 启 动 分 布 式 事 务 , 可 使 用 BEGIN DISTRIBUTED TRANSACTION 语 句 。 要 求远 程 服 务 器 的 链 接 服 务 器 或 远 程 服 务 器 的 分 布 式 查 询 将 由 提 交 协 调 程 序 发 布 。这 种 控 制 服 务 器 可 自 动 调 用 MS DTC , 以 便 在 分 布 式 事 务 中 支 持 链 接 服 务 器 和 远程 服 务 器 。 当 发 出 COMMIT 或 ROLLBACK 语 句 时 , 提 交 协 调 程 序 , 也 称 为 控 制 SQL Server 将 调 用 MS DTC , 通 过 提 交 或 重 新 运 行 来 管 理 两 阶 段 提 交 处 理 。
如 果 对 链 接 服 务 器 的 分 布 式 查 询 在 本 地 事 务 内 发 出 , 并 且 支 持 OLE DB 分 布式 事 务 接 口 , 则 该 事 务 自 动 变 成 分 布 式 事 务 。 如 果 数 据 源 不 支 持 OLE DB 分 布 式事 务 接 口 , 则 只 有 SELECT 只 读 语 句 才 是 有 效 的 。 使 用 Transact-SQL COMMIT TRANSACTION 、 COMMIT WORK、 ROLLBACK TRANSACTION 或 ROLLBACK WORK 语 句 ,
可 以 完 成 分 布 式 事 务 的 自 动 调 用 , 以 管 理 该 事 务 。
对 话 级 REMOTE_PROC_TRANSACTIONS 选 项
REMOTE_PROC_TRANSACTIONS 选 项 可 以 通 过 使 用 Transact-SQL 语 句 打 开 或 关闭 。 当 这 种 对 话 级 的 选 项 为 OFF 时 , 对 远 程 存 储 过 程 调 用 或 链 接 服 务 器 分 布 式查 询 不 会 自 动 用 本 地 事 务 发 起 MS DTC 事 务 。 设 置 这 种 对 话 级 选 项 的 Transact-
SQL 语 法 为 :
set remote_proc_transactions { O N |OFF }
如 果 REMOTE_PROC_TRANSACTIONS 设 置 为 OFF , 若 本 地 事 务 已 经 重 新 运 行 , 用 本 地 事 务 发 出 的 远 程 存 储 过 程 调 用 就 不 能 重 新 运 行 。 当 在 远 程 服 务 器 上 的 执行 过 程 已 经 结 束 了 远 程 存 储 过 程 时 , 就 提 交 远 程 服 务 器 的 变 化 。
REMOTE PROC TRANS 服 务 器 配 置 参 数
REMOTE PROC TRANS 是 通 过 使 用 sp_configure 语 句 控 制 的 服 务 器 配 置 。 该服 务 器 配 置 参 数 可 设 置 为 上 一 节 介 绍 的 REMOTE_PROC_TRANSACTIONS 对 话 级 选 项的 缺 省 设 置 。
REMOTE PROC TRANS 与 其 中 所 进 行 的 对 话 级 选 项 是 非 常 相 同 的 , 但 是 它 能 使隐 含 的 MS DTC 事 务 对 整 个 SQL Server 系 统 有 效 或 无 效 , 不 只 是 一 次 对 话 。 下面 的 语 法 表 示 如 何 配 置 SQL Server REMOTE PROC TRANS 服 务 器 的 配 置 参 数 :
sp_configure ′ remote proc trans′ , 1 reconfigure with override
用 REMOTE PROC TRANS 服 务 器 配 置 参 数 时 ,1 表 示 ON ,0 表 示 OFF 。如 果 REMOTE
PROC TRANS 设 置 为 OFF , 若 本 地 事 务 已 经 重 新 运 行 , 用 本 地 事 务 发 出 的 远 程 存储 过 程 调 用 就 不 能 重 新 运 行 。 当 在 远 程 服 务 器 上 的 执 行 过 程 已 经 结 束 了 远 程 存储 过 程 时 , 就 提 交 对 远 程 服 务 器 的 变 化 。
MS DTC 和 COM
MS DTC 是 COM 体 系 结 构 的 组 成 部 分 , 而 事 务 则 是 分 布 式 应 用 程 序 的 必 要 组成 部 分 。 事 务 的 概 念 是 用 这 样 的 方 法 与 COM 结 合 的 , 即 自 动 进 行 安 装 、 管 理 和使 用 。 OLE 事 务 接 口 可 通 过 使 用 MS DTC 来 执 行 。 通 过 增 加 资 源 管 理 器 , 而 不 是其 他 SQL Server , 可 以 预 计 未 来 的 MS DTC 的 功 能 性 和 应 用 范 围 将 不 断 增 长 。
- 链 接 服 务 器
链 接 服 务 器 是 由 SQL Server 存 储 过 程 sp_addlinkedserver 定 义 的 虚 拟 服务 器 , 用 它 可 为 执 行 分 布 式 的 不 同 查 询 , 针 对 OLE DB 数 据 源 创 建 链 接 服 务 器 。增 加 链 接 服 务 器 之 后 , 在 Transact-SQL 语 句 中 可 使 用 参 考linked_server_name.catalog.schema.object_name , 以 便 参 考 链 接 服 务 器 中 的数 据 对 象 。
linked_server 是 容 纳 数 据 对 象 的 链 接 服 务 器 的 名 称 , catalog 是 数 据 对 象 的 目录 名 称 , schema 是 数 据 对 象 的 结 构 名 称 , 而 object_name 是 数 据 对 象 的 名 称 。这 些 名 称 联 合 起 来 可 识 别 特 定 的 数 据 对 象 。
使 用 下 列 系 统 存 储 过 程 在 链 接 服 务 器 上 返 回 元 数 据 :
sp_linkedserverssp_primarykeys
sp_catalogssp_indexes sp_column_privilegessp_table_privileges sp_columns_exsp_tables_ex sp_foreignkeys
关 于 系 统 存 储 过 程 的 详 细 信 息 , 请 参 阅 第 26 章 。
当 前 的 SQL Server 登 录 时 , Microsoft SQL Server 使 用 映 射 变 换 连 接 到 系统 存 储 过 程 。 当 前 SQL Server 登 录 对 远 程 SQL Server 登 录 映 射 , 类 似 于 Remote Procedure Call (RPC) 映 射 , 只 是 使 用 的 语 法 不 同 。 同 时 , 使 用 链 接 服 务 器 和分 布 式 查 询 , 可 在 源 服 务 器 上 完 成 映 射 , 在 处 于 RPC 映 射 的 情 况 下 不 接 受 服 务器 。
系 统 存 储 过 程 sp_droplinkedsrvlogin 和 sp_addlinkedsrvlogin 可 直 接 创建 映 射 , 并 可 创 建 许 可 所 有 用 户 都 映 射 到 链 接 服 务 器 上 的 相 应 用 户 登 录 的 缺 省映 射 。 当 使 用 系 统 存 储 过 程 sp_addlinkedserver 增 加 链 接 服 务 器 时 , 可 以 创 建上 述 映 射 。 第 23 章 详 细 介 绍 了 关 于 sp_addlinkedserver 等 系 统 存 储 过 程 的 信息 。
- 如 何 定 义 远 程 服 务 器
为 简 化 某 个 组 织 内 各 SQL Server 之 间 的 连 接 , SQL Server 可 增 加 远 程 服 务器 。 这 样 , SQL Server 可 以 从 其 他 SQL Server 验 证 连 接 端 。 网 络 中 每 个 单 个
的 SQL Server 通 过 列 出 SQL Server ,都 可 以 控 制 对 它 的 访 问 ,在 它 的 sysservers 系 统 表 中 可 接 受 连 接 。
使 用 下 列 语 法 可 以 定 义 远 程 服 务 器 。 该 语 法 也 可 以 用 于 定 义 本 地 服 务 器 的名 称 。
sp_addserver ′ remote_server_name′
该 存 储 过 程 在 远 程 服 务 器 上 执 行 , 并 把 该 远 程 服 务 器 增 加 到 master 系 统 数据 库 中 的 sysservers 系 统 表 中 。
调 用 远 程 存 储 过 程
调 用 远 程 存 储 过 程 的 原 理 是 由 ODBC CALL 消 除 顺 序 和 Transact-SQL EXECUTE 语 句 组 成 的 。 ODBC CALL 消 除 顺 序 是 最 佳 的 执 行 机 制 。
使 用 ODBC CALL 意 味 着 使 用 应 用 程 序 可 检 索 存 储 过 程 的 返 回 代 码 。SQL Server
ODBC 驱 动 程 序 使 用 经 优 化 的 协 议 , 在 SQL Server 之 间 发 送 远 程 过 程 调 用 , 省去 了 许 多 处 理 和 语 法 分 析 过 程 , 提 高 了 运 行 性 能 。
远 程 配 置 选 项
要 用 Enterprise Manager 查 看 和 设 置 远 程 服 务 器 配 置 选 项 , 可 右 击 服 务 器 , 选 择 Properties , 然 后 再 选 择 Connections 面 板 , 如 图 16.2 所 示 。 通 过 配 置 ,
可 以 改 变 通 过 RPC 远 程 连 接 的 其 他 SQL Server 以 及 在 从 查 询 返 回 前 等 待 的 时 间秒 数 。 缺 省 等 待 时 间 为 0 秒 , 表 示 在 SQL Server 重 新 启 动 前 一 直 处 于 等 待 状 态 。在 此 之 前 可 以 终 止 运 行 。
图 16.2 远程配置选项
用 户 也 可 以 改 变 设 置 , 强 迫 分 布 式 事 务 用 于 Microsoft Transaction Server(MTS) , 并 设 置 并 行 运 行 的 最 大 用 户 。 最 大 用 户 数 是 介 于 0 到 256 之 间 的一 个 数 值 , 缺 省 设 置 为 10 , 用 它 可 以 确 定 许 可 的 并 行 连 接 的 远 程 服 务 器 的 最 大数 量 。 在 设 置 远 程 服 务 器 最 大 数 值 之 前 , 在 SQL Server 上 必 须 许 可 远 程 服 务 器的 连 接 。 改 变 这 些 配 置 选 项 需 要 停 止 和 启 动 SQL Server 。
必 须 在 两 个 服 务 器 上 都 改 变 配 置 选 项 , 以 使 设 置 生 效 。
- 使 用 远 程 登 录 访 问 远 程 服 务 器
要 使 用 远 程 登 录 访 问 远 程 服 务 器 , 必 须 把 直 接 映 射 设 置 成 SQL Server 记 录的 专 用 用 户 ID 和 密 码 。 然 而 , 要 映 射 所 有 用 户 是 非 常 容 易 的 , 仅 通 过 使 用 系 统存 储 过 程 的 remoteserver 语句 sp_addremotelogin 即 可 完 成 。
使 用 下 面 的 语 法 可 直 接 添 加 远 程 记 录 :
sp_addremotelogin { ′ remoteserver′ } [ , ′ login ′ [ , ′ remote_nam e′ ]]
使 用 这 些 参 数 如 何 确 定 登 录 映 射 的 范 围 呢 ? 只 使 用 remoteserver 参 数 表示 , 远 程 服 务 器 上 的 所 有 用 户 都 被 映 射 到 本 地 服 务 器 上 已 有 的 同 名 登 录 上 。 本地 登 录 与 远 程 服 务 器 上 的 登 录 相 对 应 。
如 果 已 知 remoteserver 和 登 录 参 数 , 远 程 服 务 器 上 的 所 有 用 户 都 被 映 射 到给 定 的 本 地 登 录 上 。 当 远 程 服 务 器 上 的 用 户 连 接 本 地 SQL Server 时 , 它 们 按 给定 的 登 录 进 行 连 接 。
如 果 除 了 其 他 两 个 参 数 外 还 给 定 远 程 服 务 器 参 数 , 那 么 只 有 在 远 程 服 务 器参 数 中 已 注 册 的 用 户 才 能 映 射 到 本 地 服 务 器 上 的 给 定 登 录 中 。 当 远 程 服 务 器 上的 远 程 名 称 连 接 到 本 地 SQL Server 时 , 它 们 才 能 按 给 定 的 登 录 进 行 连 接 。
远 程 登 录 的 缺 省 状 态 是 NT Authentication( 受 托 安 全 ) 。 如 果 不 想 进 行 密 码检 查 , 可 使 用 sp_remoteoption 系 统 存 储 过 程 改 变 密 码 的 状 态 。 关 于 系 统 存 储过 程 sp_remoteoption 的 详 细 内 容 , 以 及 如 何 使 用 , 可 参 阅 第 23 章 中 的sp_remoteoption 系 统 存 储 过 程 。
总 之 , 向 远 程 服 务 器 增 加 系 统 管 理 员 (SA) 连 接 的 步 骤 如 下 : 在 调 用 Server1 的 本 地 服 务 器 上 执 行 以 下 程 序 :
sp_addlinked server server2 G O
在 调 用 Server2 的 远 程 服 务 器 上 执 行 以 下 程 序 :
sp_addlinked server Server1 G O
sp_add remotelogin Server1, sa, sa G O
sp_serveroption Server1, ′ data access ′ , TRUE
G O
注 意 : 在 用 7 以 前 的 版 本 增 加 服 务 器 时 , 可 使 用 sp_addserver 和
sp_configure ′ remote access ′。
使 用 下 列 语 法 可 避 开 输 入 密 码 :
sp_serveroption Server1, sa, sa, trusted, TRUE
在 本 章 中 , 介 绍 了 链 接 服 务 器 和 远 程 服 务 器 , 以 及 它 们 使 用 Microsoft Distributed Transaction Coordinator (MS DTC) 执 行 两 阶 段 提 交 的 方 法 。 在下 一 章 , 将 介 绍 SQL Server Profiler , 研 究 查 找 并 修 复 性 能 问 题 的 方 法 。
第 17 章 监 测 服 务 器 性 能 的 工 具
监 测 Microsoft SQL Server 对 于 确 保 避 免 出 现 性 能 瓶 颈 是 非 常 重 要 的 。 可能 出 现 问 题 的 三 个 关 键 方 面 是 性 能 、 处 理 量 和 一 致 性 。 如 果 用 户 的 硬 件 设 备 配置 不 正 确 或 申 请 错 误 , 查 询 速 度 就 会 降 低 , 每 秒 钟 执 行 的 事 务 数 也 达 不 到 期 望的 数 值 , 而 且 所 有 共 享 用 户 将 会 造 成 锁 定 和 性 能 降 低 。 如 果 在 以 上 三 个 关 键 方面 中 任 一 方 面 遇 到 问 题 , 均 可 以 改 变 结 构 选 项 以 适 应 服 务 器 , 如 果 应 用 问 题 是由 故 障 所 致 , 则 可 以 识 别 这 种 故 障 和 修 改 程 序 。
有 两 个 图 形 工 具 可 以 提 供 密 切 监 视 影 响 服 务 器 性 能 活 动 的 能 力 , 这 就 是 SQL Server Profiler 和 SQL Server Performance Monitor 。 对 这 两 个 工 具 使 用 得越 熟 练 , 发 现 并 解 决 问 题 的 速 度 就 会 越 快 。
SQL Server Profile 目 前 已 经 取 代 了 原 来 的 SQL Trace , 前 者 能 够 提 供 在服 务 器 上 活 动 的 实 时 数 据 。 通 过 把 这 些 数 据 保 存 到 表 格 或 文 件 中 , 可 以 将 它 们收 集 起 来 以 供 分 析 , 建 立 有 关 SQL Server 性 能 的 原 始 资 料 。
对 于 这 两 种 工 具 , SQL Server Profile 可 提 供 有 关 数 据 库 性 能 方 面 的 详 细信 息 , 而 SQL Server Performance Monitor 则 具 有 调 度 工 作 和 超 过 性 能 阈 值 时发 出 警 告 的 功 能 。
17.1 SQL Server Profiler
SQL Server Profiler 是 一 个 为 系 统 管 理 员 设 计 的 应 用 程 序 调 试 工 具 , 可 为Transact-SQL 语 句 和 链 接 提 供 视 图 , 能 够 识 别 查 询 、 插 入 、 数 据 更 新 及 其 它 发生 在 SQL Sever 上 的 事 件 。 该 工 具 还 能 监 视 远 程 访 问 。
注 意 : 要 执 行 SQL Server Profiler, 可 从 NT Start 按 钮 下 的 Microsoft SQL Server
菜 单 中 , 或 从 Enterprise Manager 中 Tools Menu 中 选 择 SQL Server Profiler 。
SQL Server Profile Queue
SQL Server Profiler 使 用 排 序 法 保 存 收 集 到 的 事 件 ,在 SQL Server Profiler 下 从 View 菜 单 中 选 择 Options , 将 缓 冲 区 显 示 器 的 项 目 数 改 变 到 控 制 台 , 如 图
- 所 示 。
图 17.1SQL Server Profiler 的 Queue 选 项
排 序 的 作 用 与 任 何 缓 冲 区 的 作 用 一 样 : 即 先 进 先 出 。 每 个 轨 迹 都 是 由 不 同
的 、 称 作 发 生 器 的 计 算 机 代 码 模 型 产 生 的 , 每 个 发 生 器 对 应 一 个 事 件 种 类 : 都是 把 事 件 按 时 间 顺 序 发 送 到 队 列 中 。 SQL Server 根 据 无 空 间 就 暂 停 发 生 器 来 控制 队 列 。 若 当 发 生 器 能 写 入 队 列 之 前 暂 停 时 间 消 失 , 那 么 SQL Server 就 暂 停 所有 的 发 生 器 , 这 叫 做 自 动 停 止 状 态 。 在 自 动 停 止 状 态 中 , 发 生 器 仍 继 续 收 集 事件 数 据 , 但 不 写 入 队 列 中 。
要 想 提 高 线 程 优 先 权 以 便 从 缓 冲 区 移 走 更 多 的 事 件 和 脱 离 自 动 停 止 状 态 , 可 打 开 File 菜 单 , 单 击 Properties , 从 General Panel 中 选 择 Trace Name , 然 后 单 击 SQL Server 下 拉 列 表 框 旁 边 的 按 钮 , 就 会 看 到 服 务 器 队 列 设 置 , 这 样就 能 改 变 这 些 设 置 , 提 高 线 性 程 先 权 , 如 图 17.2 所 示 。
图 17.2SQL Server Profiler Trace Name 属 性
由 SQL Server Profiler 跟 踪 的 相 关 事 件 可 形 成 不 同 的 种 类 , 下 一 节 将 介绍 跟 踪 事 件 的 类 别 。
跟 踪 事 件 的 类 别
跟 踪 事 件 可 按 下 面 的 类 别 进 行 分 组 :
-
Lock
-
Misc
-
Objects
-
SQL Operators
-
Scan
-
Session
-
Stored Procedures
-
TSQL
-
Transaction
下 面 进 一 步 看 介 绍 其 中 某 些 种 类 中 可 跟 踪 哪 些 特 殊 事 件 , 以 了 解 服 务 器 的性 能 。
锁 定 事 件
SQL Server Profiler 的 锁 定 类 别 包 含 以 下 跟 踪 事 件 :
-
获 得 锁 定
-
取 消 锁 定 请 求
-
锁死
-
解 除 锁 定
-
超 时 锁 定
当 某 个 请 求 还 没 有 正 确 写 入 时 , 在 Microsoft SQL Server 中 通 常 会 发 生 锁定 问 题 , 遗 憾 的 是 , 几 乎 每 个 请 求 在 初 期 都 会 经 历 锁 定 问 题 。 要 尽 量 多 获 取 产生 问 题 原 因 的 信 息 , 可 以 使 用 SQL Server Profiler , 以 便 更 容 易 、 更 快 捷 和 更准 确 地 确 定 锁 定 问 题 中 包 含 的 代 码 。
杂 项 事 件
SQL Server Profiler 包 含 以 下 跟 踪 事 件 :
-
Attention
-
Auto-UpdateStats
-
CursorOpen
-
ErrorLog
-
EventLog
-
HashBail
-
LoginFailed
-
Recompile(NoHints)
-
ServiceControl
杂 项 事 件 描 述 包 括 中 断 或 破 坏 连 接 ;有 关 更 新 的 统 计 量 自 动 运 行 的 事 件 ;SQL Server 指 针 打 开 事 件 ; 写 到 SQL Server 的 错 误 日 志 和 事 件 日 志 的 事 件 ; 转 到另 一 个 计 划 的 杂 乱 操 作 ; 不 成 功 的 联 机 请 求 ; 存 贮 过 程 和 起 动 系 统 未 给 出 最 佳线 索 就 重 新 编 译 ; 以 及 暂 停 或 重 新 启 动 SQL Server 。
对 象 事 件
SQL Server Profiler 对 象 类 别 包 含 以 下 跟 踪 事 件 :
-
Object:Closed
-
Object:Created
-
Object:Deleted
-
Object:Opened
对 象 的 事 件 描 述 包 括 当 打 开 的 对 象 已 被 SELECT,INSERT 或 DELETE 状 态 关闭 ; 当 某 个 对 象 已 被 创 建 、 删 除 或 存 取 时 ; 当 某 个 SQL SELECT,INSERT 或 DELETE 已 经 发 生 时 ; 二 重 性 的 程 度 ; 及 当 一 个 表 格 或 索 引 扫 描 开 始 和 结 束 时 。
会 话 事 件
SQL Server Profiler 会 话 类 别 包 括 以 下 跟 踪 事 件 :
-
Connect
-
Disconnect
-
ExistingConnection
会 话 事 件 的 描 述 包 括 所 有 连 接 事 件 , 所 有 未 连 接 事 件 , 以 及 在 跟 踪 之 前 使用 者 登 录 的 活 动 。
存 储 过 程 事 件
SQL Server Profiler 被 存 储 过 程 的 类 别 包 括 以 下 跟 踪 事 件 :
-
SP:CacheHit
-
SP:CacheInsert
-
SP:CacheMiss
-
SP:CacheRemove
-
SP:Completed
-
SP:ExecContext
-
SP:Recompile
-
SP:Starting
-
SP:StmtStarting
存 贮 过 程 跟 踪 事 件 包 括 在 过 程 存 储 器 中 发 现 存 储 过 程 ; 将 一 个 存 储 过 程 移 到或 插 入 过 程 存 储 器 中 ; 已 完 成 的 存 储 过 程 ; 执 行 过 程 的 局 部 状 态 ; 重 编 译 或 开 始 存储 过 程 ; 及 包 含 在 一 存 储 过 程 中 的 语 句 的 开 始 。
TSQL 事 件
SQL Server Profiler TSQL 类 别 包 括 以 下 跟 踪 事 件 :
-
RPC:Completed
-
RPC:Starting
-
SQL:BatchCompleted
-
SQL:BatchStarting
-
SQL:StmtStarting
TSQL 跟 踪 事 件 包 括 已 完 成 的 远 程 过 程 呼 叫 ; 已 经 开 始 的 远 程 过 程 呼 叫 ; 已 完成 的 用 Transact-SQL 语 句 写 的 程 序 组 ; Transact-SQL 语 句 写 的 程 序 的 开 始 执行 时 间 ; 及 每 一 条 Transact-SQL 语 句 的 开 始 执 行 时 间 。
事 务 事 件
SQL Server Profile Transaction 类 别 包 含 以 下 跟 踪 事 件 :
-
DTCTransaction
-
SQLTransaction
执 行 跟 踪 事 件 包 括 MS DTC 在 数 据 库 和 开 始 之 间 的 双 向 委 托 处 理 ; 委 托 ; 保 存点 ; 及 重 新 运 行 处 理 .
如 上 所 述 , SQL Server Profiler 允 许 跟 踪 很 多 重 要 事 件 , 当 你 的 服 务 器 遇到 问 题 时 , 别 忘 了 使 用 这 个 工 具 。 下 一 节 包 含 了 如 何 去 建 立 一 个 跟 踪 。
创 建 跟 踪
要 建 立 一 个 SQL Server 跟踪 , 需 从 Microsoft SQL Server 程 序 组 中 选 择 SQL Server Profiler, 当 Profiler 运 行 时 , 从 File 菜 单 中 选 择 New, 然 后 选 择 Trace 。在 General 面 板 上 的 Trace Name 对 话 框 中 为 跟 踪 键 入 一 个 名 字 , 从 下 拉 列 表框 中 选 择 SQL Server 并 决 定 是 否 将 捕 获 的 输 出 结 果 放 到 一 个 文 件 中 还 是 一 个 表中 , 然 后 输 入 地 址 。 单 击 Events 面 板 , 选 择 希 望 跟 踪 的 事 件 , 图 17.3 显 示 的是 Events 面 板 。 选 完 跟 踪 事 件 后 , 选 择 Data Columns 面 板 , 再 选 择 希 望 包 括在 跟 踪 输 出 中 的 任 何 附 加 列 , 最 后 在 Filters 面 板 中 选 择 不 希 望 看 到 的 所 有 事件 。
图 17.3SQL Server Profiler Trace Events 面 板
选 择 OK 按 钮 后 跟 踪 立 刻 开 始 , 将 结 果 送 到 所 选 择 的 目 的 地 。 若 前 面 没 选 择
文 件 或 表 , 结 果 就 传 到 屏 幕 上 。
使 用 已 有 的 跟 踪
若 启 动 一 个 已 经 创 建 的 SQL Server Profiler 跟 踪 , 需 从 Microsoft SQL Server 程 序 组 中 选 择 SQL Server Profiler 。 当 Profiler 运 行 时 , 从 File 菜单 中 选 择 Run Traces , 然 后 从 已 存 在 的 跟 踪 的 名 单 中 选 择 想 启 动 的 跟 踪 。
从 File 菜 单 中 也 可 以 停 止 、 暂 停 和 删 除 跟 踪 。 跟 踪 必 须 在 停 止 后 才 能 被 删除 。 在 关 闭 SQL Server Profiler 窗 口 之 前 , 所 有 活 动 的 跟 踪 都 必 须 被 关 闭 。
在 已 经 选 择 了 Run Traces 后 , 可 以 从 File 菜 单 中 选 择 Properties 来 改 变
一 个 活 动 的 跟 踪 , 这 个 跟 踪 将 会 出 现 在 屏 幕 上 或 输 出 到 一 个 表 或 文 件 中 , 再 选择 General 、 Events 、 Data Columns 或 Filters 面 板 以 改 变 相 应 的 性 能 。
若 已 有 多 个 活 动 的 跟 踪 而 想 清 理 跟 踪 窗 口 以 看 到 其 它 的 跟 踪 , 从 File 菜 单中 选 择 Clear Trace Window 。
跟 踪 输 出 文 件
若 已 在 General 面 板 中 选 择 了 把 数 据 保 存 到 一 个 跟 踪 文 件 中 , 如图 17.4 所示 , 那 么 跟 踪 输 出 将 被 保 存 在 一 个 文 件 中 。 这 种 扩 展 名 为 .scu 的 文 件 有 一 些 重要 作 用 :
图 17.4SQL Server Profiler General 面 板
-
捕 获 解 决 SQL Server 错 误 的 事 件
-
调 试 扩 展 存 储 过 程
-
建 立 一 段 时 间 后 的 服 务 器 事 件 的 度 量 标 准
-
辅 助 建 立 Index Tuning Wizard 的 工 作 文 件
-
在 SQL Server Profiler 中 输 入 到 Replay SQL Server 功能
-
重 现 SQL Server
-
SQL Server Profiler 中 的 Replay SQL Server 函 数 功 能 以 实 时 的 或 压 缩 模式 读 出 跟 踪 的 捕 获 数 据 文 件 , 这 将 实 际 上 是 在 数 据 库 文 件 应 用 Transact SQL 。可 从 SQL Server Profiler 菜 单 中 选 择 Replay SQL Server 函 数 , 有 关 Replay SQL Server 的 更 多 信 息 请 看 第 7 章 。
- SQL Server 性 能 监 视 器
SQL Server Performance Monitor 也 提 供 了 监 视 服 务 器 性 能 和 活 动 的 功 能 , 其 功 能 是 在 选 择 的 计 数 器 上 设 置 阈 值 , 当 达 到 阈 值 时 产 生 警 告 。
SQL Performance Monitor 在 安 装 SQL Server 中 产 生 的 , 可 作 为 Microsoft
SQL Server 程 序 组 中 的 选 择 项 。
启 动 SQL Server 性 能 监 视 器
从 NT Start 菜 单 中 选 择 SQL Server 程 序 组 , 然 后 再 选 择 SQL Server Perpormance Monitor 。 SQL Server Perporfance Monitor 具 有 创 建 、 观 察 和保 存 功 能 的 图 表 。 用 户 也 可 以 选 择 对 象 和 计 数 器 并 把 它 们 添 加 到 图 表 中 , 不 同颜 色 的 图 形 代 表 不 同 的 计 数 器 。 要 使 图 表 较 小 并 且 可 读 , 可 创 建 不 同 的 图 表 来监 视 不 同 的 统 计 类 型 。
从 SQL Server Performance Monitor File 菜 单 中 选 择 New Chart , 然 后选 择 Edit 菜 单 和 Add to Chart , 此 时 有 许 多 计 数 器 可 供 选 择 。 通 过 把 计 数 器添 加 到 图 标 中 可 选 择 希 望 监 视 的 计 数 器 。 这 一 任 务 完 成 后 , 监 视 不 同 类 型 统 计的 图 表 中 就 会 出 现 不 同 的 颜 色 。
生 成 警 告
本 节 解 释 当 在 SQL Server Performance Monitor 中 超 出 阈 值 时 如 何 生 成 警告 信 息 。 从 Microsoft SQL Server 程 序 组 中 选 择 Performance Monitor , 再 从Performance Monitor View 菜 单 中 选 择 Alert , 出 现 Alert Log 屏 幕 后 , 从 Edit 菜 单 中 选 择 Add to Alert , 然 后 选 择 感 兴 趣 的 对 象 和 计 数 器 。 在 Alert If 框中 选 择 Over 或 Under 单 选 按 钮 , 并 输 入 一 个 阈 值 , 最 后 在 Alert 框 中 的 Run Program 中 输 入 sqlalrtr70 命 令 。
Sqlalrtr70 命 令 格 式 如 下 :
sqlalrtr70 -E error_number [ -S server_name] [ -P password ]
[ -D database_nam e][ -V severity ] [ -T ]
语 法 的 前 半 部 , -E 项 后 面 的 错 误 号 是 多 少 , 作 用 在 服 务 器 上 的 错 误 号 就 是多 少 。 Sqlalrtr70 中 的 参 数 -E 、 -S 、 -P 、 -V 和 -T 是 区 分 大 小 写 的 , 所 以 要 确保 按 大 写 方 式 输 入 这 些 参 数 。 也 可 以 选 择 First Time 或 Error Time 运 行 警 告 。
到 了 这 一 步 还 没 有 完 成 。 要 想 从 SQL Server Performance Monitor 中 的 阈值 产 生 警 告 , 需 建 立 两 种 不 同 的 警 告 , 除 了 前 面 描 述 的 SQL Server Performance Monitor 警 告 外 , 还 须 建 立 一 个 SQL Server 警 告 。
要 建 立 SQL Server 警 告 , 首 先 要 使 用 Enterprise Manager 建 立 一 个 用 户定 义 的 事 件 错 误 信 息 以 扩 展 到 服 务 器 上 , 然 后 从 Enterprise Manager 的 分 层 树中 选 择 SQL Server Agent 和 Alerts , 在 Result 面 板 中 双 击 警 告 , 或 右 击 它 再选 择 Properties , 单 击 浏 览 按 钮 ( ... ) 出 现 Manage Server Messages 对 话 框 , 如 图 17.5 所 示 。
图 17.5 创建用户定义的错误消息
单 击 New 创 建 一 个 用 户 定 义 消 息 , 当 Performance Monitor 产 生 错 误 时 , 可 使 用 这 一 消 息 产 生 一 个 SQL Server 警 告 , 输 入 与 在 Performance Monitor 中的 Run Program on Alert 框 中 的 sqlalrtr70 命 令 中 要 使 用 的 错 误 号 相 同 的 数 , 用 户 定 义 消 息 中 的 错 误 号 值 是 从 50001 开 始 , SQL Server 保 留 小 于 50001 的 数值 。
最 后 一 步 是 建 立 一 新 的 SQL Server 警 告 , 当 错 误 产 生 时 这 一 警 告 会 响 。 要用 用 户 定 义 的 错 误 号 建 立 一 个 警 告 , 需 在 Enterprise Manager 的 分 层 树 中 扩 展到 服 务 器 , 再 扩 展 到 SQL Server Agent , 然 后 右 击 Alerts , 选 择 New Alert 。为 警 告 输 入 一 个 名 字 , 然 后 选 中 Error Number 按 钮 , 单 击 浏 览 按 钮 ( ... ) 选择 刚 建 立 的 那 个 错 误 号 , 也 即 在 sqlalrtr70 命 令 中 出 现 的 值 。 警 告 也 可 由 缺 省值 产 生 。 若 想 让 这 警 告 只 在 一 个 数 据 库 中 起 作 用 , 必 须 从 这 屏 幕 上 选 择 这 个 数据 库 , 如 图 17.6 所 示 。
图 17.6SQL Server Agen t—— New Alert 属性
选 择 Response 面 板 , 指 出 当 警 告 发 出 响 声 时 通 知 谁 、 通 知 什 么 和 如 何 通 知 。
SQL Server Performance Monitor 和 SQL Server Agent 服 务 使 用 必 须 为 警告 发 出 而 运 行 。
当 超 过 SQL Server Performance Monitor 的 阈 值 时 ,SQL Server Performance Monitor 的 警 告 就 产 生 了 ,它 也 启 动 了 sqlalrtr70 应 用 ,这 一 应 用 与 SQL Server Agent 、 isql 应 用 及 SQL Server Performance Monitor 都 有 联 系 , isql 应 用 连着 SQL Server 并 运 行 RAISERROR WITH LOG Transact-SQL 语 句 , 这 将 把 事 件写 到 Windows NT 应 用 记 录 中 。当 建 立 新 的 SQL Server 警 告 时 ,SQL Server Agent 会 注 意 到 这 一 事 件 , SQL Server 警 告 发 出 响 声 并 通 知 在 Response 面 板 中 选 择的 人 。
对 象 和 计 数 器
SQL Server Performance Monitor 从 一 个 属 性 对 象 中 聚 集 起 来 的 性 能 计 数器 中 收 集 信 息 , SQL Server 计 数 器 对 监 视 器 的 好 处 在 于 :
-
Access Methods Object-Page Splits / sec 由 于 索 引 页 太 满 引 起
。
-
Access Methods Object-Table Lock Escalations / sec 每 秒 对 表 格
的 锁 定强 度 所 扩 大 的 次 数 。
-
Access Methods Object-Extents Allocated / sec 每 秒 由 存 储 数 据
的 数 据库 对 象 所 分 配 的 范 围 。
-
Access Methods Object-Extents deallocated / sec 每 秒 钟 由 数 据
库 对 象存 储 的 数 据 未 分 配 的 范 围 。
-
Access Methods Object-Worktables Created / sec 在 前 一 秒 建 立 的
工 作 台的 个 数 。
-
Buffer Manager Object-Buffer Cache Hit Ratio 在 内 存 中 的 缓 冲 区
中 发现 的 而 不 是 从 磁 盘 上 读 一 个 请 求 的 次 数 的 比 率 。 这 一 比 率 应 趋 近 于 100% , 数 值越 高 , 服 务 器 的 性 能 越 好 。
-
Buffer Manager Object-Checkpoint Writes / sec 通 过 检 查 点 每 秒
钟 写 到磁 盘 上 的 脏 页 。
-
Buffer Manager Object-Page Reads / sec 每 秒 钟 物 理 页 的 读 数
和 通 过 所 有数 据 库 每 秒 钟 。
物 理 页 的 总 读 数 。 如 果 这 个 值 高 的 话 , 在 索 引 、 查 询 效 率 和 数 据 库 设 计 方 面 的申 请 会 受 到 检 验 。
-
Buffer Manager Object-Readahead Pages / sec 每 秒 物 理 I / O 请
求 的 数 目 , 需 要 提 前 读 和 提 前 得 到 这 一 页 。
-
Cache Manager Object-Cache Hit Ratio 在 内 存 的 数 据 区 中 发 现
的 而 不 是从磁 盘 上 读 一 个 请 求 的 次 数 的 比 率 。 这 一 比 率 应 趋 近 于 100% , 数 值 越 高 , 服 务器 的 性 能 越 好 。
-
Databases Object-Transactions / sec 每 秒 钟 执 行 Transact-SQL 命
令 批 的数 目 。 每 秒 执 行 速 度 高 表 明 有 好 的 信 息 通 过 量 。
-
Databases Object-Active Transaction 作 用 于 数 据 库 上 的 有 效 的
执 行 数 目 。
-
Databases Object-Log Growths 日 志 必 须 要 增 加 尺 寸 的 次 数 。
-
Latches Object-Average Latch Wait Time 当 计 数 器 需 等 待 时 以 毫
秒 计 的
等 待 时 间 ( 锁 存 器 是 新 的 版 本 7 锁 定 范 例 的 组 成 部 分 ) 。
-
Locks Object-Number of Deadlocks / sec 每 秒 钟 死 锁 的 次 数 。
-
Replication Logreader Object-Delivery Latency 日 志 阅 读 器 的 延
迟 秒 数 。
-
Replication Logreader Object-Delivery Rate 每 秒 插 入 的 日 志 阅
读 器 命令 的 数 目 。
-
Replication Merge Object-Conflicts 计 算 更 新 用 户 中 出 现 的 冲
突 。 该 值大 于 零 表 示 失 败 , 必 须 控 制 该 冲 突 。
-
Replication Snapshot Object-Bulk Copy Rate 每 秒 块 拷 贝 的 行 数
。
-
General Statistics Objects-Logins / sec 每 秒 注 册 数 。
-
性 能 因 素
-
SQLServer Performance Monitor 可 能 会 降 低 服 务 器 的 性 能 , 这 取 决 于 它 运行 时 间 的 长 短 、 它 正 在 监 测 的 内 容 以 及 所 选 用 的 硬 件 平 台 、 计 数 器 的 数 码 和 更新 间 隔 。
需 要 连 接 到 SQLServer 的 许 可
要 确 认 运 行 SQL Server Performance Monitor 的 Windows 帐 户 已 经 访 问 连接 到 SQL Server , 并 成 为 SQL Server Public 角 色 的 成 员 。 关 于 Windows NT
第 四 部 分 开 发 — — 编 程 语 言
第 18 章 开 发 话 题
在 本 章 中 , 主 要 介 绍 与 SQL Server 7 应 用 开 发 相 关 的 各 种 话 题 。 在 此 版 本中 , 行 级 锁 定 和 死 锁 的 可 避 免 性 、 锁 定 的 增 强 和 更 优 化 的 查 询 功 能 , 将 直 接 为开 发 人 员 带 来 利 益 。 另 外 也 可 以 将 SQL Server 与 其 他 可 以 用 来 调 试 存 储 过 程 的Microsoft 开 发 工 具 , 如 Visual C + + 和 Visual Basic 结 合 使 用 。 用 户 可 以 使用 Samples 目 录 下 的 样 本 程 序 。 SQL Server 7 即 安 装 在 这 个 Samples 目 录 下 。
本 章 第 一 节 中 将 讨 论 一 项 非 常 实 用 的 功 能 — — 创 建 数 据 库 图 表 。 数 据 库 图表 是 数 据 库 的 映 像 。 它 对 于 那 些 希 望 继 承 系 统 和 在 完 成 开 发 过 程 后 需 要 进 行 数据 维 护 的 用 户 是 非 常 重 要 的 。
- 数 据 库 图 表
Microsoft Visual Studio 中 的 Visual Database Tools 能 用 来 创 建 数 据 库图 表 。 Database Designer 有 一 个 特 殊 的 用 户 接 口 。 用 此 接 口 , 不 仅 可 以 改 变Microsoft SQL Server 数 据 库 结 构 , 也 可 以 改 变 Oracle 数 据 库 结 构 。 对 数 据库 管 理 员 而 言 , 在 准 备 通 过 由 Database Designer 创 建 的 脚 本 之 前 , 使 用“ What
if ” 设 计 方 法 , 可 以 不 影 响 当 前 的 设 计 , 数 据 库 对 象 的 关 系 、 索 引 、 约 束 和 修改 , 以 及 数 据 库 定 义 语 言 的 改 变 , 都 不 必 逐 行 编 写 Transact-SQL 代 码 , 即 可 实现 。
Visual Database Tools 正 在 融 入 Enterprise Manager 之 中 。 随 着 时 间 的推 移 , 这 种 融 合 将 越 来 越 多 。 在 没 有 数 据 库 图 表 的 情 况 下 去 设 计 一 个 复 杂 的 数据 库 是 非 常 困 难 的 。 因 此 , 要 保 持 复 杂 数 据 库 图 表 的 先 进 性 是 十 分 重 要 的 。
- 数 据 完 整 性
加 强 数 据 库 的 数 据 完 整 性 有 许 多 迫 切 的 原 因 。 Microsoft SQL 为 这 种 完 整 性提 供 了 许 多 途 径 , 以 保 证 数 据 质 量 。 数 据 库 的 数 据 完 整 性 包 括 以 下 四 个 方 面 :
-
实 体 完 整 性
-
域 完 整 性
-
参 照 完 整 性
-
用 户 定 义 完 整 性
下 面 将 分 几 部 分 对 上 述 几 方 面 分 别 进 行 解 释 , 并 阐 述 其 实 现 的 方 法 。 采 用这 些 方 法 实 现 数 据 库 完 整 性 , 不 仅 能 够 保 证 数 据 质 量 , 而 且 能 够 避 免 由 于 缺 乏数 据 库 完 整 性 而 导 致 的 费 时 费 力 的 数 据 审 查 和 随 之 而 来 的 数 据 清 理 问 题 。
实 体 完 整 性
必 须 确 保 表 中 的 每 一 行 都 是 独 立 的 。 每 一 行 都 能 够 被 设 置 指 针 , 并 且 能 够在 不 干 扰 其 他 行 的 情 况 下 被 访 问 , 这 些 是 很 重 要 的 。 独 立 形 式 的 实 体 完 整 性 是通 过 建 立 主 关 键 字 约 束 , 唯 一 索 引 、 唯 一 约 束 或 IDENTITY 特 征 来 实 现 的 。
主 关 键 字 是 表 中 的 一 列 或 多 列 , 其 所 具 有 的 值 对 表 格 中 的 其 他 各 行 而 言 必须 是 唯 一 的 。 每 个 表 格 只 能 有 一 个 主 关 键 字 , 并 且 主 关 键 字 不 允 许 存 在 空 值 。主 关 键 字 被 创 建 后 , SQL Server 通 过 以 主 关 键 字 建 立 唯 一 索 引 来 实 现 表 格 的 唯一 性 。 通 过 给 表 格 设 定 主 关 键 字 , 不 仅 实 现 了 表 格 中 行 的 独 立 , 而 且 访 问 设 有主 关 键 字 的 表 格 , 其 数 据 的 检 索 也 更 加 快 捷 。
创 建 一 个 identity 列 是 一 种 更 为 复 杂 、 更 为 先 进 的 强 化 独 立 性 的 方 式 。 主关 键 字 列 常 常 用 IDENTITY 属 性 来 定 义 , 这 样 做 的 好 处 是 : 当 用 户 插 用 行 时 , SQL Server 会 同 时 自 动 给 被 插 入 行 的 每 列 赋 值 , 用 户 不 必 知 道 插 入 行 的 每 个 值 , 也无 须 存 储 。 当 索 引 是 整 数 时 , 数 据 的 访 问 更 加 快 捷 , 因 而 功 能 也 相 应 增 强 。
在 使 用 IDENTITY 属 性 的 情 况 下 插 入 行 , 而 插 入 失 败 , 则 插 入 行 的 值 不 会 在表 格 中 出 现 , 下 一 行 的 值 仍 将 递 增 。 例 如 , 插 入 行 10 , 而 由 于 某 种 原 因 使 插 入失 败 , 数 字 10 将 不 会 在 表 中 出 现 ; 下 一 次 插 入 成 功 时 , 行 9 后 出 现 的 将 是 行 11 。然 而 , 通 过 SET IDENTITY_INSERT ON 命 令 , 可 以 控 制 表 格 中 的 数 值 , 人 为 地 给插 入 的 行 赋 一 个 整 数 值 ( 该 整 数 值 须 在 表 格 中 未 被 使 用 过 ) 。 可 以 使 用 SET IDENTITY_INSERT OFF 命 令 来 结 束 操 作 , 使 用 DBCC CHECKIDENT 命 令 来 检 验 和改 变 IDENTITY 值。
每 个 表 格 只 允 许 有 一 个 主 关 键 字 , 而 用 户 有 显 时 需 要 非 关 键 字 段 中 的 唯 一值 。 此 种 情 况 下 , 可 以 使 用 UNIQUE 约 束 来 给 非 主 关 键 字 段 建 立 唯 一 索 引 。 如 果用 户 插 入 一 个 已 在 表 格 中 存 在 的 行 , SQL Server 将 给 予 错 误 提 示 , 告 知 用 户 一个 相 同 的 行 业 已 存 在 。 以 此 防 止 相 同 行 的 插 入 。 如 果 用 户 想 采 用 缺 省 方 式 , 则主 关 键 字 约 束 可 以 使 用 CLUSTERED 索 引 , UNIQUE 约 束 可 以 使 用 NONCLUSTERED 索 引 。 NONCLUSTERED 索 引 现 使 用 聚 簇 关 键 字 , 而 不 再 使 用 行 标 识 符 。 因 此 当 主关 键 字 很 长 时 , 用 户 可 以 指 定 NONCLOSTERED 索 引 。
域 完 整 性
域 完 整 性 指 : 对 一 个 给 定 的 列 而 言 , 只 有 一 定 范 围 内 的 数 值 是 有 效 的 。 通 过规 定 数 据 类 型 、 使 用 CHECK 约 束 和 规 则 、 使 用 DEFAULT 值 、 NOT NULL 定 义 以 及FOREIGN KEY 约 束 , 可 以 限 定 有 效 值 的 范 围 。
数 据 类 型 用 于 定 义 可 以 放 置 于 列 、 局 部 变 量 和 存 储 过 程 参 数 中 的 数 据 的 类型 。 用 户 可 以 直 接 使 用 SQL Server 提 供 的 数 据 类 型 , 亦 可 以 自 己 定 义 数 据 类 型 。数 据 类 型 对 填 入 某 列 的 数 据 加 以 限 制 。 例 如 , 字 符 型 数 据 不 能 插 入 到 以 数 字 型数 据 创 建 的 列 中 。 CHECK 约 束 对 插 入 某 列 的 数 值 或 数 值 的 格 式 加 以 限 制 , 例 如电 话 号 码 和 邮 政 编 码 。 表 格 中 的 一 列 可 以 有 多 个 CHECK 约 束 。 用 户 亦 可 随 时 给新 创 建 的 或 业 已 存 在 的 表 格 增 加 限 制 。
在 SQL Server 7 中, RULES 被 用 以 反 向 兼 容 , 它 与 CHECK 约 束 起 相 同 作 用 , 区 别 在 于 每 一 列 只 能 有 一 条 规 则 。 SQL Server 7 中 , 一 般 使 用 CHECK 约 束 而 不
使 用 RULES , 因 为 CHECK 约 束 在 表 格 创 建 或 变 更 同 时 自 然 产 生 , 而 RULES 则 需要 单 独 创 建 。
有 时 , 用 户 可 能 不 知 道 确 切 的 数 字 ; 或 者 数 据 中 带 有 空 值 , 而 表 格 中 的 该 列不 允 许 使 用 空 值 , 或 用 户 本 身 不 希 望 出 现 空 值 。 在 这 些 情 况 下 , 可 以 使 用 缺 省值 。 缺 省 值 可 以 在 创 建 或 变 更 表 格 时 用 DEFAULT 关 键 字 来 定 义 。 例 如 , 用 户 想对 某 列 中 的 数 值 取 平 均 值 , 此 时 , 如 列 中 出 现 空 值 , 则 该 命 令 不 能 被 执 行 。 此种 情 况 下 , 可 以 给 每 行 中 的 每 一 列 空 值 上 赋 一 缺 省 值 0 。 这 样 , 平 均 运 算 即 有效 , 且 包 含 了 表 格 中 每 一 行 的 数 字 。
在 创 建 表 格 的 同 时 定 义 某 一 列 为 NOT NULL , 能 够 防 止 该 列 被 赋 以 NULL 值 。这 是 确 保 数 据 完 整 性 , 特 别 是 域 的 完 整 性 的 另 一 种 方 式 。 列 中 的 NULL 意 味 着 该值 是 未 知 的 。 NULL 的 运 行 方 式 不 同 于 0 值 或 空 值 。 因 为 它 们 不 能 相 互 比 较 , 而且 也 不 相 等 。 在 使 用 Transact-SQL 命 令 时 , NULL 将 引 起 许 多 麻 烦 。 因 为 在 遇到 NULL 值 时 , 每 条 命 令 都 将 不 能 正 常 运 行 。
FOREIGN KEY 约 束 与 主 关 键 字 或 唯 一 约 束 并 同 使 用 , 可 以 确 保 被 插 入 列 中 的值 也 被 包 含 在 另 一 个 表 中 的 主 关 键 字 之 中 。 它 不 仅 被 用 以 确 保 域 的 完 整 性 , 而且 对 下 文 将 讲 述 的 参 照 完 整 性 也 很 重 要 。
参 照 完 整 性
使 用 参 照 完 整 性 意 味 着 要 维 持 两 个 表 格 之 间 的 关 系 , 并 且 数 据 库 中 不 允 许孤 立 行 的 存 在 。 也 就 是 说 , SQL Server 不 允 许 用 户 在 子 表 中 添 加 父 表 中 不 具 有
的 行 ; 同 时 , 如 果 一 行 在 其 他 表 格 中 有 子 行 时 , 也 不 允 许 对 该 父 行 进 行 删 改 。SQL Server 通 过 上 文 讲 述 的 FOREIGN KEY 约 束 和 CHECK 约 束 来 实 现 参 照 完
整 性 。
如 果 在 标 准 的 SQL Server 确 保 完 整 性 的 工 具 中 , 没 有 能 够 满 足 需 求 的 , 用户 也 可 以 以 CONSTRAINTS 、 TRIGGRES 和 STORED PROCEDURES 形 式 定 义 用 户 定 义的 事 务 规 则 。 这 些 形 式 将 在 下 一 节 中 介 绍 。
用 户 自 定 义 完 整 性
用 户 自 定 义 完 整 性 是 指 用 户 可 以 为 某 一 个 表 格 或 某 一 列 设 定 自 己 的 特 殊 的事 务 规 则 。 触 发 器 和 存 储 过 程 用 户 可 以 以 更 为 复 杂 的 方 式 实 现 这 一 操 作 。 使 用Transact-SQL 语 言 中 的 流 程 控 制 语 言 ( 如 IF 语 句 ) 可 以 控 制 插 入 表 格 中 或 某 一列 中 的 元 素 。 这 是 一 种 较 为 复 杂 的 方 式 。 书 写 存 储 过 程 和 触 发 器 的 方 法 将 在 第19 章 中 阐 述 。
- 设 计 数 据 库
设 计 一 个 数 据 库 比 我 们 所 想 象 的 要 简 单 。 注 意 不 要 将 这 一 过 程 复 杂 化 。 设计 数 据 库 有 几 条 实 用 的 规 则 , 在 用 户 自 己 设 计 过 几 个 数 据 库 后 , 用 户 即 可 以 凭直 觉 遵 循 这 些 规 则 。 设 计 得 再 完 善 的 数 据 库 也 有 其 自 身 的 缺 陷 , 因 为 它 们 的 设
计 者 — — 人 本 身 便 是 有 缺 陷 的 。 我 们 不 可 能 预 见 到 明 年 人 们 将 以 何 种 方 式 去 访问 数 据 , 也 很 难 预 测 商 业 需 求 的 变 化 。 所 以 , 只 需 大 胆 着 手 , 做 出 我 们 最 好 的设 计 就 行 了 。 关 系 型 数 据 库 的 一 大 优 点 是 它 易 于 修 改 , 这 一 点 区 别 于 以 往 的 网状 或 层 次 数 据 库 。
建 立 数 据 库 的 三 大 要 素 是 :
-
实体
-
属性
-
关系
实 体 可 以 是 一 个 人 、 一 个 地 方 、 一 件 物 品 、 一 个 抽 象 的 事 物 或 其 他 任 何 可以 包 含 一 定 信 息 的 用 名 词 表 示 的 东 西 。 这 样 的 例 子 很 多 , 每 一 个 例 子 都 用 一 个独 立 的 关 键 字 表 示 。 这 些 名 词 都 对 应 着 表 格 , 并 且 用 单 数 名 词 表 示 。 例 如 , 应说 “ 客 户 ”, 而 非 “ 客 户 们 ”。 另 外 , 常 会 用 到 一 个 “ 相 关 实 体 ” 的 概 念 , 它 指实 体 以 常 见 的 关 系 组 合 在 一 起 。
一 个 实 体 可 能 包 含 多 个 属 性 , 其 中 包 括 可 能 作 为 主 关 键 字 的 属 性 。 含 有 空值 、 遗 漏 值 或 者 NULL 值 的 属 性 不 可 能 作 为 主 关 键 字 , 而 被 称 为 备 用 关 键 字 。
属 性 是 每 一 个 实 体 的 各 种 事 实 和 特 征 。 每 个 实 体 都 包 含 着 作 为 主 关 键 字 特征 的 属 性 。 其 他 类 型 的 关 键 字 包 括 候 选 关 键 字 、 备 用 关 键 字 、 外 部 关 键 字 和 代理 关 键 字 。 其 中 代 理 关 键 字 是 具 有 单 一 属 性 的 关 键 字 , 是 大 型 、 组 合 型 ( 含 多 个列 ) 的 关 键 字 。 代 理 关 键 字 使 得 Transact-SQL 程 序 更 加 简 便 易 行 , 因 为 用 户 在查 询 时 , 不 必 逐 一 在 编 码 中 写 出 每 一 个 列 。
关 系 是 数 据 库 设 计 的 核 心 , 它 包 含 着 事 务 规 则 。 关 系 是 指 两 个 且 仅 两 个 实
体 之 间 的 关 联 。 它 是 以 相 关 实 体 的 组 合 形 式 表 现 出 来 的 。 在 了 解 关 系 之 前 , 需要 先 了 解 基 数 的 概 念 。 基 数 是 指 : 父 表 中 的 多 少 实 例 与 子 表 中 的 多 少 实 例 相 关联 。 包 括 一 对 多 、 多 对 多 ; 标 识 性 一 对 多 、 标 识 性 多 对 多 ; 以 及 回 归 性 一 对 多 、回 归 性 多 对 多 。
多 对 多 关 系 亦 称 非 确 定 关 系 。 非 确 定 关 系 必 须 被 分 解 。 关 系 亦 可 看 作 是 实体 , 因 而 关 系 的 分 解 可 以 通 过 表 格 的 连 接 来 实 现 。
当 父 关 键 字 是 子 表 关 键 字 的 一 部 分 时 , 即 产 生 标 识 性 关 系 。 当 父 关 键 字 不
是 子 表 关 键 字 的 一 部 分 时 , 非 标 识 性 关 系 产 生 。
回 归 关 系 是 一 种 非 标 识 性 关 系 。 在 这 种 关 系 中 , 父 表 与 子 表 的 实 例 相 同 。
数 据 库 设 计 的 方 法
数 据 库 设 计 可 以 通 过 三 种 方 式 完 成 :
-
自 上 而 下
-
自 里 而 外
-
自 下 而 上
自 上 而 下 的 设 计 方 法 即 按 事 件 的 时 间 发 展 顺 序 设 计 表 格 。 例 如 , 按 照 需 求的 收 集 、 逻 辑 模 式 设 计 以 及 物 理 设 计 的 顺 序 。 这 种 方 法 在 需 求 定 义 时 期 使 用 。而 在 外 部 环 境 快 速 发 展 的 今 天 , 这 种 费 时 费 力 的 方 法 已 不 再 适 用 了 。 有 些 时 候 , 我 们 需 要 就 手 头 现 有 的 材 料 进 行 设 计 。 这 些 材 料 可 能 仅 仅 是 一 个 有 限 的 调 试 , 或 一 个 不 能 过 多 改 变 其 界 面 的 遗 留 系 统 。 这 时 , 就 要 采 用 其 他 的 方 法 。
如 果 需 要 安 装 一 个 现 存 的 软 件 包 , 则 自 上 而 下 的 方 法 比 较 适 用 。 如 果 需 要修 改 或 扩 展 现 存 的 系 统 , 则 自 内 而 外 的 方 法 比 较 适 用 。
在 下 一 节 中 , 我 们 将 讨 论 一 个 比 较 有 争 议 的 话 题 : 规 范 化 。 正 确 的 事 务 规 则的 实 现 和 数 据 库 的 性 能 比 起 一 个 完 善 的 、 规 范 化 了 的 数 据 库 重 要 得 多 。 切 勿 为了 追 求 数 据 库 规 范 化 而 忽 视 了 其 运 行 和 功 能 。
规 范 化
数 据 库 将 如 何 运 行 , 是 由 数 据 库 、 表 格 和 表 格 间 关 系 的 逻 辑 设 计 决 定 的 。规 范 化 技 术 即 将 数 据 划 分 为 不 同 表 格 的 规 则 。 适 当 的 规 范 化 有 利 于 数 据 库 的 运行 。 要 注 意 , 规 范 化 的 程 序 越 高 , 连 接 越 复 杂 。 而 过 度 复 杂 的 关 系 连 接 需 要 大量 的 表 格 , 这 将 对 数 据 库 运 行 起 消 极 作 用 。 系 统 的 规 范 化 有 五 种 范 式 , 但 大 多数 系 统 的 规 范 化 只 进 行 到 第 三 范 式 。
采 用 自 上 而 下 或 自 内 而 外 的 设 计 方 法 , 可 以 将 一 个 大 的 表 格 规 范 为 几 个 较小 的 表 格 。 如 果 用 户 是 通 过 存 储 过 程 来 访 问 数 据 库 的 , 则 用 户 可 以 使 用 视 图 , 而 不 必 使 用 应 用 程 序 。
达 到 第 三 范 式 的 规 范 化 规 则 如 下 :
-
表 格 应 具 有 一 个 主 关 键 字 , 以 唯 一 地 标 识 表 格 中 的 每 一 行 。 即 要 达 到 第一 范 式 , 需 要 给 每 一 个 表 格 创 设 一 个 唯 一 的 主 关 键 字 。
-
达 到 第 二 范 式 , 需 将 已 满 足 第 一 范 式 的 数 据 库 分 解 , 将 其 中 多 余 的 数 据属 性 移 入 另 一 个 单 独 的 表 格 。
-
要 达 到 第 三 范 式 , 要 清 除 表 格 中 不 依 赖 主 关 键 字 的 列 。 第 三 范 式 的 表 格应 仅 仅 具 有 一 种 类 型 的 具 体 的 数 据 。
规 范 化 即 用 多 个 较 小 的 表 格 来 代 替 一 个 大 的 、 包 罗 万 象 的 表 格 。 过 大 的 表格 不 利 于 数 据 库 的 运 行 。 注 意 , 允 许 空 值 存 在 的 列 要 尽 可 能 少 。 不 是 十 分 必 要 , 在 列 中 不 要 采 用 空 值 。
过 分 的 规 范 化 会 导 致 大 量 表 格 间 过 分 复 杂 的 连 接 ; 而 规 范 化 程 度 不 足 , 又 会使 数 据 库 只 包 含 少 数 几 个 包 含 过 多 列 的 大 表 格 。 上 述 两 种 情 况 都 会 降 低 数 据 库的 运 行 速 度 , 因 此 要 尽 可 能 寻 找 两 者 之 间 的 平 衡 点 。
归 纳
图 18.1 归纳 :“类型 O R 类型”
人 们 总 是 会 自 然 地 将 事 物 分 类 。 在 进 行 数 据 库 设 计 时 更 是 如 此 。 一 般 认 为 , 事 物 是 可 以 划 分 为 各 种 类 型 的 , 这 个 分 类 的 过 程 被 称 为 “ 归 纳 ”。 在 设 计 数 据 库时 , 应 该 具 有 这 种 归 纳 的 意 识 , 并 运 用 这 种 意 识 去 设 计 一 个 包 含 有 主 关 键 字 、某 种 类 型 的 列 和 由 所 有 类 型 的 列 所 共 同 具 有 的 属 性 组 成 的 表 格 。 图 18.1 给 出 了几 个 独 立 的 子 表 格 , 这 几 个 子 表 格 具 有 相 同 的 主 关 键 字 ( 这 个 主 关 键 字 在 父 表中 , 是 一 个 外 部 关 键 字 ) 和 不 同 的 属 性 。
如 果 将 采 用 “ 这 一 类 型 或 那 一 类 型 ” 的 归 纳 思 路 , 则 图 18.1 所 示 的 设 计 方式 无 疑 是 正 确 的 。 然 而 如 果 采 用 “ 这 一 类 型 和 那 一 类 型 ” 的 归 纳 思 路 , 则 设 计的 结 果 会 有 所 不 同 。 如 图 18.2 所 示 , 这 时 , 各 种 类 型 在 父 表 中 位 于 同 一 列 , 而不 是 每 种 类 型 各 占 一 列 。
图 18.2 归纳 :“类型 AND 类型”
然 而 , 归 纳 还 有 第 三 种 情 况 , 即 : “ 这 一 类 型 或 那 一 类 型 ” 和 “ 这 一 类 型 和那 一 类 型 ” 同 时 存 在 。 如 图 18.3 所 示 , 在 这 种 综 合 性 的 情 况 下 , outlet 可 能是 一 个 reporting oulet 或 nonreporting outlet 和 一 个 distributor outlet 。
接 下 来 我 们 研 究 如 何 设 计 数 据 库 , 让 我 们 来 看 一 下 , Enterprise Manager 将 给 数 据 库 设 计 带 来 多 大 的 方 便 。
图 18.3 归纳 :“类型 OR 类型”和 “类 型 A N D 类型”
- 如 何 创 建 数 据 库
创 建 数 据 库 最 为 简 单 的 方 法 是 使 用 Enterprise Manager , 运 行 Create Database Wizard。 方 法 如 下 :
- 从 Windows start 菜 单 中 的 SQL Server 程 序 组 中 选 择 SQL Server
Enterprise Manager 。
-
展 开 Server Group , 然 后 展 开 Enterprise Manager 层 次 树 中 的
SQL Server 。
-
从 Microsoft Management Console 中 的 Help Menu 中 , 选 择 Wizards
, 就 会 看 到 wizards 清 单 ( 如 图 18.4 所 示 ) 。 可 以 从 该 清 单 中 进 行 选 择 。
-
双 击 Create Database Wizard 选 项 , 并 回 答 向 导 所 提 出 的 问
题 , 按 照缺 省 值 或 输 入 用 户 个 人 的 参 数 。
也 可 以 使 用 CREATE DATABASE Transact-SQL 语 句 。本 书 第 21 章 将 详 细 介 绍 CREATE DATABASETransact-SQL 语 句 。
图 18.4 选择向导对话框
- 特 大 型 数 据 库 ( VLDB)
SQL Server 的 许 多 方 面 在 处 理 特 大 型 数 据 库 时 会 发 生 一 些 变 化 , 以 适 应 特大 型 数 据 库 的 特 殊 需 要 。
这 种 变 化 无 疑 使 得 SQL Server 在 备 份 、 在 增 量 备 份 具 有 更 大 优 势 , 并 且 使
得 SQL Server 能 够 只 对 一 个 文 件 或 文 件 组 进 行 修 改 , 而 不 必 变 动 整 个 数 据 库 。SQL Server 的 这 种 优 势 和 能 力 对 特 大 型 数 据 的 管 理 是 非 常 有 利 的 。 如 果 用 户 要将 一 个 特 大 型 数 据 库 备 份 到 一 张 磁 盘 上 , 就 可 以 从 重 新 起 动 备 份 文 件 或 修 复 两者 之 中 进 行 选 择 。
Database Consistency Checker 已 经 完 成 了 一 项 重 要 功 能 的 提 高 工 作 。 对特 大 型 数 据 库 的 管 理 正 是 这 一 改 变 的 主 要 目 的 。 SQL Server 7 的 运 用 对 大 型 数据 库 的 管 理 有 益 无 害 。
- 编 码 技 巧
在 编 码 过 程 中 , 有 一 条 技 巧 是 应 当 掌 握 的 , 即 在 使 用 SQL Server 时 , 应 充分 发 挥 存 储 过 程 的 作 用 , 而 不 应 在 应 用 码 中 使 用 Transact-SQL 。
使 用 存 储 过 程 的 好 处 很 多 , 其 中 包 括 : 它 们 为 模 块 化 程 序 设 计 提 供 关 键 字 。因 而 我 们 可 以 建 立 存 储 过 程 , 将 其 存 储 在 数 据 库 中 的 syscomments 系 统 表 中 ,
在 使 用 时 调 用 它 。 对 存 储 过 程 进 行 修 改 时 , 不 必 重 新 编 辑 应 用 码 , 也 不 必 在 成千 条 编 码 中 搜 寻 那 些 因 数 据 库 设 计 的 变 化 而 需 改 动 的 Transact-SQL 编 码 。
Transact-SQL 码 已 经 过 了 分 析 和 优 化 , 因 而 运 行 十 分 快 捷 。 如 果 有 人 在 最近 时 间 内 调 用 存 储 程 序 , 则 查 询 规 划 会 被 保 存 在 内 存 中 。 另 一 方 面 , 那 些 来 自于 被 嵌 入 应 用 码 的 客 户 机 的 Transact-SQL , 每 次 通 过 网 络 传 送 到 SQL Server 中 使 用 时 , 都 要 经 过 编 译 和 优 化 。 存 储 过 程 减 少 了 网 络 信 息 量 。 除 此 之 外 , 存储 过 程 可 以 作 为 安 全 性 设 计 的 一 部 分 。 因 为 客 户 可 以 不 必 使 用 特 殊 查 询Transact-SQL 语 句 即 可 运 行 存 储 过 程 。
- 索 引
索 引 的 建 立 加 速 了 对 数 据 库 的 数 据 查 询 。 索 引 可 以 只 含 有 一 列 , 也 可 以 是多 列 的 组 合 体 。 SQL Server 索 引 分 两 大 类 :
-
聚 簇 索 引
-
非 聚 簇 索 引
聚 簇 索 引 是 指 : 按 照 索 引 中 所 包 含 的 列 排 序 , 并 将 经 过 排 序 的 数 据 安 排 好 的顺 序 存 入 表 格 之 中 。 因 为 行 是 经 过 排 序 的 , 包 含 这 样 的 行 的 实 体 只 能 有 一 个 。所 以 , 每 个 表 格 只 能 有 一 个 聚 簇 索 引 。 数 据 行 是 索 引 的 一 部 分 。 除 了 那 些 很 小的 表 格 外 , 每 个 表 格 都 应 该 有 一 个 聚 簇 索 引 , 而 且 最 好 是 以 主 关 键 字 建 立 的 聚
簇 索 引 。
而 在 非 聚 簇 索 引 中 , 数 据 行 不 是 索 引 的 一 部 分 。 非 聚 簇 索 引 中 , 表 格 中 的每 一 行 数 据 都 放 置 了 指 针 。 非 聚 簇 索 引 的 效 率 不 及 聚 簇 索 引 , 但 是 它 非 常 适 合作 表 格 浏 览 , 以 及 在 表 格 中 查 询 满 足 某 些 条 件 的 行 。
索 引 可 以 按 以 下 两 种 方 式 定 义 :
-
唯 一 索 引
-
非 唯 一 索 引
唯 一 索 引 是 指 索 引 关 键 字 段 的 各 行 无 相 同 数 值 。 而 非 唯 一 索 引 相 反 , 它 允许 索 引 关 键 字 段 各 行 有 相 同 的 值 。
下 列 语 句 可 以 用 来 创 建 索 引 :
-
CREATE INDEX 语 句
-
CREATE TABLE 语 句 , PRIMARY KEY 子 句
-
CREATE TABLE 语 句 , UNIQUE 子 句
-
CREATE TABLE 语 句 , PRIMARY KEY 子 句
-
CREATE TABLE 语 句 , UNIQUE 子 句
如 果 数 据 已 经 被 排 序 , 可 以 使 用 CREATE INDEX 中 的 SORTED_DATA 或SORTED_DATA_REORG 选 择 。
这 种 选 择 可 以 提 高 建 立 聚 簇 索 引 的 速 度 。 填 充 度 决 定 着 在 非 聚 簇 索 引 的 索
引 页 上 , 或 聚 类 索 引 的 数 据 页 上 , 每 一 个 索 引 项 目 之 间 的 间 距 。 如 果 数 据 库 需要 经 常 增 删 数 据 , 则 建 立 索 引 时 就 使 用 低 填 充 度 ; 如 果 数 据 库 是 只 读 性 的 , 则 建立 索 引 时 就 使 入 高 填 充 度 。 填 充 度 并 非 永 久 不 变 的 。 索 引 会 长 期 地 保 持 一 定 的
密 度 , 并 在 索 引 重 新 建 立 之 前 保 持 不 变 。以 下 是 关 于 索 引 的 几 点 注 意 事 项 :
-
较 小 的 索 引 比 含 有 多 个 列 的 较 大 索 引 运 行 速 度 快 。 而
整 数 或 IDENTITY 关 键 字 是 最 快 的 。
-
如 果 一 个 索 引 的 第 一 列 未 在 WHERE 子 句 中 被 引 用 , 则
SQL Server 将 不能 使 用 这 个 多 列 的 复 合 性 索 引 。
-
作 为 索 引 关 键 字 的 列 中 最 好 无 重 复 值 。 否 则 运 行 结 果 只 能 是 表 格 浏 览 。
-
研 究 用 户 查 询 记 录 的 方 式 , 选 择 效 率 较 高 的 聚 簇 索 引
的 最 佳 位 置 和 用 途 。尽 可 能 不 使 用 非 聚 簇 索 引 。
索 引 调 整 是 增 强 数 据 库 功 能 的 主 要 途 径 。 Microsoft SQL Server 在 Query Analyzer 中 提 供 了 Index Tuning Wizard 。 它 是 一 个 与 Enterprise Manager 中的 Tools 菜 单 选 择 下 的 isql / w 相 似 的 窗 口 。Index Tuning Wizard 与 SQL Server Profiler 结 合 使 用 , 可 以 用 来 分 析 用 户 运 用 SQL Server Profiler 工 具 捕 捉 并运 用 的 工 作 负 荷 。 Index Tuning Wizard 可 以 针 对 不 同 数 据 库 向 用 户 推 荐 最 佳的 索 引 排 列 方 法 。 在 第 7 章 中 , 我 们 对 Index Tuning Wizard 已 作 过 详 细 说 明 。
- 分 区
大 型 表 格 存 在 着 运 行 不 便 的 问 题 。 将 一 个 数 据 库 划 分 为 几 个 较 小 的 表 格 , 则 能 够 缩 短 查 询 时 间 。 而 且 , 较 小 的 表 格 索 引 的 重 建 也 更 快 捷 。
如 果 表 格 不 易 被 分 解 , 则 可 以 将 不 同 的 表 格 分 别 置 于 不 同 的 磁 盘 轨 道 上 。这 样 做 的 目 的 在 于 , 同 时 运 用 多 个 驱 动 器 同 时 读 取 资 料 。 SQL Server 中 有 一 个新 的 文 件 组 功 能 。 使 用 这 个 功 能 可 以 将 多 个 表 格 进 行 物 理 划 分 , 分 置 于 不 同 驱动 器 之 中 。 之 后 , 通 过 多 个 驱 动 器 , 运 用 磁 盘 阵 列 将 表 格 分 解 。
水 平 分 区
水 平 分 区 指 将 一 个 大 表 格 分 解 成 几 个 具 有 相 同 结 构 的 小 表 格 。 水 平 分 区 可以 依 据 月 份 、 字 母 顺 序 或 其 他 任 何 数 据 的 自 然 因 素 。 划 分 表 格 后 , 数 据 查 询 所需 进 入 的 表 格 越 少 越 好 。 这 样 可 以 避 免 分 解 表 格 的 过 分 联 合 , 使 分 解 后 的 表 格不 致 回 复 成 为 一 个 大 表 。
垂 直 分 区
垂 直 分 区 是 通 过 规 范 化 和 行 的 分 割 实 现 的 。 行 的 分 割 是 将 一 个 大 表 格 划 分成 几 个 含 较 少 列 的 小 表 格 。 分 解 后 的 两 个 表 格 的 行 相 连 接 , 即 得 到 与 分 解 并 的大 表 格 相 同 的 行 。
垂 直 分 区 同 样 可 以 减 少 查 询 所 需 访 问 的 数 据 。 如 果 一 个 大 表 格 中 只 有 少 数几 列 是 常 用 的 , 就 可 以 将 那 些 不 常 用 的 列 置 于 另 一 个 表 格 之 中 。 划 分 表 格 可 以使 大 表 格 的 运 行 变 得 快 捷 。
- 并 发 性
并 发 性 是 指 , 在 多 用 户 同 时 访 问 数 据 时 , 通 过 锁 定 保 持 事 务 完 整 性 的 功 能 。为 大 量 并 发 用 户 开 发 的 系 统 , 最 好 能 在 一 段 时 间 内 保 持 事 务 。 排 他 型 锁 可 以 起到 这 一 作 用 , 它 可 以 阻 止 其 他 事 务 读 取 表 中 的 数 据 , 直 到 当 前 的 事 务 被 确 认 或滚 回 时 为 止 。
排 他 型 在 事 务 被 确 认 或 被 滚 回 之 前 一 直 起 作 用 。 事 务 阻 隔 标 准 装 置 可 以 确
定 SELECT 语 句 能 否 获 取 排 他 型 锁 。 有 些 情 况 下 , 锁 定 是 不 必 要 的 。 例 如 : 开 发人 员 需 要 输 入 数 据 , 或 在 某 一 事 务 处 理 中 需 浏 览 更 多 的 数 据 , 或 者 试 图 在 某 一事 务 的 处 理 中 进 入 更 多 的 非 必 要 进 入 的 数 据 。 这 些 情 况 下 , 就 应 选 用 可 读 的 较低 阻 隔 标 准 。 保 持 事 务 的 完 整 性 和 允 许 更 多 开 发 用 户 进 入 数 据 行 , 两 者 都 是 很重 要 的 。 阻 隔 标 准 就 是 为 了 协 调 两 者 的 矛 盾 而 设 置 的 。 标 准 越 高 , 则 允 许 存 在的 阻 隔 越 多 , 限 制 锁 定 越 多 。 阻 隔 标 准 越 低 , 则 相 反 。
阻 隔 标 准 由 低 到 高 排 列 如 下 所 示 :
-
READ UNCOMMITTED
-
READ COMMITTED
-
REPEATABLE READ
-
SERIALIZABLE
在 第 21 章 中 , 有 对 SET TRANSACTION ISOLATION LEVEL Transact-SQL 语句 的 详 细 介 绍 和 用 法 讲 解 。 如 果 一 个 数 据 在 使 用 的 同 时 难 以 变 更 , 则 应 指 出 在
使 用 游 标 时 , 于 何 处 设 置 游 标 阻 隔 标 准 更 有 意 义 。
在 隐 含 事 务 模 式 下 处 理 某 一 事 务 时 , COMMIT 或 ROLLBACK 后 , 将 产 生 新 的 事务 , 而 用 户 可 能 觉 察 不 到 这 一 新 事 务 的 产 生 。 很 多 情 况 下 , 用 户 都 意 识 不 到 自己 正 在 要 求 正 在 处 理 某 一 事 务 的 其 他 用 户 输 入 数 据 。 为 避 免 隐 式 事 务 模 式 可 能带 来 的 不 便 , 可 以 在 COMMIT 或 ROLLBACK 之 后 , 在 编 码 中 使 用 Transact-SQL 语句 , 将 隐 式 事 务 模 式 设 置 到 OFF 状 态 。 下 列 任 何 一 个 Transact-SQL 语 句 都 可 以起 到 这 一 作 用 :ALTER TABLE 、 FETCH 、 REVOKE 、 CREATE 、 GRANT 、SELECT 、DELETE 、INSERT 、 TRUNCATE 、 TABLE 、 DROP 、 OPEN 、 UPDATE 等 。 而 COMMIT 或 ROLLBACK
可 以 关 闭 事 务 。
本 章 中 , 讨 论 了 有 关 开 发 的 话 题 。 下 一 章 中 , 将 讨 论 如 何 书 写 Transact-SQL 查 询 、 存 储 过 程 以 及 触 发 器 。
第 19 章 Transact-SQL 的 使 用
本 章 将 讨 论 如 何 使 用 Transact-SQL 。 它 即 是 一 条 非 常 简 单 的 也 是 非 常 有 用的 查 询 语 句 。 并 且 Transact-SQL 的 查 询 书 写 也 很 简 单 。 使 用 SQL Server Query Analyzer 即 可 以 键 入 简 单 的 查 询 命 令 并 能 得 到 结 果 集 。从 Microsoft SQL Server 程 序 组 或 Enterprise Manager 中的 Tools 菜 单 中 可 以 进 入 Quary Analyzer 。要 了 解 更 多 的 有 关 SQL Server 7 的 安 装 问 题 , 请 参 照 本 书 第 11 章 。
在 对 SQL Server 有 了 初 步 了 解 之 后 , 即 可 着 手 编 写 较 复 杂 的 查 询 语 句 , 接下 来 的 几 节 中 , 将 讨 论 与 Transact-SQL 相 关 的 如 下 主 题 :
-
编 写 查 询 语 句
-
编 写 存 储 过 程
-
编 写 触 发 器
-
快 捷 、 大 量 的 输 入 / 输 出
-
查 询 处 理 器
-
多 索 引 查 询
-
SHOWPLAN
-
表 格 连 接
-
Tempdb
-
游标
-
重 新 编 译 存 储 过 程
-
异 构 型 分 布 式 查 询
SQL Server 所 安 装 的 目 录 下 提 供 了 可 供 使 用 的 范 本 程 序 。 下 文 将 首 先 讨 论第 一 个 主 题 — — 编 写 查 询 语 句 。
- 编 写 查 询 语 句
Transact-SQL SELECT 语 句 连 带 一 个 WHERE 子 句 , 就 构 成 一 个 最 简 单 、 最 有效 的 查 询 语 句 。 下 面 是 一 个 使 用 SELECT 语 句 的 简 单 例 子 :
SELECT*
FROM MyAccountTable
WHERE Past_Due_Amt > 100000
在 本 例 中 , * 表 示 “取 MyAccountTable 中 所 有 的 列 和 列 中 的 数 值 ”。
通 过 这 个 简 单 的 查 询 , 可 以 得 到 许 多 相 关 的 重 要 信 息 。 而 从 所 得 到 的 信 息中 , 又 可 以 得 到 更 为 重 要 的 、 进 一 步 的 信 息 。 如 本 例 查 询 所 得 的 结 果 集 中 , 有一 个 Customer ID 列 。 我 们 可 以 得 到 该 列 的 值 , 也 可 以 运 用 以 下 这 个 类 似 的 查询 语 句 , 查 找 到 CustomerName( 客 户 姓 名 ) 和 电 话 号 码 :
SELECT*
FROM CustomerTable
WHERE CustomerID = 3876098
本 例 中 的 这 个 命 令 很 可 能 帮 助 用 户 直 接 找 到 客 户 姓 名 和 电 话 号 码 。 即 使 不能 , 它 也 会 给 用 户 提 供 一 些 信 息 , 提 示 客 户 电 话 号 码 所 在 的 表 格 。 根 据 提 示 , 可 以 使 用 SELECT 语 句 继 续 查 询 。
使 用 下 述 语 句 , 可 以 看 到 数 据 库 中 所 有 用 户 定 义 表 格 的 名 称 , 并 查 询 其 内容 。
SELECT name FROM sysobjects
WHERE type = ′ U ′
ORDER BY name
在 本 例 中 , 在 sysobjects 系 统 表 中 , 列 type 中 是 U 的 对 象 是 一 个 用 户 定义 的 表 格 。 那 些 具 有 相 同 名 称 的 列 , 且 该 列 的 值 相 同 的 表 格 是 相 互 连 接 的 , 这种 连 接 叫 做 关 系 。
查 询 是 Transact-SQL 中 最 有 趣 味 的 部 分 。 它 的 形 式 可 以 是 最 为 简 单 的 , 但却 非 常 有 效 , 而 且 , 在 实 际 使 用 中 , 查 询 也 可 以 变 得 相 当 复 杂 。 因 此 , 无 论 对于 初 学 者 还 是 专 家 , 它 都 同 样 具 有 挑 战 性 和 趣 味 性 。
下 一 节 中 , 将 讨 论 如 何 编 写 存 储 过 程 。
- 编 写 存 储 过 程
像 查 询 一 样 , 最 简 单 的 存 储 过 程 非 常 容 易 书 写 , 但 也 是 非 常 有 效 的 。 存 储过 程 实 质 就 是 经 过 编 辑 , 并 被 存 入 数 据 库 之 中 的 Transact-SQL 语 句 。 它 的 运 行速 度 非 常 快 , 因 为 在 调 用 存 储 程 序 时 , 语 句 编 辑 和 分 析 过 程 并 不 出 现 。
存 储 过 程 的 另 一 个 优 势 是 : 它 们 集 中 存 储 在 一 个 中 心 部 分 , 而 不 是 分 散 在 整个 应 用 程 序 的 编 码 之 中 。 当 用 户 的 事 务 规 则 变 更 时 , 只 需 在 一 个 地 方 寻 找Transact-SQL 编 码 并 修 改 它 即 可 。 存 储 过 程 是 一 种 数 据 库 对 象 。
下 面 是 一 个 简 单 的 存 储 过 程 的 例 子 : CREATE PROCEDURE MajorPastDue A S
SELECT*
FROM MyAccountTable
WHERE Past_Due_Amt > 100000 G O
在 例 子 中 , 在 上 节 讲 过 的 SELECT 语 句 中 增 加 了 一 个 CREATE PROCDVRE AS
语 句 。 CREATE PROCDVRE 语 句 可 以 将 一 系 列 Transact-SQL 语 句 作 为 一 个 数 据 库对 象 来 创 建 , 并 将 它 存 储 在 数 据 库 之 中 。
下 一 个 例 子 将 展 示 如 何 调 用 上 例 所 创 建 的 存 储 过 程 :
EXECUTE MajorPastDue
运 用 本 例 中 提 供 的 语 句 , 可 以 调 用 上 例 所 创 建 的 存 储 过 程 , 得 到 SELECT 语句 运 行 所 得 的 结 果 集 。
下 面 , 我 们 研 究 略 为 复 杂 的 存 储 过 程 。 用 户 可 以 使 用 局 部 变 量 和 参 数 将 信息 传 递 到 存 储 过 程 中 ,也 可 以 从 一 个 存 储 过 程 中 调 用 其 他 存 储 过 程 。使 用 OUTPUT
选 择 , 可 以 将 变 量 从 一 个 存 储 过 程 传 送 到 另 一 个 正 在 被 调 用 的 存 储 过 程 中 。 下面 是 一 个 较 为 复 杂 的 存 储 过 程 的 例 子 :
CREATE PROCEDURE ProcWithParm @ customer_id int
A S
SELECT Customer_Name FROM Customer
WHERE Customer_ID = @customer_id
在 本 例 中 , 客 户 的 姓 名 被 反 馈 回 来 , 客 户 ID 被 传 送 到 存 储 过 程 之 中 。下 面 一 个 例 子 将 展 示 如 何 调 用 一 个 带 有 参 数 的 存 储 过 程 。
EXECUTE ProcWithParm 10034
在 本 例 中 ,上 例 所 创 建 的 名 为 ProcwithParm 的 存 储 过 程 被 调 用 ,客 户 ID10034 作 为 一 个 自 变 量 或 参 数 被 传 送 到 存 储 过 程 之 中 。
下 面 一 个 例 子 中 的 存 储 过 程 更 长 、 更 复 杂 。 它 需 要 与 游 标 共 同 运 行 。 并 且 ,
数 据 库 的 每 个 表 格 均 需 运 行 UPDATE STATISTICS 命 令 。
/ ************************************
Description: UpdStatsAll is a stored procedure that uses a cursor to run Update Statistics on every table in the database.
Execute this stored procedure in a user database.
************************************* /
IF EXISTS (SELECT * FROM sysobjects
WHERE id = object_id ( ′ dbo.UpdStatsAll ′ ) ANDtype = ′ P ′ )
BEGIN
END G O
PRINT ′ Create Procedure UpdStatsAll′
G O
CREATE PROCEDURE UpdStatsAll
A S
DECLARE @table_name varchar(128),
@ table_name_msg varchar(95), @ errmsg varchar(85)
SELECT ′ Starting Update Statistics ′ ,getdate()
DECLARE cursor1 CURSOR FOR SELECT name
FROM sysobjects WHERE type = ′ U ′ ORDER BY name
OPEN cursor1
FETCH NEXT FROM cursor1 INTO @table_name WHILE(@@FETCH_status<> -1) BEGIN
IF (@@FETCH_status<> -2) BEGIN
SELECT @table_name_msg = ′ System is running Update Statistics on ′+
RTRIM(@table_name)
PRINT @ table_name_msg
EXEC( ′ UPDATE STATISTICS ′+ @ table_name) END
ELSE
BEGIN
SELECT @errmsg = ′ FETCH error has occurred.′ GOTO err_rtn
END
FETCH NEXT FROM cursor1 INTO @table_name
END
SELECT ′ Finished with Update Statistics ′ , getdate() DEALLOCATE cursor1
RETURN
err_rtn:
DEALLOCATE cursor1 RAISERROR 500000 @errmsg
RETURN - 100
G O
- 编 写 触 发 器
触 发 器 实 质 上 是 一 种 特 殊 的 存 储 过 程 。 当 表 中 运 行 INSERT 、UPDATE 、DELETE 命 令 时 , 触 发 器 会 自 动 被 激 活 , 发 挥 一 些 特 殊 作 用 。 下 述 例 子 将 展 示 当 表 中 运行 INSERT 、 UPDATE 或 DELETE 命 令 时 , 如 何 发 送 一 封 电 子 邮 件 。
IF EXISTS (SELECT name FROM sysobjects
WHERE name = ′ CustChgTr′ AND type = ′ TR ′ ) DROP TRIGGER CustChgTr
G O
CREATE TRIGGER CustChgTr
ON Customer
FOR INSERT, UPDATE, DELETE
A S
EXEC master..xp_sendmail ′ CUSTSERV ′ ,
′ The data in the customer table has changed.′ G O
本 例 中 , 当 表 格 Customer 中 的 数 据 变 更 时 , 电 子 邮 件 被 发 送 到 别 名 为
CUSTSERV 的 表 格 Customer Service 中 去 。
触 发 器 的 另 一 个 重 要 作 用 是 建 立 起 了 虚 拟 表 格 的 概 念 。 虚 拟 表 格 是 一 个 带有 触 发 器 的 表 格 的 拷 贝 。 当 该 表 格 增 删 数 据 时 , 表 格 的 触 发 器 可 以 按 编 定 的 程序 被 激 活 。 下 例 展 示 表 格 被 插 入 数 据 时 , 触 发 器 是 如 何 被 激 活 的 :
IF EXISTS (SELECT name FROM sysobjects WHERE name = ′ reminder′ AND type = ′ TR ′ ) DROP TRIGGER reminder
G O
CREATE TRIGGER MyTrigger ON MyTable
FOR INSERT, UPDATE
A S
DECLARE @MyFlag tinyint SELECT @MyFlag = d .Disc_Type
FROM Artist a INNER JOIN inserted i ON a.art_id = i.art_ID JOIN Discipline d ON d.disc_id = i.disc_id
IF (@MyFlag = 0 )
BEGIN
RAISERROR ( ′ This artist does not have a discipline.′ ,16,-1) ROLLBACK TRANSACTION
END
在 本 例 中 , 插 入 数 据 的 表 格 被 查 看 后 , 触 发 器 被 激 活 。 本 例 同 样 适 用 于 运行 UPDATE 和 DELETE 命 令 的 表 格 。
当 一 个 触 发 器 中 的 同 一 个 表 格 第 二 次 更 改 时 , 触 发 器 不 能 激 活 它 自 己 , 除非 用 户 设 置 了 Resursive Triggers( 重 复 触 发 器 ) 选 择 。 使 用 sp_dboption 语 句可 以 设 置 这 种 数 据 库 选 择 。 重 复 触 发 器 功 能 是 SQL Server 7 新 增 设 的 功 能 。
- 快 捷 、 大 型 的 输 入 / 输 出
SQL Server 7 版 本 增 设 了 快 捷 、 大 型 输 入 / 输 出 功 能 , 这 是 该 版 本 在 技 术上 的 主 要 进 步 。 它 将 SQL Server 带 入 21 世 纪 。 Microsoft 在 设 计 中 强 调 可 扩展 性 和 运 行 性 能 — — 除 了 大 力 增 加 I / O 水 平 外 ,还 有 什 么 更 能 实 现 这 一 目 标 呢 ? 此 版 本 中 , 输 入 / 输 出 的 页 数 大 大 增 加 , 并 实 现 了 并 行 I / O 。
大 型 I/ O
8KB 的 I / O 量 , 在 页 数 上 是 2KB 的 4 倍 , 所 占 盘 区 也 是 2KB 的 4 倍 ; 同 样 ,
64KB 的 页 数 和 所 占 盘 区 也 是 16KB 的 4 倍 。
快 捷 的 I/ O
快 捷 的 I / O 被 概 念 化 , 使 得 查 询 处 理 器 成 为 数 据 pump 的 功 能 得 以 实 现 。运 用 快 捷 的 I / O , 我 们 可 以 处 理 大 型 I / O , 和 大 量 的 超 前 读 内 容 ( 为 实 现 查 询目 的 , 超 前 读 的 页 数 已 被 存 放 在 高 速 缓 冲 存 储 器 中 ) , 也 可 以 进 行 物 理 行 序 的 数据 浏 览 , 并 从 文 件 上 读 取 并 行 I / O 。 其 中 超 前 阅 读 既 适 用 于 聚 簇 索 引 , 也 适 用于 非 聚 簇 索 引 。 超 前 阅 读 由 查 询 处 理 器 驱 动 , 对 随 后 所 需 的 页 的 内 容 加 以 提 示 。
- 多 索 引 查 询
在 SQL Server 7 版 本 中 , 通 过 索 引 交 叉 进 行 查 询 。 每 个 表 格 可 以 使 用 多 个索 引 , 这 些 被 同 时 使 用 的 索 引 中 写 有 共 同 的 行 指 示 器 , 因 而 SQL Server 可 以 将这 些 索 引 进 行 连 接 , 在 短 时 间 内 反 馈 所 需 的 结 果 集 , 这 样 就 增 强 了 查 询 功 能 。
- 查 询 处 理 器
SQL Server 7 版 本 中 , 查 询 处 理 器 的 运 行 与 以 前 版 本 有 所 不 同 。 在 此 版 本中 , 它 用 以 支 持 特 大 型 数 据 库 和 复 杂 的 查 询 。 本 版 本 中 , 增 加 了 新 的 运 行 技 巧 , 如 : 散 连 , 散 合 计 连 接 以 及 合 并 连 接 技 巧 。这 些 技 巧 与 传 统 的 嵌 套 循 环 连 接 相 比 , 使 用 更 方 便 、 效 果 更 好 , 并 能 适 应 较 大 型 数 据 库 的 要 求 。
多 索 引 的 索 引 交 叉 和 联 合 能 够 在 检 索 之 前 对 数 据 进 行 过 滤 。 表 格 的 所 有 索
引 可 以 被 同 时 更 新 , 各 种 约 束 也 将 在 查 询 程 序 设 计 中 被 加 以 考 虑 。
成 本 模 式 的 改 进 和 编 译 时 间 的 增 强 使 得 查 询 规 则 有 了 大 幅 度 的 发 展 。 下 一节 中 , 将 讲 解 SHOWPLAN 功 能 , 看 一 看 查 询 处 理 器 是 如 何 运 行 的 。
19.7SHOWPLAN
SQL Server 7 将 SHOWPLAN 置 于 Query Analyzer 工 具 中 一 个 显 著 的 位 置 , 以 突 出 它 的 功 能 。在 Query Analyzer 窗 口 中 键 入 一 个 查 询 命 令 ,选 择 SQL Server Query Analyzer 中 的 Execution Plan 标 签 , 调 出 SHOWPLAN , 就 能 看 到 查 询 处理 器 是 如 何 进 行 数 据 查 询 的 。
在 SQL Server 7 中 , 一 条 查 询 命 令 可 以 在 32 个 表 格 中 被 执 行 。 内 部 工 作
表 格 也 不 再 局 限 在 16 个 。 如 果 希 望 信 息 以 文 本 形 式 而 非 图 表 形 式 反 馈 , 也 可 以使 用 Transact-SQL 语 句 来 运 行 SHOWPLAN 来 实 现 。 但 是 , 如 果 设 置 了SHOWPLAN_TEXT 或 SHOWPLAN_ALL 状 态 , 则 不 能 再 进 行 查 询 , 相 反 地 , 用 户 将 看到 查 询 执 行 规 化 是 如 何 被 查 询 优 化 器 格 式 化 的 。
下 面 的 SHOWPLAN 命 令 范 例 展 示 了 如 何 运 行 查 询 命 令 , 以 得 到 文 本 形 式 的 数
据 :
SET SHOWPLAN_TEXT ON
本 例 中 , Transact-SQL 语 句 被 执 行 后 , 即 可 看 到 数 据 以 可 读 文 本 形 式 输 出 。下 面 是 一 个 类 似 的 例 子 :
SET SHOWPLAN_ALL ON
19.7.1 SHO WPLAN 树
SHOWPLAN_TEXT 和 SHOWPLAN_ALL 都 是 展 示 查 询 执 行 规 化 的 Transact-SQL 语句 。 当 SHOWPLAN_TEXT 或 SHOWPLAN_ALL 语 句 被 设 置 在 ON 状 态 时 , 查 询 不 能 被执 行 。 此 时 查 询 优 化 器 反 馈 回 来 的 , 是 详 尽 的 查 询 执 行 规 化 。
如 果 输 入 的 是 一 个 存 储 过 程 或 Transact-SQL 语 句 , 它 会 将 自 己 作 为 树 根 建
立 , 而 被 该 存 储 过 程 调 用 的 语 句 则 作 为 树 枝 。
如 果 输 入 的 是 一 个 Data Manipulation Language(DML) 语 句 , 例 如 SELECT 、INSERT 、 DELETE 或 UPDATE , 则 这 些 语 句 将 作 为 树 根 , 并 可 以 带 有 两 个 分 枝 : 执行 规 划 和 触 发 器 。
SHOWPLAN 将 条 件 语 句 , 如 IF ELSE 划 分 为 三 个 分 枝 。 IF ELSE 语 句 作 为树 根 , if 条 件 句 作 为 它 的 子 树 分 枝 , then 和 else 条 件 句 点 是 作 为 一 个 程 序 块被 使 用 ;WHILE 和 DO-UNTIL 语 句 有 相 似 的 三 枝 规 化 。
查 询 引 擎 , 如 : 表 格 的 浏 览 、 连 接 、 集 合 等 执 行 的 操 作 作 为 树 的 枝 , 每 个 分枝 都 包 含 一 定 的 信 息 , 例 如 : 相 关 的 代 数 运 算 符 和 这 些 代 表 运 算 符 的 算 法 ( 如 无效 数 据 连 接 、 合 并 连 接 、 嵌 入 循 环 等 ) 。 这 些 运 算 所 占 的 字 节 数 可 以 被 显 示 出 来 , 优 化 器 将 选 择 占 用 字 节 最 少 的 一 种 方 案 。
OPEN CURSOR 语 句 作 为 树 根 , 并 带 有 其 他 语 句 作 为 树 枝 。下 一 节 中 , 将 讨 论 有 关 表 格 连 接 的 问 题 。
19.8 表 格 连 接
表 格 连 接 的 目 的 是 对 两 个 或 两 个 以 上 表 格 中 相 关 联 的 数 据 进 行 检 索 。 它 是通 过 比 较 两 个 或 两 个 以 上 表 格 中 的 数 据 , 并 用 表 格 中 相 匹 配 的 行 组 成 一 个 新 的表 格 来 完 成 的 。 那 些 符 合 连 接 条 件 的 相 匹 配 的 行 , 是 通 过 在 每 个 表 格 的 两 列 之间 使 用 逻 辑 运 算 符 , 如 < , = 或 > 来 进 行 选 择 的 。
在 表 格 连 接 时 需 要 使 用 WHERE 子 句 。 WHERE 子 句 包 含 着 一 个 连 接 符 号 , 例 如等 号 。 并 且 , 在 WHERE 子 句 中 通 常 要 给 出 两 个 被 连 接 的 表 格 的 名 称 。 在 使 用 等号 的 情 况 下 , 则 反 馈 回 来 的 列 每 一 行 的 值 都 相 等 。 如 果 连 接 中 未 使 用 WHERE 子句 , 则 会 产 生 笛 卡 尔 乘 积 。 也 就 是 说 , 参 加 连 接 的 所 有 表 格 的 所 有 行 的 任 何 一种 可 能 的 组 合 方 式 都 出 现 。 此 种 情 况 下 , 反 馈 回 来 的 行 数 多 于 用 户 查 询 所 需 的结 果 。 也 可 以 在 WHERE 子 句 中 使 用 关 系 运 算 符 来 连 接 表 格 。 使 用 ANSI 样 式 语 句连 接 表 格 时 , 有 一 种 新 的 功 能 , 使 用 户 可 以 使 用 嵌 入 的 外 连 接 , 或 嵌 于 一 个 外连 接 中 的 内 连 接 。
连 接 的 类 型 包 括 :
内 连 接 是 一 种 常 用 的 , 使 用 比 较 运 算 符 ( 例 如 ,=) 的 连 接 方 式 。 其 结果 是 , 在 两 个 被 连 接 的 表 格 中 , 只 有 那 些 符 合 比 较 条 件 的 行 被 显 示 出 来 。
外 连 接 包 括 左 外 连 接 、 右 外 连 接 和 全 ( 外 ) 连 接 , 稍 后 将 分 别 对 它 们
作 详 细 说 明 。
交 叉 连 接 交 叉 连 接 产 生 两 个 表 格 的 各 组 的 交 叉 乘 积 。 反 馈 回 来 的 结 果与 无 WHERE 子 句 的 传 统 非 ANSI 样 式 相 同 。
外 连 接 的 方 式 包 括 :
左 外 连 接 使 用 左 外 连 接 时 , JOIN 子 句 中 第 一 个 表 格 的 所 有 行 均 被 反馈 回 来 ,而 第 二 个 表 格 中 那 些 没 有 与 第 一 个 表 格 相 匹 配 的 值 的 行 ,则 被 赋 NULLS 。
右 外 连 接 使 用 右 外 连 接 时 , JOIN 子 句 中 第 二 个 表 格 的 所 有 行 均 被 反
馈 回 来 ,而 第 一 个 表 格 中 那 些 没 有 与 第 二 个 表 格 相 匹 配 的 值 的 行 ,则 被 赋 NULLS 。
全 ( 外 ) 连 接 使 用 全 ( 外 ) 连 接 时 , 第 一 个 或 第 二 个 表 格 中 那 些 不 符 合 选择 条 件 的 行 均 被 选 出 来 , 对 应 表 格 的 列 中 被 赋 NULL 值 。
内 连 接 的 关 系 运 算 符 包 括 :
= 等 于
> 大 于
>= 大 于 或 等 于
< 小 于
<= 小 于 或 等 于
< > 不 等 于 (ANSI 标准 )
! > 不 大 于
! < 不 小 于
!= 不 等 于
LIKE 匹 配
NOT 不
OR 或 者
可 以 使 用 substring 函 数 , 通 过 比 较 第 一 个 字 符 、 列 的 长 度 来 连 接 文 本 和图 像 列 。 这 也 是 连 接 此 数 据 类 型 的 列 的 唯 一 方 法 。 查 询 处 理 器 的 新 的 连 接 技 术将 在 下 文 中 介 绍 : 合 并 连 接 和 散 列 连 接 。
合 并 连 接
合 并 连 接 是 一 种 新 的 连 接 方 式 。 当 查 询 优 化 器 收 到 一 个 对 有 序 排 列 的 数 据进 行 连 接 的 命 令 时 , 查 询 优 化 器 将 选 择 合 并 连 接 方 式 。 如 果 两 个 表 格 中 的 数 据都 是 按 连 接 关 键 字 排 序 的 , 或 要 求 按 照 聚 簇 关 键 字 排 序 , 在 这 两 种 情 况 下 , 等值 连 接 是 最 为 高 效 的 。
合 并 连 接 的 运 行 方 式 如 下 。 从 外 表 中 取 一 行 , 从 具 有 相 同 关 键 字 的 内 表 中寻 找 匹 配 行 。 如 找 到 , 则 将 该 行 反 馈 并 在 内 表 中 循 环 , 如 未 找 到 , 则 在 外 表 中循 环 。
散 列 连 接 是 7 版 本 中 查 询 优 化 器 中 另 一 个 新 的 内 容 。
散 列 连 接
当 表 格 无 索 引 , 或 无 需 按 序 输 出 数 据 , 且 连 接 为 等 值 连 接 时 , 可 以 采 用 一种 新 的 、 无 需 按 序 输 入 数 据 的 连 接 方 式 — — 散 列 连 接 。 查 询 命 令 被 格 式 化 , 并且 表 格 索 引 尚 未 建 立 时 , 它 被 用 以 进 行 特 定 查 询 。
散 列 连 接 连 接 方 法 如 下 ; 读 取 较 小 表 格 中 的 数 据 , 散 列 关 键 字 值 , 将 关 键 字和 行 ID 都 置 于 散 列 存 储 桶 中 , 之 后 循 环 , 直 至 较 小 表 格 的 末 行 。 接 下 来 , 读 取较 大 表 格 的 数 据 , hash 关 键 字 , 看 在 hash 存 储 桶 中 是 否 有 与 之 相 同 的 值 。 如果 有 , 将 关 键 字 及 行 ID 反 馈 回 来 , 之 后 循 环 , 直 至 外 表 末 行 。
查 询 优 化 器 所 具 有 的 最 后 一 种 连 接 类 型 是 嵌 套 循 环 连 接 。
嵌 套 循 环 连 接
嵌 套 循 环 连 接 是 在 以 往 的 SQL Server 版 本 中 已 存 在 的 传 统 的 连 接 方 式 。 当一 个 表 格 的 输 入 数 据 少 , 而 另 一 个 较 大 时 , 这 种 方 式 常 被 采 用 。 它 是 一 种 不 等值 连 接 。 在 合 并 和 散 列 不 能 适 用 的 情 况 下 , 亦 可 采 用 此 方 式 。
嵌 套 循 环 连 接 的 操 作 过 程 如 下 : 从 外 表 中 与 内 表 格 各 取 一 行 , 将 其 进 行 比较 。 如 其 相 匹 配 , 则 将 结 果 反 馈 回 来 ; 并 在 内 表 中 依 次 循 环 这 一 过 程 。 内 表 循 环结 束 后 , 返 回 第 一 行 , 继 续 在 外 表 中 循 环 。
19.9Tempdb
在 7 版 本 中 , 如 果 需 要 占 用 更 大 的 内 存 空 间 , 则 tempdb 系 统 数 据 库 会 自 动扩 展 。 而 在 下 一 次 SQL Server 启 动 时 , SQL Server 又 将 tempdb 系 统 数 据 库 恢复 成 原 来 的 大 小 。 tempdb 是 数 据 库 工 作 区 。 当 运 行 特 定 查 询 , 或 年 末 、 月 末 操作 过 程 中 tempdb 需 求 量 大 而 所 需 持 续 时 间 较 短 时 , 这 种 新 的 功 能 的 使 用 将 带 来很 大 的 便 利 。
- 游 标
确 切 地 说 , 游 标 应 被 称 为 卷 动 器 , 因 为 它 实 际 在 做 数 据 卷 动 的 工 作 。 游 标在 数 据 库 中 卷 动 数 据 , 使 上 行 、 下 行 、 相 关 或 绝 对 行 成 为 当 前 行 。 游 标 的 整 个语 法 框 架 是 类 似 的 , 有 几 种 不 同 的 类 型 。 使 用 游 标 的 最 简 单 的 程 序 如 下 例 所 示 。它 的 功 能 是 比 较 容 易 理 解 的 : 卷 动 那 些 执 行 SELECT 语 句 所 反 馈 回 来 的 数 据 。
DECLARE cursor1 CURSOR FOR SELECT name
FROM sysobjects WHERE type = ′ U ′ ORDER BY name OPEN cursor1
FETCH NEXT FROM cursor1 INTO @table_name
WHILE (@@FETCH_status <> -1) BEGIN
IF (@@FETCH_status <> -2)
BEGIN
SELECT @table_name_msg = " System is running Update Stat istics
ON " +
RTRIM(@table_name) PRINT @table_name_msg
EXEC ("UPDATE STATISTICS" + @table_name)
END ELSE BEGIN
SELECT @errmsg = ′ FETCH error has occurred. ′ GOTO err_rtn
END
FETCH NEXT FROM cursor1 INTO @table_name
END
SELECT "Finished with Update Statistics " ,getdate() DEALLOCATE cursor1
RETURN
err_rtn:
DEALLOCATE cursor1 RAISERROR 500000 @errmsg
RETURN -100
G O
在 本 例 中 , 执 行 SELECT FROM sysobjects 命 令 后 , 反 馈 回 一 系 列 数 据 。 通过 在 一 个 循 环 中 依 次 移 动 游 标 , 数 据 被 卷 动 。 通 过 卷 动 数 据 , 使 其 逐 行 显 示 , 就 可 以 对 数 据 进 行 某 些 处 理 。 在 本 例 中 , 是 获 取 用 户 定 义 表 格 的 名 称 , 之 后 对该 表 运 行 UPDATE STATISTICS 命 令 。 SQL Server 7 版 本 中 , 有 一 种 新 的 方 法 , 可 以 对 每 个 表 格 通 过 使 用 Database Maintance Plan 在 循 环 的 基 础 上 运 行 UPDATE STATISTICS 命 令 。
在 7 版 本 中 , 有 关 游 标 的 某 些 细 节 有 所 变 化 。 本 版 本 中 , 游 标 可 以 是 全 局的 , 也 可 以 是 局 部 的 。 局 部 游 标 只 在 一 定 范 围 内 有 效 , 在 范 围 外 将 被 取 消 。Transact-SQL 中 还 有 一 个 新 的 游 标 , 它 是 由 存 储 过 程 创 建 的 , 并 可 以 在 整 个 运行 过 程 中 传 递 。 游 标 还 有 许 多 类 型 , 详 细 情 况 请 参 看 本 书 第 21 章 。
- 重 新 编 译 存 储 过 程
有 时 , 需 要 对 数 据 库 进 行 某 些 处 理 , 而 存 储 过 程 在 设 计 中 可 能 未 将 这 些 处理 考 虑 在 内 。 例 如 : 需 要 追 加 索 引 或 被 编 入 索 引 的 列 中 的 数 据 需 要 重 新 分 布 , 这时 , 存 储 过 程 就 需 要 重 新 编 辑 , 以 适 应 新 的 需 求 。 但 是 , 并 不 是 总 是 需 要 进 行存 储 过 程 的 重 编 译 。 SQL Server 被 重 新 启 动 或 存 储 过 程 再 次 被 调 用 之 后 , 或 者当 存 储 过 程 中 所 使 用 的 表 格 被 更 改 时 , 存 储 过 程 会 自 动 进 行 重 新 编 译 。
- 异 构 型 分 布 式 查 询
SQL Server 7 支 持 异 构 型 分 布 式 查 询 。 本 版 本 中 , Transact-SQL 查 询 使 用来 自 于 OLE DB 数 据 源 中 的 数 据 , 而 不 使 用 Open Data Services 来 书 写 服 务 器应 用 程 序 , 以 之 作 为 与 其 他 数 据 库 系 统 的 连 接 点 。
本 章 中 , 介 绍 了 SQL Server7 的 Transact-SQL 使 用 的 主 要 部 分 。 有 关Transact-SQL 语 言 的 语 法 结 构 , 请 参 看 本 书 第 21 章 。
第 20 章 数 据 仓 库 和 数 据 市 场
数 据 仓 库 概 念 的 出 现 是 为 了 解 决 在 线 分 析 处 理 (OLAP) 时 发 生 的 问 题 , 在 线分 析 处 理 包 括 与 在 线 事 务 处 理 (OLTP) 发 生 干 涉 的 决 策 支 持 活 动 。
在 同 时 运 行 某 个 OLAP 查 询 时 , 增 加 和 改 变 数 据 行 的 大 量 并 行 用 户 之 间 可 能
会 引 起 争 议 , 例 如 经 历 无 法 接 受 OLAP 性 能 的 用 户 和 报 告 说 OLAP 查 询 运 行 时 间太 长 的 OLAP 用 户 。 按 规 则 编 排 的 基 础 提 供 数 据 库 拷 贝 可 以 有 所 帮 助 , 但 是 随 着数 据 库 的 不 断 膨 胀 , 往 往 有 必 要 重 新 设 计 数 据 库 , 有 必 要 为 加 载 和 查 询 大 量 数据 的 数 据 仓 库 进 行 特 别 设 计 。 为 此 , 可 为 OLTP 或 可 操 作 类 型 的 活 动 特 意 设 计 另一 个 数 据 库 或 一 组 数 据 库 , 并 且 另 一 个 数 据 库 或 一 组 数 据 库 可 以 是 数 据 仓 库 的一 个 子 集 , 该 数 据 仓 库 用 于 报 告 部 门 层 次 的 活 动 。 当 包 含 需 要 摘 要 的 大 量 数 据时 , 数 据 仓 库 显 得 特 别 有 用 。
OLTP 系 统 和 OLAP 系 统 之 间 的 区 别 在 于 它 们 存 储 数 据 的 方 法 不 同 。 在 OLTP 系 统 中 , 数 据 是 以 高 标 准 方 式 按 详 细 层 次 存 储 的 。 而 在 OLAP 系 统 中 , 数 据 仓 库中 的 数 据 是 以 非 标 准 摘 要 方 式 存 储 的 , 为 的 是 提 高 OLTP 决 策 支 持 处 理 的 查 询 性能 。
数 据 仓 库 可 提 供 摘 要 性 的 历 史 只 读 数 据 , 以 便 简 化 决 策 支 持 活 动 , 通 常 可
强 化 来 自 不 同 可 操 作 数 据 源 的 数 据 。 在 对 数 据 进 行 一 致 性 分 析 时 , 数 据 仓 库 还
可 提 供 跨 组 织 的 标 准 化 , 当 把 数 据 仓 库 放 到 一 个 位 置 时 , 对 它 的 组 织 只 包 含 关键 的 性 能 指 示 器 。 对 于 运 行 与 执 行 报 告 无 关 的 事 务 , 在 低 层 次 上 需 要 的 外 部 信息 被 留 下 。
对 信 息 进 行 概 述 , 长 时 期 限 制 数 据 仓 库 , 目 的 都 是 为 了 提 供 历 史 分 析 和 趋势 报 告 。 在 数 据 仓 库 中 , 数 据 一 般 不 作 改 变 , 除 非 因 为 发 生 错 误 而 必 须 进 行 重新 处 理 。 发 生 的 唯 一 操 作 是 加 载 和 报 告 数 据 。 数 据 仓 库 使 用 星 型 模 式 (star schemas) 来 改 进 响 应 时 间 。
- 星 型 模 式
星 型 模 式 对 于 主 题 领 域 使 用 一 种 “ 事 实 ” 表 和 描 述 该 事 实 表 的 许 多 尺 寸 表 。为 提 高 性 能 , 可 对 存 储 在 事 实 表 中 的 信 息 进 行 概 述 。 空 间 上 的 关 键 字 是 可 用 作外 来 关 键 字 的 唯 一 标 识 符 , 外 来 关 键 字 可 把 事 实 和 尺 寸 表 联 结 起 来 。 当 数 据 仓库 数 据 库 在 使 用 星 型 模 式 时 , 它 可 以 包 含 长 整 型 窄 行 事 实 表 , 以 及 小 型 宽 行 尺寸 表 。 查 询 可 检 索 小 型 尺 寸 表 中 的 尺 寸 关 键 字 , 以 嵌 进 主 事 实 表 , 减 少 磁 盘 扫描 量 。 由 于 数 据 在 加 载 时 就 已 经 进 行 概 括 , 所 以 查 询 速 度 加 快 。
事 实 表
事 实 表 是 与 事 件 相 关 的 实 体 , 其 中 包 含 每 个 时 期 和 每 个 地 理 上 的 或 历 史 上
的 分 组 的 数 据 集 合 。 销 售 、 事 务 、 灾 难 、 计 算 机 崩 溃 、 需 要 服 务 、 书 籍 出 版 、房 屋 结 构 和 历 史 事 件 等 都 有 资 格 作 为 事 件 , 都 可 根 据 业 务 变 换 无 穷 。 OLAP 以 其集 合 的 形 式 需 要 历 史 的 和 高 层 次 的 观 察 , 以 检 测 趋 势 和 分 析 商 业 实 践 的 成 功 , 并 支 持 由 主 管 人 员 做 出 的 商 业 决 策 。
事 实 表 可 以 包 含 成 千 上 万 行 历 史 只 读 数 据 。 事 实 表 应 该 只 包 含 数 字 型 数 据 , 而 非 带 有 整 数 外 来 关 键 字 的 字 符 型 数 据 , 这 些 数 字 型 数 据 再 转 换 成 尺 寸 表 , 以履 行 它 们 作 为 星 型 模 式 中 心 部 分 的 作 用 。 如 果 中 心 事 实 表 变 得 太 大 , 有 可 能 会变 成 性 能 瓶 颈 , 应 该 按 自 然 分 割 的 形 式 通 过 将 它 分 割 成 多 个 逻 辑 表 进 行 分 段 , 如 按 日 期 分 段 。
尺 寸 表
尺 寸 表 是 一 种 非 常 小 的 表 ( 与 数 百 万 或 数 十 亿 行 相 比 只 有 数 百 或 数 千 行 ) , 并 引 用 存 储 在 事 实 表 中 的 数 据 , 事 实 表 中 含 有 描 述 型 、 名 称 型 和 其 他 字 符 型 数据 。 把 小 型 尺 寸 表 中 的 字 符 型 数 据 放 入 巨 型 数 字 型 事 实 表 的 一 侧 , 可 允 许 查 询嵌 进 小 型 尺 寸 表 , 对 大 型 事 实 表 拾 取 索 引 关 键 字 和 扫 描 更 小 型 的 数 据 集 。 首 先对 事 实 表 进 行 处 理 结 果 的 清 楚 描 述 或 命 名 结 果 , 使 在 tempdb 系 统 表 中 带 有 切 实可 行 需 求 的 巨 型 数 据 区 域 的 查 询 扫 描 速 度 大 幅 度 降 低 。 当 包 含 超 大 量 的 数 据 时 , 带 有 围 绕 概 括 事 实 表 的 决 策 表 的 星 型 模 式 的 决 策 , 在 管 理 层 次 上 一 直 保 持 磁 盘扫 描 和 tempdb 用 法 。
而 事 实 表 中 的 数 据 在 出 现 错 误 之 前 不 会 发 生 变 化 , 尺 寸 表 中 的 数 据 设 计 成
可 说 明 改 变 的 数 值 。 决 策 表 有 一 个 整 数 主 关 键 字 , 也 称 为 尺 寸 关 键 字 , 由 占 优势 的 字 符 型 数 据 组 成 。 所 有 标 准 化 的 规 则 在 设 计 尺 寸 表 时 均 被 中 断 , 目 标 是 把数 据 拆 散 成 单 一 表 。 使 用 的 技 巧 是 要 知 道 如 何 访 问 数 据 , 并 用 尽 可 能 最 为 便 利和 最 为 快 捷 的 方 法 设 计 访 问 方 法 , 以 消 除 与 数 据 间 接 参 考 的 表 联 结 。 多 头 联 结是 这 种 尺 寸 的 数 据 库 的 大 敌 , 必 须 通 过 拆 散 尺 寸 表 进 行 设 计 。 换 句 话 说 , 如 果普 通 使 用 的 查 询 需 要 联 结 四 个 表 , 可 为 该 查 询 设 计 一 个 特 殊 的 尺 寸 表 。 如 果 区段 存 储 在 另 一 个 表 中 ( 例 如 销 售 厂 家 表 ) , 则 可 删 除 该 表 , 把 它 放 到 自 己 的 尺 寸表 中 , 并 把 districk_id 的 尺 寸 关 键 字 添 加 到 事 实 表 中 。 用 日 期 或 周 期 数 据 也可 以 做 到 这 一 点 。 财 政 年 、 周 期 、 星 期 、 月 和 年 都 是 日 期 型 尺 寸 标 的 实 例 。 这种 方 法 可 大 幅 度 提 高 性 能 。
通 过 确 定 核 心 商 业 事 件 可 仔 细 慎 重 地 逼 近 事 实 表 和 尺 寸 表 , 在 核 心 商 业 事件 中 , 数 据 仓 库 将 集 中 创 建 事 实 表 。 然 后 再 确 定 分 析 事 件 的 方 法 , 创 建 尺 寸 表 。
- 数 据 市 场
数 据 市 场 是 数 据 仓 库 的 一 个 较 小 分 支 , 它 位 于 自 身 的 数 据 库 中 , 并 为 商 业的 特 殊 焦 点 领 域 所 使 用 。 数 据 市 场 包 含 的 数 据 可 以 处 于 细 节 层 次 和 / 或 概 述 层次 。 由 于 数 据 量 较 小 , 所 以 数 据 市 场 查 询 起 来 即 容 易 又 快 捷 。
设 计 数 据 仓 库 及 其 相 应 的 数 据 市 场 有 多 种 不 同 的 方 法 , 唯 一 的 限 制 性 因 素就 是 开 发 自 己 的 想 象 和 自 己 的 商 业 需 求 。 从 数 据 市 场 可 以 创 建 数 据 仓 库 , 从 数
据 仓 库 也 可 以 创 建 数 据 市 场 , 使 用 下 拉 式 的 、 中 间 弹 出 式 的 和 底 部 弹 出 式 的 方法 均 可 。 其 中 最 重 要 的 操 作 是 正 确 定 义 关 键 字 、 基 本 原 理 和 底 层 商 业 事 件 , 以及 对 周 边 事 件 的 分 析 。 开 始 建 立 数 据 仓 库 时 不 必 完 全 重 做 所 有 事 情 , 通 过 识 别关 键 商 业 事 件 开 始 , 如 销 售 , 并 从 一 个 关 键 事 件 开 始 建 立 自 己 的 数 据 仓 库 , 提供 分 析 和 趋 势 报 告 , 这 些 趋 势 报 告 可 提 供 商 业 内 部 的 决 定 性 市 场 需 要 的 关 键 信息 。 罗 马 不 是 一 天 建 成 的 , 数 据 仓 库 也 不 是 一 天 可 以 建 成 的 , 但 是 从 数 据 仓 库获 得 的 利 益 足 以 保 证 沿 着 正 确 方 向 前 进 的 步 伐 。
- M icrosoft OLAP Server
Microsoft OLAP Server 是 一 个 允 许 分 析 大 量 数 据 的 中 层 数 据 库 。 该 产 品 支持 在 线 分 析 处 理 (OLAP) 应 用 程 序 , 并 可 做 出 报 告 、 数 据 模 型 和 决 策 支 持 。
Microsoft Desktop Data Cube Service 可 提 供 客 户 应 用 程 序 对 OLAP 数 据的 客 户 机 访 问 。 OLAP 技 术 设 计 目 的 是 对 可 能 需 要 充 足 时 间 才 能 回 答 的 问 题 提 供答 案 。 OLAP 技 术 可 对 需 要 立 刻 回 答 的 问 题 提 供 答 案 , 因 为 这 些 问 题 要 进 行 一 致性 查 询 和 有 效 地 设 计 数 据 仓 库 。 OLAP 服 务 器 把 数 据 预 处 理 成 “ 立 体 数 据 ”, 概括 成 如 时 间 和 地 理 这 样 的 尺 寸 。 Microsoft OLAP Server 支 持 三 种 技 术 , 即 多维 型 的 (MOLAP) 、关 系 型 的 (ROLAP) 和 混 合 型 的 (HOLAP) 数 据 库 ,均 可 用 于 存 储 OLAP 数 据 。
OLAP 解 决 方 案 可 用 于 大 型 商 业 的 报 告 和 分 析 需 求 。 到 现 在 这 些 解 决 方 案 一
般 还 是 非 常 昂 贵 的 。 Microsoft OLAP Server 和 Desktop Data Service 都 有 图形 用 户 接 口 和 向 导 , 以 帮 助 从 已 有 数 据 仓 库 快 速 和 廉 价 地 创 建 OLAP 数 据 库 。
数 据 爆 炸
当 合 计 所 有 可 能 的 数 据 集 合 时 , 以 及 结 果 行 大 于 事 实 表 中 已 有 的 行 时 , 就会 发 生 数 据 爆 炸 。 Microsoft OLAP Server 可 以 自 动 选 择 所 有 可 能 集 合 的 子 集 , 并 在 需 要 时 计 算 来 自 子 集 的 集 合 的 容 量 。
Aggregation Design Wizard 可 提 供 操 纵 磁 盘 存 储 需 求 和 合 计 集 合 量 之 间 平衡 的 功 能 。 Microsoft OLAP Server 可 以 跨 几 个 服 务 器 分 段 立 体 数 据 和 存 储 数据 ,通 过 支 持 完 整 MOLAP 实 现 、完 整 ROLAP 实 现 和 HOLAP 解 决 方 案 ,Microsoft OLAP Server 具 有 数 据 模 型 的 灵 活 性 , 为 OLAP 数 据 库 设 计 者 提 供 的 数 据 模 型 选 择 最接 近 符 合 组 织 的 需 要 。
Desktop Data Cube Service — — 灵 活 的 解 决 方 案
在 客 户 机 上 可 以 运 行 Microsoft Desktop Data Cube Service , 可 以 使 用Microsoft Visual Basic 或 其 他 语 言 开 发 用 户 应 用 程 序 , 这 些 用 户 应 用 程 序 可充 分 利 用 来 自 Microsoft OLAP Server 的 数 据 , 或 来 自 使 用 Microsoft OLE DB 的 关 系 型 数 据 库 的 数 据 。 这 样 可 允 许 Microsoft OLAP Server 具 有 使 用 相 同 立
体 数 据 的 多 台 客 户 机 。 这 样 可 对 表 现 形 式 和 分 析 提 供 灵 活 的 解 决 方 案 , 这 种 分析 允 许 用 户 在 不 连 接 到 Microsoft OLAP Server 的 情 况 下 分 析 数 据 。
Microsoft ActiveX 控 件 和 Microsoft Office 实 现 都 通 过 提 供 类 似 的 终 端图 形 用 户 接 口 来 创 建 。 其 他 软 件 供 应 商 也 提 供 开 放 接 口 , 以 开 发 第 三 方 应 用 程序 。
多 维 数 据 库 立 体 数 据
立 体 数 据 是 多 维 数 据 库 中 的 主 要 对 象 。 依 据 如 何 分 析 和 带 有 普 通 分 级 空 间的 数 据 , 每 个 立 体 数 据 都 包 含 一 组 尺 寸 。 尺 寸 的 度 量 是 依 据 尺 寸 位 于 立 体 数 据中 的 定 量 数 据 进 行 的 。 一 个 立 体 数 据 可 以 容 纳 大 量 的 集 合 。
M icrosft OLAP Manager
Microsft OLAP Manager 是 连 接 在 Microsoft Management 控 制 台 中 的 。 在该 工 具 内 部 , 用 户 可 以 创 建 新 的 数 据 库 , 在 ODBC Data Source Administrator 中 设 置 System 数 据 源 名 称 DSN 之 后 可 以 定 义 数 据 源 。
通 过 右 击 新 创 建 数 据 库 下 面 的 Public Dimensions 文 件 夹 , 并 从 快 捷 菜 单中 选 择 New Dimension , 可 创 建 新 的 尺 寸 。 Dimension Wizard 允 许 用 户 贯 穿 创建 新 尺 寸 的 每 个 步 骤 。 Dimension Wizard 的 最 后 一 步 进 入 Dimension Editor , 在 此 可 以 创 建 尺 寸 的 层 次 。
当 完 成 尺 寸 的 创 建 时 , 通 过 右 击 数 据 库 下 面 的 Cubes 文 件 夹 , 并 从 快 捷 菜单 上 选 择 New Cube , 可 以 建 立 立 体 数 据 。 Cube Wizard 允 许 用 户 贯 穿 创 建 立 体数 据 的 各 个 步 骤 。 Cube Wizard 的 最 后 一 步 进 入 Cube 编 辑 器 , 在 此 可 以 添 加 更多 的 公 共 尺 寸 、 私 人 尺 寸 和 选 择 立 体 数 据 的 量 度 。
至 此 已 准 备 好 确 定 集 合 , 通 过 右 击 分 层 树 形 结 构 中 的 新 立 体 数 据 处 理 该 立体 数 据 , 然 后 从 快 捷 菜 单 从 上 选 择 Process 。 Aggregations Wizard 允 许 用 户 贯穿 设 计 集 合 的 各 个 步 骤 , Aggregations Wizard 的 最 后 一 步 将 处 理 该 立 体 数 据 , 并 显 示 计 算 的 进 程 。
服 务 器 分 区
分 区 可 把 一 个 逻 辑 OLAP 数 据 库 放 到 不 同 的 物 理 存 储 器 中 。 对 于 每 个 OLAP 数 据 库 , 缺 省 时 可 创 建 单 一 分 区 。 把 数 据 库 分 割 成 多 个 分 区 , 就 是 用 户 如 何 允许 不 同 的 存 储 模 式 充 分 利 用 Microsoft 的 OLAP Server 支 持 的 MOLAP 、 ROLAP 或HOLAP 特 性 。
单 一 服 务 器 分 区 是 在 单 一 服 务 器 上 , 用 在 此 可 调 谐 集 合 的 单 一 DSN 创 建 的多 个 分 区 。 在 带 有 小 比 例 集 合 的 ROLAP 中 , 可 以 存 储 极 少 使 用 的 历 史 数 据 , 以节 省 磁 盘 空 间 , 在 带 有 高 比 例 集 合 的 MOLAP 中 , 可 以 存 储 当 前 数 据 , 以 提 高 性能 。
多 服 务 器 分 区 可 在 多 个 服 务 器 上 创 建 , 它 并 行 使 用 多 个 DSN 处 理 。 不 同 的数 据 可 以 有 相 同 的 数 据 库 结 构 , 也 许 可 以 按 年 或 地 理 类 别 进 行 分 区 。
在 Microsoft Management Console 的 分 层 树 形 结 构 中 , 可 选 择 立 体 数 据 下面 的 Partitions 文 件 夹 ,并 从 快 捷 菜 单 上 选 择 New Partition 。Partition Wizard 允 许 用 户 贯 穿 创 建 分 区 的 各 个 步 骤 。
用 户 可 以 使 用 ADO 的 扩 展 ADO MD 作 为 多 维 数 据 访 问 的 程 序 对 象 模 型 。ADO MD 是 以 多 维 数 据 库 方 式 使 用 的 独 立 语 言 的 数 据 访 问 接 口 。 用 户 可 以 使 用 Microsoft Visual Basic , 以 ADO MD 作 为 对 多 维 存 储 器 中 数 据 的 数 据 访 问 接 口 。
在 本 章 中 , 简 单 介 绍 了 数 据 仓 库 领 域 和 新 的 OLAP Server 。 在 下 一 章 中 , 将介 绍 Transact-SQL 编 程 语 言 的 语 法 。