2 个版本
0.0.2 | 2024 年 6 月 17 日 |
---|---|
0.0.1 | 2024 年 3 月 16 日 |
#188 在 数据库接口 中
每月 97 次下载
用于 elefant-sync
610KB
15K SLoC
Elefant Tools
Elefant Tools 是一个库 + 二进制文件,用于以与 pg_dump
和 pg_restore
相同的方式与 PostgreSQL 数据库接口。此外,Elefant Tools 还可以直接在两个数据库之间进行复制,而无需写入磁盘。这在你想要将数据库从一台服务器复制到另一台服务器,或者将数据库从服务器复制到本地开发环境时非常有用。
主要区别在于 Elefant Tools 是用 Rust 编写的,旨在比 pg_dump
和 pg_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 文件。
该文件可以通过 psql
或 elefant-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