资料库管理系统

Linux下 的 Client/Server— miniSQL


miniSQL(或 mSQL)是 一 套 轻 量 级 的 资 料 库 引 擎 (Database Engine), 它 主 要 的 特 色 是 在 低 记 忆 体 需 求 下 , 提 供 快 速 的 资 料 存 取 。 而 目 前 在 Solaris 2.3, Ultrix 4.3, Linux, FreeBSD以 及 OSF/1 等 平 台 都 可 使 用 , 是 一 个 小 具 规 模 的 查 询 语 言 。

高 国 峰


    这 阵 子 因 工 作 的 关 系 必 须 到 客 户 那 上 班 , 坐 到 人 家 暂 时 让 我 使 用 的 桌 前 , 一 把 拉 开 抽 屉 放 完 文 具 之 後 , 却 发 现 抽 屉 推 不 回 去 , 一 阵 推 拉 抽 打 踢 下 来 发 现 糗 大 了 !! 一 上 班 事 情 还 没 开 始 做 便 被 抽 屉 给 缠 住 , 旁 边 比 我 早 到 的 同 事 赶 忙 过 来 , 只 见 他 伸 手 在 抽 屉 之 中 摸 阿 摸 的 , 抽 屉 已 经 被 推 回 去 , 後 来 才 知 道 关 键 在 抽 屉 里 面 左 上 方 的 铁 片 8P原 来 如 此 ...

    在 Linux上 架 设 软 体 有 时 就 像 难 缠 的 抽 屉 , 日 前 由 二 月 号 HOPE_NET月 刊 上 取 得 一 套 miniSQL 1.0.1, 便 想 要 架 设 起 来 , 看 看 与 Sybase或 Oracle这 些 商 业 用 的 资 料 库 管 理 系 统 有 何 差 异 , 以 及 如 何 的 「 Client/Server」 , 提 供 各 位 读 者 参 考 。

关连式资料库

    在 进 入 miniSQL之 前 , 我 门 先 来 闲 聊 一 下 关 连 式 资 料 库 (Relation Database), 目 前 几 乎 市 面 上 所 有 的 资 料 库 软 体 都 称 自 己 是 关 连 式 资 料 库 , 虽 然 物 件 导 向 资 料 库 (Object-Oriented Database)正 受 到 学 界 热 烈 的 研 究 , 但 除 Raima公 司 好 像 曾 有 产 品 之 外 , 要 等 物 件 导 向 资 料 库 有 市 场 化 的 东 西 出 来 , 那 又 是 一 段 时 间 之 後 的 事 。 不 过 什 麽 是 关 连 式 资 料 库 , 我 先 粗 略 的 说 明 一 下 , 首 先 是 使 用 者 会 感 到 资 料 库 中 的 资 料 是 以 表 格 的 方 式 表 现 , 像 是 :

表 格 A1
姓 名 电 话 住 址
222-2222 XX路
444-4444 YY街
666-6666 zz路

    其 次 使 用 者 可 以 处 理 这 些 既 有 的 表 格 成 为 另 外 一 个 新 的 表 格 , 这 种 动 作 又 叫 查 询 (Query), 像 是 :

SELECT 电 话 FROM 表 格 A1 ;

    上 面 的 句 子 表 示 一 个 关 连 式 运 算 , 说 明 我 想 找 出 表 格 A1中 所 有 人 的 电 话 号 码 , 我 会 得 到 结 果 :

