#postgresql #backup #restore #pg-dump #database-server #pg-restore

elefant-tools

一个用于执行 pg_dump 和 pg_restore 等操作的库,具有额外功能,可能也存在更多错误。

2 个版本

0.0.2 2024 年 6 月 17 日
0.0.1 2024 年 3 月 16 日

#188数据库接口

Download history 1/week @ 2024-05-21 1/week @ 2024-06-04 70/week @ 2024-06-11 71/week @ 2024-06-18

每月 97 次下载
用于 elefant-sync

MIT 许可证

610KB
15K SLoC

Elefant Tools

Elefant Tools 是一个库 + 二进制文件,用于以与 pg_dumppg_restore 相同的方式与 PostgreSQL 数据库接口。此外,Elefant Tools 还可以直接在两个数据库之间进行复制,而无需写入磁盘。这在你想要将数据库从一台服务器复制到另一台服务器,或者将数据库从服务器复制到本地开发环境时非常有用。

主要区别在于 Elefant Tools 是用 Rust 编写的,旨在比 pg_dumppg_restore 更灵活,并提供了一个用于完全定制和转换数据库结构的库。

用法

对于这里的大多数命令,您需要提供凭据和数据库主机信息。这些一般以这些参数的形式提供。这些参数也可以通过环境变量提供,名称相同,只是首字母大写。例如,--source-db-host 可以通过环境变量 SOURCE_DB_HOST 提供。

--source-db-host localhost --source-db-user postgres --source-db-password TopSecretPassword --source-db-name my_db
--target-db-host localhost --target-db-user postgres --target-db-password TopSecretPassword --target-db-name my_target_db

为了使这里的示例简单,我不会包括这些参数。你应该始终在自己的命令中包含它们,或者通过环境变量提供。如果你不提供它们,命令将失败并告诉你缺少哪些参数。

使用 Postgres 插入语句将数据导出到 SQL 文件。

该文件可以通过 psqlelefant-sync 传递以再次导入数据

# Dump to file
elefant-sync export sql-file --path my_dump.sql --format InsertStatements

# Import from file
elefant-sync import sql-file --path my_dump.sql
# or
psql --dbname my_target_db -f my_dump.sql

使用 Postgres 复制语句将数据导出到 SQL 文件。

这需要使用 elefant-sync 再次导入数据,但速度更快

# Dump to file
elefant-sync export sql-file --path my_dump.sql --format CopyStatements

# Import from file
elefant-sync import sql-file --path my_dump.sql

在两个数据库之间复制数据而不使用临时文件

这是此工具的主要原始用例之一。它允许您在不写入磁盘的情况下,将数据库从一台服务器复制到另一台服务器。当您有一个大型数据库且不确定是否有足够的磁盘空间时,这非常有用。此外,它比导出 + 恢复更快,所以这也是一个优势。

elefant-sync copy --source-db-name my_source_db --target-db-name my_target_db

虽然这个工具不支持在一个事务中运行所有操作,但它支持“差异复制”。这意味着如果复制失败,您可以再次运行相同的命令,它将从上次停止的地方继续,这通常是您试图通过完整事务实现的目的。

elefant-sync copy --source-db-name my_source_db --target-db-name my_target_db --differential

--help 命令

强烈建议查看每个命令的 --help 命令,以查看所有可用的选项,例如

elefant-sync.exe --help
A replacement for db_dump and db_restore that supports advanced processing such as moving between schemas.

This tool is currently experimental and any use in production is purely on the user. Backups are recommended.

Usage: elefant-sync.exe [OPTIONS] <COMMAND>

Commands:
  export  Export a database schema to a file or directory to be imported later on
  import  Import a database schema from a file or directory that was made using the export command
  copy    Copy a database schema from one database to another
  help    Print this message or the help of the given subcommand(s)

Options:
      --max-parallelism <MAX_PARALLELISM>
          How many threads to use when exporting or importing. Defaults to the number of estimated cores on the machine. If the available parallelism cannot be determined, it defaults to 1

          [env: MAX_PARALLELISM=]
          [default: 32]

  -h, --help
          Print help (see a summary with '-h')

  -V, --version
          Print version

支持的功能

并非所有Postgres功能目前都受支持。以下是一份支持、部分支持和不支持的功能列表。如果您发现不支持的功能,请提出问题。如果可能,提供支持该功能的实际代码将非常有帮助。

✅ Supported
❌ Not supported
➕ Partially supported (Check the nested items)
✅ Primary keys
✅ Sequences
    ❌ owned by
✅ Foreign keys
    ✅ Update/Delete cascade rules
✅ Not null constraints
✅ Check constraints
    ✅ Check constraints calling functions
✅ Unique constraints
    ✅ Distinct nulls
    ✅ Using explicit unique index
✅ Indexes
    ✅ Column direction
    ✅ Nulls first/last
    ✅ Index type
    ✅ Filtered index
    ✅ Expressions
    ✅ Included columns
    ✅ Index storage parameters
✅ Generated columns
❌ Row level security
✅ Triggers
✅ Views
✅ Materialized views
➕ Functions/Stored procedures
    ❌ Transforms
    ✅ Aggregate functions
✅ Extensions
➕ Comments (Best effort to support comments on objects. If I have forgotten to support comments on any object, please open an issue.)
✅ Partitions
✅ Inheritance
✅ Enums
❌ Collations
✅ Schemas
❌ Roles/Users
✅ Default values
✅ Quoted identifier names
✅ Array columns
❌ Exclusion constraints
✅ Domains

Timescale DB 支持

✅ Hypertables
    ✅ Space partitioning
    ✅ Time partitioning
    ✅ Multiple dimensions
    ✅ Compression
    ❌ Distributed hypertables
✅ Continuous aggregates
    ✅ Compression
✅ Retention policies
✅ User defined actions/jobs

请注意:这使用了 Timescale 的高级功能,并且不直接操作 Timescale 的底层块/目录表,与 pg_dump 不同。这意味着数据可能略微不同于原始数据库,但数据应该是相同的。例如,如果您在某个时间点更改了块间隔,并且有不同的块大小,那么在转储中它们都将具有相同的大小。

连续聚合会重新创建,这意味着原始表中不再存在的数据也将从连续聚合中缺失。

依赖关系

~10–20MB
~324K SLoC