1、安装postgres
安装文档见:https://www.postgresql.org/download/linux/redhat/
我这里是centos7系统,选择安装postgresql11
# Install the repository RPM:
sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
# Install PostgreSQL:
sudo yum install -y postgresql11-server
sudo yum install -y postgresql11-devel
sudo yum install -y postgresql11-contrib.x86_64 --这个主要是安装pg_recvlogical
# Optionally initialize the database and enable automatic start:
sudo /usr/pgsql-11/bin/postgresql-11-setup initdb
#设置开机启动
sudo systemctl enable postgresql-11
#启动pg
sudo systemctl start postgresql-11
可以看到pg已经启动
切换到postgres用户:su postgres
psql命令进入命令行:
#创建用户
CREATE USER dev WITH PASSWORD '123456';
创建数据库:
createdb mydb
修改配置允许远程访问,
vim /var/lib/pgsql/11/data/pg_hba.conf
添加配置:
host all all 0.0.0.0/0 md5
重启pg:sudo systemctl start postgresql-11
即可通过navicat工具,使用dev用户连接pg
2、安装wal2json插件
sudo yum install -y wal2json11
vim /var/lib/pgsql/11/data/postgresql.conf
添加配置:
shared_preload_libraries = 'wal2json'
wal_level = logical
max_wal_senders = 4
max_replication_slots = 8
listen_addresses = '*'
重启pg:sudo systemctl start postgresql-11
注意,后续pg相关命令需要切换到postgres用户执行
建议把/usr/pgsql-11/bin/加入到环境变量,这样就可以直接执行pg_recvlogical等命令了
#创建slot
/usr/pgsql-11/bin/pg_recvlogical -d mydb --slot mydb_test_slot --create-slot -P wal2json
#查看slot列表
select * from pg_replication_slots;
#启动slot,即可监听数据变化
/usr/pgsql-11/bin/pg_recvlogical -d mydb --slot mydb_test_slot --start -o pretty-print=1 -o add-msg-prefixes=wal2json -f -
在mydb库下创建表并插入数据:
CREATE TABLE "user" (
"id" int4 NOT NULL,
"name" varchar(255) COLLATE "pg_catalog"."default" NOT NULL DEFAULT ''::character varying,
CONSTRAINT "user_pkey" PRIMARY KEY ("id")
)
;
INSERT INTO "user" VALUES (1, 'test');
可以在slot监听窗口看到刚刚插入的数据
后续通过debezium拉取wal日志数据发到kafka时,会遇到kafka消息中before字段为null的问题
需要执行命令:ALTER TABLE “public”.“user” REPLICA IDENTITY FULL;
默认情况下,REPLICA IDENTITY值为DEFAULT,oldkeys只有主键数据
见下图的前后对比,上面是DEFAULT的情况,oldkeys只有id;下面是FULL的情况,oldkeys包含了name