姓 名 电 话
222-2222
444-4444
666-6666

    对 於 这 种 可 以 表 示 我 想 要 找 出 资 料 语 言 , 一 般 也 称 做 查 询 语 言 (Query Language), 不 过 目 前 你 大 部 份 遇 到 的 资 料 库 软 体 所 使 用 的 语 言 , 除 了 查 询 的 功 能 之 外 其 实 是 要 有 包 含 资 料 的 定 义 , 维 护 , 保 全 权 限 与 整 合 性 等 才 算 一 个 完 整 的 资 料 库 语 言 , 像 是 SQL(Structed Query Language), 而 一 般 常 见 的 XBASE语 言 (像 是 DBASE, Clipper, Foxpro), 可 能 就 有 点 力 有 未 逮 。

    而 在 一 般 XBASE语 言 为 基 础 的 资 料 库 系 统 (像 是 DBASE, Clipper, Foxpro)之 中 , 每 个 表 格 对 映 到 一 个 .DBF 的 档 案 , 所 以 以 一 般 XBASE应 用 程 式 设 计 师 的 角 度 来 看 , 一 个 表 格 几 即 是 一 个 在 DOS环 境 之 中 可 以 藉 由 DIR指 令 看 到 的 档 案 , 不 过 若 读 者 有 接 触 过 Access 2.0的 话 , 会 发 现 在 Access 2.0中 一 个 Database其 实 包 含 Table, Query, Form, Report, Marco以 及 Module, 而 整 个 Database才 对 映 到 O.S.的 档 案 系 统 , 若 不 以 效 率 的 观 点 来 看 , 而 就 对 资 料 库 的 观 念 上 来 看 , 笔 者 认 为 Access这 点 做 得 很 好 。

    至 於 一 般 的 SQL产 品 , 对 於 Database的 观 念 更 有 趣 , 基 本 上 类 似 Access, 不 过 没 有 Form与 Report, 而 对 於 包 含 在 其 中 的 物 件 也 分 得 更 细 , 此 外 一 个 对 一 般 XBASE应 用 程 式 设 计 师 而 言 不 可 不 察 的 地 方 是 , 它 实 际 储 存 资 料 的 档 案 并 不 表 示 就 是 一 个 表 格 , 在 一 般 SQL产 品 中 像 Oracle它 对 实 际 你 在 O.S.下 可 以 看 到 的 档 案 称 作 Tablespace, SYBASE中 则 叫 Drives, 它 可 能 是 一 个 Database或 多 个 Database, 也 可 能 两 、 叁 个 这 种 储 存 单 位 组 成 一 个 Database, 在 正 式 的 资 料 库 定 义 中 你 可 以 发 现 有 实 体 层 与 逻 辑 层 , 在 XBASE语 言 为 基 础 的 资 料 库 系 统 , 你 感 受 不 到 , 但 是 面 对 比 较 高 阶 的 资 料 库 管 理 系 统 , 就 一 一 浮 出 台 面 了 。

    除 了 关 连 式 资 料 库 之 外 , 客 户 /伺 服 器 (Client/Server)的 名 字 , 也 时 常 出 现 在 各 种 地 方 , 所 以 我 们 也 一 并 瞧 瞧 , 当 客 户 /伺 服 器 (Client/Server)碰 上 关 连 式 资 料 库 , 会 是 个 什 麽 样 的 光 景 呢 ? 其 实 具 有 Client/Server结 构 的 关 连 式 资 料 库 系 统 , 指 的 是 一 个 环 境 , 在 这 个 环 境 之 中 , 任 何 一 个 使 用 者 可 以 存 取 任 何 电 脑 上 的 任 何 资 料 库 , 这 是 功 能 上 很 笼 统 的 说 法 (当 然 就 不 严 密 ), 若 组 成 的 观 点 , 看 字 面 就 知 道 分 成 Client与 Server, 而 对 於 资 料 库 系 统 中 的 Client与 Server到 底 有 些 什 麽 呢 , 请 各 位 再 耐 心 的 看 看 :

