Sybase 简介,第 3 部分

作者:Jay Sissom

欢迎回来!在本系列的前两部分中,我们安装了 Sybase 数据库并配置了 Perl 语言以与数据库一起工作。在第三部分中,我们将使用我们新安装的数据库服务器创建一个 Web 应用程序。在您可以使用 Sybase 服务器管理应用程序之前,需要了解一些背景信息。我假设您已经阅读了本系列的前两篇文章。

示例程序是一个 Web 上的书店。我们将讨论使用 Sybase SQL 服务器创建和维护客户端-服务器应用程序的各个方面。阅读本文后,您不会成为专家,但您将对客户端-服务器应用程序需要完成的工作有一个很好的了解。示例应用程序将无法与 Amazon.com 竞争,但它将使您了解如何设计客户端-服务器应用程序。我们首先来看一下 Sybase SQL 服务器的一些基础知识。

事务

Sybase SQL Server 是一个事务型数据库服务器。事务是单个工作单元。例如,下订单将被视为一个事务。从一个帐户转移资金到另一个帐户是一个事务。即使事务影响我们数据库中的两个表,整个事务也应该完成或根本不应该发生——它永远不应该半途而废。例如,如果您想从您的储蓄帐户转移 100 美元到您的支票帐户,您要么希望转移发生,要么不发生。您不希望 100 美元从您的储蓄帐户中移除但没有放入您的支票帐户。完成此转移的 SQL 语句看起来像这样

update accounts_t set balance = balance - 100
       where account_nbr = 'mysaving'
update accounts_t set balance = balance + 100
       where account_nbr = 'mychecking'

银行不希望第一个更新在没有第二个更新的情况下执行。如果那是我的帐户,我知道我不会愿意。Sybase SQL Server 允许开发人员指定事务的开始和结束位置。

begin transaction
   update accounts_t set balance = balance - 100
      where account_nbr = 'mysaving'
   if @@error != 0
   begin
     rollback transaction
     return
   end
   update accounts_t set balance = balance + 100
      where account_nbr = 'mychecking'
   if @@error != 0
   begin
     rollback transaction
     return
   end
   commit transaction
   if @@error != 0
   begin
     rollback transaction
   end
如果您不使用 begin transaction 和 commit transaction 命令,数据库服务器将假定每个 SQL 命令都是一个单独的事务。请确保在需要的地方在您的应用程序中使用事务控制。有关事务的更多信息,请参阅《Transact-SQL 用户指南》第 17 章。
日志

SQL Server 使用日志来跟踪所有事务。每个数据库都有自己的日志。日志是数据库的一部分,不可人工读取。对数据库所做的每个更改都保存在数据库的事务日志中。一些数据库将它们的数据和日志信息保存在同一区域。大多数数据库为数据和日志分别设置了区域。数据库的每个区域都称为段。默认情况下,数据库有三个段

  • 系统:存储数据库的系统表。

  • 日志:存储数据库的事务日志。

  • 默认:存储所有其他数据库对象。

您可以创建一个数据库,其中所有三个段都在同一设备上。如果您这样做,您将无法像您希望的那样控制数据库。创建数据库的最佳方法是将日志段与系统段和默认段分开。当您创建数据库时,您可以指定将数据库放在哪些设备上。有关这些段以及创建您自己的自定义段的更多信息,请查看《系统管理指南》的第 16 章(请参阅“资源”)。有关创建数据库的更多信息,请查看第 14 章。在我们的示例程序中,创建了一个名为 book_d 的数据库,其中为数据分配了 20MB,为日志分配了 10MB。

所有修改数据库的事务都保存在数据库的事务日志中。此日志中的数据将持续增加,直到您将日志备份到磁带或磁盘。即使在所有事务都提交后,日志中的数据仍将保留。它会一直保留到日志段被备份。这意味着您需要经常备份您的数据库,否则此日志段将填满。当日志段填满时,在您备份日志段之前,您无法对此数据库中的数据进行更改。

