无法使用pg_dump PostgreSQL

问题描述

用于进行备份的命令

C:\Program Files\Postgresql\12\bin>pg_dump  -h localhost -U postgres -p 5432  -Fc -f "D:\Database Backup\temp_10.bak" GESEMS_Performace_Test.

错误

pg_dump:注意:超表数据位于块中,不会复制任何数据。

详细信息:Hypertable的数据存储在Hypertable的块中,因此Hypertable的copY TO将 不复制任何数据。

Reference Image:

是否有建议备份TimescaleDB超表?

解决方法

在TimescaleDB中,超级表是一个空表,数据存储在名为 chunks 的子表中。您可以在\d+中使用psql命令来查看超表的结构:

postgres=# \d+ devices
                                          Table "public.devices"
 Column |           Type           | Collation | Nullable | Default | Storage | Stats target | Description 
--------+--------------------------+-----------+----------+---------+---------+--------------+-------------
 time   | timestamp with time zone |           | not null |         | plain   |              | 
 device | integer                  |           | not null |         | plain   |              | 
 temp   | double precision         |           |          |         | plain   |              | 
Indexes:
    "devices_pkey" PRIMARY KEY,btree ("time",device)
    "devices_device_time_idx" btree (device,"time" DESC)
    "devices_time_idx" btree ("time" DESC)
Triggers:
    ts_insert_blocker BEFORE INSERT ON devices FOR EACH ROW EXECUTE FUNCTION _timescaledb_internal.insert_blocker()
Child tables: _timescaledb_internal._dist_hyper_1_10_chunk,_timescaledb_internal._dist_hyper_1_11_chunk,_timescaledb_internal._dist_hyper_1_12_chunk,_timescaledb_internal._dist_hyper_1_13_chunk,_timescaledb_internal._dist_hyper_1_14_chunk,_timescaledb_internal._dist_hyper_1_15_chunk,_timescaledb_internal._dist_hyper_1_1_chunk,_timescaledb_internal._dist_hyper_1_2_chunk,_timescaledb_internal._dist_hyper_1_3_chunk,_timescaledb_internal._dist_hyper_1_4_chunk,_timescaledb_internal._dist_hyper_1_5_chunk,_timescaledb_internal._dist_hyper_1_6_chunk,_timescaledb_internal._dist_hyper_1_7_chunk,_timescaledb_internal._dist_hyper_1_8_chunk,_timescaledb_internal._dist_hyper_1_9_chunk

使用PostgreSQL pg_dump转储表时,它将分别转储父表和子表的内容。恢复转储时,转储将依次填充超表(父表)和块(子表)。

由于pg_dump在转储时使用标准的COPY命令提取表的内容,因此TimescaleDB会打印一条通知,说明您正在尝试转储超表,该表为空。

这样做的原因是,如果使用COPY直接转储仅超表 ,它将根本不转储任何数据,这很容易理解,很有用否则会犯错误。由于无法区分是直接在单个表上运行COPY还是使用pg_dump(转储所有表)的情况,因此当您使用{{1 }},但这是无害的。

您应该检查实际的转储输出,以查看子表是否已实际转储。