Chinaunix首页 | 论坛 | 博客
  • 博客访问: 444773
  • 博文数量: 403
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: -70
  • 用 户 组: 普通用户
  • 注册时间: 2016-09-05 12:45
文章分类

全部博文(403)

文章存档

2014年(3)

2013年(1)

2012年(3)

2011年(21)

2010年(13)

2009年(64)

2008年(9)

2007年(36)

2006年(253)

分类: Oracle

2006-08-01 14:51:24

了解如何利用开放源代码工具轻易地将 Access 数据移植到 Linux 上的 Oracle 数据库中。

在计算机和软件世界艰难地向前发展的过程中,存在的一个不幸的事实,有时我们发现自己必须丢弃旧的数据。 我们从一个字处理 office 程序包转移到另一个程序包,就发现旧的文档再也打不开了。

同样的情况也发生在数据库上。 一个小公司可能觉得将信息存储在一个 PC 数据库中就足够了,但在该迁移信息时将发生什么? 我们可能很苦恼要丢掉有价值的信息,但的确常常扔掉这些信息。 不过,当时可能看起来不是非常主要并被丢弃的信息,有时可能会需要。

我最近就遇到这样一个问题。 我工作的一个社区机构有一个基于 PC 的应用程序,它带有一个相当大的 Microsoft Access 格式的会员数据库。 已经编写了一个来自第三方的用户程序来与该数据库一起工作,但随后许可过期了,再没有方法来获取该软件的更新。 碰巧,突然又非常需要这些信息。 我们备份了旧的数据库,并将之存储在一个 Linux 系统上。 在新的开放源代码世界中,为我们提供了许多强大的数据库(如 Linux 上的 Oracle 数据库)。 一种选择是购买一份 Microsoft Access 并创建一个应用程序,但这将把我们限制在同一个特定模型中,而这本来就已经使我们陷于困境。 此外,公司希望能够从一个安全的服务器远程访问这些数据。

再次依赖 Microsoft 不是我们希望的选择。 Linux 将作为这个新的数据库服务器的基础,并且它将运行一个行业标准的 SQL 数据库。 因此,如果我们着手取出限制在旧的 MDB 文件中的数据 — 而不依赖于安装带新的 Access 许可的 Windows 服务器(这样将再次受限于一个单体系结构解决方案),那将如何?

到处寻找解决困境的解决方案,我来到了 Brian Burns 的网站,并知道了他的 mdbtools 程序包,该程序包是命令行工具的一个集合还有一个 GUI,它的唯一的目的是提供从 Access 数据库中取出信息方法。

获取和安装 mdbtools

您需要做的第一件事是获取一份 mdbtools 程序包。 转至 ,您将找到源代码和适用于几种基于 RPM 的版本的 RPM 程序包。 从源代码进行编译非常简单,包括提取到构建 5 个步骤。

     tar -xzvf mdbtools-0.5.tar.gz
     cd mdbtools-0.5
     ./configure
make
     su -c "make install"

还可能通过下载和从 CVS 进行构建获得最新和最好的程序包。 这并不像它听起来那么复杂。 从连接并匿名登录 CVS 服务器开始。

cvs -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/mdbtools login

下一个步骤是查看 mdbtools 程序包:

cvs -z3 -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/mdbtools co mdbtools

注意前面的每一条命令都是完整的一行。 在输入上面的命令之后,当下载进行时,您将看到一个包含该版本中的各种文件的列表在屏幕上逐行显示。 当下载完成时,转移到下载目录(名称为 mdbtools)并执行以下命令。

     ./autogen.sh --enable-sql --with-unixodbc=/usr/local
make:
     su -c "make install"

对 mdbtools 进行一些研究

mdbtools 程序包自带了一系列命令行工具以及一个 GUI,用于从 mdb 文件中处理和提取数据。 我将马上说明这个 GUI,但首先我想向您介绍一些命令行工具。 这些工具中最基础的是 mdb-ver,您可以用它来识别您要处理的 mdb 文件的类型。

     $ mdb-ver members.mdb
     JET3

