# dbblob2file **Repository Path**: ismartyx/dbblob2file ## Basic Information - **Project Name**: dbblob2file - **Description**: 一个高性能的 Go 语言工具,用于将 MySQL 8 数据库表中的 LONGBLOB 字段导出为本地文件。 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-11-13 - **Last Updated**: 2026-05-13 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # MySQL LONGBLOB 导出工具 一个高性能的 Go 语言工具,用于将 MySQL 8 数据库表中的 LONGBLOB 字段导出为本地文件。 ## 功能特性 - ✅ **高性能并发处理**:使用 goroutine 和 worker pool 模式,支持多线程并发导出 - ✅ **流式批量读取**:避免一次性加载所有数据到内存,降低内存占用 - ✅ **进度监控**:实时显示导出进度、速度和错误统计 - ✅ **灵活配置**:支持命令行参数配置所有选项 - ✅ **文件名冲突处理**:自动处理重名文件,避免覆盖 - ✅ **跨平台支持**:自动清理文件名中的非法字符 ## 安装依赖 ```bash go mod download ``` ## 使用方法 ### 基本用法 ```bash go run main.go \ -dsn "root:Sdhq%402025@tcp(192.168.2.11:33069)/mydb?charset=utf8mb4&parseTime=True" \ -table "files" \ -blob "file_data" \ -name "file_name" \ -content-type "content_type" \ -output "./output" ``` ### 命令行参数说明 | 参数 | 默认值 | 说明 | |-----------------|---------------------------------------------------------------------------|-------------------------| | `-dsn` | `root:password@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True` | MySQL 数据库连接字符串 | | `-table` | `files` | 要导出的表名 | | `-blob` | `file_data` | LONGBLOB 字段名 | | `-name` | `file_name` | 文件名字段 | | `-ext` | `` | 文件扩展名字段(可选,为空则从文件名提取) | | `-content-type` | `` | MIME类型字段(可选,可用于推断扩展名) | | `-base64` | `false` | BLOB字段是否为Base64编码(需要解码) | | `-output` | `./output` | 输出目录路径 | | `-workers` | `CPU核心数` | 并发 worker 数量 | | `-batch` | `100` | 每批查询的记录数 | | `-id` | `id` | 主键字段名(用于分页) | | `-use-filename` | `false` | 直接使用文件名字段的值(不拼接扩展名) | ### 示例 #### 示例 1:导出图片文件 假设你有一个表结构如下: ```sql CREATE TABLE images ( id INT PRIMARY KEY AUTO_INCREMENT, image_name VARCHAR(255), image_ext VARCHAR(10), image_data LONGBLOB ); ``` 导出命令: ```bash go run main.go \ -dsn "root:123456@tcp(localhost:3306)/mydb?charset=utf8mb4" \ -table "images" \ -blob "image_data" \ -name "image_name" \ -ext "image_ext" \ -output "./exported_images" \ -workers 20 \ -batch 50 ``` #### 示例 2:导出文档文件 ```bash go run main.go \ -dsn "user:pass@tcp(192.168.1.100:3306)/documents?charset=utf8mb4" \ -table "documents" \ -blob "content" \ -name "doc_name" \ -ext "doc_type" \ -output "D:/exported_docs" \ -workers 15 ``` #### 示例 3:导出 sys_org 表的附件(使用 content_type 字段) 假设你有一个 sys_org 表结构如下: ```sql CREATE TABLE `sys_org` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `name` varchar(128) NOT NULL COMMENT '机构名称', `file_url` longblob COMMENT '附件文件流', `file_name` varchar(512) DEFAULT NULL COMMENT '附件名字', `content_type` varchar(100) DEFAULT NULL COMMENT '文件类型 (MIME类型)', `file_size` bigint(20) DEFAULT NULL COMMENT '文件大小(字节)', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='机构信息表'; ``` 导出命令: ```bash go run main.go \ -dsn "root:password@tcp(127.0.0.1:3306)/your_database?charset=utf8mb4&parseTime=True" \ -table "sys_org" \ -blob "file_url" \ -name "file_name" \ -content-type "content_type" \ -output "./output_sys_org" \ -workers 10 \ -batch 100 \ -id "id" ``` 或者使用提供的批处理文件: ```bash example_sys_org.bat ``` **说明**: - 该表没有单独的扩展名字段,文件名已包含扩展名(如 "document.pdf") - 使用 `-content-type` 参数可以在文件名缺少扩展名时,根据 MIME 类型自动推断扩展名 - 工具会自动跳过 `file_url` 为空的记录 #### 示例 4:导出 Base64 编码的 BLOB 数据 如果数据库中的 LONGBLOB 字段存储的是 **Base64 编码的字符串**(而不是原始二进制数据),需要添加 `-base64` 参数: ```bash go run main.go \ -dsn "root:Sdhq%402025@tcp(192.168.2.11:33069)/sample-db?charset=utf8mb4&parseTime=True" \ -table "project_material" \ -blob "file_data" \ -name "file_name" \ -ext "file_ext" \ -base64 \ -output "./output" \ -workers 10 \ -batch 100 ``` **重要**: - ✅ 如果 BLOB 字段存储的是 Base64 字符串,**必须**添加 `-base64` 参数 - ❌ 如果 BLOB 字段存储的是原始二进制数据,**不要**添加 `-base64` 参数 - 工具会自动将 Base64 字符串解码为原始文件 **如何判断是否为 Base64?** 在数据库中查询一条记录: ```sql SELECT LEFT(file_data, 100) FROM your_table LIMIT 1; ``` - 如果看到类似 `iVBORw0KGgoAAAANSUhEUgAA...` 的字符串 → 是 Base64 - 如果看到乱码或二进制数据 → 不是 Base64 ## 性能优化建议 1. **调整 worker 数量**:根据 CPU 核心数和磁盘 I/O 能力调整 `-workers` 参数 - SSD 硬盘:可设置为 20-50 - HDD 硬盘:建议 5-10 2. **调整批次大小**:根据 BLOB 数据大小调整 `-batch` 参数 - 小文件(< 1MB):可设置为 200-500 - 大文件(> 10MB):建议 10-50 3. **数据库优化**: - 确保主键字段有索引 - 适当增加 MySQL 的 `max_allowed_packet` 配置 ## 编译为可执行文件 ### Windows ```bash go build -o dbblob2file.exe main.go ``` ### Linux/Mac ```bash go build -o dbblob2file main.go ``` ## 注意事项 1. 确保数据库用户有足够的权限读取目标表 2. 确保输出目录有足够的磁盘空间 3. 如果文件名重复,工具会自动添加 ID 后缀 4. 建议先用小批次测试,确认无误后再大规模导出 ## 输出示例 ``` 2025/11/12 10:20:15 开始导出任务... 2025/11/12 10:20:15 配置: DSN=root:***@tcp(127.0.0.1:3306)/mydb, 表=files, BLOB字段=file_data, 输出目录=./output, Workers=10, 批次大小=100 2025/11/12 10:20:15 总记录数: 1500 2025/11/12 10:20:20 进度: 450/1500 (30.00%), 错误: 0, 耗时: 5s 2025/11/12 10:20:25 进度: 920/1500 (61.33%), 错误: 0, 耗时: 10s 2025/11/12 10:20:30 进度: 1500/1500 (100.00%), 错误: 0, 耗时: 15s === 导出完成 === 总记录数: 1500 成功导出: 1500 错误数: 0 总耗时: 15.234s 平均速度: 98.46 文件/秒 ``` ## 许可证 MIT License