有一个函数可用,它将允许数据库服务器在段即将填满时自动调用存储过程。因此,您可以编写一个存储过程以在段接近满时自动备份日志。存储过程是数据库中包含 SQL 代码的对象。应用程序中包含一个名为 sp_thresholdaction 的示例存储过程,它将日志备份到磁盘。有关阈值过程的更多信息,请参阅《系统管理指南》的第 21 章。

备份

就像计算机系统的任何其他部分一样,数据库也需要备份。一种方法是关闭数据库服务器,然后备份数据库设备文件。这可能有效,但 Sybase 表示以这种方式进行的备份不能保证正确恢复。每个数据库都必须跟踪其日志和事务序列。如果其中任何一个与其他不同步,Sybase 将无法使用该数据库。幸运的是,Sybase 创建了一个备份服务器来帮助您备份数据库。它甚至允许您在数据库仍在运行时运行备份。您的书店可以每周 7 天、每天 24 小时保持运行。

您可以使用 Sybase 备份服务器将数据库和日志备份到磁盘或磁带。要备份到磁带,您需要配置您的磁带设备。阅读《系统管理指南》的第 18 章,了解如何配置您的磁带驱动器。

根据您的数据库大小,我建议您至少在白天备份一次日志,并在每晚备份数据库。如果您的数据库非常庞大,您可能无法做到这一点。尽可能频繁地备份日志,但将日志备份视为对数据库所做的更改。如果数据库损坏,您需要恢复数据库,然后恢复自数据库备份以来您备份的所有日志。

如果您选择将日志保存到磁盘驱动器,我强烈建议将它们保存在与保存数据库的磁盘不同的磁盘上。在我们的一个生产数据库服务器上,我们每天中午将日志备份到磁盘,然后通过 FTP 将它们传输到另一个系统。该系统上有 20 个 1GB 的驱动器,因此数据库和日志位于不同的驱动器上,日志备份位于另一个磁盘上。为了获得最佳性能,最好将所有内容保存在单独的小驱动器上。系统可以比对单个大型驱动器更快地读取和写入多个驱动器。

数据库一致性

每次您启动 Linux 系统时,都会针对您的所有文件系统运行 fsck 程序。fsck 程序确保所有目录和数据都一致。文件系统有可能变得不同步,从而导致数据丢失。

Sybase 数据库服务器有一个类似的命令。它被称为 dbcc(数据库一致性检查)。此命令确保所有数据分配都正确且已核算。应定期在您的数据库上运行这些检查。可以像安排备份一样安排它们。

书店应用程序

您可以从 Linux Journal FTP 服务器 ftp://ftp.linuxjournal.com/pub/lj/listings/issue64/ 下载整个应用程序。为了节省空间,此处未展示整个应用程序。有两个 tar 文件:3250src.tgz 和 3250cgi.tgz。第一个文件包含所有数据库对象的源代码。以 sybase 用户身份登录并解压缩 tar 文件。安装前请阅读 README 文件。您需要安装服务器附带的 pubs2 示例数据库。第二个 tar 文件包含应用程序所需的所有 CGI 脚本和其他文件。这些文件应放置在您的 Web 服务器的 /cgi-bin 目录中。同样,安装前请阅读 README 文件。必须安装 Sybase 和 Sybperl 才能使用此应用程序。有关此安装的信息,请参见本文的前两部分。

本文不是关于 Web 开发的文章,因此我不会详细介绍应用程序的 Web 方面。它也不是 Web 应用程序选美比赛。您会看到我没有花太多时间使其看起来漂亮。我相信您可以找到时间使应用程序看起来像您喜欢的那样。

如果您将应用程序安装在默认位置,您可以在您的系统上启动 Web 浏览器并转到 https:///cgi-bin/store/store/ 以运行应用程序。如果您收到“File Not Found”错误消息,则表示找不到您的 CGI 应用程序。在默认的 Red Hat 5.x 系统上,CGI perl 脚本应位于 /home/httpd/cgi-bin/store/store。

如果您收到“Internal Server Error”错误消息,则表示您的 Perl 程序可能不在 /usr/bin/perl。编辑文件 /home/httpd/cgi-bin/store/store/ 并修改 Perl 的路径以指向您的 Perl 可执行文件。找出问题的一种方法是在命令行运行 Perl 脚本。您应该收到 HTML。如果您收到错误消息,则需要解决此问题。

