2 个不稳定版本
0.2.0 | 2019 年 9 月 14 日 |
---|---|
0.1.0 | 2019 年 9 月 8 日 |
#1257 in 数据库接口
29KB
544 行
sqlite2dir
sqlite2dir
将 SQLite 3 数据库的内容以纯文本文件集合的形式暴露出来。其预期用途不是数据库备份 -- 提供的视图旨在使人类更容易检查和跟踪 SQLite 数据库的更改。输出格式选择是为了让像 diff
和 git
这样的操作纯文本文件的工具能够很好地工作。
为了支持更改跟踪,sqlite2dir
支持将数据库导出的文件树直接提交到裸 Git 仓库,这允许使用常规 Git 工具检查更改历史。
请注意,sqlite2dir
目前处于初始开发阶段,甚至尚未由其作者部署。适用通常的警告。
文档
sqlite2dir
的文档以 man 页面 的形式提供。Markdown 文件可以使用 pandoc 转换为 troff 格式,以便使用 man
命令查看。请注意,markdown 源针对通过 pandoc 处理而优化,因此不会在 github 或类似的平台上很好地渲染,也不适合直接阅读。
使用 Unix 的 man
命令生成和查看 man 页面
pandoc -s -t man sqlite2dir.1.md -o sqlite2dir.1
man -l sqlite2dir.1
您还可以在 网上 找到 man 页面的 pandoc HTML 渲染版本。
安装
由于 sqlite2dir
使用 Rust 编写,您需要一个 Rust 工具链。需要 Rust 1.37 或更高版本。要从 crates.io 获取最新版本,请使用以下命令:
cargo install sqlite2dir
或者,您可以直接从源代码检出运行它
cargo run -- --help
cargo run -- db.sqlite3 db-contents
要从本地检出源安装,请使用 cargo install --path .
,这将在 ~/.cargo/bin/sqlite2dir
中安装可执行文件,如果您遵循了 Rust 工具链安装说明,则它应该已经在您的 PATH
环境变量中。
静态构建
对于部署到Linux目标,一个有吸引力的选项是使用Rust的MUSL目标创建一个静态链接的二进制文件。这将产生一个完全独立的二进制文件,仅依赖于Linux内核的系统调用ABI。
在这种情况下,您需要启用vendored-sqlite
功能标志,以便链接到嵌入的、新编译的libsqlite3
的副本。
# If you haven't installed the MUSL target already, let's do that now:
rustup target add x86_64-unknown-linux-musl
# Build using a compiled-in copy of libsqlite3
cargo build --target x86_64-unknown-linux-musl --features vendored-sqlite --release
# Let's check it's really a static binary
file target/x86_64-unknown-linux-musl/release/sqlite2dir \
| grep -q 'statically linked' || echo "nope"
用法
将sqlite3数据库的转储到目录中
sqlite2dir db.sqlite3 db-contents
在新建的db-contents
目录中,您将找到包含数据库模式的SQL文件集合,以及每个表的表内容对应的JSON文件。
SQL表格数据文件的格式是一系列JSON数组,每一行是一个包含单个数据库行列数据的独立JSON数组。这种格式被选择以满足以下标准:
- 合理的diff输出,同时保留值的类型。特别是,NULL值以JSON
null
表示,可以与“NULL”字符串或空字符串区分开来。 - 允许使用操作整个值的JSON解析器和序列化器进行流式创建和消费。
请注意,SQLite的“blob”数据类型尚不支持,如果遇到blob,数据库转储将中止。有关详细信息,请参阅下方的“计划中的功能”。
计划中的功能
以下功能是计划中的,大致按照作者认为的重要性顺序。在开发过程中,项目将在完成时从下方移动到变更日志中。
- 生成一个简短的报告的选项,适合用作电子邮件消息正文。
- 包括一些基本烟雾测试的测试框架。
- 支持SQLite的“blob”数据类型。基本实现是将blob内容进行哈希处理,并将其作为自己的文件输出到磁盘。然后,数据库列将包含如下引用:
{"blob-sha3-256": "SHA-3-here"}
。改进的做法是对小型blob进行base64编码,并将其存储在内联中。
可能未来的功能
- 添加支持
--run
参数,允许指定配置文件,以便在单次运行中执行多个数据库提取。 - 使用
--run
,添加多线程操作的可能性。 - 额外的数据库后端。我不预计需要这个功能,所以可能不会自己添加它。欢迎Pull请求!
非功能特性
sqlite2dir
不是,也无意成为,并且很可能永远不会成为数据库备份工具。SQLite在其命令行工具中提供了.dump
和.backup
元命令,应使用这些命令代替。这样,甚至可以恢复数据!
示例用例
这是促使开发sqlite2dir
的场景。
PowerDNS(又名pdns
)授权域名服务器提供了多种数据库后端,除了在纯文本区域文件上运行的“bind”后端之外。使用数据库后端更加灵活,但无法轻松跟踪区域内容的更改。当使用纯文本区域文件时,只需将区域文件放入git仓库即可轻松实现更改跟踪。使用sqlite2dir
,您可以在使用SQLite pdns后端时恢复该功能。
以下命令将提取数据库并将其提交到裸git仓库
sqlite2dir --git-name="Clara Root" --git-email="root@localhost" \
/var/lib/pdns/pdns.sqlite3 /var/lib/pdns/pdns.git
通过添加一个定期执行上述命令的任务,例如通过cron
或systemd
定时器,可以在裸git仓库中积累历史记录,这可以用于故障排除或其他分析。
许可证
依赖项
~34MB
~710K SLoC