过期的行不会从外部表分区postgres中移出

问题描述 投票:0回答:1

我正在尝试了解如何在Postgres中配置分片。

我的Postgres设置有一个temperature表,该表具有4个分区,每个分区覆盖不同的“时间戳”值范围。

postgres=# \d+ temperature
                                                     Partitioned table "public.temperature"
  Column   |            Type             | Collation | Nullable |                 Default                 | Storage | Stats target | Description 
-----------+-----------------------------+-----------+----------+-----------------------------------------+---------+--------------+-------------
 id        | bigint                      |           | not null | nextval('temperature_id_seq'::regclass) | plain   |              | 
 city_id   | integer                     |           | not null |                                         | plain   |              | 
 timestamp | timestamp without time zone |           | not null |                                         | plain   |              | 
 temp      | numeric(5,2)                |           | not null |                                         | main    |              | 
Partition key: RANGE ("timestamp")
Partitions: temperature_201901 FOR VALUES FROM ('2019-01-01 00:00:00') TO ('2019-02-01 00:00:00'),
            temperature_201902 FOR VALUES FROM ('2019-02-01 00:00:00') TO ('2019-03-01 00:00:00'),
            temperature_201903 FOR VALUES FROM ('2019-03-01 00:00:00') TO ('2019-04-01 00:00:00'),
            temperature_201904 FOR VALUES FROM ('2019-04-01 00:00:00') TO ('2019-05-01 00:00:00')

[temperature_201904表,特别是外国表

postgres=# \d+ temperature_201904 
                                                           Foreign table "public.temperature_201904"
  Column   |            Type             | Collation | Nullable |                 Default                 | FDW options | Storage | Stats target | Description 
-----------+-----------------------------+-----------+----------+-----------------------------------------+-------------+---------+--------------+-------------
 id        | bigint                      |           | not null | nextval('temperature_id_seq'::regclass) |             | plain   |              | 
 city_id   | integer                     |           | not null |                                         |             | plain   |              | 
 timestamp | timestamp without time zone |           | not null |                                         |             | plain   |              | 
 temp      | numeric(5,2)                |           | not null |                                         |             | main    |              | 
Partition of: temperature FOR VALUES FROM ('2019-04-01 00:00:00') TO ('2019-05-01 00:00:00')
Partition constraint: (("timestamp" IS NOT NULL) AND ("timestamp" >= '2019-04-01 00:00:00'::timestamp without time zone) AND ("timestamp" < '2019-05-01 00:00:00'::timestamp without time zone))
Server: shard02

插入操作按预期进行。如果我插入以下值并从远程主机shard02检查,则该值存在。太棒了!

postgres=# select * from temperature_201904;
 id | city_id |      timestamp      | temp  
----+---------+---------------------+-------
  1 |       1 | 2019-04-02 00:00:00 | 12.30
(1 row)

但是,如果我更新此行的时间戳,使其在为该分区定义的范围内不再有效,我希望它移出并放入正确的分区temperature_201901中,但不是。

postgres=# update temperature set timestamp =  '2019-01-04' where id=1;
UPDATE 1
postgres=# select * from temperature_201904 ;
 id | city_id |      timestamp      | temp  
----+---------+---------------------+-------
  1 |       1 | 2019-01-04 00:00:00 | 12.30

再次重申一下,该表的范围为temperature_201904 FOR VALUES FROM ('2019-04-01 00:00:00') TO ('2019-05-01 00:00:00'),并且是外部表。

感觉就像我在这里丢失了一些东西。

这是预期的行为吗?如果是这样,是否有一种方法可以配置为:随着分区约束的改变,数据可以在节点之间自动移动?

提前感谢!

postgres=# SELECT version();
                                                     version                                                      
------------------------------------------------------------------------------------------------------------------
 PostgreSQL 12.2 (Debian 12.2-2.pgdg100+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 8.3.0-6) 8.3.0, 64-bit
postgresql sharding
1个回答
1
投票

这似乎是预期的。从the docs

虽然行可以从本地分区移动到外部表分区(只要外部数据包装程序支持元组路由,但是不能将它们从外部表分区移动到另一个分区。

现在,我本应期望产生一个错误,而不是默默地违反隐含的约束,但是我不希望这种方式能够按您希望的方式工作。

© www.soinside.com 2019 - 2024. All rights reserved.