如果您收到商店菜单,请单击“搜索图书”。如果您收到错误消息,则表示您的客户端无法连接到数据库。查看文件 /home/httpd/cgi-bin/store/store.inc/。您可能需要更改数据库服务器的名称。确保您的数据库服务器已启动并正在运行。您应该能够使用 store.inc 文件中的用户名和密码连接到它。使用命令行中的 isql 程序进行测试。

应用程序的每个屏幕都有一个用 Perl 编写的子例程。子例程以 URL 的最后一部分命名。要搜索图书,URL 将是 https:///cgi-bin/store/store/search/。负责此操作的子例程称为 search

应用程序数据库

在我们的应用程序中,我们使用两个数据库。第一个是 pubs2 示例数据库。我们使用 titles 表作为图书列表。此表是只读的。我们只查看它;应用程序不对其进行更改。第二个数据库名为 book_d,它创建在两个设备上。日志段位于 device02 上,分配了 10MB 空间。数据段位于 device01 上,分配了 20MB 空间。此数据库中有五个表。

  • inventory_t:此表与 pubs2 数据库中的 titles 表是一对一关系。titles 表中的每一行在此表中都有一行。此表包含库存中的图书数量和订购中的数量。

  • orders_t:此表是客户订单的列表。

  • order_nbr_t:此表只有一行。它用于保证订单号始终是唯一的。

  • types_t:此表是图书类型的列表。它用于填充搜索屏幕上的下拉框。

  • user_t:此表是客户列表。

为了提供对数据的访问,我们在除一种情况外的所有情况下都使用存储过程。存储过程是存储在数据库中的 SQL 代码。这使我们能够将过程封装在数据库中,因此不必在您的所有应用程序中复制它。它还提供了性能优势。当存储过程加载时,SQL 已预编译。当应用程序运行时,服务器不必预编译 SQL,因此应用程序应该运行得更快。我们在 search1 过程中使用了 SQL,因为它会根据给定的参数发生巨大变化。

在脚本中,我们还创建了一个用户来访问数据库。每次 CGI 脚本运行时,它都以此用户身份登录。您的应用程序的最终用户不需要知道这一点,实际上,也不应该知道这一点。即使此用户拥有运行应用程序所需的最低权限,您也应保护此用户名和密码。

这是一个非常小的应用程序。如果您将此应用程序投入生产,则必须完成更多事情。

  • 使其看起来更漂亮。此应用程序在 90 年代早期看起来还不错,但在今天的世界中,它需要看起来好得多,人们才会使用它。

  • 准备并安排自动备份。使用 cron 以定期间隔备份您的数据。

  • 准备并安排数据库一致性检查。应定期运行这些检查,再次使用 cron 来安排这些检查。

  • 创建和调整表索引。这些表没有定义的索引。索引是关于表的额外数据,它将允许数据库服务器更快地访问数据。

解释数据库服务器如何使用索引超出了本文的范围——我有一本关于该主题的完整书籍。在将应用程序投入生产之前,您应该在所有表中加载示例数据并测试将在您的应用程序中运行的查询。根据查询,您可以很好地猜测需要哪些索引。SQL 中有一个命令可以帮助调整索引。它是 set showplan on。整本书的章节都致力于解释此命令及其输出。

总结

正如您所看到的,使用 Sybase 数据库作为您的客户端-服务器应用程序的基础并非易事。Sybase 数据库服务器是一个工业级数据库,能够处理数百个用户和千兆字节的数据。Linux 上有许多数据库可用。在免费数据库中,我认为 Sybase 数据库服务器是最强大的。如果您不需要强大的数据库,则可能有更好的选择。但是,如果您需要一个强大的数据库来管理大量数据或许多用户,Sybase 数据库服务器将是一个坚实的基础。

资源

Jay Sissom (jsissom@indiana.edu) 负责印第安纳大学基于 Web 的财务决策支持数据的前端。他已经在许多操作系统上安装和支持了 Sybase 数据库,并为 Web 编写了数据库客户端。在不编程时,他喜欢业余无线电和弹奏他的贝斯吉他和键盘。

加载 Disqus 评论