这种情况下的结果是 "JET3",它告诉我我的社区会员文件是基于 Access 97 应用程序的。 返回值是 "JET4",则是 Access 2000 或 Access XP 数据库。 使用 mdb-tables 命令将开始出现稍微有趣一点的信息。

     $ mdb-tables members.mdb
     ActionTaken CaseMembers ContactFollowUp ContactReason ContactSource
 ContactStatus Donations Issues Location MemberInfo PersonContacted Status ToDo

默认情况下,所有的数据库表将转储到一行上。 为了分别列出(每行一个表),可以使用 -1 标记。 不过,一些表不会显示;这些是系统表(以 Msys 开头的表)。 如果您希望这些表也列出来,那么可以使用 -S 标记。

上面的输出为您提供了组成您的 Access 数据库的各种表的详细分类。 有趣的是,我们实际上可以在数据库上执行 SQL 查询(尽管只能使用 SQL 的一个有限的子集),即使数据库不再在一个 Microsoft 系统上运行。 这就是 mdb-sql 命令的用途。 要进入交互式的 SQL 解释程序,可以输入 mdb-sql,后面紧跟数据库名称。 您将看到 1 => 提示符,您可以在提示符处输入单行或多行查询。 当您完成输入并且想运行查询时,输入 go,然后按 Enter 键。

     $ mdb-sql members.mdb
     1 => list tables
     2 => go

在上面的例子中,我基本上重新创建了 mdb-tables 命令。 其不同之处是输出限定在美观的、带有标题并且周围用虚线框起来的表中。 当调用 mdb-sql 时,您可以重载这一行为,用 -H 来取消标题,用 -p 来去除边框。

     $ mdb-sql -H -p members.mdb

您可以随时通过输入 quit 并按 Enter 键来退出 SQL 解释程序。

要创建一条查询,您可以使用默认的交互模式或在一行上发送一条查询。 在下面的例子中,我使用了另一条命令 — describe table 查询,该命令让我能够更深入地挖掘数据库的表的格式。

     $ echo "describe table Location" | mdb-sql members.mdb

     +------------------------------+--------------------+----------+
     |Column Name                   |Type                |Size      |
     +------------------------------+--------------------+----------+
     |ID                            |Long Integer        |4         |
     |Address1                      |Text                |255       |
     |Address2                      |Text                |255       |
     |Address3                      |Text                |255       |
     |Phone                         |Text                |50        |
     |Fax                           |Text                |50        |
     |DefaultInd                    |Boolean             |0         |
     +------------------------------+--------------------+----------+

为了便于使用脚本,还可以用 -I 标记从外部文件中导入查询,以及用 -o 标记并指定一个文件名来将查询输出到一个文本文件中。

利用这些简单的 SQL 查询,我们能够了解到关于数据库的布局和其相关的表的许多信息。 通过加上边框的标题和美观的显示格式,我们可以导出到文本文件中,并利用 shell 脚本来处理结果。 实际上,如果您所需要只是您的旧数据的一些简单的报表,那么以上操作就足够了。 不过,如果您希望将数据库移植到一个基于服务器的 SQL 数据库(如 Oracle)中,那么 mdbtools 也可以在此为您提供帮助。 (当然,一旦您达到了这个目的您将如何处理数据就是一个完全不同的主题了。)

取出数据

取出数据至少有两个步骤。 第一步是在您的服务器上创建一个新的数据库和它相关的表。 第二步是加载数据。 利用上述示例,您可以获得关于组成原始的 Access 数据库的各种表的所有详细信息。 然后利用这些信息,您可以编写必需的脚本来专门为您的数据库逐个地重新创建这些表。 幸运的是,您不用太费力,因为 mdbtools 程序包也为此提供了一个工具。 它就是mdb-schema。 考虑到我的社区会员表包含了一些敏感信息,所以让我用 Microsoft Access 自带的练习数据库 Northwind.mdb 来进行演示。

     $ mdb-schema Northwind.mdb

