请问,这种方法为什么不能同步

laladasdas 发布于 2012/11/26 12:51
阅读 365
收藏 0

Windows下Postgresql数据库通过Slony-I 实现数据库同步备份

一. 我们要实现的环境是windows xp、windows7、windows2003或windows2008上安装Postgresql数据库,实现目的是多台数据库服务器进行数据库同步,即数据库同步更新、删除、插入等对数据库的操作。

二. 使用的工具是数据库版本Postgresql8.4,配置集群的工具是Stack Builder自己的可安装的Slony-I v2.0.4-1或者edb_slony_i_pg84.

三. Slony-I实现数据库集群同步的原理简述:Slony-i是采用一主多从式集群方式,通过在主服务器和从服务器上建立同步节点,设置远程访问路径,启动监听进程(slon守护进程)进行监听,当主服务器进行了修改操作时,通过触发器触发,从进程进行异步修改来达到数据库同步。但是这种同步只能是从服务器备份主服务器,不能修改从服务器让主服务器同步。也即这种同步是单方向的。而且主、从服务器的postgres服务和slony-I服务都必须启动。

四. 先在两台机上安装 postgresql和slony,且都建立一个test的数据库。在master节点的test库上建立需要复制的表,例如testtable,这些表必须要有主键(slony只是实现某个数据库,某些设定好的表的同步更新,新建表不行)。需要多个表则建立多个。slave节点的test库可以不用建表。

五. 详细步骤如下:

1.环境

OS:windows Server 2003 SP1/2008;

PostGreSQL: postgresql-8.2.4-1;

Slony-I: postgresql-8.2.4-1自带的Slony-I;

2.实现要求

单向同步主服务器“172.16.1.1”到从服务器的“172.16.1.2”;

其中主服务器IP:172.16.1.1,DBName:test,UserName:postgres,PassWord:111111;

从服务器IP:172.16.1.2,DBName:test,UserName:postgres,PassWord:111111;

3.配置步骤

step1:

注册相应的动态链接库:

在主服务器上以及从服务器上,进入%PG%/lib目录,运行“regsvr32 slevent.dll”;

step2:

注册服务:

在主服务器上以及从服务器上,进入%PG%/bin目录,运行“slon -regservice”;建立Slony-I服务。

step3:

建立联通性:

在主服务器上以及从服务器上,编辑%PG%/data/pg_hba.conf,使网络中的两个数据库服务器能相互访问;

都要加上主从的ip,必须保留127.0.0.1

# IPv4 local connections:

host all all 127.0.0.1/32 md5

host all all 172.16.1.1/32 md5

host all all 172.16.1.2/32 md5

step4:

建立主服务器脚本文件“master.script”;

master.script

注:postgrecluster为群集名 test为需要复制的数据库名testtable为复制表名(必须在两个库先建且要有主键)node 1 和 node 2 中的1,2为节点的别名,可以用别的。

------------------------------------------------------------------------------------------------------------

#定义集群名称

cluster name=postgrecluster;

# 定义复制节点

#主节点

node 1 admin conninfo = 'dbname=test host=172.16.1.1 user=postgres password=111111';

#从节点

node 2 admin conninfo = 'dbname=test host=172.16.1.2 user=postgres password=111111';

# 初始化集群,id从1开始

init cluster ( id = 1, comment = 'Master Node' );

#设置参与同步的数据表,创建复制集,id也是从1开始,从复制集添加表

create set ( id = 1, origin = 1, comment = 'All test Tables' );

set add table ( set id = 1, origin = 1, id = 1, fully qualified name = 'public. testtable', comment = 'Table testtable' );

#设置存储节点,存储主从两个节点的信息

store node ( id = 2, comment = 'Slave Node', event node = 1);

#设置存储路径

#主节点

store path ( server = 1, client = 2, conninfo = 'dbname= test host=172.16.1.1 user=postgres password=111111');

#从节点

store path ( server = 2, client = 1, conninfo = 'dbname= test host=172.16.1.2 user=postgres password=111111');

#设置侦听事件和订阅方向,复制中角色,主节点是原始提供者,从节点是接受者

store listen ( origin = 1, provider = 1, receiver = 2 );

store listen ( origin = 2, provider = 2, receiver = 1 );

------------------------------------------------------------------------------------------------------------

step5:

运行脚本文件:

在主服务器里进入%PG%/bin运行“slonik master.script” ;

注:如果 master.script 不放在bin目录下,则需要加上路径!

如报错提示缺少相应的*.sql文件,请将%PG%/share下的xxid.v80.sql, slony1_funcs.v80.sql,slony1_base.v80.sql复制后更名为相应的文件(只改文件名,如将xxid.v80.sql复制后改为xxid.v81.sql);

step6:

在主服务器上建立引擎配置文件“slony_master.conf”其内容是集群名称以及指向从服务器的连接配置;

