10.5 给复制添加表和管理的问题

一旦我们增加了此表到系统中,我们可以将它添加到复制设置。这样做有点复杂。首先,我们必须创建我们自己的新表集合并把这个和我们已经有的表合并。因此,过一段时间,我们将有两个表集合。该脚本是这样的:

#!/bin/sh

MASTERDB=db1

SLAVEDB=db2

HOST1=localhost

HOST2=localhost

DBUSER=hs

slonik<<_EOF_

cluster name = first_cluster;

node 1 admin conninfo = 'dbname=$MASTERDB host=$HOST1 user=$DBUSER';

node 2 admin conninfo = 'dbname=$SLAVEDB host=$HOST2 user=$DBUSER';

create set (id=2, origin=1,

comment='a second replication set');

set add table (set id=2, origin=1, id=5,

fully qualified name = 'public.t_second',

comment='second table');

subscribe set(id=1, provider=1,receiver=2);

merge set(id=1, add id=2,origin=1);

_EOF_

成功的关键是在脚本结尾处的 merge 调用。它将确保,这些新表将被集成到现有的表集合。

当脚本被执行是,我们将面临一个预期的问题,具体如下:

hs@hs-VirtualBox:~/slony$ sh slony_add_to_set.sh

<stdin>:7: PGRES_FATAL_ERROR select "_first_cluster".determineIdxnameU

nique('public.t_second', NULL); - ERROR: Slony-I: table "public"."t_

second" has no primary key

我们已经创建了一个 没有主键的妙。这是非常重要的—Slony没有办法复制一个没有主键的表。因此,我们必须添加这个主键。基本上,我们有两个选择做到它。这里所期望的方法是一定要使用execute script,就像我们在前面展示的那样。如果您的系统是空闲的,您也可以使用麻烦的方法快速做到:

db1=# ALTER TABLE t_second ADD PRIMARY KEY (id);

NOTICE: ALTER TABLE / ADD PRIMARY KEY will create implicit index "t_second_pkey" for table "t_second"

ALTER TABLE

db1=# \q

hs@hs-VirtualBox:~/slony$ psql db2

psql (9.2.4)

Type "help" for help.

db2=# ALTER TABLE t_second ADD PRIMARY KEY (id);

NOTICE: ALTER TABLE / ADD PRIMARY KEY will create implicit index "t_second_pkey" for table "t_second"

ALTER TABLE

然而,这是不推荐的—使用Slony接口来做这样的修改是跟理想的。

一旦我们修改了数据结构,我们可以再次执行 slonik 脚本,看看会发生什么:

hs@hs-VirtualBox:~/slony$ sh slony_add_to_set.sh

<stdin>:6: PGRES_FATAL_ERROR lock table "_first_cluster".sl_event_lock,