结果是模式的一个文本文件,该文件以 DDL(数据定义语言)格式发送至标准输出。 如果您想捕获该输出(非常有用)则务必将该输出重定向到一个文件中。 DDL 输出默认是 Access 格式(如以下示例所示)。

     DROP TABLE Customers;
     CREATE TABLE Customers
      (
        CustomerID                      Text (10),
        CompanyName                     Text (80),
        ContactName                     Text (60),
        ContactTitle                    Text (60),
        Address                 Text (120),
        City                    Text (30),
        Region                  Text (30),
        PostalCode                      Text (20),
        Country                 Text (30),
        Phone                   Text (48),
        Fax                     Text (48)
     );     

上面的输出只显示了一个表(为简洁起见),现在正好可以告诉您,您可以利用 -T 标记来指定单个表(我将马上演示这一操作)。 DDL 输出的数据库格式称为后端。 这时支持五个不同的后端。 它们是 "access" — 代表 Microsoft Access;"sybase" — 代表 Sybase;"oracle" — 代表 Oracle;和 "postgres" 代表 PostgreSQL(以及在 CVS 代码中的 "mysql" — 代表 MySQL)。 因此,要为 SavedQueries 表创建 Oracle 格式的 DDL,我使用下面的命令:

     $ mdb-schema -T Customers Northwind.mdb oracle

下面是模式导出的结果:

     DROP TABLE Customers;
     CREATE TABLE Customers
      (
        CustomerID              VARCHAR2 (10),
        CompanyName             VARCHAR2 (80),
        ContactName             VARCHAR2 (60),
        ContactTitle            VARCHAR2 (60),
        Address                 VARCHAR2 (120),
        City                    VARCHAR2 (30),
        Region                  VARCHAR2 (30),
        PostalCode              VARCHAR2 (20),
        Country                 VARCHAR2 (30),
        Phone                   VARCHAR2 (48),
        Fax                     VARCHAR2 (48)
     );

这样,现在我们就了解了数据库的详细信息。 我们有了它的格式、表和模式。 我们所需的就是数据,而这就是 mdb-export 命令起作用的地方。 它最简单的形式看起来如下所示:

     mdb-export database.mdb TableName

导出数据时,默认情况包含标题,用逗号作为分隔符,并在每一个字段周围加上双引号。 可以用 -H 修改符来取消标题。 -Q 取消自动在字段周围使用引号。 最后,您还可以将分隔符修改为除默认的逗号之外的其它符号。 由于习惯原因,我倾向于选择否定号 (~)。

     mdb-export -H -Q -d "~" Northwind.mdb Customers 

GUI 工具

除了作为程序包的一部分提供的命令行工具之外,还有一个美观的、基于 GTK 的图形界面 — MDB File Viewer。 调用该 GUI 的程序称为 gmdb2。 您可以通过在命令行上指定一个数据库名称来启动该程序,或简单地启动该程序,然后以图形化的方式来打开文件(单击 File,然后单击 Open,然后从另一个对话框中选择文件名)。

该 GUI 有六个选项卡: Tables、Querys (sic)、Forms、Reports、Macros 和 f{x} Modules。 请看一下,您将看到 MDB File Viewer 打开了默认的 Tables 选项卡。

 mdbtools GUI、gmdb2
mdbtools GUI、gmdb2

浏览器的右边有三个按钮。 单击任意一个表将这些按钮变为高亮状态。 Definition 按钮弹出一个窗口,以一种美观的表格化报表的形式显示该表的模式,如 所示。

表的模式
单击 Definition 按钮显示表的模式。

Data 按钮是列表上的下一个按钮。 单击此按钮将显示所选的表中的记录的一个表格化列表,如 中所示。