Server:
提 供 基 本 的 RDBMS功 能 , 包 含 资 料 的 定 义 , 维 护 , 保 密 性 与 整 合 性 外 , 也 含 有 并 行 控 制 与 回 复 的 动 作 支 援 , 以 及 能 接 受 资 料 库 语 言 的 叙 述 。
Client:
此 设 备 包 含 数 个 分 开 的 子 系 统 如 资 料 工 作 台 (Data WorkBench)包 含 资 料 库 的 管 理 工 具 , 表 格 (Form)工 具 制 作 资 料 输 入 画 面 , 报 表 (Report)产 生 工 具 制 作 输 出 报 表 以 及 一 般 性 的 资 料 库 维 护 工 具 ; 应 用 程 式 工 作 台 (Application WorkBench)提 供 应 用 程 式 产 生 器 与 执 行 环 境 等 ; 应 用 程 式 库 (Application Library)则 提 供 给 一 般 程 式 语 言 (如 C或 BASIC)做 资 料 库 的 应 用 程 式 时 的 介 面 ; 以 及 一 般 性 的 资 料 交 谈 工 具 (像 终 端 监 视 器 Terminal Monitor)与 使 用 者 发 展 的 应 用 程 式 。

mSQL简介

    在 考 验 完 大 家 的 耐 性 之 後 , 我 们 开 始 来 看 看 miniSQL吧 :-)

    miniSQL(或 mSQL)是 一 套 轻 量 级 的 资 料 库 引 擎 (Lightweight Database Engine), 它 主 要 特 色 是 在 低 记 忆 体 需 求 下 , 提 供 快 速 的 资 料 存 取 ; 原 先 是 在 Sun OS 4.1.1上 发 展 , 目 前 经 测 试 可 使 用 的 平 台 包 含 Solaris 2.3, Ultrix 4.3, Linux, FreeBSD以 及 OSF/1.其 实 大 多 数 的 BSD衍 生 系 统 , SVR4为 基 础 的 系 统 或 POSIX系 统 相 容 的 平 台 应 都 可 架 设 , 目 前 也 有 报 告 在 HP-UX, NeXT, SCO, Sequent, Cray, Tandem等 平 台 上 架 设 的 例 子 。

    mSQL提 供 一 个 SQL语 言 的 子 集 为 查 询 语 言 , 类 似 FoxPro与 DBaseIV所 提 供 的 SQL语 言 一 样 都 只 有 一 小 部 份 , 虽 说 是 一 小 部 份 , mSQL所 支 援 的 都 是 遵 循 ANSI SQL的 规 格 , 而 如 果 你 有 使 用 过 其 它 的 SQL-Server, 会 发 现 这 套 软 体 之 中 已 可 算 小 具 规 模 ;mSQL 其 中 包 含 5个 部 份 :

资 料 库 引 擎 (DataBase Engine):
 此 为 整 各 资 料 库 系 统 的 核 心 , 由 之 前 的 说 明 我 们 可 以 知 道 它 扮 演 着 伺 服 器 (server)的 脚 色 , 虽 然 伺 服 器 的 名 字 听 起 来 很 响 亮 , 它 不 过 也 是 一 个 程 式 , 只 是 它 必 须 像 7-11一 样 为 别 人 服 务 , 而 电 脑 中 没 有 店 面 , 如 过 是 在 一 般 DOS平 台 下 , 它 就 得 类 似 常 驻 程 式 的 方 式 出 现 , 不 过 这 里 是 Linux, 本 来 就 已 经 有 多 工 的 能 力 , 所 以 你 看 到 的 是 一 个 在 背 後 默 默 执 行 的 一 个 行 程 (Process), 这 在 Unix中 叫 背 景 行 程 (Background Process), 另 外 有 一 个 专 有 名 词 叫 deamon, 所 以 资 料 库 引 擎 是 以 deamon的 形 态 存 在 於 系 统 之 中 , 负 责 所 有 维 护 资 料 的 动 作 , 而 需 要 做 成 7-11一 样 的 Database Ser ver时 , 你 只 要 每 次 电 脑 启 动 是 都 执 行 一 次 资 料 库 引 擎 , 让 它 活 在 背 景 中 就 可 以 , 这 种 运 转 的 模 式 , 别 说 是 mSQL , 连 Oracle, Sybase也 是 相 同 的 作 法 , 不 过 mSQL资 料 库 引 擎 也 有 能 力 上 的 限 制 , 其 中 与 一 般 市 售 的 SQL Server比 较 的 话 , 它 是 单 一 执 行 绪 (Thread), 一 般 市 售 的 SQL Server是 多 重 执 行 绪 所 以 每 个 连 结 到 资 料 库 引 擎 的 动 作 都 会 使 资 料 库 引 擎 建 立 一 个 执 行 绪 (Thread), 而 离 线 的 时 候 执 行 绪 (Thread)死 亡 , 归 还 使 用 的 系 统 资 源 , 所 以 当 mSQL系 统 负 荷 较 重 时 它 的 效 率 曲 线 会 下 降 的 很 快 , 不 过 这 也 表 示 轻 载 时 , 它 的 效 率 会 比 一 般 市 售 的 SQL Server要 好 (这 当 然 是 指 相 同 平 台 之 下 )。