"_first_cluster".sl_config_lock;select "_first_cluster".storeSet(2, 'a

second replication set'); - ERROR: duplicate key value violates unique

constraint "sl_set-pkey"

DETAIL: Key (set_id)=(2) already exists.

CONTEXT: SQL statement "insert into "_first_cluster".sl_set

(set_id, set_origin, set_comment) values

(p_set_id, v_local_node_id, p_set_comment)"

PL/pgSQL function _first_cluster.storeset(integer,text) line 7 at SQL

statement

您看到的是一个典型的使用Slony您将面对的问题。如果出现错误,它真的,真的很难让所有的事情井然有序。这是一个您应该准备的场景。

[如果您在一台生产系统上使用Slony工作,总是使用脚本执行不同的工作来为自己创建一个完美的工作库。如果您不必在系统运行和正常操作期间进行修改,这将大大降低您的风险。始终确保您有足够的脚本来处理最常见的问题,例如我们刚才介绍的一个。]

因此,要解决这个问题,我们可以简单地再次删除该表集,并从头开始:

slonik<<_EOF_

cluster name = first_cluster;

node 1 admin conninfo = 'dbname=$MASTERDB host=$HOST1 user=$DBUSER';

node 2 admin conninfo = 'dbname=$SLAVEDB host=$HOST2 user=$DBUSER';

drop set (id=2, origin=1);

_EOF_

要删除一个表集,我们可以运行 drop set 。它将帮助您回到您开始的地方。这个脚本会执行的很干净:

hs@hs-VirtualBox:~/slony$ sh slony_drop_set.sh

现在,我们可以再次重新启动,并添加表。请注意,我们在对slave使用两个集合,以确保这干净地执行:

slonik<<_EOF_

cluster name = first_cluster;

node 1 admin conninfo = 'dbname=$MASTERDB host=$HOST1 user=$DBUSER';

node 2 admin conninfo = 'dbname=$SLAVEDB host=$HOST2 user=$DBUSER';

create set (id=2, origin=1, comment='a second replication set');

set add table (set id=2, origin=1, id=5, fully qualified name =

'public.t_second', comment='second table');

subscribe set(id=1, provider=1,receiver=2);

subscribe set(id=2, provider=1,receiver=2);

merge set(id=1, add id=2,origin=1);

_EOF_

现在,我们可以干净地执行那个脚本,一切都将被如期复制:

hs@hs-VirtualBox:~/slony$ sh slony_add_to_set_v2.sh

<stdin>:11 subscription in progress before mergeSet. waiting

<stdin>:11 subscription in progress before mergeSet. waiting

正如我们已经指出的,在本章中,我们特意犯了一个小错误,您已经看到了,即使它只是一个小错误,使事情顺利是多么的棘手和紧张。其中的一个原因是,一个脚本基本上不是服务端的一个事务。所以,如果一个脚本在中间某个地方失败,它将停止工作—它将不会撤销迄今为止所做的改变。这可能会导致一些问题;这是在节说描述的。

所以,一旦您做出来改变,您应该经常看一下,并看看是否一切都正常工作。下面是一个这样做的简单的方法:

db2=# BEGIN;

BEGIN

db2=# DELETE FROM t_second;

ERROR: Slony-I: Table t_second is replicated and cannot be modified on a subscriber node - role=0

db2=# ROLLBACK;

ROLLBACK

您可以开始一个事务,并尝试删除一行。它应该失败。如果他不失败,您可以安全地回滚,并尝试解决您的问题。就像您在使用事务一样,从不提交,什么都不会会出现错误。

PostgreSQL Replication之第十章 配置Slony(5)的更多相关文章

  1. PostgreSQL Replication之第十章 配置Slony(1)

    在PostgreSQL领域中,Slony是最广泛的复制解决方案之一.它不仅是最老的复制方案实现的一个,但也是有最多的外部工具支持的一个,例如PgAdmin3等. 在本章中,我们将深入探究Slony并学 ...

  2. PostgreSQL Replication之第十章 配置Slony(6)

    10.6 执行故障切换 一旦您学会了如何复制表并将它们添加到集合中,是时候学习故障转移了.基本上,我们可以在两个两种类型的故障转移之间做出区分: • 计划内故障转移 • 计划外故障转移和崩溃 在本节, ...

  3. PostgreSQL Replication之第十章 配置Slony(4)

    10.4 部署DDLs 对于生产性的应用程序来说,仅仅复制一个表明显是不够的.此外,通过没有办法保证数据从来不会发生改变.在某些时候,部署变化的数据结构(所谓的DDLs)是必要的. 现在的问题是,Sl ...

  4. PostgreSQL Replication之第十章 配置Slony(2)

    10.2 理解 Slony如何工作 在我们开始复制我们的第一个数据库之前,我们想深入Slony的架构.理解这是如何工作的是非常重要的,否则,将不可能以一种有用的和合理的方法使用这个软件.与事务日志流不 ...

  5. PostgreSQL Replication之第十章 配置Slony(3)

    10.3 复制您的第一个数据库 这个小小的介绍之后,我们可以继续前进并复制我们的第一个数据库.要做到这一点,我们可以在一个数据库实例上创建两个数据库.我们想简单地在这两个数据库之间进行复制. [ 您在 ...

  6. [转]PostgreSQL Replication之扩展与BDR

    原文:https://www.cnblogs.com/xmzzp/p/6284300.html postgres 实现master, slave ,且master是多主. -------------- ...

  7. PostgreSQL Replication之第九章 与pgpool一起工作(7)

    9.7 处理故障转移和高可用 可以使用pgpool来解决的一些明显的问题是高可用性和故障转移.一般来讲,有使用pgpool或者不使用pgpool可以用来处理这些问题的各种方法. 9.7.1 使用Pos ...

  8. 安装Postgresql之后,创建用户 配置rails

    登录 sudo su - postgres psql 1 创建Postgresql新用户,devpg是用户名,密码也是devpg, 不是超级管理员,拥有创建数据库权限,登录权限,继承拥有角色权限 cr ...

  9. PostgreSQL Replication之第四章 设置异步复制(4)

    4.4 基于流和基于文件的恢复 生活并不总只是黑色或白色:有时也会有一些灰色色调.对于某些情况下,流复制可能恰到好处.在另一些情况下,基于文件复制和PITR是您所需要的.但是也有许多情况下,您既需要流 ...

随机推荐

  1. [转自Kevins的天空 http://rootsec.cn]rad studio 2007 up3方法

    rad studio 2007 网络下载点: http://bbs.hnhyxy.com/bcb/CodeGear.RAD.Studio.2007.rar http://andy.jgknet.de/ ...

  2. win7 创建软链接方式

    mklink  目标文件  源文件(需要被软链的文件) Win7中的软链接详解(mklink命令) Post by 铁木箱子 in 技术杂谈 on 2011-05-24 13:13. 点评一下 评论 ...

  3. 【转】简单的虚拟摇杆控制移动(NGUI)

    http://www.cnblogs.com/zhangbaochong/p/4928688.html 一.用NGUI创建虚拟摇杆贴图 先创建一个sprite作为背景叫做JoyStick 并添加一个B ...

  4. 【转】Problems with HTTPS, HttpWebRequest, and iOS?

    We're using HttpWebRequest to hit HTTPS urls, on iOS. In Debug, local builds, etc. everything works ...

  5. 捕获JS 错误日志

    最近在做项目的过程中,发现很多JS报错没有引起重视,我就想想把JS错误捕获了,然后展示在我们一个平台上 具体实现代码: window.onerror = function(message, url,  ...

  6. centos 重启php-fpm

    centos 重启php-fpm ps -ef | grep php-fpm 查看php-fpm的配置文件,然后从配置文件查看php-fpm的pid文件,然后,  kill -SIGUSR2 `cat ...

  7. VS2013编译Qt5.6.0静态库(乌合之众)

    获取qt5.6.0源码包 直接去www.qt.io下载就好了,这里就不详细说了. 这里是我已经编译好的** 链接:http://pan.baidu.com/s/1pLb6wVT 密码: ak7y ** ...

  8. 利用 libiconv 实现汉字编码 utf-8 格式 和 gbk格式的相互转换

    参考文章:http://jimmee.iteye.com/blog/2174693 关于windows上编译libiconv的库,请参见:http://www.cnblogs.com/tangxin- ...

  9. js创建元素

    js创建多条数据,插入到页面中的方法. 方法一: 执行时间大概在35ms左右. 这个就属于使用字符串拼接之后,再一次性的插入到页面中.缺点是,容易导致事件难以绑定. 方法二: 执行时间不定,最少的在8 ...

  10. Arcgis for JS之Cluster聚类分析的实现

    原文:Arcgis for JS之Cluster聚类分析的实现 在做项目的时候,碰见了这样一个问题:给地图上标注点对象,数据是从数据库来 的,包含XY坐标信息的,通过graphic和graphicla ...