表中的数据的一次简单的转储
表中的数据的一次简单的转储

假定我们能够看到表中的信息,您可能会问自己是否有可能在这时对该信息进行一些查询。 单击 Tools,选择 SQL Window。 在这里您可以输入简单的 SQL 查询,就像使用 mdb-sql 命令行实用工具一样。

当然,最初的想法是使数据从 Access 转变成另一种数据库格式。 要导出数据库模式,单击 Tools 并选择 Export Schema。 从生成的对话框()中,指定一个用于输出的文件名,然后开始。 标记为 Table 的下拉式列表让您能够选择转储整个数据库模式或单个表。 同时,Schema Dialect 提供了各种支持的后端格式的一个选择。 根据您特定的目标数据库格式,您还可能想要在输出模式中包括关系。 结果为您提供了重新创建表必需的所有语句,所以您还可以选择在 CREATE TABLE 之前包括 DROP TABLE 命令。

导出 Oracle 格式模式
导出 Oracle 格式模式

最后,我们说明 Export 按钮,如果您想将数据导入到其它地方,那么它可能是三个按钮中最重要的一个。 当您选择一个表并单击 Export 时,将有一些选项供您选择(参见)。 产生的对话框将首先要求您输入文件名;您可以选择一个现有的文件或输入一个新的文件名。 然后您必须选择行结束符格式,换行符仅适用于 Linux 和 UNIX,回车符适用于 Macintosh,Windows 和 DOS 两种结束符都适用。

以 CSV 格式导出表数据
以 CSV 格式导出表数据

在下一个字段中,您可以选择分隔符。 在下拉式列表中提供了几个默认值,但您可以通过输入您自己的字符(例如,一个否定符)来覆盖这些值。 接下来的两个选择决定如何以及何时在字段周围使用引号,以及引号字符是什么。 最后,有一个检查框让您决定是否在您的输出中包含标题。

利用已有的 CSV 数据,您现在可以随意将您的数据导入到新创建的数据库中。

那些其它的选项卡和mdbtools 的未来

无疑您已经注意到了我略过了 gmdb2 GUI 的一些很吸引人的特性。 这是因为虽然图形化界面的确能够使您更清楚地了解在原来的数据库中存在什么内容,但暂时仅用于提供信息。

该工具提供了关于 mdb-tools 工具程序包的未来的一些线索。 例如,如果您单击 Forms 选项卡,您将看到为数据库创建的 VB 表单的一个列表。 类似地,Reports 选项卡允许您查看预先定义的报表。

mdbtools 程序仍在继续进行开发;一个邮件列表使开发人员和其他感兴趣人都能够讨论这个程序包并进一步推动它的发展(在 mdbtools 主页上您可以找到一个链接来加入这个邮件列表)。 下一个重要的版本 — 0.6 — 将成为第一个结合了写功能的版本。 利用其 mdb-import 工具,它将很快有可能获取 CVS 文件,并把它加载到一个 MDB 数据库中。 在更远的将来,计划包括完整的插入、更新和删除功能,以及一个更加强健和强大的 ODBC 驱动程序(当前的版本仅提供基本的功能)。 这些增强中的最后两个将使 Linux 系统上的用户有可能填写或编辑 Microsoft Access 数据库,从而提供 Linux 和 Windows 之间的互操作性的一些实际的可能性。 更多雄心勃勃的计划的增强之一是能够将 Access 表单转换成开放源代码格式,从而可以轻易地将 Access 转换到 Linux。 我迫切希望看到这些计划将如何发展。

同时,mdb-tools 程序包为那些正在向开放源代码软件转移,但不准备扔掉他们的数据再重新开始的用户提供了一条可能的途径。

阅读(801) | 评论(0) | 转发(0) |
0

上一篇:DVB技术

下一篇:DOS学习全过程

给主人留下些什么吧!~~