终 端 监 视 器 (Terminal Monitor)程 式 :
 按 先 前 所 说 的 图 中 表 示 来 看 , 它 是 一 个 一 般 性 的 交 谈 工 具 , 资 料 工 作 台 它 提 供 一 个 简 单 的 与 资 料 库 引 擎 交 谈 的 工 具 , 不 过 它 听 不 懂 英 文 更 别 说 是 中 文 , 请 用 它 提 供 的 SQL子 集 语 言 , 终 端 监 视 器 会 先 连 接 到 资 料 库 引 擎 (也 许 是 远 端 的 资 料 库 引 擎 ), 然 後 将 你 所 说 的 SQL语 言 , 原 封 不 动 的 以 字 串 的 型 式 送 到 资 料 库 引 擎 , 资 料 库 引 擎 会 剖 析 你 的 SQL句 子 , 然 後 按 你 所 要 求 的 执 行 , 最 後 在 传 回 答 案 , 如 你 说 的 它 听 不 懂 (例 如 打 错 字 )它 会 有 错 误 讯 息 , 其 实 就 算 是 一 般 市 售 的 SQL Server, 它 也 是 直 接 传 送 整 句 的 SQL句 子 , 只 不 过 一 般 市 售 的 SQL Server在 剖 析 你 的 SQL句 子 後 会 有 一 个 最 佳 化 的 步 骤 後 才 执 行 , 若 以 Oracle为 例 , 它 就 像 SQLPLUS或 SYBASE为 例 就 是 I/SQL。
资 料 库 管 理 (DataBase Administation)程 式 :
 它 是 先 前 所 说 的 图 中 资 料 工 作 台 的 一 部 份 , 它 直 接 对 资 料 库 引 擎 下 达 控 制 的 动 作 , 像 是 建 立 一 个 资 料 库 , 卸 下 一 个 资 料 库 , 重 载 入 资 料 库 的 设 定 档 或 中 止 资 料 库 引 擎 的 运 作 , 类 似 像 Oracle上 也 有 一 个 这 样 的 工 具 叫 SQLDBA, 不 过 Oracle上 的 控 制 命 令 比 较 多 , 至 於 mSQL它 只 提 供 5个 资 料 库 系 统 管 理 上 的 命 令 。
资 料 规 划 观 看 (schema viewer)程 式 :
 它 也 是 图 中 资 料 工 作 台 的 一 部 份 , 在 mSQL中 它 作 成 两 个 应 用 程 式 , 一 是 观 看 资 料 库 的 资 料 结 构 , 另 外 是 观 看 整 个 资 料 库 的 内 容 (Database Dumper), 这 种 工 具 在 市 售 的 SQL Server中 没 有 , 因 为 它 只 是 资 料 库 管 理 程 式 的 一 个 指 令 或 一 个 表 单 选 项 。
以 及 一 个 C语 言 的 API-C语 言 的 函 数 库 :
 用 以 与 资 料 库 引 擎 交 谈 。

    由 资 料 库 引 擎 与 C语 言 的 API构 成 一 个 在 TCP/IP网 路 上 的 *Client/Server*环 境 。

