无法使用 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 是否确实被转储。
用于备份的命令
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 是否确实被转储。