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. prototype linkage can reduce object initialization time and memory consumption

    //对象是可变的键控集合, //"numbers, strings, booleans (true and false), null, and undefined" 不是对象的解释 ...

  2. Flink - FlinkKafkaConsumer08

      先看 AbstractFetcher 这个可以理解就是,consumer中具体去kafka读数据的线程,一个fetcher可以同时读多个partitions的数据来看看 /** * Base cl ...

  3. WCF中自定义消息编码器:压缩编码器的使用

    通过抓包知道WCF在提交.返回数据的时候大多使用XML进行数据交互,如果返回DataTable那么这些数据将变得很大,通过查询找到一个对数据压缩的方法: http://msdn.microsoft.c ...

  4. json数据交换

    1.1   为什么要进行json数据交互 json数据格式在接口调用中.html页面中较常用,json格式比较简单,解析还比较方便. 比如:webservice接口,传输json数据. 1.2   s ...

  5. addevent兼容函数 && 阻止默认行为 && 阻止传播

    function addEvent(a, b, c, d) { a.addEventListener ? a.addEventListener(b, c, d) : a.attachEvent(&qu ...

  6. Python的安装

    篇幅主要是别人的分享,我这里主要是添加注意点.我当初就是按照下面的图片开始安装python,安装的是python3.5,pyDev也是使用的博主的(还花了1资源分下载).但是运行程序时,一直显示 Er ...

  7. 一个高度压缩的bit位图字典的实现

    微软实现的字典功能简单方便,出于全局性考虑,其内部实现比较复杂,在对海量数据处理时,仅仅存放一个对象地址就将占据32个bit(64位机器中占据64个bit),而且其内部通过int[]来处理hash桶, ...

  8. centos apache安装和设置

    分类: LINUX 安装方式:yum install httpdyum install mysql-serveryum install phpyum install php-mysql 一.WEB服务 ...

  9. javaScript中的单引号与双引号

    javaScript中的单引号与双引号没有什么区别.但因为xhtml规范要求所有xhtml属性要用双引号括起来.所以在javaScript中使用单引号. var html = '<h2 clas ...

  10. JQuery源码之“对象的结构解析”

    吃完午饭,觉得有点发困,想起了以后我们的产品可能要做到各种浏览器的兼容于是乎不得不清醒起来!我们的web项目多数是依赖于Jquery的.据了解,在Jquery的2.0版本以后对IE的低端版本浏览器不再 ...