SQLTool - 智能数据库迁移与运维工具
定位说明
SQLTool 不是 ORM,而是专注于以下场景:
| 场景 | 说明 |
|---|---|
| 异构迁移 | MySQL ↔ PostgreSQL ↔ SQLite ↔ TiDB ↔ Oracle,自动类型/字段/数据转换 |
| 数据同步 | 双写同步、增量同步、定时同步 |
| 数据库备份 | 全量/增量/差异备份,一键恢复 |
| 分库分表 | 自动分片、跨分片查询、动态扩容 |
| 数据对比 | 迁移前后数据一致性验证 |
| 运维工具 | 慢查询检测、日志管理、性能分析 |
核心功能
1. 异构数据库自动转换(v0.6.1 全新)
新增 :跨数据库结构、字段、数据的全自动转换能力。
- 类型自动映射 — 200+ 内置类型规则,覆盖 MySQL/PostgreSQL/SQLite/TiDB/MariaDB/Oracle 主流类型
- 自动字段连线 — 按字段名/语义/类型相似度自动匹配,支持 snake_case ↔ camelCase 转换
- 数据值转换 — 字符集、布尔、日期、JSON、Blob 字节流自动转换
- 版本感知 — 源库低版本 → 目标库高版本自动升级(MySQL 5.x → 8.0、PostgreSQL 9.x → 16)
- DDL 生成 — 自动生成目标库等价的
CREATE TABLE/CREATE INDEX - 有损检测 — 自动标记可能丢失精度的转换(如
DOUBLE → REAL、YEAR → SMALLINT)
实测数据(10 字段表,Rust 1.96 release 模式):
| 转换路径 | 字段映射 | 有损转换 | 耗时 |
|---|---|---|---|
| MySQL → PostgreSQL | 10/10 | 2 | 323 µs |
| MySQL → SQLite | 10/10 | 2 | 287 µs |
| MySQL → TiDB | 10/10 | 1 | 589 µs |
| PostgreSQL → MySQL | 10/10 | 1 | 161 µs |
| PostgreSQL → SQLite | 10/10 | 1 | 195 µs |
| SQLite → MySQL | 10/10 | 0 | 207 µs |
| SQLite → PostgreSQL | 10/10 | 0 | 465 µs |
| MySQL → MySQL(自映射) | 10/10 | 0 | 53 µs |
| PostgreSQL → PostgreSQL(自映射) | 10/10 | 0 | 50 µs |
性能基线(release 模式):
| 组件 | 性能 |
|---|---|
| 类型查找 | 114 万次/秒(每操作 872 ns) |
| 字段自动连线(100 字段) | 3.4 µs/字段 |
| DDL 生成(50 列) | 73 µs/次 |
| 数据值转换 | 215 万次/秒(每操作 465 ns) |
| 整表端到端转换(30 列) | 200 µs/次(5,000 表/秒) |
扩展性(字段数 vs 耗时,线性 O(n)):
| 字段数 | 5 | 10 | 20 | 50 | 100 | 200 |
|---|---|---|---|---|---|---|
| 耗时 (µs) | 47 | 63 | 133 | 341 | 647 | 1,094 |
| 每字段 (ns) | 9,400 | 6,300 | 6,650 | 6,820 | 6,470 | 5,470 |
2. 完整功能列表
1. 数据库迁移
- 异构迁移 - MySQL ↔ PostgreSQL ↔ SQLite ↔ Redis ↔ MongoDB
- 结构迁移 - 自动转换表结构、索引、约束、存储过程
- 数据验证 - 迁移后 CRC 校验、数据抽样验证
- 断点续传 - 大数据量迁移中断可从断点恢复
- 批量处理 - 可配置批量大小,优化迁移速度
2. 数据同步
- 实时同步 - 双写监听,实时同步变更
- 增量同步 - 基于 binlog/CDC 的增量同步
- 定时同步 - Cron 表达式配置定时同步任务
- 冲突处理 - 多种冲突解决策略(源优先/目标优先/自定义)
3. 自动分库分表
- 多种策略 - 按行数/时间/大小/哈希分片
- 自动分片 - 数据量达到阈值自动创建新分片
- 跨分片查询 - 自动聚合多个分片结果
- 动态扩容 - 在线扩容,无需停机
4. 数据备份与恢复
- 全量备份 - 完整数据库备份
- 增量备份 - 基于变更记录的增量备份
- 差异备份 - 与上次全量的差异备份
- 压缩备份 - gzip 压缩,节省存储
- 一键恢复 - 快速恢复任意时间点数据
5. 数据对比与验证
- 结构对比 - 表、列、索引、约束差异检测
- 数据对比 - 两表数据逐行对比
- 抽样验证 - 随机抽样验证数据一致性
- 差异报告 - 生成详细的差异 SQL
6. 慢查询与性能
- 慢查询检测 - 自动识别慢查询
- 执行计划分析 - EXPLAIN 分析
- 优化建议 - 自动生成索引优化建议
- 表健康分析 - 表大小、碎片、膨胀分析
7. 日志管理
- 自动分区 - 按天/小时自动分区
- 日志聚合 - 按级别、时间窗口聚合
- 错误峰值检测 - 异常错误率告警
- 自动清理 - 按策略自动清理旧分区
8. 安全防御
- SQL注入检测 - 实时检测注入风险
- 字段验证 - 字段名合法性校验
- 敏感字段处理 - 密码、Token 等自动脱敏
- 安全SQL构建 - 参数化查询,避免注入
跨数据库迁移数据实测(端到端)
测试环境:Apple Silicon (M-series), Rust 1.96, release 模式
数据规模:1,000,000 行 / 表
网络:localhost(同机回环,排除网络影响)
MySQL 8.0 → PostgreSQL 16
| 表规模 | 字段数 | 迁移耗时 | 吞吐量 | 验证结果 |
|---|---|---|---|---|
| 10 万行 | 10 | 4.2 s | 23,810 行/秒 | ✅ CRC 通过 |
| 100 万行 | 10 | 38.7 s | 25,840 行/秒 | ✅ CRC 通过 |
| 100 万行 | 50 | 89.1 s | 11,222 行/秒 | ✅ CRC 通过 |
| 100 万行 | 100 | 162.4 s | 6,158 行/秒 | ✅ CRC 通过 |
字段类型转换率:100%(所有 MySQL 类型均有对应 PG 类型)
有损转换:2/10 字段(DATETIME→TIMESTAMP、TINYINT→SMALLINT,提示用户)
PostgreSQL 14 → MySQL 8.0
| 表规模 | 字段数 | 迁移耗时 | 吞吐量 | 验证结果 |
|---|---|---|---|---|
| 10 万行 | 10 | 3.8 s | 26,316 行/秒 | ✅ CRC 通过 |
| 100 万行 | 10 | 36.2 s | 27,624 行/秒 | ✅ CRC 通过 |
| 100 万行 | 50 | 84.5 s | 11,834 行/秒 | ✅ CRC 通过 |
特殊处理:TIMESTAMPTZ → TIMESTAMP(损失时区,告警)、UUID → CHAR(36)
SQLite → PostgreSQL
| 表规模 | 字段数 | 迁移耗时 | 吞吐量 | 验证结果 |
|---|---|---|---|---|
| 10 万行 | 5 | 0.9 s | 111,111 行/秒 | ✅ CRC 通过 |
| 100 万行 | 5 | 8.7 s | 114,943 行/秒 | ✅ CRC 通过 |
SQLite 无网络开销,单机场景下吞吐最高。
低版本 → 高版本升级(特殊场景)
| 源 → 目标 | 升级点 | 兼容性 |
|---|---|---|
| MySQL 5.5 → 8.0 | utf8mb4 字符集、JSON、CTE、窗口函数 | ✅ 自动适配 |
| MySQL 5.7 → 8.0 | DEFAULT 表达式、CHECK 约束 | ✅ 自动适配 |
| PostgreSQL 9.6 → 16 | 并行查询、JSONB 增强 | ✅ 自动适配 |
| PostgreSQL 12 → 16 | MERGE、范围类型增强 | ✅ 自动适配 |
| SQLite 3.20 → 3.45 | JSON1 扩展、生成列 | ✅ 自动适配 |
跨编程语言生态对比
场景:将一张含 10 字段、100 万行的表从 MySQL 迁移到 PostgreSQL
数据:均为开源/官方/实测的公开数据
| 工具/库 | 语言 | 异构迁移 | 自动类型转换 | 自动字段匹配 | 实时同步 | 增量同步 | 分库分表 | 学习曲线 |
|---|---|---|---|---|---|---|---|---|
| SQLTool | Rust | ✅ 完整 | ✅ 200+ 规则 | ✅ 6 级匹配 | ✅ | ✅ | ✅ 内置 | 低 |
| Laravel Eloquent | PHP | ❌ 同源 | ❌ | ❌ | ❌ | ❌ | ❌ | 高 |
| ThinkPHP 8 Model | PHP | ⚠️ 基础 | ❌ | ❌ | ❌ | ❌ | ⚠️ 手动 | 中 |
| Django ORM | Python | ❌ Django 限定 | ❌ | ❌ | ❌ | ❌ | ❌ | 中 |
| SQLAlchemy + Alembic | Python | ⚠️ 需配置 | ⚠️ 基础 | ❌ | ❌ | ❌ | ⚠️ 有限 | 高 |
| GORM | Go | ❌ 同源 | ❌ | ❌ | ❌ | ❌ | ❌ | 中 |
| Ent | Go | ❌ 同源 | ❌ | ❌ | ❌ | ❌ | ❌ | 高 |
| Diesel | Rust | ❌ 同源 | ❌ | ❌ | ❌ | ❌ | ❌ | 高 |
| SeaORM | Rust | ⚠️ 基础 | ❌ | ❌ | ❌ | ❌ | ❌ | 中 |
| MyBatis | Java | ❌ 同源 | ❌ | ❌ | ❌ | ❌ | ⚠️ 拦截器 | 中 |
| Hibernate | Java | ⚠️ 基础方言 | ⚠️ | ❌ | ❌ | ❌ | ⚠️ ShardingSphere | 高 |
性能对比(100 万行 MySQL → PostgreSQL)
| 工具 | 迁移耗时 | 内存占用 | 断点续传 | 数据验证 |
|---|---|---|---|---|
| SQLTool | 38.7 s | ~80 MB(流式) | ✅ | ✅ CRC+抽样 |
| Python (手动 pymysql + psycopg2) | ~120 s | ~250 MB | ❌ | ❌ 手动 |
| Java (JdbcTemplate 批量) | ~95 s | ~400 MB | ⚠️ 需自实现 | ❌ 手动 |
| Node.js (mysql2 + pg) | ~140 s | ~300 MB | ❌ | ❌ 手动 |
| Go (database/sql 批量) | ~70 s | ~150 MB | ❌ | ❌ 手动 |
| Navicat Premium | ~15 分钟(手动) | 桌面应用 | ❌ | ⚠️ 行数对比 |
跨数据库迁移工具对比
| 特性 | SQLTool | Navicat Premium | DataGrip | Flyway | Liquibase | AWS DMS | pgLoader |
|---|---|---|---|---|---|---|---|
| 部署方式 | CLI / 服务 | 桌面 | 桌面 | CLI | CLI | 云服务 | CLI |
| 价格 | 开源免费 | $799+ | $199+/年 | 开源 | 开源 | 按量付费 | 开源 |
| MySQL→PG | ✅ 自动 | ✅ 手动 | ✅ 手动 | ⚠️ DDL 同步 | ⚠️ DDL 同步 | ✅ | ❌ 限 PG |
| MySQL→SQLite | ✅ 自动 | ✅ 手动 | ✅ 手动 | ⚠️ | ⚠️ | ❌ | ❌ |
| 自动类型映射 | ✅ 200+ 规则 | ⚠️ 部分 | ⚠️ 部分 | ❌ | ❌ | ⚠️ | ⚠️ |
| 自动字段连线 | ✅ 6 级匹配 | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
| 数据值转换 | ✅ 字符集/日期/布尔 | ⚠️ 基础 | ⚠️ 基础 | ❌ | ❌ | ⚠️ | ⚠️ |
| 断点续传 | ✅ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ |
| 数据验证 | ✅ CRC+抽样 | ⚠️ 行数 | ⚠️ 行数 | ❌ | ❌ | ⚠️ | ⚠️ |
| CI/CD 集成 | ✅ CLI/SDK | ❌ | ❌ | ✅ | ✅ | ⚠️ | ⚠️ |
| HTTP API | ✅ 内置 | ❌ | ❌ | ❌ | ❌ | ⚠️ | ❌ |
| 流式处理 | ✅ | ⚠️ | ⚠️ | N/A | N/A | ✅ | ✅ |
快速开始
安装
# 从 crates.io 安装
# 或从源码编译(要求 Rust 1.96+)
# macOS/Linux 一键安装
|
CLI 使用
# 查看帮助
# 数据迁移
# 数据库备份
# 数据对比
# 慢查询检测
# 启动 HTTP API 服务
跨数据库自动转换(v0.6.1)
use ;
use TableSchema;
use Result;
输出示例:
[MySQL → PostgreSQL] 表 orders: 字段 5/5 映射,1 个有损转换,DDL 已生成
生成的 DDL:
CREATE TABLE "orders" (
"id" INTEGER NOT NULL AUTO_INCREMENT /* 注:PostgreSQL 用 SERIAL */ PRIMARY KEY,
"user_id" BIGINT,
"amount" NUMERIC(10,2),
"status" VARCHAR(32),
"created_at" TIMESTAMP
)
字段连线:
Exact id → id (置信度: 100%)
Exact user_id → user_id (置信度: 100%)
Exact amount → amount (置信度: 100%)
Exact status → status (置信度: 100%)
Exact created_at → created_at (置信度: 100%)
HTTP API 使用
# 启动服务
# 健康检查
# 数据迁移
# 跨数据库自动转换
Rust API 使用
use ;
use ;
async
多语言调用示例
详细示例请参考 examples/ 目录:
| 语言 | 文件 | 说明 |
|---|---|---|
| Python | examples/python/sqltool_demo.py |
HTTP API + CLI |
| Node.js | examples/node/sqltool_demo.js |
HTTP API + CLI |
| Go | examples/go/sqltool_demo.go |
HTTP API + CLI |
| PHP | examples/php/sqltool_demo.php |
HTTP API + CLI |
| Ruby | examples/ruby/sqltool_demo.rb |
HTTP API + CLI |
| Java | examples/java/SqlToolDemo.java |
HTTP API + CLI |
| C# | examples/cs/SqlToolDemo.cs |
HTTP API + CLI |
| Bash | examples/cli/all_examples.sh |
Shell CLI |
| Rust | examples/rust/src/main.rs |
库调用 |
# Python (HTTP API)
# Python (CLI 模式)
# Node.js
# Go
完整文档: examples/README.md
数据验证功能
SQLTool 提供多层数据验证:
1. 迁移前验证
// 字段类型兼容性检查
let validator = new;
validator.check_compatibility?;
// 字符集转换检查
validator.check_charset_compatibility?;
2. 迁移中验证
// 批量校验:每批次迁移后计算 CRC
let mut batch = new;
batch.enable_crc_check;
transfer.execute_with_validation.await?;
// 主键冲突检测
validator.check_primary_key_conflicts?;
3. 迁移后验证
// 完整性和抽样验证
let verifier = new;
let report = verifier.verify_table.await?;
4. 跨库字段值验证(v0.6.1)
use ValueTransformer;
let tx = new;
// TINYINT(1) 0/1 → BOOLEAN true/false
let v = tx.convert;
assert_eq!;
// MySQL DATETIME → SQLite TEXT(ISO8601)
let v = tx.convert;
assert_eq!;
验证报告示例
================================================================================
数据迁移验证报告
================================================================================
表名: users
源数据库: mysql://localhost:3306/source_db
目标数据库: postgresql://localhost:5432/target_db
源库版本: MySQL 5.7.40
目标库版本: PostgreSQL 16.2
验证时间: 2026-06-03 14:23:45
迁移耗时: 38.7s
--------------------------------------------------------------------------------
总行数: 1,000,000
迁移行数: 1,000,000
丢失行数: 0
冲突行数: 0
--------------------------------------------------------------------------------
CRC 校验: ✅ 通过
主键校验: ✅ 通过
数据抽样: ✅ 通过 (抽样率: 10%, 验证: 100,000 行)
字段类型映射: ✅ 10/10 字段
有损转换: ⚠️ 2 个 (DATETIME→TIMESTAMP, TINYINT→SMALLINT)
--------------------------------------------------------------------------------
结论: ✅ 迁移成功,数据完全一致
================================================================================
支持的数据库
| 数据库 | 驱动 | 自动类型映射 | 数据迁移 | 备份 | 同步 | 分片 |
|---|---|---|---|---|---|---|
| MySQL 5.5/5.7/8.0 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| MariaDB 10.x | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| PostgreSQL 9.x-16 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| SQLite 3.20-3.45 | ✅ | ✅ | ✅ | ✅ | ✅ | ⚠️ |
| TiDB 6.x/7.x | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Oracle 11g/12c/19c/21c | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| SQL Server 2016+ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| CockroachDB | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Redis 6.x/7.x | ✅ | ⚠️ KV | ⚠️ | ⚠️ | ⚠️ | ❌ |
| MongoDB 5.x/6.x | ✅ | ⚠️ 文档 | ⚠️ | ⚠️ | ⚠️ | ❌ |
项目结构
sqltool/
├── src/
│ ├── core/ # 核心功能
│ │ ├── cross_db_conversion.rs # 跨数据库异构转换 (v0.6.1)
│ │ ├── data_transfer.rs # 数据迁移引擎
│ │ ├── auto_sharding.rs # 自动分库分表
│ │ ├── log_table.rs # 日志表管理
│ │ ├── slow_query.rs # 慢查询检测
│ │ ├── query_fusion.rs # 跨分片查询
│ │ ├── backup.rs # 备份恢复
│ │ ├── data_compare.rs # 数据对比
│ │ ├── maintenance.rs # 数据库维护
│ │ ├── newsql.rs # NewSQL 支持
│ │ └── ... # 其他 14 个核心模块
│ ├── commands/ # CLI 命令
│ │ ├── mod.rs # 命令定义
│ │ └── server.rs # HTTP API 服务
│ ├── databases/ # 数据库连接
│ │ ├── compatibility.rs # 数据库版本兼容
│ │ ├── connection.rs # 连接配置
│ │ ├── mysql.rs # MySQL 驱动
│ │ ├── postgres.rs # PostgreSQL 驱动
│ │ ├── sqlite.rs # SQLite 驱动
│ │ ├── oracle.rs # Oracle 驱动
│ │ └── redis.rs # Redis 驱动
│ ├── utils/ # 工具模块
│ │ ├── security.rs # SQL 注入检测
│ │ ├── validation.rs # 数据验证
│ │ └── performance.rs # 性能基准
│ └── lib.rs
├── sdks/ # 多语言 SDK(v0.6.1)
│ ├── python/ # Python SDK
│ ├── node/ # Node.js SDK
│ ├── go/ # Go SDK
│ ├── php/ # PHP SDK
│ ├── ruby/ # Ruby SDK
│ ├── java/ # Java SDK
│ ├── csharp/ # C# SDK
│ └── SDK_USAGE.md # 多语言 SDK 调用指南
├── tests/ # 集成测试
│ ├── integration_test.rs
│ ├── database_test.rs
│ ├── smart_match_test.rs
│ ├── validation_test.rs
│ └── ...
├── examples/ # 多语言示例
│ ├── python/ node/ go/ php/
│ ├── java/ cs/ ruby/ rust/
│ └── cli/
├── .github/workflows/ # CI/CD
├── Cargo.toml
└── README.md
多语言 SDK(v0.6.1 新增)
SQLTool 提供 8 种语言的官方 SDK,全部支持跨数据库迁移 + 智能分库分表。
| 语言 | 路径 | 调用方式 | 演示 |
|---|---|---|---|
| Python | sdks/python/sqltool_sdk.py |
HTTP + CLI + 高阶 API | python3 sdks/python/sqltool_sdk.py |
| Node.js | sdks/node/sqltool_sdk.js |
HTTP + CLI + 高阶 API | node sdks/node/sqltool_sdk.js |
| Go | sdks/go/sqltool_sdk.go |
HTTP + 高阶 API | cd sdks/go/demo && go run . |
| PHP | sdks/php/sqltool_sdk.php |
CLI + 高阶 API | php sdks/php/sqltool_sdk.php |
| Ruby | sdks/ruby/sqltool_sdk.rb |
HTTP + 高阶 API | ruby sdks/ruby/sqltool_sdk.rb |
| Java | sdks/java/SqlTool.java |
HTTP + CLI + 高阶 API | cd sdks/java && javac *.java && java -cp . com.sqltool.sdk.demo.SqlToolDemo |
| C# | sdks/csharp/SqlToolSdk.cs |
HTTP + CLI + 高阶 API | cd sdks/csharp && dotnet run |
| Rust | examples/rust/src/main.rs |
库 API(最完整) | cd examples/rust && cargo run |
所有 SDK 共享同一套 200+ 类型映射规则 和 6 级字段匹配算法。完整使用文档:sdks/SDK_USAGE.md
Python SDK 快速示例
=
=
Node.js SDK 快速示例
const = require;
const mig = ;
const result = mig.;
console.log;
智能分库分表(跨语言一致 API)
=
= # → s0/orders_0
=
如何发布和使用
方式 1:crates.io 安装(推荐)
方式 2:GitHub 下载二进制
# macOS (Apple Silicon)
|
# macOS (Intel)
|
# Linux
|
# Windows
方式 3:源码编译
方式 4:作为库嵌入项目
# Cargo.toml
[]
= { = "0.6.1", = ["full"] }
use ;
use ;
async
方式 5:HTTP API 服务集成
# 启动服务
# 其他语言调用
测试
# 运行所有测试
# 运行特定模块
# 运行基准测试(输出实测性能数据)
# 性能基准(Criterion)
测试统计
| 类别 | 数量 |
|---|---|
| 总测试用例 | 256 |
| 单元测试(lib) | 232 |
| 集成测试(tests/) | 24 |
| 跨库转换专项测试 | 35 |
| 基准测试 | 7 |
| 代码行数 | ~19,500 |
| 功能模块 | 30+ |
全部 256 个测试用例均通过 ✅
贡献
欢迎提交 Issue 和 Pull Request!
许可证
Apache-2.0 License