mSQL 的安装与重建

    mSQL须 要 recompile来 重 建 前 面 所 说 的 5部 份 , mSQL会 AutoConfig你 的 系 统 , 不 过 在 重 建 之 前 , 我 先 说 明 它 对 环 境 的 需 求 以 及 笔 者 重 建 的 环 境 :

Linux : Kernel Version 1.1.90(也 在 1.1.68上 测 试 过 )
Gcc: Gcc version 2.6.2
Lib: Lib version 4.6.20
flex: 
root login
首 先 将 msql101.tgz在 Linux下 解 开 :


Abulafia:/usr/src#tar zxvf msql101.tgz in Directory /usr/src

改 变 目 录 至 msql-1.0.1中

Abulafia:/usr/src#cd msql-1.0.1

Abulafia:/usr/src/msql-1.0.1#

建 立 你 自 己 平 台 相 依 的 环 境

Abulafia:/usr/src/msql-1.0.1#make target

改 变 目 录 至 你 自 己 平 台 相 依 的 环 境 的 环 境 中

Abulafia:/usr/src/msql-1.0.1#cd targets/Linux-1.1.90-i486

Abulafia:/usr/src/msql-1.0.1/ targets/Linux-1.1.90-i486#



ex:Linux-1.1.90.i486 or CLIX-3.1-6755

执 行 setup

Abulafia:/usr/src/msql-1.0.1/ targets/Linux-1.1.90-i486#./setup

    这 时 mSQL的 autoconfig在 检 查 你 的 系 统 之 前 会 询 问 叁 个 问 题 , 首 先 它 会 询 问 mSQL的 安 装 目 录 预 设 值 是 /usr/local/Minerva, 你 也 可 以 改 变 它 到 你 想 要 的 位 置 ; 其 次 是 问 你 是 否 现 在 正 以 root或 有 相 同 权 限 的 使 用 者 帐 号 登 录 , 最 後 是 你 的 使 用 者 帐 号 的 档 案 PID所 在 的 位 置 , 一 般 再 linux之 下 是 /var/adm, setup会 检 查 可 能 的 位 置 然 後 给 定 预 设 值 , 所 以 你 如 果 自 己 没 变 更 过 的 话 使 用 预 设 值 就 可 以 。

    之 後 setup会 检 查 它 所 须 使 用 到 的 程 式 与 档 案 , 像 是 gcc, flex, 以 及 一 些 会 使 用 到 的 C语 言 include档 ,


Abulafia:/usr/src/msql-1.0.1/targets/Linux-1.1.90-i486#make all

will rebuild package



Abulafia:/usr/src/msql-1.0.1/targets/Linux-1.1.90-i486#make install

will install contribute kits



change to directory 

/usr/local/Minerva

mSQL的存取控制档(Access Control File)

    这 是 mSQL一 个 很 重 要 的 部 份 , 因 为 mSQL没 有 保 全 系 统 (Secutiy), 它 是 直 接 使 用 作 业 系 统 的 的 保 全 措 施 , 也 就 是 直 接 由 Login时 的 User名 称 决 定 资 料 库 的 使 用 权 限 , 当 资 料 库 引 擎 启 动 或 者 由 管 理 者 程 式 下 达 Reload时 , mSQL会 读 取 你 在 安 装 目 录 下 的 msql.acl这 个 档 案 , 而 这 个 档 案 说 明 资 料 库 引 擎 使 用 这 些 资 料 库 时 , 使 用 者 的 权 限 与 可 使 用 的 远 端 主 机 定 义 , 当 使 用 到 没 有 在 存 取 控 制 档 内 说 明 的 资 料 库 时 , 预 设 值 是 没 有 限 定 , 而 存 取 控 制 档 中 每 个 资 料 库 的 的 使 用 权 限 , 都 是 由 类 似 下 列 范 例 的 格 式 来 说 明 :

sample.acl

# Sample file for mSQL Access Control

