使用 PostgreSQL 7.0.3 设置 RServ

来自 PostgreSQL Wiki
跳转到导航跳转到搜索


此页面包含**历史信息或已弃用文章**。


最后更新于 2001 年 9 月 13 日

作者:S.Gopi

本文档描述了如何使用 RServ 在 PostgreSQL 7.0.3 中进行数据库镜像。

以下所有流程都是通过反复试验得出的,您可能找到另一种更简单的方法来实现相同的结果。如果是这样,请告诉我。

在 Slackware 7.0 (2.2.16),PostgreSQL 版本 7.0.3,RServ 版本 0.1 下测试

本文档是在您已将 PostgreSQL 安装在 /usr/local/pgsql 并成功安装 RServ 二进制文件和库的情况下编写的。如果没有,请先安装它们,然后查看 postgresql-7.0.3/share/contrib/rserv/ 中的 README.rserv 以获取安装说明。

创建主数据库

(如果您已经拥有一个,可以跳过此步骤)

    createdb master

然后在这个主数据库中创建您想要的任何表(必需的),以及您想要的任何记录(可选)。

让我们使用 pg_dump,因为只有在初始阶段主从数据库的表结构和记录条目(如果有)相似的情况下,复制才会发生,否则在复制时会出错。

    pg_dump -d master -f master.dump

创建从数据库

首先我们创建从数据库,然后从我们在上一步中创建的转储中恢复表结构和记录。

    createdb slave
    psql slave

    slave=$ \i master.dump
    slave=$ \q (quit from psql)

在设置完主数据库和从数据库后,让我们开始设置复制流程。设置复制流程

在开始复制之前,您必须执行四个步骤

  • 步骤 1:初始化主数据库以进行复制
  • 步骤 2:初始化从数据库以进行复制
  • 步骤 3:在主数据库中添加需要复制的表和列
  • 步骤 4:在从数据库中添加需要复制的表和列。这些必须与主数据库相同。

步骤 1:初始化主数据库以进行复制

从命令行执行 

    /usr/local/pgsql/bin/MasterInit master

此流程将在主数据库中创建复制流程使用的必要表和序列。这些表由复制流程用来跟踪复制。

步骤 2:初始化从数据库以进行复制

从命令行执行 

    /usr/local/pgsql/bin/SlaveInit slave

此流程将根据 RServ 的作者在从数据库中创建必要的表,这些表用于簿记信息(我不知道它们用于什么目的)。

步骤 3:在主数据库中添加需要复制的表和列

从命令行执行 

    /usr/local/pgsql/bin/MasterAddTable master table_name column_name

这将为主数据库中的 rserv 表添加必要的条目。只有以这种方式添加的表才会复制到镜像数据库中。

您可以在表中指定一个特定的列名,在这个版本(0.1)中没有限制,尽管作者的文档说只有这列会被复制。有用的 bug !!! :-) 在表中更改的任何列都将在主数据库中正确更新。

对您想要镜像的所有主数据库表重复上述步骤(非常痛苦的工作)

步骤 4:在从数据库中添加需要复制的表和列

从命令行执行 

    /usr/local/pgsql/bin/SlaveAddTable slave table_name column_name

这些表和列必须与您为主数据库所做的相同(我不知道如果您更改某些内容会发生什么,如果您有时间可以测试此功能。请记住,这是 0.1 版本 ;-))

对您想要镜像的所有从数据库表重复上述步骤(另一个痛苦的工作)

然后呢?......

您现在可以开始进行复制了,

    /usr/local/pgsql/bin/Replicate master slave

就是这样!您已经做到了... 作为测试,更新主数据库中的一些记录(添加、修改、删除),然后进行复制并检查从数据库,它必须是主数据库的镜像。如果没有,请再次检查所有上述流程,如果仍然无法解决问题,请给我发电子邮件。

只要您想复制,只需执行命令 

    Replicate master slave

注意

执行 Replicate 命令后,请确保在 /usr/local/pgsql/bin/ 或您的当前目录中不存在 0 字节的“__Snapshot”文件。

当我检查时,只有在复制流程因某些原因失败时才会创建此文件(即使程序没有显示任何错误消息,请记住这是 0.1 版本)。

附注

一旦您创建了适当的结构(这是个大任务),RServ 就非常易于使用。RServ 处于起步阶段,可能存在 bug,因此请自担风险使用。例如,试试这个 : 在没有执行 MasterAddTable 和 SlaveAddTable 的情况下尝试执行 Replicate,它将返回,没有任何错误消息,但实际上没有进行镜像。

现在,执行 MasterAddTable 和 SlaveAddTable 流程,然后尝试使用 Replicate,这次它会进行复制,但从数据库中的原始条目(在 SlaveAddTable 条目之前)将永远不会更新,或者会发生其他一些问题!尝试更新主数据库中的一些条目,然后进行复制,您将遇到惊喜......

尽情享用...