第 8 章 实 用 程 序 的 变 化
M icrosoft SQL Server 实 用 程 序 的 主 要 目 的 是 增 强 功 能 、 性 能 和 可 靠 性 。 随着 对 太 字 节 (1000,000,000,000 字 节 ) 数 据 库 的 支 持 , 数 据 库 实 用 程 序 还 必 须 能 够处 理 大 量 的 数 据 , M icrosoft SQL Server 实 用 程 序 已 在 这 些 方 面 进 行 了 改 进 , 特别 是 提 高 执 行 速 度 的 问 题 。
本 章 介 绍 了 下 列 实 用 程 序 , 主 要 论 述 每 个 实 用 程 序 的 新 功 能 :
-
Bulk Copy Program(BCP)( 成 批 拷 贝 程 序 )
-
Backup( 备份 )
-
Restore( 恢复 )
-
Database Consistency Checker(DBCC)( 数 据 库 一 致 性 检 查 程 序 )
-
OSQL 和 ISQL
-
SQLMaint
8.1BCP
Bulk Copy Program(BCP )实 用 程 序 可 在 DOS 命 令 提 示 符 下 执 行 。 该 实 用 程
序 可 将 数 据 从 数 据 库 拷 贝 到 操 作 系 统 文 件 , 也 能 从 操 作 系 统 文 件 中 取 出 数 据 , 并 把 它 放 到 M icrosoft SQL Server 数 据 库 上 的 表 格 中 。 在 版 本 7 中 , BCP 实 用 程序 已 完 全 改 写 , 从 设 计 和 体 系 结 构 的 角 度 来 看 , 它 是 新 版 本 中 改 进 最 大 、 最 有趣 的 内 容 之 一 。
BCP 实 用 程 序 的 体 系 结 构 已 经 进 行 了 更 改 , 它 不 再 使 用 DB_Library 成 批 拷贝 API ; 而 是 使 用 ODBC 成 批 拷 贝 AP I。 以 前 , 成 批 拷 贝 将 数 据 放 入 预 格 式 化的 行 中 , 这 样 就 形 成 了 无 休 止 的 错 误 源 。 现 在 , 成 批 拷 贝 实 用 程 序 使 用 Tabular Data Stream(TDS )结 果 集 。 这 就 意 味 着 使 用 SQL Server 的 主 插 入 路 径 , 所 进 行的 任 何 优 化 都 将 包 容 数 据 插 入 路 径 的 所 有 方 面 。 在 成 批 装 入 部 分 接 收 到 TDS 结果 集 后 ,OLE DB 就 接 管 一 切 ,并 把 行 集 移 到 Relational Engine 上 。然 后 ,OLE DB 把 数 据 从 Relational Engine 移 到 Storage Engine, 同 时 把 数 据 格 式 化 成 页 , 并 把数 据 存 储 在 数 据 库 中 。
令 人 欣 喜 的 是 , M icrosoft SQL Server 一 直 致 力 于 数 据 传 递 的 工 艺 , 且 已 有多 种 方 法 解 决 此 问 题 。在 M icrosoft SQL Server 7 中 ,已 经 进 行 了 尝 试 :通 过 Data Transformation Services 工 具 的 Import/ Export 功 能 ,“ 其 他 ” 经 销 商 的 数 据 库 可以 从 SQL Server 输 入 和 输 出 数 据 。 Data Transformation Services 工 具 在 第 7 章 已经 作 过 介 绍 。
BCP 实 用 程 序 的 完 整 格 式 和 插 入 路 径 已 经 发 生 变 化 , 添 加 了 一 些 新 特 性 , 所 以 BCP 在 将 作 业 中 的 数 据 作 为 命 令 文 件 进 行 移 动 时 是 相 当 便 利 的 。 用 户 还 可以 选 择 是 否 记 录 BCP 事 件 , 以 及 是 加 强 约 束 还 是 激 活 触 发 程 序 。 如 果 不 希 望 记录 BCP 事 务 , 则 可 设 置 数 据 库 选 项 SELECT INTO / BULKCOPY 。 为 此 , 可
在 Enterprise M anager 中 展 开 数 据 库 、 选 择 某 个 数 据 库 , 右 击 它 , 从 快 捷 菜 单 中选 择 Properties , 选 择 Options 面 板 , 然 后 单 击 复 选 框 Select Into / Bulk Copy , 如 图 8.1 所 示 。 如 果 希 望 加 强 约 束 , 可 使 用 下 表 中 介 绍 的 BCP 的CHECK_CONSTARINTS 自 变 量 。
图 8.1Select Into / Bulk Copy 数据库选项 BCP 实用程序可用于:
-
从 数 据 库 外 获 取 数 据 , 有 时 可 在 恢 复 状 态 下 获 得
-
把 数 据 放 入 数 据 库 , 数 据 有 时 来 自 另 一 个 经 销 商 的 数 据 库 , 有 时 来 自 随产 品 附 送 的 应 用 程 序 的 非 关 系 型 文 件 格 式
-
把 大 量 的 数 据 移 入 和 移 出 数 据 库 , 形 成 普 通 的 文 件 格
式
-
把 数 据 从 某 个 查 询 复 制 到 数 据 文 件 中 ( 新 功 能 )。 请
参 见 表 8.1 中 bcp 的
QUERYOUT 参 数
-
在 批 处 理 作 业 和 作 业 步 骤 中 将 数 据 移 入 和 移 出 服 务 器
-
将 数 据 从 数 据 库 移 到 电 子 表 格 或 另 一 种 类 型 的 数 据 库 中 , 如 M icrosoft Excel 或 M icrosoft Access
另 外 , 某 些 应 用 程 序 通 过 使 用 DB Library、 ODBC 或 OLE DB 程 序 中 的 成批 拷 贝 AP I, 可 把 BCP 写 到 应 用 程 序 中 。
使 用 BCP 实 用 程 序 的 语 法 如 下 :
bcp [[ databasename.] tableowner. ] tablename { in | out | format} datafile
[ -m ] [ -f] [ -e ] [ -F ] [ -L ] [ -b ] [ -n ] [ -c ] [ -w ] [ -6 ]
[ -E ] [ -t] [ -r] [ -i] [ -o ]
[ -U ] [ -P ] [ -S ] [ -v ] [ -a ][ -T ] [ -q] [ -k ] [ -h ]
表 8.1 描 述 了 BCP 实 用 程 序 的 自 变 量 。 自 变 量 旁 的 星 号 (*) 表 示 该 自 变 量 很重 要 。 这 并 不 是 说 , 其 他 的 自 变 量 就 不 需 要 或 不 重 要 了 , 但 如 果 还 没 有 使 用 带星 号 的 自 变 量 , 就 应 确 定 是 否 需 要 使 用 它 们 。
表 8.1BCP 实用程序的自变量
BCP 自变量 |
描述 |
---|---|
DatabaseName |
所调用的数据库名 |
TableOwner |
表格拥有者的名称 |
TableName |
显示数据库表或视图 |
IN OUT |
表明是把数据拷入或拷出该数据库,还是创建格式文件 |
QUERYOUTQUERYOUT |
的 一 个 实 例 为 : bcp "select * from Sysobjects" QUERYOUT objects.txt-c -Sservername-Usa – Ppassword |
FORMAT |
如 果 根 据 -n 、 -c 、 -w 或 -6 自 变 量 和 表 格 分 隔 符 来 使 用 FORMAT 自变量,就可创建格式文件。如果使用格式选项,还需要指定 -f 选项 |
DataFile |
给 出 数 据 文 件 的 路 径 。 数 据 文 件 的 路 径 最 多 可 有 225 个字符 |
-m * |
设 置 执 行 中 止 前 发 生 的 错 误 的 最 大 数 。 如 果 没 有 设 置 此参数,其缺省值为 10 |
-f |
给 出 格 式 文 件 的 完 整 路 径 和 名 称 。 格 式 文 件 是 在 回 答 了命令行问题后创建的,用于为 SQL Server 提供它所需的文件中的列信息。该文件用缺省名 bcp.fmt 创建一次,此后由其他 BCP 会话使用,作为移动数据的固定格式。如果指定了 -n 、 -c、 -w 或 -6 自变量,但没有指定 -f,则不能进 入 格 式 命 令 行 调 查 表 。 如 果 还 要 避 免 显 示 该 对 话 框 , 可 使 用 -c 自 变 量 , 该 自 变 量 将 使 用 列 或 域 的 字 符 数 据 类型 。 如 果 使 用 了 -c , BCP 对 每 列 都 不 作 提 示 , 缺 省 存 储类 型 是 字 符 , 制 表 符 是 缺 省 的 列 分 割 符 , 新 列 是 缺 省 的 行终结符 |
续 表
-e * |
给 出 错 误 文 件 的 完 整 路 径 和 名 称 。 这 是 所 有 “ 坏 ” 行 都 要 进 入 的 位 置 。 数 据 库 将 不 接 受 这 些 行 。 如 果 没 有 使 用 - e ,就不会创建错误文件 |
---|---|
-F |
确 定 要 标 记 为 开 始 拷 贝 的 第 一 行 的 行 。 如 果 不 使 用 -F , 就将第一行标记为开始拷贝的第一行 |
-L |
确 定 要 标 记 为 结 束 拷 贝 的 最 后 一 行 的 行 。 如 果 不 使 用 -L , 就将最后一行标记为结束拷贝的最后一行 |
-b * |
设 置 要 拷 贝 的 每 个 批 处 理 的 行 数 。 每 个 批 处 理 就 成 为 一个 事 务 。 如 果 不 使 用 -b , 就 将 所 有 行 放 到 一 个 事 务 中 该自 变 量 不 适 于 与 -h( 提 示 ) “ ROWS_PER_BATCH=bb ” 自变 量 一 起 使 用 , -h 自 变 量 是 数 据 文 件 作 为 一 个 事 务 发 送到服务器的位置。服务器负责用 ROWS_PER_BATCH bb 优化装载 |
-n * |
将 数 据 库 的 数 据 类 型 用 作 缺 省 的 数 据 类 型 复 制 数 据 , 该数 据 类 型 称 为 原 (native) 数据类型, BCP 对每一列或域的数据类型都不做提示。该自变量与和 SQL Server 交互操 作的格式文件命令行相关联 |
-c * |
将 char 数据类型用作缺省的数据类型复制数据, BCP 对每 一 列 或 域 的 数 据 类 型 都 不 作 提 示 。 缺 省 存 储 类 型 是 字符型 (char) , 制 表 符 (tab) 为 缺 省 的 列 分 隔 符 , 新 行 是 缺 省 的行结束符。 |
续 表
-w * |
将 Unicode 数据类型用作缺省的数据类型复制数据 , BCP 对 每 一 列 或 域 的 数 据 类 型 都 不 作 提 示 。 缺 省 存 储 类 型 是nchar , 制 表 符 (tab) 是 缺 省 的 列 分 隔 符 , 新 行 是 缺 省 的 行 结束符 |
---|---|
-6 * |
当使用 -c 自变量或 -n 自变量时,可将 6.x 数据类型用作缺省数据类型, BCP 对每列或行的数据类型都不作提示。当需要使用 SQL Server 6.x 数据库中的 BCP 文件时,这是很有用的。该自变量与和 SQL Server 交互操作的格式 文件命令行相关联 |
-E * |
在 包 含 的 表 格 上 定 义 等 同 列 , 且 等 同 值 已 存 在 于 数 据 文件 中 的 情 况 下 使 用 。 保 存 该 文 件 中 已 有 的 等 同 值 , 如 果等 同 列 为 主 键 , 并 且 已 有 的 其 他 表 格 用 外 来 键 连 接 到 该 列上,这是特别有用的 |
-t * |
允 许 在 该 自 变 量 后 面 指 定 缺 省 的 行 结 束 符 。 如 果 要 用 制 表符 (tab ),可使用\ t |
-r * |
允许指定缺省的行结束符。如果要用新行,可使用\ n 。 |
- I |
指定重定向输入到 BCP 的数据文件名 |
-o |
命名 BCP 的重定向输出数据文件 |
-U |
指明拥有运行 BCP 许可的的用户注册 ID |
-P |
命名注册 ID 的密码 |
-S |
给出所使用的,并试图连接的 M icrosoft SQL Server。 |
-v |
说明当前的 BCP 版本。当在网络中使用了 Microsoft SQL Server 的 多 个 版 本 时 , 或 让 用 户 使 用 过 时 的 版 本 或 BCP 可执行程序的 beta 拷贝时,这一点就非常重要 |
续 表
-a |
对 于 通 过 网 络 发 送 的 每 个 网 络 软 件 包 的 字 节 数 , 允 许 忽略 服 务 器 配 置 选 项 (sp_configure)。 M icrosoft SQL Server 的缺省值为 4096 字节,通常最快的 BCP 的字节范围是 4096-8192 字节。用户可以看到 BCP 输出到屏幕或输出文件时所使用的软件包的尺寸 |
---|---|
-T * |
需要 M icrosoft SQL Server 的 受 托 连 接 |
-q |
指 定 引 用 标 识 符 BCP 选 项 , 该 选 项 对 应 于 为 每 个 SQL Server 连 接 设 置 的 ANSI 引 用 标 识 符 约 定 。 如 果 标 识 符名 中 包 含 通 常 无 效 的 字 符 , 如 表 格 名 , 则 可 使 用 此 自 变 量。双重引用限定使用这类标识符 |
-k * |
当 数 据 文 件 中 的 域 为 NULL 时 , 数 据 库 列 保 持 NULL 值,而不允许在已满的数据库列上进行任何缺省操作 |
-C |
如果数据中包含的 char 、varchar 或 text 列的长度大于 127 或 小 于 32 , 就 需 要 给 出 代 码 页 , 此 处 ACP=ANSI / M icrosoft Windows(ISO 1252)、 OE=- 缺省代码页, R A W = 代码页不发生转换,或可提供代码页数 |
续 表
-h |
当用 BCP 把数据移到表格中时,可传递提示 (hint) 以备使用。该自变量只用于版本 7 的数据库。可使用下列提示: ORDER (column_list) where column_list = {column [ ASC | DESC ] [ , ... ] } 使 用 存 储 的 数 据 文 件 , 通 过 把 表 中 的数据按已有的成簇索引顺序进行排列,可提高 BCP 的速度。缺省情况下 , BCP 是不排序的 。ROWS_PER_BATCH = bb 利用该提示可将数据文件作为一个事务发送到服务器 上 ; 服 务 器 负 责 用 ROWS_PER_BATCH 值 优 化 装 载KILOBYTES_PER_BATCH = nn 使 用 KILOBYTES_PER_BATCH 提 示 可 以 指 明 每 个 批 处 理 的千字节数。 TABLOCK 该优化程序提示可为整个 BCP 操作 提 供 独 占 的 表 格 块 。 缺 省 设 置 是 无 表 格 块 , 这 可 能 意味 着 对 表 格 的 争 用 。 并 行 BCP 数 据 装 载 需 要 该 提 示 。CHECK_CONSTRAINTS 该 提 示 意 味 着 接 收 Microsoft SQL Server 表格的表格约束得到重视。如果不使用该自 变量,约束就得不到重视 |
备 份 (Backup)
在 以 前 版 本 中 , 原 来 称 作 “ 转 储 ” 数 据 库 或 事 务 记 录 的 操 作 现 在 称 为BACKU P 。这 一 变 化 对 应 于 M icrosoft SQL Server 7 包 含 的 新 数 据 结 构 ,M icrosoft SQL Server 7 可 提 供 下 列 功 能 :
-
备 份 整 个 数 据 库
-
备 份 文 件 和 文 件 组
-
备 份 事 务 记 录
部 分 BACKUP 程 序 有 时 包 括 转 储 设 备 的 创 建 , 该 设 备 是 一 个 物 理 文 件 的 逻辑 名 。 数 据 库 、 文 件 、 文 件 组 或 记 录 都 可 卸 除 到 这 个 与 物 理 文 件 相 关 联 的 逻 辑设 备 名 上 。
在 创 建 了 转 储 设 备 之 后 ,就 可 以 备 份 和 恢 复 数 据 库 了 。BACKUP 和 RESTORE
语 句 都 有 许 多 不 同 的 变 体 。 在 第 21 章 中 将 介 绍 这 些 不 同 变 体 的 实 例 和 自 变 量 。
恢 复 (Restore)
在 以 前 版 本 中 原 来 称 作 装 载 (loading) 数 据 库 事 务 记 录 的 操 作 现 在 称 为RESTORE 。这 一 变 化 对 应 于 M icrosoft SQL Server 7 包 含 的 新 数 据 结 构 ,M icrosoft SQL Server 7 可 提 供 下 列 功 能 :
-
恢 复 整 个 数 据 库
-
恢 复 文 件 和 文 件 组
-
恢 复 事 务 记 录
RESTORE 实 用 程 序 除 了 以 前 版 本 中 已 有 的 其 他 选 项 外 , 新 增 了 两 个 选 项 : RESTART 和 REPLACE 。 如 果 使 用 REPLACE , SQL Server 将 删 除 原 数 据 库 , 并 根 据 备 份 集 中 的 规 范 重 新 创 建 数 据 库 。 在 下 列 条 件 下 , 如 果 不 使 用 REPLACE
选 项 , 将 不 恢 复 原 数 据 库 :
-
数 据 库 已 存 在 于 服 务 器
-
数 据 库 名 不 同 于 备 份 集 中 的 数 据 库 名
-
数 据 库 中 的 文 件 集 不 同 于 备 份 集 中 包 含 的 数 据 库 文 件
集
在 恢 复 过 程 中 , M icrosoft SQL Server 不 识 别 文 件 尺 寸 的 差 别 , 恢 复 时 不 检查 文 件 尺 寸 。
RESTART 是 发 生 中 断 时 重 新 启 动 恢 复 的 选 项 。为 此 ,可 重 复 使 用 RESTORE 命 令 并 指 定 RESTORE 选 项 。 然 而 , 该 选 项 有 一 个 问 题 必 须 说 明 : 它 只 能 用 于磁 带 介 质 中 的 恢 复 , 并 写 在 多 卷 磁 带 上 。
另 一 个 重 要 的 新 特 性 是 RESTORE VERIFYONLY 。 该 特 性 可 检 查 备 份 集 是否 完 整 , 数 据 是 否 能 读 。 它 不 检 查 数 据 库 是 否 损 坏 。
RESTORE 语 句 还 有 一 些 很 有 用 的 变 体 :
-
RESTORE FILELISTONLY 返 回 的 结 果 集 带 有 数 据 库 列 表 和 备 份 集 中 包含 的 记 录 文 件
-
RESTORE VERIFYONLY 检 查 备 份 集 是 否 完 整 , 数 据 是 否 能 读
。 它 不 检
查 数 据 库 是 否 损 坏
- RESTORE HEADERONLY 显 示 备 份 文 件 中 所 有 备 份 的 所 有 头 文
件 信 息
数 据 库 一 致 性 检 查 程 序 ( Database Consistency Checker)
Database Consistency Checker(DBCC )可 用 于 扫 描 数 据 库 的 不 同 部 分 , 以 检 查其 不 一 致 性 。 该 检 查 程 序 可 查 找 错 误 , 并 以 DBCC 输 出 报 告 的 形 式 报 告 其 查 找结 果 。 随 着 使 用 该 检 查 程 序 的 次 数 不 断 增 多 , 用 户 将 根 据 编 号 熟 悉 DBCC 错 误 , 了 解 其 内 容 、 严 重 程 度 , 并 根 据 特 定 的 环 境 采 取 相 应 的 措 施 。 使 用 DBCC 有 许多 不 同 的 方 法 , 每 个 环 境 都 会 根 据 应 用 程 序 所 使 用 的 各 种 数 据 库 功 能 出 现 不 同的 DBCC 错 误 。 影 响 如 何 使 用 DBCC 的 因 素 有 : 数 据 库 的 尺 寸 , 该 数 据 库 上 的用 户 数 ,以 及 数 据 的 重 要 性 等 。在 版 本 7 中 ,CHECKDB 是 运 行 CHECKCATALOG 和 CHECKALLOG 的 一 次 作 业 站 。 由 于 版 本 7 的 安 全 体 系 , 它 无 须 执 行 很 多 步骤 。 如 果 数 据 库 不 在 单 用 户 模 式 下 , 并 且 有 许 多 选 项 用 来 修 复 CHECKDB 、CHECKALLOG 和 CHECKTABLE 中 的 数 据 库 , 就 不 会 再 发 生 虚 假 错 误 。
DBCC 方 案
下 述 三 个 方 案 论 证 了 如 何 根 据 用 法 和 尺 寸 在 不 同 的 环 境 下 运 行 DBCC 。8.4.1.1DBCC SCENARIO #1 重 要 数 据 , 中 小 型 数 据 库 , 上 班 时间 使 用
如 果 有 了 数 据 库 , 如 帐 目 数 据 库 , 内 含 不 在 多 兆 字 节 范 围 但 日 常 使 用 最 频
繁 的 重 要 数 据 , 就 可 以 在 下 班 时 间 以 下 列 方 式 使 用 DBCC :
-
运 行 DBCC CHECKDB
-
检 查 DBCC 输 出 错 误
-
如 果 发 现 错 误 ,要 确 定 错 误 的 严 重 程 度 ( 有 些 错 误 是 由 于 空 间 分 配 造 成 的 , 不 能 认 为 是 严 重 错 误 )
-
检 查 Knowledge Base 以 确 定 如 何 处 理 错 误
-
按 照 Knowledge Base 程 序 更 正 错 误
-
转 储 数 据 库
上 面 涉 及 到 的 Knowledge Base 是 一 个 M icrosoft 工 具 , 它 记 录 已 作 过 注 释 的各 种 错 误 。 Knowledge Base 可 以 给 出 每 个 错 误 的 替 代 方 案 或 正 确 操 作 。 在 带 有许 多 服 务 器 和 数 据 库 的 环 境 中 , Knowledge Base 是 非 常 重 要 的 工 具 , 因 为 它 能快 速 分 析 最 近 发 生 的 错 误 的 各 个 方 面 , 所 以 笔 者 一 直 在 使 用 该 工 具 。 对Knowledge Base 的 访 问 可 以 通 过 Internet 进 行 , 也 可 通 过 与 M icrosoft Technical Support 联 系 以 确 定 如 何 访 问 它 。 如 果 不 能 访 问 Knowledge Base , 在 发 现 严 重 错误 时 可 与 M icrosoft Technical Support 电 话 联 系 。
M icrosoft SQL Server 能 通 知 DBA 需 要 的 正 确 操 作 , 所 以 下 班 时 运 行 DBA 的 整 个 过 程 可 以 自 动 进 行 。 要 充 分 利 用 这 一 功 能 , 应 按 优 先 顺 序 对 数 据 库 进 行分 类 , 当 这 些 数 据 库 开 始 工 作 时 , 就 应 确 定 是 立 即 寻 呼 DBA , 还 是 一 早 向 DBA 发 送 e-mail 。 在 美 国 和 欧 洲 频 繁 使 用 的 数 据 库 可 能 每 天 24 小 时 都 在 使 用 , 并 可能 需 要 每 天 24 小 时 / 每 周 7 天 的 无 线 寻 呼 支 持 , 或 在 发 生 严 重 的 DBCC 错 误时 , 需 要 某 些 其 他 类 型 的 即 时 通 知 。 在 这 种 情 况 下 , DBCC 可 能 没 有 在 该 服 务器 上 运 行 , 而 是 运 行 在 其 他 服 务 器 上 。 这 就 是 下 一 个 DBCC 方 案 要 讨 论 的 问 题 。
DBCC SCENARIO #2 重 要 数 据 、 巨 型 数 据 库 (VLDB )、 连续 不 停 的 使 用
如 果 包 含 重 要 数 据 的 数 据 库 是 巨 型 多 兆 字 节 的 数 据 库 , 且 用 户 连 续 使 用 它 ,
就 可 以 考 虑 下 列 策 略 :
-
获 得 备 份 服 务 器
-
在 备 份 服 务 器 上 以 单 用 户 模 式 运 行 DBCC CHECKDB
这 对 管 理 员 来 说 是 较 难 以 掌 握 的 一 种 方 案 , 因 为 必 须 采 取 额 外 的 措 施 才 能确 保 数 据 的 完 整 性 和 可 恢 复 性 。 此 时 最 好 是 得 到 另 一 个 服 务 器 ( 为 了 避 免 由 于 硬件 异 常 或 某 些 与 硬 件 相 关 的 其 他 问 题 , 而 不 得 不 通 宵 达 旦 地 把 应 用 程 序 移 到 另一 个 服 务 器 上 , 就 应 拥 有 备 份 服 务 器 )。 使 用 该 备 份 服 务 器 可 在 该 数 据 库 上 运 行DBCC 检 查 , 备 份 服 务 器 也 可 以 用 作 报 告 服 务 器 ( 请 参 见 下 一 节 )。
对 于 这 样 重 要 的 数 据 库 采 用 备 份 服 务 器 具 有 各 种 充 分 、 坚 实 的 理 由 。 对 于多 兆 字 节 的 数 据 库 , DBCC 必 须 在 页 面 层 次 上 考 察 它 。 对 大 型 数 据 库 而 言 可 能花 费 较 长 时 间 , 因 此 就 不 可 能 为 客 户 维 护 一 个 良 好 的 计 算 环 境 , 但 是 DBA 在 把数 据 库 恢 复 到 备 份 服 务 器 上 之 后 , 就 可 以 充 分 利 用 备 份 服 务 器 , 以 单 用 户 模 式在 数 据 库 上 运 行 DBCC 。
DBCC SCENARIO #3 报 告 服 务 器 、 复 制 从 另 一 个 数 据 库中 恢 复 的 数 据 库 、 只 读 数 据 库 、 连 续 使 用
如 果 报 告 服 务 器 的 数 据 库 实 际 上 是 从 另 一 个 服 务 器 上 恢 复 的 , 就 可 以 考 虑
下 列 策 略 :
-
不 必 在 原 服 务 器 上 运 行 DBCC
-
确 保 DBCC CHECKDB 运 行 在 原 数 据 库 或 报 告 服 务 器 上
如 果 DBCC 未 运 行 在 原 数 据 库 中 , 而 使 DBCC 运 行 在 该 报 告 服 务 器 上 会 更有 意 义 , 就 应 考 虑 获 得 另 一 个 报 告 服 务 器 的 可 能 性 。 这 将 允 许 维 护 窗 口 以 数 据库 的 预 防 性 维 护 为 中 心 进 行 升 级 和 操 作 , 并 允 许 用 户 随 时 访 问 数 据 库 。 通 过 监视 环 境 来 确 定 用 户 数 量 和 使 用 次 数 何 时 增 长 。 随 着 用 户 数 量 和 使 用 次 数 的 增 加 , 要 设 法 满 足 硬 件 的 最 大 需 求 并 增 加 服 务 器 。 坚 持 位 于 该 曲 线 的 前 面 可 节 省 大 量时 间 。
大 多 数 DBCC 错 误 都 出 现 在 运 行 DBCC 前 的 错 误 记 录 中 。 错 误 记 录 是 每 个M icrosoft SQL Server 写 入 的 内 容 , 在 有 许 多 服 务 器 的 环 境 下 , 当 错 误 记 录 中 出现 错 误 时 ,使 用 SQL Server 的 自 动 创 建 警 告 功 能 向 DBA 发 送 e-mail 或 寻 呼 DBA 是 很 重 要 的 。 这 是 对 出 现 的 故 障 发 出 的 第 一 个 警 告 。 这 些 警 告 可 按 错 误 的 严 重程 度 排 列 , 用 户 可 指 定 是 通 报 具 有 某 种 严 重 程 度 的 错 误 , 还 是 根 本 不 通 报 某 些错 误 。 现 在 为 SQL Server 错 误 设 置 自 动 警 告 是 很 容 易 的 , 第 4 章 SQL Server Ag ent 已 介 绍 了 设 置 自 动 警 告 的 基 本 原 理 。
DBCC 的 功 能
在 数 据 库 上 运 行 的 Database Consistency Checker 有 不 同 的 类 型 , 每 种 类 型可 完 成 不 同 的 事 务 。 下 面 几 节 将 介 绍 最 常 用 的 几 种 类 型 。
DBCC CHECKCATALOG
DBCC CHECKCATALOG 可 检 查 各 系 统 表 是 否 一 致 。 每 次 安 排 DBCC 在 该数 据 库 上 运 行 时 都 应 该 运 行 DBCC CHECKCATALOG 。 这 就 可 用 systypes 检 查syscolumns 的 完 整 性 , 用 syscolumns 检 查 sysobjects 的 完 整 性 。 syscolumns 中 的每 个 数 据 类 型 在 systypes 中 要 有 一 行 , 每 个 表 格 和 视 图 在 syscolumns 中 最 少 要有 一 列 。
DBCC CHECKDB
DBCC CHECKDB 可 检 查 数 据 库 中 每 个 对 象 的 完 整 性 , 应 修 复 所 发 现 的 任何 错 误 。 如 果 运 行 了 DBCC CHECKDB , 可 不 必 再 运 行 DBCC CHECKALLOG 或 DBCC CHECKTABLE 。 应 检 查 每 个 表 格 的 索 引 和 数 据 页 , 看 看 其 中 是 否 有正 确 的 页 面 连 接 和 一 致 的 指 针 。 进 一 步 检 查 各 索 引 , 以 确 保 各 项 已 正 确 排 序 , 且 每 个 页 面 上 的 偏 移 和 数 据 都 是 合 理 的 。 要 检 查 每 个 表 格 的 文 本 、 ntext 和 图 像页 面 , 以 及 所 有 页 面 上 的 页 面 分 配 。
其 他 DBCC STATEMENTS
许 多 其 他 的 DBCC 语 句 是 DBCC CHECKDB 功 能 的 子 集 , 或 可 执 行 某 些 其他 实 用 程 序 类 型 的 功 能 。 在 第 24 章 “ Transact-SQL Programming Language Reference ” 中 , 将 介 绍 其 语 法 、 说 明 和 自 变 量 。
-
DBCC CHECKALLOG 可 检 查 数 据 库 中 数 据 页 的 分 配 。 N O INDEX 表 示不 检 查 用 户 表 格 中 的 非 成 簇 索 引 。 NO_INFOMSGS 通 知 SQL Server 不 显 示 信 息类 消 息 , 而 只 显 示 错 误 消 息
-
DBCC CHECKIDENT 返 回 已 命 名 表 格 的 当 前 等 同 值 , 或 更 正
该 等 同 值
-
DBCC SHRINKDATABASE 可 压 缩 数 据 库 中 数 据 文 件 的 尺 寸
-
DBCC SHRINKFILE 可 压 缩 数 据 文 件 的 尺 寸 。 目 标 尺 寸 是 一 个 整 数 , 且是 想 要 的 文 件 尺 寸( 以 兆 字 节 为 单 位 ),如 果 还 指 定 了 TRUNCATEONLY ,则 SQL Server 不 使 用 该 尺 寸 。 如 果 不 使 用 目 标 尺 寸 , SQL Server 将 尽 可 能 压 缩 文 件 的尺 寸 。 NOTRUNCATE 表 示 在 数 据 库 文 件 中 保 留 空 间 。 TRUNCATEONLY 表 示不 重 新 为 各 行 定 位 , 并 将 未 用 空 间 添 加 到 目 录 中 的 自 由 空 间 上
-
DBCC CHECKFILEGROUP 可 查 看 文 件 组 中 所 有 表 格 的 分 配 情 况 和 完 整性 。NOINDEX 表 示 不 检 查 用 户 表 格 上 的 非 成 簇 索 引 。NO_INFOMSGS 通 知 S Q L Server 不 显 示 信 息 性 消 息 , 而 只 显 示 错 误 消 息
-
DBCC UPDATEUSAGE 可 更 新 sysindexes 表 , 以 指 明 表 格 中 尺 寸 数 据 ( 行数 、 已 使 用 的 行 、 保 留 行 和 dpages) 的 最 新 值 。 NO_INFOMSGS 通知 SQL Server 不 显 示 信 息 性 消 息 , 而 只 显 示 错 误 消 息
-
DBCC UPDATEUSAGE WITH COUNT_ROWS 可 为 indid 是 0 或 1 的sysindexes 行 用 表 格 中 的 当 前 行 数 来 更 新 sysindexes 系 统 表 。 COUNT_ROWS 处理 大 型 表 格 的 时 间 较 长
-
DBCC DBREINDEX 可 重 新 建 立 表 格 的 一 个 或 所 有 索 引 。 如 果 卸 除 或 重建 索 引 , 这 对 于 保 护 唯 一 性 和 可 能 丢 失 的 主 键 约 束 是 非 常 有 用 的 。 填 充 因 子 是每 个 索 引 页 上 有 多 少 数 据 的 百 分 比 。 如 果 使 填 充 因 子 为 0 , 就 使 用 创 建 索 引 时所 用 的 原 始 填 充 因 子 。 NO_INFOMSGS 通 知 SQL Server 不 显 示 信 息 性 消 息 , 而只 显 示 错 误 消 息
-
DBCC OPENTRAN 可 显 示 最 旧 的 活 动 事 务 和 已 复 制 ( 分 布 式 和 非 分 布 式 ) 的 事 务 。W ITH TABLERESULTS 以 可 载 入 表 格 的 格 式 给 出 结 果 。NO_ INFOMSGS 通 知 SQL Server 不 显 示 信 息 性 消 息 , 而 只 显 示 错 误 消 息
-
DBCC PINTABLE 表示 SQL Server 不 从 内 存 中 清 除 该 表 格 。 该 表 格 在 内存 中 有 它 自 己 的 位 置
-
DBCC UNPINTABLE 表 示 SQL Server 可 以 从 内 存 中 清 除 表 格
-
DBCC CHECKTABLE 可 检 查 数 据 库 上 的 特 定 表 格 ( 数 据 、 索 引 、 文 本 、ntext、 图 像 页 面 ) 的 完 整 性 。 NOINDEX 表 示 不 检 查 用 户 表 格 上 的 非 成 簇 索 引 。NO_INFOMSGS 通 知 SQL Server 不 显 示 信 息 性 消 息 , 而 只 显 示 错 误 消 息
-
DBCC SHOWCONTIG 说 明 已 命 名 的 表 格 和 已 命 名 的 索 引 中 是
否 包 含 碎
片
- DBCC TEXTALLOG 可 检 查 表 格 的 文 本 或 图 像 列 的 分 配 情 况 。
FULL 通
知 SQL Server 生 成 分 配 报 告
-
DBCC MEMUSAGE 可 显 示 SQL Server 的 内 存 使 用 情 况 , 以 及 以 8K 页面 表 达 的 SQL Server 的 过 程 高 速 缓 存
-
DBCC PERFMON 可 显 示 三 个 统 计 IOSTATS、 LRUSTATS 和 NETSTATS
的 性 能 信 息
-
DBCC DBREPAIR 可 卸 除 不 能 恢 复 的 数 据 库 。 该 命 令 只 包 含 向 后 的 兼 容性 , 可 用 Drop Database 代 替 它
-
DBCC TEXTALL 可 选 择 数 据 库 中 包 含 文 本 、 ntext 或 图 像 的 表 格 , 并 在表 格 上 运 行 TEXTALLOG 。 FULL 通知 SQL Server 生 成 分 配 报 告
-
DBCC USEROPTIONS 可 显 示 当 前 对 话 的 SET 选 项
-
DBCC dllname(FREE )从 内 存 中 取 出 已 命 名 的 扩 展 存 储 过 程
-
DBCC SQLPERF(LOGSPACE ) 可 显 示 M icrosoft SQL Server 上 数 据 库 中的 事 务 记 录 空 间
-
DBCC TRACEON 可 打 开 已 命 名 的 跟 踪 标 志
-
DBCC TRACEOFF 可 关 闭 已 命 名 的 跟 踪 标 志
-
DBCC TRACESTATUS 说 明 服 务 器 上 使 用 的 跟 踪 标 志
-
DBCC PROCCACHE 可 显 示 过 程 高 速 缓 存 的 信 息
DBCC 是 可 执 行 许 多 功 能 的 强 有 力 工 具 。 用 户 越 熟 悉 DBCC 的 , 就 越 能 管理 好 服 务 器 , 并 使 数 据 库 保 持 良 好 的 状 态 。
OSQL 和 ISQL
OSQL 实 用 程 序 除 了 使 用 ODBC , 而 不 使 用 DB-Library 连 接 和 与 M icrosoft SQL Server 7 通 讯 之 外 , 它 的 功 能 类 似 于 ISQ L。 在 OSQL 和 ISQL 中 都 可 以 运行 Transact-SQL 语 句 、 系 统 过 程 和 脚 本 文 件 。 这 两 个 实 用 程 序 都 可 直 接 从 操 作系 统 上 启 动 , 都 包 含 区 分 大 小 写 的 自 变 量 。 用 户 可 以 使 用 这 两 个 实 用 程 序 与 发送 给 STDOUT 的 结 果 交 互 运 行 , 也 可 通 过 发 送 给 命 名 文 件 的 结 果 来 传 递 自 变量 , 以 批 处 理 模 式 在 命 令 文 件 中 运 行 SQL 。
不 仅 Transact-SQL 语 句 可 以 在 ISQL 和 OSQL 内 部 运 行 , 这 两 个 实 用 程 序还 有 专 用 命 令 :
-
GO 运 行 语 句
-
RESET 通 过 清 除 已 输 入 的 语 句 来 重 置 对 话
-
ED 调 用 编 辑 器
-
!! 执 行 操 作 系 统 命 令
-
QUIT 或 EXIT() 从 ISQL 和 OSQL 中 退 出
-
CTRL + C 中 断 查 询 , 但 不 退 出
在 两 个 实 用 程 序 中 , 都 可 以 先 输 入 两 个 惊 叹 号 (!!) , 再 输 入 命 令 , 来 执 行 操作 系 统 命 令 。 另 外 , 还 可 以 在 实 用 程 序 内 部 的 提 示 下 键 入 下 列 语 法 , 交 互 地 输入 每 个 实 用 程 序 , 把 一 个 文 件 从 操 作 系 统 文 件 结 构 中 读 入 ISQL 或 OSQL 缓 存区 :
: r filename
要 在 Transact-SQL 语 句 ( 该 语 句 是 从 ISQL 或 OSQL 中 递 交 给 SQL Server 的 ) 中 包 含 注 释 , 可 在 每 行 的 开 始 使 用 两 个 连 字 符 (--), 或 使 用 普 通 的 C 编 程 语法 (/ *...* / )。 其 语 法 、 说 明 和 自 变 量 将 在 第 21 章 中 介 绍 。
8.6SQLMAINT
Sqlmaint 实 用 程 序 可 以 用 来 创 建 备 份 数 据 库 的 作 业 , 并 在 命 令 提 示 行 上 运行 。 在 版 本 7 中 , 如 果 每 次 运 行 Database Maintenance Plan 时 , 对 把 数 据 库 备 份成 新 的 备 份 文 件 名 的 方 法 不 满 意 , 可 用 该 实 用 程 序 代 替 Database Maintenance Plan(Database Maintenance Plan 可 能 会 使 服 务 器 上 的 空 间 出 现 问 题 ) 。 要 运 行sqlmain t, SQL-DMO 必 须 在 SQL Server 上 注 册 。
Slqmaint 实 用 程 序 对 数 据 库 进 行 维 护 操 作 , 并 且 非 常 方 便 , 因 为 它 可 在 命 令提 示 下 或 在 SQL Server Agent 中 运 行 。 该 实 用 程 序 可 用 于 备 份 数 据 库 、 检 查 数据 库 的 一 致 性 、 运 行 UPDATE STATITIC S、 校 验 备 份 、 只 有 清 除 了 数 据 库 一 致性 检 查 才 备 份 数 据 库 , 并 能 把 结 果 放 到 H T M L 文 件 中 , 或 用 电 子 邮 件 将 结 果 发送 给 操 作 员 。
所 用 的 语 法 如 下 :
[ -? ] |
[
[ -S server]
[ -U "login_ID" [ -P "password" ]]
{
[ -D database_name | -PlanName name | -PlanID guid ]
[ -Rpt text_file [ -DelTxtRpt <time_period> ] ]
[ -To operator_name]
[ -HtmlRpt html_file [ -DelHtmlRpt <time_period> ] ]
[ -RmUnusedSpace threshold_percent free_percen t]
[ -CkDB | -CkDBNoIdx ]
[ -CkAl | -CkAlNoIdx ]
[ -CkTxtA l]
[ -CkCat]
[ -UpdSts ]
[ -UpdOptiStats sample_percen t]
[ -RebldIdx free_space ]
[ -WriteHistory ]
[
{-BkUpDB [ backup_path ] | -BkUpLog [ backup_path ] }
{-BkUpMedia
{DISK [ [ -DelBkUps <time_period> ]
[ -CrBkSubDir ] [ -UseDefDir ]
]
| TAPE
}
}
[ -BkUpOnlyIfClean ]
[ -VrfyBackup ]
]
}
]
<time_period> ::=
number [ minutes | hours | days | weeks | months] 变 量 如 表 8.2 所 示 。
表 8.2sqlmaint 实用程序变量
sqlmaint 变量 |
描述 |
---|---|
-? |
显示 sqlmaint 的语法 |
-S server |
服务器是目标服务器 |
-U "login ID" |
Login ID 是连接 SQL Sever 时 对 se 的许可 |
-P "password" |
密码是注册 ID 的密码 |
-D database_name |
数据库是执行维护的数据库名 |
-PlanName name |
名称是数据库维护计划的名称 |
续 表
-PlanID guid |
Guid 是数据库维护计划的全球唯一标 识符 (GUID) |
---|---|
-Rpt text_file |
Text_file 是文件的合法路径和名称 |
-DelTxtRpt<time_period> |
Time_period 可 用 于 删 除 名 称 与 text_file* 相 匹 配 , 且 比 该 时 限 更 旧 的 任 何文件 |
-To operator_name |
Operator_name 是 通 过 SQLMail 发 送报告的操作员 |
-HtmlRpt html_file |
Html_file 是放置 H T M L 报告的文件的合法路径和名称 |
-DelHtmlRpt<time_period> |
Time_period 可 用 于 删 除 名 称 与 html_file* 相 匹 配 , 且 比 该 时 限 更 旧 的 任 何 文件 |
-RmUnusedSpace threshod_percent free_percent |
RmUnusedSpace 指示 SQL Server 从数 据 库 中 删 除 未 用 的 空 间 , 以 用 于 自 动 扩 展的数据库 |
Threshod_percent 是数据库在删除未用空间前所应有的兆字节数 |
|
Free_percent 是可以在数据库中保留的未用空间量。这是数据库尺寸的百分比 |
|
-CkDB|CkDBNoIdx |
-CkDB|CkDBNoldx 指 示 SQL Server 用 或 不 用 NOINDEX 选 项 运 行 DBCC CHECKDB |
续 表
-CkAl | CkAlNoIdx |
-CkAl | CkAlNoIdx 指 示 SQL Server 用 或 不 用 NOINDEX 选 项 运 行 DBCC NEWALLOC |
---|---|
-CkTxtAl |
-CkTxtAl 指示 SQL Server 运行 DBCC TEXTALL |
-CkCat |
-CkCat 指示 SQL Server 运行 DBCC CHECKCATALOG |
-UpdSts |
-UpdSts 指 示 SQL Server 在所有数据库表格上运行更新统计 |
-UpdOptiStats sample_percent |
-UpdOptiStats sample_percent 指示 SQL Server 使 用 UPDATE STATISTICS 的 W ITH SAMPLE 选 项 在 所 有 用 户 创 建 的 数 据 库 表 格上运行更新统计 |
-RebldIdx free_space |
-RebldIdx free_space 指示 SQL Server 通 过 将 free_space 百 分 值 用 作 填 充 因 子 的反数,来重建数据库中表格的索引。例如, 如果 free_space 百分比为 10 ,填充因子就是 90 。如果 free_space 等于 100 ,就使用 原始填充因子 |
-W riteHistory |
-WriteHistory 把行写入 msdb 系统数据 库的 sysdbmaintplan_history 表中 |
续 表
-BkUpDB [ backup_path ] |-BkUpLog [ backup_path ] |
-BkUpDB [ backup_path ] |-BkUpLog [ backup_path ] 可 定 义 要 执 行 的 备 份 操 作 - BkUpDb 备份整个数据库。 -BkUpLog 备份事 务 记 录 。[ backup_path ] 是 备 份 的 目 录名 。 如 果 提 供 了 自 变 量 -UseDefDir , 就 不需要 [ backup_path ],如果二者都提供,将 不使用 [ backup_path ]。数据库备份的文件名 由 系 统 创 建 , 该 文 件 名 可 以 是 : dbname_db_yyyyMMddhhmm.BAK , 或dbname_log_yyyymmddhhmm 。用户还必须 提供 -BkUpMedia 参数 |
---|---|
-BkUpMedia DISK|TAPE |
-BkUpMedia DISK|TAPE 是 备 份 的 介 质类型 |
-DelBkUps<time_period> |
-DelBkUps<time_period> 指 示 系 统 如 果目录中的备份文件比 time_period 还旧,就删除它们 number [ minutes | hours | days | weeks | month s]是一个整数,代表时间。例如, 12 周、 3 个月或 15 天。如果只提供一 个 整 数 , 缺 省 时 代 表 周 -CrBkSubDir- CrBkSubDir 将在 [ backup_path ]目录下创建 系 统 命 名 的 子 目 录 , 它 是 一 种 不 需 改 变 [ backup_path ] 自 变 量 , 而 把 每 个 数 据 库 的备份都放到各自的目录下的方法 |
续 表
-UseDefDir |
-UseDefDir 指示 SQL Server 把备份文件 放 到 缺 省 的 备 份 目 录 下 , 不 考 虑 [ backup_path ] 自 变 量 的 内 容 。 对 于 香 草 SQL Server 安装 ,这是 C :\ Mssql7 \ Backup 目录 |
---|---|
-BkUpOnlyIfClean |
如果 -Ck 检查发现在数据中存在 DBCC 错 误 , -BkUpOnlyIfClean 禁 止 进 行 备 份 。然 而 , 维 护 操 作 是 定 位 的 , 并 以 自 变 量 出现 的 顺 序 运 行 。 如 果 使 用 这 个 自 变 量 , 就要 把 任 何 -Ck 检 查 都 放 在 -BkUpDB / - BkUpLog 自变量之前,否则将得不到预期的结果 |
-VrfyBackup |
-VrfyBackup 指示 SQL Server 在备份 结 束 后 对 备 份 运 行 RESTORE VERIFYONLY |
所 有 的 SQL Server 实 用 程 序 在 版 本 7 中 都 进 行 了 改 进 , 对 过 去 出 现 的 性 能问 题 都 给 予 了 应 有 的 重 视 。 M icrosoft 知 道 , 这 些 实 用 程 序 都 必 须 能 在 T 字 节 的数 据 库 上 运 行 , 它 们 经 过 大 幅 度 的 修 改 后 可 达 到 这 个 目 标 。 在 下 一 章 中 , 将 回顾 SQL Server 7 增 强 的 复 制 性 能 。