database=test

read=root,ulyess,joyce

write=root

host=*.iitinc.iii.tw, -staff.troy.iitinc.iii.tw

access=local, remote

    先 来 看 看 这 个 存 取 控 制 档 范 例 , 首 先 在 第 一 行 出 现 的 以 #为 首 的 文 字 是 注 解 , 接 下 来 的 一 行 说 明 受 存 取 控 制 的 资 料 库 名 称 , 在 mSQL中 每 个 资 料 库 你 都 会 在 msqldb的 目 录 下 找 到 , mSQL把 资 料 库 名 称 当 作 是 msqldb下 的 一 个 子 目 录 , 而 存 取 控 制 档 中 所 说 明 的 也 就 是 对 每 个 子 目 录 (也 就 是 资 料 库 )的 存 取 权 限 , 後 面 的 两 行 就 可 知 道 表 示 谁 可 以 读 取 以 及 写 入 资 料 到 资 料 库 之 中 , 其 中 每 个 用 逗 号 分 开 的 是 作 业 系 统 的 Login名 称 , 在 下 来 的 两 行 是 网 路 上 可 以 存 取 这 资 料 库 的 主 机 , 以 上 例 而 言 它 作 用 的 范 围 是 iitinc.iii.tw这 个 Domain任 何 一 个 主 机 除 了 staff.troy.iitinc.iii.tw外 都 可 接 受 。

    每 一 个 控 制 选 项 都 支 援 万 用 字 元 -"*", 在 上 例 之 中 只 有 host控 制 选 项 有 使 用 到 , 其 实 你 也 可 以 将 read改 成 "read=*", 则 任 何 使 用 者 都 可 以 读 取 test这 个 资 料 库 , 或 资 料 库 控 制 选 项 设 定 为 database=*, 则 每 个 资 料 库 都 适 用 这 个 存 取 控 制 规 范 , 除 此 之 外 每 个 资 料 库 控 制 选 项 都 必 须 注 意 一 下 顺 序 的 问 题 , mSQL的 控 制 选 项 以 第 一 个 项 目 为 基 准 , 例 如 如 果 你 想 说 明 资 料 库 除 了 ulyess之 外 其 它 人 都 不 可 读 取 时 , 若 你 的 read控 制 选 项 是 "read=-*, ulyess", 则 ulyess仍 然 不 可 以 读 取 资 料 库 , 因 为 -*也 包 含 ulyess, 所 以 read控 制 选 项 应 改 成 "read=ulyess, -*", 其 实 这 与 "read=ulyess"的 作 用 是 一 样 的 , 其 它 存 取 接 应 改 成 "read=ulyess, -*", 其 实 这 与 "read=ulyess"的 作 用 是 一 样 的 , 其 它 存 取 控 制 档 要 注 意 的 是 每 个 资 料 库 规 范 之 後 要 保 留 一 行 空 白 , 所 以 当 有 两 个 资 料 库 存 在 时 , 存 取 控 制 档 就 成 为


sample1.acl

# Sample file for mSQL Access Control

database=test

read=root,ulyess,joyce

write=root

host=*.iitinc.iii.tw, -staff.troy.iitinc.iii.tw

access=local, remote



# Sample file for mSQL Access Control

database=classdata

read=root,ulyess,joyce

write=root

host=*.iitinc.iii.tw, -staff.troy.iitinc.iii.tw

access=local, remote

mSQL的测试

    在 设 定 完 存 取 控 制 档 之 後 我 们 可 以 利 用 mSQL提 共 的 测 试 程 式 , 来 测 试 一 下 重 建 的 mSQL是 否 已 g经 可 以 正 常 运 作 了 .

/usr/local/



check access control file

Do /usr/local/Minerva/bin/msqld &
Do rtest

参考资料

1. C.J. Date [1993] A Guide to SYBASE and SQL Server
2. David J. Hughes [1995] Mini SQL - A Lightweight Database Engine Patch 1, Jan 1995