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

app elefant-sync

类似于pg_dump和pg_restore的工具,但功能更丰富,可能也更容易出错

2 个版本

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

#908数据库接口

Download history 66/week @ 2024-06-11 63/week @ 2024-06-18

每月 89 次下载

MIT 许可证

635KB
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 不同。这意味着数据可能会稍微不同于原始数据库中的块,但数据应该是相同的。例如,如果您在某个时间点更改了块间隔,并且有不同大小的块,则它们在转储中都将具有相同的大小。

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

依赖项

~16–28MB
~437K SLoC