注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

PostgreSQL 中文网

 
 
 

日志

 
 

PostgreSQL9.4: 初识逻辑解析 ( logical decoding )  

2014-06-09 17:42:23|  分类: Postgres基础 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

       逻辑复制(  Logical decoding ) 是 PostgreSQL9.4 的关键特性之一,Logical decoding 允许读取 WAL 日志,并将数据变化解析成目标格式, 这块内容很多,下面仅做一些简单的分享。
    
      在开启逻辑复制之前,需要设置  wal_level   和 max_replication_slots 参数.
    
--1 设置参数

wal_level = logical
max_replication_slots = 2

备注: max_replication_slots 值最少需设置成 1,设置后重启数据库生效。

--2 创建逻辑 slot

[pg94@db1 ~]$ psql
psql (9.4beta1)
Type "help" for help.

postgres=# SELECT * FROM pg_create_logical_replication_slot('log_slot1', 'test_decoding');
 slotname  | xlog_position 
-----------+---------------
 log_slot1 | 0/540001E8
(1 row)

postgres=# select * from pg_replication_slots where slot_name='log_slot1';
 slot_name |    plugin     | slot_type | datoid | database | active | xmin | catalog_xmin | restart_lsn 
-----------+---------------+-----------+--------+----------+--------+------+--------------+-------------
 log_slot1 | test_decoding | logical   |  12993 | postgres | f      |      |         1902 | 0/540001B4
(1 row)


 --3 DDL 操作不被记录

 postgres=# SELECT * FROM pg_logical_slot_get_changes('log_slot1', NULL, NULL); 
 location | xid | data 
----------+-----+------
(0 rows)
postgres=# create table test_logical(id int4); 
CREATE TABLE

postgres=# SELECT * FROM pg_logical_slot_get_changes('log_slot1', NULL, NULL);
  location  | xid  |    data     
------------+------+-------------
 0/540003F8 | 1902 | BEGIN 1902
 0/54013CE4 | 1902 | COMMIT 1902
(2 rows)

postgres=# SELECT * FROM pg_logical_slot_get_changes('log_slot1', NULL, NULL);
 location | xid | data 
----------+-----+------
(0 rows)

备注:记录只能查询一次,之后查询为空。

--4 DML 操作被解析

postgres=# insert into test_logical (id) values (1);
INSERT 0 1

postgres=# SELECT * FROM pg_logical_slot_get_changes('log_slot1', NULL, NULL);
  location  | xid  |                       data                       
------------+------+--------------------------------------------------
 0/54013DE0 | 1903 | BEGIN 1903
 0/54013DE0 | 1903 | table public.test_logical: INSERT: id[integer]:1
 0/54013E58 | 1903 | COMMIT 1903
(3 rows)

postgres=# insert into test_logical (id) values (2),(3),(4);                  
INSERT 0 3

postgres=# SELECT * FROM pg_logical_slot_get_changes('log_slot1', NULL, NULL);
  location  | xid  |                       data                       
------------+------+--------------------------------------------------
 0/54013F38 | 1905 | BEGIN 1905
 0/54013F38 | 1905 | table public.test_logical: INSERT: id[integer]:2
 0/54013F74 | 1905 | table public.test_logical: INSERT: id[integer]:3
 0/54013FB0 | 1905 | table public.test_logical: INSERT: id[integer]:4
 0/5401403C | 1905 | COMMIT 1905
(5 rows)


--5 重复查询解析日志

postgres=# insert into test_logical (id) values (7);                         
INSERT 0 1

postgres=# select * from pg_logical_slot_peek_changes('log_slot1',NULL,NULL);
  location  | xid  |                       data                       
------------+------+--------------------------------------------------
 0/54014380 | 1908 | BEGIN 1908
 0/54014380 | 1908 | table public.test_logical: INSERT: id[integer]:7
 0/540143F8 | 1908 | COMMIT 1908
(3 rows)

postgres=# select * from pg_logical_slot_peek_changes('log_slot1',NULL,NULL);
  location  | xid  |                       data                       
------------+------+--------------------------------------------------
 0/54014380 | 1908 | BEGIN 1908
 0/54014380 | 1908 | table public.test_logical: INSERT: id[integer]:7
 0/540143F8 | 1908 | COMMIT 1908
(3 rows)

备注:如果想重复查询到日志,需使用   pg_logical_slot_peek_changes() 函数。接下来使用工具接收数据变化,这里使用  pg_recvlogical 。

--6 使用 pg_recvlogical 接收数据变化

pg_recvlogical -h 127.0.0.1 -d postgres --slot log_slot1 --start -f -


--会话1: 创建表并插入数据

postgres=# create table test_1(id int4);
CREATE TABLE
postgres=# insert into test_1 values (1);
INSERT 0 1
postgres=# insert into test_1 values (2);
INSERT 0 1
postgres=# delete from test_1 where id=1;
DELETE 1


--日志被解析

[pg94@db1 ~]$ pg_recvlogical -h 127.0.0.1 -d postgres --slot log_slot1 --start -f -

BEGIN 1909
COMMIT 1909
BEGIN 1910
table public.test_1: INSERT: id[integer]:1
COMMIT 1910
BEGIN 1911
table public.test_1: INSERT: id[integer]:2
COMMIT 1911
BEGIN 1912
table public.test_1: DELETE: (no-tuple-data)
COMMIT 1912

备注:  数据日志被解析出来,以上仅是对逻辑复制简单实验,更多内容还需探索。

--7 参考


  评论这张
 
阅读(2274)| 评论(5)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016