slony_master.conf

注:postgrecluster为群集名 test为需要复制的数据库名

------------------------------------------------------------------------------------------------------------

#集群名称

cluster_name = postgrecluster

#连接主服务器的信息

conn_info = 'dbname=test host=172.16.1.1 user=postgres password=111111'

------------------------------------------------------------------------------------------------------------

step7:

为服务添加引擎:

在主服务器里进入%PG%/bin运行“slon -addengine slony_master.conf”;

出现上面错误是conf的文件名打错!

step8:

建立从服务器脚本文件“slave.script”;

slave.script

注:postgrecluster为群集名 test为需要复制的数据库名

------------------------------------------------------------------------------------------------------------

#定义集群名称

cluster name=postgrecluster;

#定义复制节点

#主节点

node 1 admin conninfo = 'dbname=test host=172.16.1.1 user=postgres password=111111';

#从节点

node 2 admin conninfo = 'dbname=test host=172.16.1.2 user=postgres password=111111';

#定义订阅

SUBSCRIBE SET (ID = 1, PROVIDER = 1, RECEIVER = 2, FORWARD = YES);

------------------------------------------------------------------------------------------------------------

#SUBSCRIBE SET (ID = 1, PROVIDER = 1, RECEIVER = 2, FORWARD NO, OMIT COPY = NO);

注:上面不是错误。

step9:

运行脚本文件:

在从服务器里进入%PG%/bin运行“slonik slave.script” ;

如报错提示缺少相应的*.sql文件,请参看step5;

step10:

在从服务器上建立引擎配置文件“slony_slave.conf”其内容是集群名称以及指向主服务器的连接配置;

slony_slave.conf

注:postgrecluster为群集名 test为需要复制的数据库名

------------------------------------------------------------------------------------------------------------

#集群名称

cluster_name = postgrecluster

#连接从服务器的信息

conn_info ='dbname=test host=172.16.1.2 user=postgres password=111111'

------------------------------------------------------------------------------------------------------------

step11:

为服务添加引擎:

在从服务器里进入%PG%/bin运行“slon -addengine slony_slave.conf”;

step12:

分别在主服务器和从服务器上挂起服务并监听引擎;

错误处理:

1. error1:

<stdin>:7: PGRES_FATAL_ERROR SELECT 1 FROM pg_catalog.pg_shadow WHERE usename = user AND usesuper - ERROR: permission denied for relation pg_shadow

处理: Error: You are not a superuser on node 1

发现user要用超级用户

2. error2:

<stdin>:10: PGRES_FATAL_ERROR

select "_slony_test1".determineIdxnameUnique('public.tb_depart', NULL); - ERROR: Slony-I: determineIdxnameUnique(): table "public"."tb_depart" not found

处理: 原来tb_depart、tb_manager、tb_user这几个表是需要先在test/testslave1/testslave2/testslave3这几个库里先建好的。。并且每个表都要有primary key

我是这样建的 依次创建

create table tb_depart (

id int primary key,

name char(8));

3. error3 :

Error: language PL/pgSQL is not installed in database 'dbname=test_slave1 host=192.168.1.244 user=admin244 port=5432'

处理: 在目的机器中运行bin/createlang plpgsql 数据库名

注:必须要以postgres 用户登录,不能用administrator用户登录。因为安装postgreSQL时建立的管理用户是默认的postgres而非administrator。如果要用远程登录postgres用户,必须要在远程登录界面权限上添加postgres用户。

4. error4 :

windows 无法启动 Slony-I 服务(位于 本计算机 上)。

错误:1067 进程意外终止。

处理:可以先把此服务的登录帐号变为NEWMAPGIS\postgres 密码111111 启动服务后再改回“本地服务” 密码 passw0rd

5. error5 :

在win7下注册动态链接库失败,提示:“模块slevent.dll已加载,但对DllRegisterServer的调用失败,错误代码为0x80040200“。解决方法:以管理员身份运行命令提示符,执行相同操作就可行。原因:win7对安全级别进行了设置,对动态链接库的注册要管理员模式才可以。

6. error6 :

在执行slonik configfilename时,发现找不到.sql文件。解决办法:复制+改名,到share文件夹下找到复制到bin目录,如果名字不对要改为相应的名字。

7. error7 :

当slon –addengine时,可以slon –listengines来查看监视进程,如果没有的话要在运行中services.msc中开启slony-i服务

按照上面的方法为什么不能同步,请您指点哪些地方有问题(是不是这个步骤不完整,第12步是什么意思),谢谢

加载中
0
justjavac
justjavac
大哥,看的我眼花了, 格式可以调整下吗。
0
SunLee
SunLee
建议先升级到Postgresql9.2,保守的话到Postgresql9.1,至少Postgresql9.0
返回顶部
顶部