通过先迁移架构,然后迁移数据来迁移更大的数据库。此方法分别复制每个表或数据块,这允许您在一次复制操作失败时中途重启。
注意
对于较小的数据库,一次性迁移整个数据库可能更方便。有关更多信息,请参阅关于选择迁移方法的部分。
警告
此方法不保留使用已删除数据计算的连续聚合。例如,如果您在一个月后删除原始数据,但在连续聚合中保留一年的降采样数据,则连续聚合在迁移后会丢失任何超过一个月的数据。如果您必须保留使用已删除数据计算的连续聚合,请一次性迁移整个数据库。有关更多信息,请参阅关于选择迁移方法的部分。
迁移数据库的过程需要以下步骤
警告
根据您的数据库大小和网络速度,涉及复制数据的步骤可能需要很长时间。在此期间,您可以继续从源数据库读取数据,尽管性能可能会较慢。为了避免这个问题,请fork您的数据库并从fork迁移数据。如果您在迁移期间写入源数据库中的表,则新写入可能不会传输到 Timescale。为了避免这个问题,请参阅关于迁移活动数据库的部分。
在开始之前,请检查您是否拥有
- 安装了 PostgreSQL
pg_dump
和pg_restore
实用程序。 - 安装了用于连接到 PostgreSQL 的客户端。这些说明使用
psql
,但任何客户端都可以。 - 在 Timescale 中创建了一个新的空数据库。有关更多信息,请参阅 安装 Timescale 部分。为您的数据库配置足够的空间来容纳所有数据。
- 检查您使用的任何其他 PostgreSQL 扩展是否与 Timescale 兼容。有关更多信息,请参阅兼容扩展列表。安装您的其他 PostgreSQL 扩展。
- 检查您是否在 Timescale 和源数据库上运行相同的主要 PostgreSQL 版本。有关升级源数据库上的 PostgreSQL 的信息,请参阅 自托管 TimescaleDB 的升级说明 和 TimescaleDB 托管服务。
- 检查您是否在目标数据库和源数据库上运行相同的主要 Timescale 版本。有关更多信息,请参阅升级 Timescale 部分。
将数据前架构从源数据库迁移到自托管 TimescaleDB。这包括表和架构定义,以及关于序列、所有者和设置的信息。这不包括 Timescale 特定的架构。
使用您的源数据库连接详细信息,将数据前架构从源数据库转储到
dump_pre_data.bak
文件中。排除 Timescale 特定的架构。如果系统提示您输入密码,请使用您的源数据库凭据pg_dump -U <SOURCE_DB_USERNAME> -W \-h <SOURCE_DB_HOST> -p <SOURCE_DB_PORT> -Fc -v \--section=pre-data --exclude-schema="_timescaledb*" \-f dump_pre_data.bak <DATABASE_NAME>使用您的 Timescale 连接详细信息,将转储的数据从
dump_pre_data.bak
文件恢复到您的 Timescale 数据库中。为了避免权限错误,请包含--no-owner
标志pg_restore -U tsdbadmin -W \-h <HOST> -p <PORT> --no-owner -Fc \-v -d tsdb dump_pre_data.bak
在数据前迁移之后,源数据库中的超表在 Timescale 中变为常规 PostgreSQL 表。在 Timescale 中重新创建超表以恢复它们。
连接到您的 Timescale 数据库
psql "postgres://tsdbadmin:<PASSWORD>@<HOST>:<PORT>/tsdb?sslmode=require"恢复超表
SELECT create_hypertable('<TABLE_NAME>',by_range('<COLUMN_NAME>', INTERVAL '<CHUNK_INTERVAL>'));
注意
by_range
维度构建器是 TimescaleDB 2.13 的新增功能。
恢复超表后,返回到源数据库以逐表复制数据。
连接到您的源数据库
psql "postgres://<SOURCE_DB_USERNAME>:<SOURCE_DB_PASSWORD>@<SOURCE_DB_HOST>:<SOURCE_DB_PORT>/<SOURCE_DB_NAME>?sslmode=require"将第一个表的数据转储到
.csv
文件中\COPY (SELECT * FROM <TABLE_NAME>) TO <TABLE_NAME>.csv CSV为您要迁移的每个表和超表重复此操作。
注意
如果您的表非常大,您可以分多块迁移每个表。按时间范围拆分每个表,并单独复制每个范围。例如
\COPY (SELECT * FROM <TABLE_NAME> WHERE time > '2021-11-01' AND time < '2011-11-02') TO <TABLE_NAME_DATE_RANGE>.csv CSV
当您将数据复制到 .csv
文件后,您可以通过从 .csv
文件复制来将其恢复到 Timescale。有两种方法:使用常规 PostgreSQL COPY
,或使用 TimescaleDB timescaledb-parallel-copy
函数。在测试中,timescaledb-parallel-copy
快 16%。timescaledb-parallel-copy
工具默认不包含。您必须安装该函数。
重要提示
由于 COPY
解压缩数据,因此源数据库中的任何压缩数据现在都以未压缩形式存储在 .csv
文件中。如果您为压缩数据配置了 Timescale 存储,则未压缩数据可能会占用过多存储空间。为了避免这个问题,在复制数据时定期重新压缩数据。有关压缩的更多信息,请参阅压缩部分。
在命令提示符下,安装
timescaledb-parallel-copy
go get github.com/timescale/timescaledb-parallel-copy/cmd/timescaledb-parallel-copy使用
timescaledb-parallel-copy
将数据导入到您的 Timescale 数据库。将<NUM_WORKERS>
设置为数据库中 CPU 数量的两倍。例如,如果您有 4 个 CPU,则<NUM_WORKERS>
应为8
。timescaledb-parallel-copy \--connection "host=<HOST> \user=tsdbadmin password=<PASSWORD> \port=<PORT> \sslmode=require" \--db-name tsdb \--table <TABLE_NAME> \--file <FILE_NAME>.csv \--workers <NUM_WORKERS> \--reporting-period 30s为您要迁移的每个表和超表重复此操作。
连接到您的 Timescale 数据库
psql "postgres://tsdbadmin:<PASSWORD>@<HOST>:<PORT>/tsdb?sslmode=require"将数据恢复到您的 Timescale 数据库
\copy <TABLE_NAME> FROM '<TABLE_NAME>.csv' WITH (FORMAT CSV);为您要迁移的每个表和超表重复此操作。
当您迁移了表和超表数据后,迁移您的 PostgreSQL 数据后架构。这包括关于约束的信息。
在命令提示符下,使用您的源数据库连接详细信息,将数据后架构从源数据库转储到
dump_post_data.dump
文件中。排除 Timescale 特定的架构。如果系统提示您输入密码,请使用您的源数据库凭据pg_dump -U <SOURCE_DB_USERNAME> -W \-h <SOURCE_DB_HOST> -p <SOURCE_DB_PORT> -Fc -v \--section=post-data --exclude-schema="_timescaledb*" \-f dump_post_data.dump <DATABASE_NAME>使用您的连接详细信息,将转储的数据后架构从
dump_post_data.dump
文件恢复到您的 Timescale 数据库中。为了避免权限错误,请包含--no-owner
标志pg_restore -U tsdbadmin -W \-h <HOST> -p <PORT> --no-owner -Fc \-v -d tsdb dump_post_data.dump
如果您在迁移过程中看到这些错误,您可以安全地忽略它们。迁移仍然会成功发生。
pg_restore: error: could not execute query: ERROR: relation "<relation_name>" already exists
pg_restore: error: could not execute query: ERROR: trigger "ts_insert_blocker" for relation "<relation_name>" already exists
当您分别传输架构和数据时,默认情况下不会迁移连续聚合。您可以通过重新创建连续聚合定义并在 Timescale 数据库上重新计算结果来恢复它们。重新计算的连续聚合仅聚合 Timescale 数据库中的现有数据。它们不包括已删除的原始数据。
连接到您的源数据库
psql "postgres://<SOURCE_DB_USERNAME>:<SOURCE_DB_PASSWORD>@<SOURCE_DB_HOST>:<SOURCE_DB_PORT>/<SOURCE_DB_NAME>?sslmode=require"获取现有连续聚合定义的列表
SELECT view_name, view_definition FROM timescaledb_information.continuous_aggregates;此查询返回所有连续聚合的名称和定义。例如
view_name | view_definition----------------+--------------------------------------------------------------------------------------------------------avg_fill_levels | SELECT round(avg(fill_measurements.fill_level), 2) AS avg_fill_level, +| time_bucket('01:00:00'::interval, fill_measurements."time") AS bucket, +| fill_measurements.sensor_id +| FROM fill_measurements +| GROUP BY (time_bucket('01:00:00'::interval, fill_measurements."time")), fill_measurements.sensor_id;(1 row)连接到您的 Timescale 数据库
psql "postgres://tsdbadmin:<PASSWORD>@<HOST>:<PORT>/tsdb?sslmode=require"重新创建每个连续聚合定义
CREATE MATERIALIZED VIEW <VIEW_NAME>WITH (timescaledb.continuous) AS<VIEW_DEFINITION>
默认情况下,当您分别传输架构和数据时,策略不会被迁移。在您的 Timescale 数据库上重新创建它们。
连接到您的源数据库
psql "postgres://<SOURCE_DB_USERNAME>:<SOURCE_DB_PASSWORD>@<SOURCE_DB_HOST>:<SOURCE_DB_PORT>/<SOURCE_DB_NAME>?sslmode=require"获取现有策略的列表。此查询返回所有策略的列表,包括连续聚合刷新策略、保留策略、压缩策略和重新排序策略
SELECT application_name, schedule_interval, retry_period,config, hypertable_nameFROM timescaledb_information.jobs WHERE owner = '<SOURCE_DB_USERNAME>';连接到您的 Timescale 数据库
psql "postgres://tsdbadmin:<PASSWORD>@<HOST>:<PORT>/tsdb?sslmode=require"
通过在您的整个数据集上运行 ANALYZE
来更新您的表统计信息。请注意,这可能需要一些时间,具体取决于您的数据库大小
ANALYZE;
如果您在运行 ANALYZE
时看到以下形式的错误,您可以安全地忽略它们
WARNING: skipping "<TABLE OR INDEX>" --- only superuser can analyze it
跳过的表和索引对应于无法访问的系统目录。跳过它们不会影响您的数据统计信息。
关键词
在此页面上发现问题?报告问题 或 在 GitHub 上编辑此页面。