无法使用 pg_dump PostgreSQL 备份超表 TimescaleDB 数据库

Not able to take backup of hypertable TimescaleDB database using pg_dump PostgreSQL

用于备份的命令

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

错误:

pg_dump: NOTICE: hypertable data are in the chunks, no data will be copied.

DETAIL: Data for hypertables are stored in the chunks of a hypertable so COPY TO of a hypertable will not copy any data.

对备份 TimescaleDB 超表有什么建议吗?

在 TimescaleDB 中,hypertable 是一个空 table,数据存储在名为 chunks 的子 table 中。您可以在 psql:

中使用 \d+ 命令查看 hypertable 的结构
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 转储 table 时,它会分别转储父 table 和子 table 的内容。当您恢复转储时,它将依次填充 hypertable(父 table)和块(子 tables)。

由于pg_dump在转储时使用标准COPY命令提取tables的内容,TimescaleDB会打印一条通知,表明您正在尝试转储一个hyper[=34] =],它是空的。

这样做的原因是,如果您使用 COPY 直接转储 hypertable ,它不会转储任何数据all,了解这一点很有用,否则很容易出错。由于无法区分您 运行 COPY 直接在单个 table 上使用 pg_dump 的情况(转储所有 table) , 当你使用 pg_dump 时也会打印此通知,但它是无害的。

您应该检查实际的转储输出以查看子 table 是否确实被转储。