2 个版本
0.0.2 | 2024年6月17日 |
---|---|
0.0.1 | 2024年3月16日 |
#908 在 数据库接口
每月 89 次下载
635KB
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
不同。这意味着数据可能会稍微不同于原始数据库中的块,但数据应该是相同的。例如,如果您在某个时间点更改了块间隔,并且有不同大小的块,则它们在转储中都将具有相同的大小。
连续聚合会被重新创建,这意味着原始表中不再存在的数据也将从连续聚合中缺失。
依赖项
~16–28MB
~437K SLoC