postgresql 安装 配置远程访问 PostgreSQL WAL日志解析工具: wal2json cdc数据同步方案

一.安装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 后面再写

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

但行益事莫问前程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值