通过先迁移架构,然后迁移数据来迁移更大的数据库。此方法分别复制每个表或数据块,这允许您在一次复制操作失败时中途重启。

注意

对于较小的数据库,一次性迁移整个数据库可能更方便。有关更多信息,请参阅关于选择迁移方法的部分。

警告

此方法不保留使用已删除数据计算的连续聚合。例如,如果您在一个月后删除原始数据,但在连续聚合中保留一年的降采样数据,则连续聚合在迁移后会丢失任何超过一个月的数据。如果您必须保留使用已删除数据计算的连续聚合,请一次性迁移整个数据库。有关更多信息,请参阅关于选择迁移方法的部分。

迁移数据库的过程需要以下步骤

警告

根据您的数据库大小和网络速度,涉及复制数据的步骤可能需要很长时间。在此期间,您可以继续从源数据库读取数据,尽管性能可能会较慢。为了避免这个问题,请fork您的数据库并从fork迁移数据。如果您在迁移期间写入源数据库中的表,则新写入可能不会传输到 Timescale。为了避免这个问题,请参阅关于迁移活动数据库的部分。

在开始之前,请检查您是否拥有

  • 安装了 PostgreSQL pg_dumppg_restore 实用程序。
  • 安装了用于连接到 PostgreSQL 的客户端。这些说明使用 psql,但任何客户端都可以。
  • 在 Timescale 中创建了一个新的空数据库。有关更多信息,请参阅 安装 Timescale 部分。为您的数据库配置足够的空间来容纳所有数据。
  • 检查您使用的任何其他 PostgreSQL 扩展是否与 Timescale 兼容。有关更多信息,请参阅兼容扩展列表。安装您的其他 PostgreSQL 扩展。
  • 检查您是否在 Timescale 和源数据库上运行相同的主要 PostgreSQL 版本。有关升级源数据库上的 PostgreSQL 的信息,请参阅 自托管 TimescaleDB 的升级说明TimescaleDB 托管服务
  • 检查您是否在目标数据库和源数据库上运行相同的主要 Timescale 版本。有关更多信息,请参阅升级 Timescale 部分

将数据前架构从源数据库迁移到自托管 TimescaleDB。这包括表和架构定义,以及关于序列、所有者和设置的信息。这不包括 Timescale 特定的架构。

  1. 使用您的源数据库连接详细信息,将数据前架构从源数据库转储到 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>
  2. 使用您的 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 中重新创建超表以恢复它们。

  1. 连接到您的 Timescale 数据库

    psql "postgres://tsdbadmin:<PASSWORD>@<HOST>:<PORT>/tsdb?sslmode=require"
  2. 恢复超表

    SELECT create_hypertable(
    '<TABLE_NAME>',
    by_range('<COLUMN_NAME>', INTERVAL '<CHUNK_INTERVAL>')
    );
注意

by_range 维度构建器是 TimescaleDB 2.13 的新增功能。

恢复超表后,返回到源数据库以逐表复制数据。

  1. 连接到您的源数据库

    psql "postgres://<SOURCE_DB_USERNAME>:<SOURCE_DB_PASSWORD>@<SOURCE_DB_HOST>:<SOURCE_DB_PORT>/<SOURCE_DB_NAME>?sslmode=require"
  2. 将第一个表的数据转储到 .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 存储,则未压缩数据可能会占用过多存储空间。为了避免这个问题,在复制数据时定期重新压缩数据。有关压缩的更多信息,请参阅压缩部分

  1. 在命令提示符下,安装 timescaledb-parallel-copy

    go get github.com/timescale/timescaledb-parallel-copy/cmd/timescaledb-parallel-copy
  2. 使用 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

    为您要迁移的每个表和超表重复此操作。

  1. 连接到您的 Timescale 数据库

    psql "postgres://tsdbadmin:<PASSWORD>@<HOST>:<PORT>/tsdb?sslmode=require"
  2. 将数据恢复到您的 Timescale 数据库

    \copy <TABLE_NAME> FROM '<TABLE_NAME>.csv' WITH (FORMAT CSV);

    为您要迁移的每个表和超表重复此操作。

当您迁移了表和超表数据后,迁移您的 PostgreSQL 数据后架构。这包括关于约束的信息。

  1. 在命令提示符下,使用您的源数据库连接详细信息,将数据后架构从源数据库转储到 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>
  2. 使用您的连接详细信息,将转储的数据后架构从 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 数据库中的现有数据。它们不包括已删除的原始数据。

  1. 连接到您的源数据库

    psql "postgres://<SOURCE_DB_USERNAME>:<SOURCE_DB_PASSWORD>@<SOURCE_DB_HOST>:<SOURCE_DB_PORT>/<SOURCE_DB_NAME>?sslmode=require"
  2. 获取现有连续聚合定义的列表

    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)
  3. 连接到您的 Timescale 数据库

    psql "postgres://tsdbadmin:<PASSWORD>@<HOST>:<PORT>/tsdb?sslmode=require"
  4. 重新创建每个连续聚合定义

    CREATE MATERIALIZED VIEW <VIEW_NAME>
    WITH (timescaledb.continuous) AS
    <VIEW_DEFINITION>

默认情况下,当您分别传输架构和数据时,策略不会被迁移。在您的 Timescale 数据库上重新创建它们。

  1. 连接到您的源数据库

    psql "postgres://<SOURCE_DB_USERNAME>:<SOURCE_DB_PASSWORD>@<SOURCE_DB_HOST>:<SOURCE_DB_PORT>/<SOURCE_DB_NAME>?sslmode=require"
  2. 获取现有策略的列表。此查询返回所有策略的列表,包括连续聚合刷新策略、保留策略、压缩策略和重新排序策略

    SELECT application_name, schedule_interval, retry_period,
    config, hypertable_name
    FROM timescaledb_information.jobs WHERE owner = '<SOURCE_DB_USERNAME>';
  3. 连接到您的 Timescale 数据库

    psql "postgres://tsdbadmin:<PASSWORD>@<HOST>:<PORT>/tsdb?sslmode=require"
  4. 重新创建每个策略。有关重新创建策略的更多信息,请参阅关于连续聚合刷新策略保留策略压缩策略重新排序策略的部分。

通过在您的整个数据集上运行 ANALYZE 来更新您的表统计信息。请注意,这可能需要一些时间,具体取决于您的数据库大小

ANALYZE;

如果您在运行 ANALYZE 时看到以下形式的错误,您可以安全地忽略它们

WARNING: skipping "<TABLE OR INDEX>" --- only superuser can analyze it

跳过的表和索引对应于无法访问的系统目录。跳过它们不会影响您的数据统计信息。

关键词

在此页面上发现问题?报告问题 或 在 GitHub 上编辑此页面