问题描述
用于进行备份的命令
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将 不复制任何数据。
是否有建议备份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 }},但这是无害的。
您应该检查实际的转储输出,以查看子表是否已实际转储。