postgresql与slony1-2.1.1远程同步数据库
借鉴了好多别人的经验,只供参考。
一、
1.解压,命令 tar -xvjf slony1-2.1.1.tar.bz2
2.这里配置是会出错,当pgconfig 找不到共享文档时。报的错误是检测到版本小于7.3。安装postgresql-devel 包
yum install postgresql-devel
如下编译即可
进入对应的 slony1-2.1.1 目录 ,命令 :cd slony1-2.1.1
./configure
3.gmake,命令: gmake
注意,是 gmake
4.安装,命令 gmake install
如果成功会有成功提示。
和主数据库服务器的安装方式一致。(其实将主的直接COPY过来就可以的)
二
1.3.3 建立数据库和数据表
以下以在主数据库服务器上建立主数据库和数据表 test 为例见解,其他数据库和数据表请参考建立.
/usr/local/pgsql/bin/createdb
/usr/local/pgsql/bin/psql -f /home/hzh/share/sql.txt
sql.txt 文件最好是 UTF-8 格式,特别是存在中文字符时)
例:sql.txt
CREATE TABLE tb_depart(Id int primary key,Name char();
在从数据库服务器上建立与主数据库服务器上相同的数据库test
1.4 配置同步
1.4.1. 主机配置
以下脚本都是在slave上的。
slony_0.sh文件内容如下:
- #!/bin/sh
- /usr/local/pgsql/bin/slonik << _END_
- #
- # Define cluster namespace and node connection information
- #
- #集群名称
- cluster name = testdb;
- # 定义复制节点
- node 1 admin conninfo = ‘dbname=test host=192.168.30.101 port=5432 user=ssuser’;
- node 2 admin conninfo = ‘dbname=test host=localhost port=5432 user=ssuser’;
- DROP SET (id=1, origin=1);
- uninstall node (id=1);
- uninstall node (id=2);
- echo ‘Drop testdb set’;
- _END_
复制代码
slony_1.sh文件内容如下:
- #!/bin/sh
- /usr/local/pgsql/bin/slonik << _END_
- cluster name = testdb;
- # 定义复制节点
- node 1 admin conninfo = ‘dbname=test host=192.168.30.101 port=5432 user=ssuser’;
- node 2 admin conninfo = ‘dbname=test host=localhost port=5432 user=ssuser’;
- echo ‘Cluster defined, nodes identified’;
- # 初始化集群,id从1开始
- init cluster (id=1, comment=’Master Node’);
- # 设置存储节点
- store node (id=2, comment=’Slave Node’);
- echo ‘Nodes defined’;
- # 设置存储路径
- store path (server=1, client=2, conninfo=’dbname=test host=192.168.30.101 port=5432 user=ssuser’);
- store path (server=2, client=1, conninfo=’dbname=test host=localhost port=5432 user=ssuser’);
- #设置侦听事件和订阅方向,复制中角色,主节点是原始提供者,从节点是接受者
- store listen (origin=1, provider = 1, receiver =2);
- store listen (origin=2, provider = 2, receiver =1);
- _END_
复制代码
slony_2.sh文件内容如下:
- #!/bin/sh
- /usr/local/pgsql/bin/slonik << _END_
- #
- # Define cluster namespace and node connection information
- #
- cluster name = testdb;
- node 1 admin conninfo = ‘dbname=test host=192.168.30.101 port=5432 user=ssuser’;
- node 2 admin conninfo = ‘dbname=test host=localhost port=5432 user=ssuser’;
- # 设置参与同步的数据表
- #先创建一个复制集,id也是从1开始
- #向自己的复制集种添加表,每个需要复制的表一条set命令
- #id从1开始,逐次递加,步进为1;
- #fully qualified name是表的全称:模式名.表名
- #这里的复制集id需要和前面创建的复制集id一致
- #假如某个表没有主键,但是有唯一键字,那么可以用key关键字
- #指定其为复制键字,如下面的key参数
- #set add table ( set id = 1, origin = 1,id = 4, fully qualified name = ‘public.history’,key = “column”,comment = ‘Table history’ );
- #对于没有唯一列的表,需要这样处理,这一句放在 create set 的前面
- #table add key (node id = 1, fully qualified name = ‘public.history’);
- # 这样设置结果集
- #set add table (set id=1, origin=1, id=4, fully qualified name = ‘public.history’, #comment=’history table’, key = serial);
- create set (id=1, origin=1, comment=’testdb tables’);
- set add table ( set id=1, origin=1,id=1, fully qualified name=’public.tb_depart’,comment=’Table tb_depart’ );
- set add table ( set id=1, origin=1,id=2, fully qualified name=’public.tb_user’,comment=’Table tb_user’ );
- set add table ( set id=1, origin=1,id=3, fully qualified name=’public.tb_manager’,comment=’Table tb_manager’ );
- set add table ( set id=1, origin=1,id=4, fully qualified name=’public.tb_test’,comment=’Table tb_test’ );
- echo ‘set 1 of testdb tables created’;
- _END_
复制代码
slony_3.sh文件内容如下:
- #/bin/sh
- /usr/local/pgsql/bin/slon testdb “dbname=test host=192.168.30.101 port=5432 user=ssuser” > ~/slon_gb_1.out 2>&1 &
- /usr/local/pgsql/bin/slon testdb “dbname=test host=localhost port=5432 user=ssuser” > ~/slon_gb_2.out 2>&1 &
- /usr/local/pgsql/bin/slonik << _END_
- #
- # Define cluster namespace and node connection information
- #
- cluster name = testdb;
- #提供连接参数
- node 1 admin conninfo = ‘dbname=test host=192.168.30.101 port=5432 user=ssuser’;
- node 2 admin conninfo = ‘dbname=test host=localhost port=5432 user=ssuser’;
- # 提交订阅复制集
- subscribe set (id=1, provider=1, receiver=2, forward=no);
- echo ‘set 1 of gb tables subscribed by node 2′;
- _END_
复制代码
slony_main.sh文件内容如下:
- #!/bin/sh
- case $1 in
-
start) -
cd /home/postgre/slony -
sh slony_3.sh -
;; -
stop) -
killall -KILL slon -
;; -
rebuild)
-
cd /home/postgre/slony -
killall -KILL slon -
sh slony_0.sh >> /dev/null 2>&1 -
sh slony_1.sh -
sh slony_2.sh -
sh slony_3.sh -
;; -
*) -
echo “Please input start or stop or rebuild!!” -
;; - esac
复制代码
在从数据库服务器上执行slony_main.sh
可以建立同步,数据库更改后重建同步。
Rebuild错误处理
错误
[postgre@exper2 slony]$ ./slony_main.sh rebuild
<stdin>:4: Cluster defined, nodes identified
<stdin>:6: Error: namespace “_testdb” already exists in database of node 1
<stdin>:6: ERROR: no admin conninfo for node 158941536
<stdin>:8: PGRES_FATAL_ERROR select “_testdb”.storeSet(1, ‘testdb tables’);
CONTEXT:
PL/pgSQL function “storeset” line 13 at SQL statement
<stdin>:9: set 1 of gb tables subscribed by node 2
处理
#psql test
test=# drop SCHEMA _testdb CASCADE ;
VACUUM ANALYZE
或者再重新执行一次就可以了。。。