Timescale Cloud:性能、规模、企业级

自托管产品

MST

通过先迁移模式,再迁移数据的方式来迁移大型数据库。此方法可独立复制每个表或块,如果某个复制操作失败,您可以从中途重新开始。

注意

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

警告

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

迁移数据库需要以下步骤

警告

根据您的数据库大小和网络速度,涉及复制数据的步骤可能需要很长时间。在此期间,您可以继续从源数据库读取数据,但性能可能会变慢。为避免此问题,请分叉您的数据库并从分叉中迁移数据。如果您在迁移期间写入源数据库中的表,则新写入的数据可能不会传输到 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> \
    dbname=tsdb \
    sslmode=require
    " \
    --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. 重新创建每个策略。有关重新创建策略的更多信息,请参阅连续聚合刷新策略保留策略Hypercore 策略重新排序策略

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

ANALYZE;

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

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

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

关键词

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