PostgreSQL通过解析日志,获取数据库增量变化,pg_recvlogical
1.首先用该工具来看我们的日志变化,需要先将test_decoding插件编译并安装(进入contrib,编译安装即可)
创建一个slot:
SELECT * FROM pg_create_logical_replication_slot('regression_slot', 'test_decoding’);
获取slot记录的变更日志:
postgres=# insert into test values(1, 'test', now());
INSERT 0 1
postgres=# insert into test values(1, 'test', now());
INSERT 0 1
只获取变化,不消费slot:
postgres=# SELECT * FROM pg_logical_slot_peek_changes('regression_slot', NULL, NULL);
lsn | xid | data
-----------+-----+-------------------------------------------------------------------------------------------------------------------------------
0/16637F8 | 572 | BEGIN 572
0/16637F8 | 572 | table public.test: INSERT: id[integer]:1 info[text]:'test' crt_time[timestamp without time zone]:'2019-05-27 11:52:08.147527'
0/1663B20 | 572 | COMMIT 572
0/1663B58 | 573 | BEGIN 573
0/1663B58 | 573 | table public.test: INSERT: id[integer]:1 info[text]:'test' crt_time[timestamp without time zone]:'2019-05-27 11:52:09.67556'
0/1663BD8 | 573 | COMMIT 573
(6 rows)
postgres=# select * from pg_replication_slots ;
slot_name | plugin | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn
-----------------+---------------+-----------+--------+----------+-----------+--------+------------+------+--------------+-------------+---------------------
regression_slot | test_decoding | logical | 13237 | postgres | f | f | | | 572 | 0/16637C0 | 0/16637F8
(1 row)
可以看到xmin还是572,且能再次查询到变化:
postgres=# select * from pg_replication_slots ;
slot_name | plugin | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn
-----------------+---------------+-----------+--------+----------+-----------+--------+------------+------+--------------+-------------+---------------------
regression_slot | test_decoding | logical | 13237 | postgres | f | f | | | 573 | 0/1663B20 | 0/1663CF0
(1 row)
postgres=# select pg_logical_slot_get_changes('regression_slot', NULL, null); pg_logical_slot_get_changes
-----------------------------
(0 rows)
2.远程使用pg_recvlogical工具来回放:
创建slot,当然也可以使用原来有的:
pg_recvlogical --create-slot -S test_logical -h pg36 -d postgres -p 5433
postgres=# select * from pg_replication_slots ;
slot_name | plugin | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn
-----------------+---------------+-----------+--------+----------+-----------+--------+------------+------+--------------+-------------+---------------------
regression_slot | test_decoding | logical | 13237 | postgres | f | f | | | 574 | 0/1663CB8 | 0/1663CF0
test_logical | test_decoding | logical | 13237 | postgres | f | f | | | 574 | 0/1663CF0 | 0/1663D28
(2 rows)
-bash-4.1$ pg_recvlogical -S test_logical -h pg36 -d postgres -p 5433 --start -f -
Password:
BEGIN 574
table public.test: DELETE: (no-tuple-data)
table public.test: DELETE: (no-tuple-data)
table public.test: DELETE: (no-tuple-data)
COMMIT 574
BEGIN 575
table public.test: INSERT: id[integer]:1 info[text]:'test' crt_time[timestamp without time zone]:'2019-05-27 14:03:02.985599'
COMMIT 575
如果slot已经建立好了,而远端的pg_recvlogical停止,停止的这段时间产生的数据库变化是不会被消费的,启动后可以接收到所有的变化。
3.可以设置从什么时候开始接收回放日志:
postgres=# select pg_current_wal_lsn();
pg_current_wal_lsn
--------------------
0/1664FB8
(1 row)
postgres=# delete from test where id = 1;
DELETE 7
postgres=# select txid_current();
txid_current
--------------
585
(1 row)
postgres=# select txid_current();
txid_current
--------------
586
(1 row)
postgres=#
postgres=#
postgres=# insert into test values(1, 'test 2', now());
INSERT 0 1
postgres=# select pg_current_wal_lsn();
pg_current_wal_lsn
--------------------
0/16652C0
(1 row)
postgres=# insert into test values(1, 'test 3', now());
INSERT 0 1
-bash-4.1$ pg_recvlogical -S test_logical -h pg36 -d postgres -p 5433 --startpos=0/16652C0 --start -f -
Password:
BEGIN 588
table public.test: INSERT: id[integer]:1 info[text]:'test 3' crt_time[timestamp without time zone]:'2019-05-27 14:37:31.246539'
COMMIT 588
可以看到,只是从0/16652C0开始进行接收的
4.不用的时候,删除复制槽
postgres=# select * from pg_replication_slots ;
slot_name | plugin | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn
-----------------+---------------+-----------+--------+----------+-----------+--------+------------+------+--------------+-------------+---------------------
regression_slot | test_decoding | logical | 13237 | postgres | f | f | | | 574 | 0/1663CB8 | 0/1663CF0
test_logical | test_decoding | logical | 13237 | postgres | f | t | 13155 | | 589 | 0/1665420 | 0/1665458
(2 rows)
postgres=# select pg_drop_replication_slot('regression_slot');
pg_drop_replication_slot
--------------------------
(1 row)
postgres=# select pg_drop_replication_slot('test_logical');
pg_drop_replication_slot
--------------------------
(1 row)
postgres=# select * from pg_replication_slots ;
slot_name | plugin | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn
-----------+--------+-----------+--------+----------+-----------+--------+------------+------+--------------+-------------+---------------------
(0 rows)
4.可以使用wal2json工具来解析日志,目前使用的是test_decoding
PostgreSQL通过解析日志,获取数据库增量变化,pg_recvlogical的更多相关文章
- canal 基于Mysql数据库增量日志解析
canal 基于Mysql数据库增量日志解析 1.前言 最近太多事情 工作的事情,以及终身大事等等 耽误更新,由于最近做项目需要同步监听 未来电视 mysql的变更了解到公司会用canal做增量监 ...
- 数据库增量日志监听canal
概述 canal是阿里巴巴旗下的一款开源项目,纯Java开发.基于数据库增量日志解析,提供增量数据订阅&消费,目前主要支持了MySQL(也支持mariaDB). 起源:早期,阿里巴巴B2B公司 ...
- PostgreSQL Replication之第二章 理解PostgreSQL的事务日志(1)
在前面的章节中,我们已经理解了各种复制概念.这不仅仅是一个为了接下来将要介绍的东西而增强您的意识的理论概述,还将为您介绍大体的主题. 在本章,我们将更加接近实际的解决方案,并了解PostgreSQL内 ...
- (转)ASP.NET缓存全解析6:数据库缓存依赖
ASP.NET缓存全解析文章索引 ASP.NET缓存全解析1:缓存的概述 ASP.NET缓存全解析2:页面输出缓存 ASP.NET缓存全解析3:页面局部缓存 ASP.NET缓存全解析4:应用程序数据缓 ...
- IIS日志存入数据库之二:ETW
在上一篇文章<IIS日志存入数据库之一:ODBC>中,我提到了ODBC方式保存的缺点,即:无法保存响应时间以及接收和响应的字节数. 如果一定要获取响应时间以及接收和响应的字节数的话,就要另 ...
- PHP面试题及答案解析(3)—MySQL数据库
1.mysql_num_rows()和mysql_affected_rows()的区别. mysql_num_rows()和mysql_affected_rows(),这两个函数都作用于 mysql_ ...
- PostgreSQL Replication之第二章 理解PostgreSQL的事务日志(5)
2.5 XLOG的内部结构 我们将使用事务贯穿本书,并让您在技术层面上更深地洞察事情是如果工作的,我们已经增加了这部分专门处理XLOG的内部工作机制.我们会尽量避免前往下降到C级,因为这将超出本书的范 ...
- PostgreSQL Replication之第二章 理解PostgreSQL的事务日志(2)
2.2 XLOG和复制 在本章中,您已经了解到PostgreSQL的事务日志已经对数据库做了所有的更改.事务日志本身被打包为易用的16MB段. 使用这种更改集来复制数据的想法是不牵强的.事实上,这是在 ...
- sql sever获取数据库还原时间语句
--只获取数据库名称和最后的还原时间 SELECT sdb.Name AS DatabaseName , ), ), '-') AS LastBackUpTime FROM sys.sysdataba ...
随机推荐
- 随机验证码生成和join 字符串
函数:string.join() Python中有join()和os.path.join()两个函数,具体作用如下: join(): 连接字符串数组.将字符串.元组.列表中的元素以指定的字符(分隔符) ...
- List集合遍历的三种方法
测试数据: List<String> list = new ArrayList<String>(); list.add("java"); list.add( ...
- D. Treasure Hunting ( 思维题 , 贪心)
传送门 题意: 在一个 n * m 的地图里,有 k 个宝藏,你的起点在 (1, 1), 每次你能 向下向右向左移动(只要在地图里): 现在,有 q 个安全的列, 你只有在这些列上面,你才能 ...
- linux中的selinux到底是什么
一文彻底明白linux中的selinux到底是什么 2018年06月29日 14:17:30 yanjun821126 阅读数 58877 标签: SElinux 更多 个人分类: Linux 一 ...
- 51 Nod 1086 多重背包问题(单调队列优化)
1086 背包问题 V2 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 收藏 关注 有N种物品,每种物品的数量为C1,C2......Cn.从中任选若干件放 ...
- C语言写数据库(二)
简单的实现增删查改的操作后,实现了一个先读写其中一个表的某两项内容,再把相关字符段写入到另外一张表中去.涉及到查询和插入两个步骤. 其中还涉及到汉字的读写和插入,会有字符的操作产生乱码.所以要先保证m ...
- [EOJ Monthly2019.11][T4]安全带
以下是题干 D. 安全带 单点时限: 1.0 sec 内存限制: 256 MB (前面题干是一堆废话,我把它删了) 简单来说:初始给出一个 n 个点顺次连接而成的环,点有点权,边权是两个端点的点权乘积 ...
- 计算机网络&http学习笔记持续整理
http不常见状态码: 204: 请求处理成功,但是没有资源可返回. 206: 只返回请求资源的某一部分(客户端只想请求某一部分),响应报文中包含由Content-Range指定范围的实体内容. 30 ...
- leetcode-easy-others-191. Number of 1 Bits-NO
mycode 不会... 输入是二进制....我还以为十进制.... 00000001011 = 11 题意: 编写一个将(无符号)整数作为输入的函数,并返回该数字二进制表示中等于1的位数.例如:输 ...
- oracle字段like多个条件
写oracle sql时有时候会有 and (字段 like ‘匹配串1’or 字段 like ‘匹配串2’or ...)这样的情况出现,下面提供一个简洁点的解决方案: and REGEXP_LIKE ...