一.安装postgres
(1)新增postgres用户组:
groupadd postgres
新增postgres用户并且设置这个用户属于上面创建的postgres用户组:
useradd -g postgres postgres
修改postgres用户密码:passwd postgres(这里设置密码为123456,需要输入2遍)
passwd postgres
cd到目录
(2)wget获取安装包(可通过其他路径或官网),解压缩包
wget https://ftp.postgresql.org/pub/source/v10.5/postgresql-10.5.tar.gz
tar xf postgresql-10.5.tar.gz
cd到解压后目录
(3)编译安装
为避免出错,先解决包缺失问题
yum install ncurses* readline* zlib* -y
指定安装路径
./configure --prefix=/usr/local/pgsql-10.5
编译
make install
(4)配置
在/usr/local目录上生成了pgsql-10.5目录
创建用户及设置/usr/local/pgsql-10.5目录文件属主组
chown -R postgres.postgres /usr/local/pgsql-10.5/
ll /usr/local/ |grep pgsql-10.5
给/usr/local/pgsql-10.5目录设置软连接
ln -s /usr/local/pgsql-10.5/ /usr/local/pgsql
ll /usr/local/pgsql
(5)切换到对应用户,操作
su - postgres
设置环境变量:
vim ~/.bash_profile
粘贴:
PATH=$PATH:$HOME/.local/bin:$HOME/bin
export PATH=$PATH:/usr/local/pgsql-10.5/bin
PGDATA=/usr/local/pgsql-10.5/data
export PGDATA
export PATH
生效
source ~/.bash_profile
测试
which psql
psql -V
(6)初始化数据库(initdb --help查看详情),指定库文件路径
initdb /usr/local/pgsql-10.5/data
(7)设置远程访问
a.进入到安装的目录下,修改pg_hba.conf配置文件
cp pg_hba.conf pg_hba.conf.`date +%F`
vim pg_hba.conf
允许所有ip通过密码访问
b.修改postgresql.conf配置文件
cp postgresql.conf postgresql.conf.`date +%F`
vim postgresql.conf
(8)创建log目录用于存放开机日志,及启动数据库
mkdir /usr/local/pgsql/log
pg_ctl start -l /usr/local/pgsql-10.5/log/pg_server.log
出现报错,进入log目录查看出错原因:
发现配置有问题,修改部分多加了一个. 把 0.0.0.0./0 改为 0.0.0.0/0,保存退出
执行:
pg_ctl start -l /usr/local/pgsql-10.5/log/pg_server.log
(9)检查是否启动
ps -ef|grep postgres
(10)数据库的简单操作
进入库
psql
在数据库中:
\password #设置密码
CREATE DATABASE cdc; #创建库
\du #查看用户
\l #查看数据库列表
create user cdc superuser password '123456'; #创建用户及密码
二.WAL日志解析工具
(1) 配置环境变量
vim /etc/profile
粘贴
export PATH="/usr/local/pgsql-10.5/bin:$PATH"
让配置生效
source /etc/profile
(2)
把postgresql的bin加入到环境变量后,执行
若无法克隆,可询问我
git clone https://github.com/streamsets/wal2json.git
配置安装的postgresql的bin下的pg_config
PATH=/path/to/bin/pg_config:$PATH
USE_PGXS=1 make
USE_PGXS=1 make install
(3)在postgresql.conf中设置参数
wal_level = logical
#
# these parameters only need to set in versions 9.4, 9.5 and 9.6
# default values are ok in version 10 or later
#
max_replication_slots = 10
max_wal_senders = 10
wal_sender_timeout = 2000
(注意:把timeout去掉,之后做数据同步的时候发现有错误)
配置的参数含义
include-xids:将xid添加到每个变更集。默认值为false。
include-timestamp:向每个变更集添加时间戳。默认值为false。
include-schemas:将架构添加到每个更改。默认为true。
include-types:为每个更改添加类型。默认为true。
include-typmod:在具有修饰符的类型中添加修饰符(例如varchar(20)而不是varchar)。默认为true。
include-type-oids:添加类型oid。默认值为false。
include-domain-data-type:用基础数据类型替换域名。默认值为false。
include-column-positions:添加列位置(pg_attribute.attnum)。默认值为false。
include-not-null:添加不为null的信息作为columnOptionals。默认值为false。
include-default:添加默认表达式。默认值为false。
include-pk:将主键信息添加为pk。包括列名和数据类型。默认值为false。
pretty-print:在JSON结构中添加空格和缩进。默认值为false。
write-in-chunks:在每次更改之后而不是每个更改集之后编写。默认值为false。
include-lsn:将nextlsn添加到每个变更集。默认值为false。
include-unchanged-toast(不建议使用):请勿使用。不推荐使用。
filter-origins:排除指定来源的更改。默认为空,这意味着将不过滤任何原点。它是一个逗号分隔的值。
filter-tables:从指定表中排除行。默认为空,这意味着将不过滤任何表。它是一个逗号分隔的值。这些表应该是模式限定的。*.foo表示所有架构中的表foo,bar.*表示架构栏中的所有表。特殊字符(空格,单引号,逗号,句号,星号)必须以反斜杠转义。模式和表区分大小写。表"public"."Foo bar"应指定为public.Foo\ bar。
add-tables:仅包含指定表中的行。默认为所有架构中的所有表。它具有与相同的规则filter-tables。
filter-msg-prefixes:如果前缀在列表中,则排除消息。默认为空,这意味着将不过滤任何消息。它是一个逗号分隔的值。
add-msg-prefixes:仅当前缀在列表中时才包括消息。默认为所有前缀。它是一个逗号分隔的值。在此参数之前wal2json应用filter-msg-prefixes。
format-version:定义要使用的格式。默认值为1。
actions:定义要发送的操作。默认为所有操作(插入,更新,删除和截断)。但是,如果您使用的是format-version1,则不会启用截断功能(向后兼容)。
配置完成后重启
pg_ctl restart-l /usr/local/pgsql-10.5/log/pg_server.log
(4)
有2种方式获取变更:通过SQL或pg_recvologic调用函数
a.pg_recvologic
在一个终端中:
pg_recvlogical -d postgres --slot test_slot --create-slot -P wal2json
pg_recvlogical -d postgres --slot test_slot --start -o pretty-print=1 -f -
在另一个终端:
vim /tmp/example1.sql
粘贴
CREATE TABLE table_with_pk (a SERIAL, b VARCHAR(30), c TIMESTAMP NOT NULL, PRIMARY KEY(a, c));
CREATE TABLE table_without_pk (a SERIAL, b NUMERIC(5,2), c TEXT);
BEGIN;
INSERT INTO table_with_pk (b, c) VALUES('Backup and Restore', now());
INSERT INTO table_with_pk (b, c) VALUES('Tuning', now());
INSERT INTO table_with_pk (b, c) VALUES('Replication', now());
DELETE FROM table_with_pk WHERE a < 3;
INSERT INTO table_without_pk (b, c) VALUES(2.34, 'Tapir');
-- it is not added to stream because there isn't a pk or a replica identity
UPDATE table_without_pk SET c = 'Anta' WHERE c = 'Tapir';
COMMIT;
psql -At -f /tmp/example1.sql postgres
原来的终端
在原来的终端
Ctrl+C 停止
pg_recvlogical -d postgres --slot test_slot --drop-slot
b.sql
采用格式1输出
vim /tmp/example2.sql
粘贴
CREATE TABLE table2_with_pk (a SERIAL, b VARCHAR(30), c TIMESTAMP NOT NULL, PRIMARY KEY(a, c));
CREATE TABLE table2_without_pk (a SERIAL, b NUMERIC(5,2), c TEXT);
SELECT 'init' FROM pg_create_logical_replication_slot('test_slot', 'wal2json');
BEGIN;
INSERT INTO table2_with_pk (b, c) VALUES('Backup and Restore', now());
INSERT INTO table2_with_pk (b, c) VALUES('Tuning', now());
INSERT INTO table2_with_pk (b, c) VALUES('Replication', now());
DELETE FROM table2_with_pk WHERE a < 3;
INSERT INTO table2_without_pk (b, c) VALUES(2.34, 'Tapir');
-- it is not added to stream because there isn't a pk or a replica identity
UPDATE table2_without_pk SET c = 'Anta' WHERE c = 'Tapir';
COMMIT;
SELECT data FROM pg_logical_slot_get_changes('test_slot', NULL, NULL, 'pretty-print', '1');
SELECT 'stop' FROM pg_drop_replication_slot('test_slot');
psql -At -f /tmp/example2.sql postgres
采用格式2输出
vim /tmp/example3.sql
粘贴
CREATE TABLE table2_with_pk (a SERIAL, b VARCHAR(30), c TIMESTAMP NOT NULL, PRIMARY KEY(a, c));
CREATE TABLE table2_without_pk (a SERIAL, b NUMERIC(5,2), c TEXT);
SELECT 'init' FROM pg_create_logical_replication_slot('test_slot', 'wal2json');
BEGIN;
INSERT INTO table2_with_pk (b, c) VALUES('Backup and Restore', now());
INSERT INTO table2_with_pk (b, c) VALUES('Tuning', now());
INSERT INTO table2_with_pk (b, c) VALUES('Replication', now());
DELETE FROM table2_with_pk WHERE a < 3;
INSERT INTO table2_without_pk (b, c) VALUES(2.34, 'Tapir');
-- it is not added to stream because there isn't a pk or a replica identity
UPDATE table2_without_pk SET c = 'Anta' WHERE c = 'Tapir';
COMMIT;
SELECT data FROM pg_logical_slot_get_changes('test_slot', NULL, NULL, 'format-version', '2');
SELECT 'stop' FROM pg_drop_replication_slot('test_slot');
psql -At -f /tmp/example3.sql postgres
三.cdc增量数据同步方案
todo 后面再写