使用 PostgreSQL 7.0.3 设置 RServ
此页面包含**历史信息或已弃用文章**。
最后更新于 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 条目之前)将永远不会更新,或者会发生其他一些问题!尝试更新主数据库中的一些条目,然后进行复制,您将遇到惊喜......
尽情享用...