本地文件迁移到云存储的批量上传方案与工具选择
一个老站做了八年,uploads目录下堆了12万个文件,平均每个200K。客户说要迁到云存储上,问我有没有快一点的办法。手动传?算了吧,传到明年。做数据迁移备份,批量上传工具选对了,这事儿一个下午就能搞定。
方案一:命令行工具ossutil(推荐)
阿里云的ossutil、腾讯云的COSCMD、七牛云的qshell,三家的命令行工具都支持递归上传整目录。以ossutil为例,安装配置好AccessKey后,核心命令就一条:
ossutil cp -r /本地目录/ oss://bucket名/目标目录/ -j 10 --update
这里有个关键参数 -j 10,表示10个并发上传线程。小文件多的时候,并发数直接决定速度。12万个200K的文件,单线程传可能要8小时,10并发大概1小时出头。--update参数确保断点续传,网络断了重跑不会重复传已完成的文件。
判断标准很简单:如果文件数量超过1万,必须用命令行工具,别考虑网页控制台。
方案二:SDK脚本定制上传
有些场景文件不是平铺在一个目录里,而是存在数据库里按规则动态生成路径。比如用户头像按 avatars/用户ID/hash.jpg 存储,本地目录结构跟云上不一致。这种情况写个Python脚本更灵活。
用阿里云OSS的Python SDK,核心逻辑就几行:遍历数据库记录 → 计算源文件路径和目标路径 → 调用 bucket.put_object_from_file() 上传。脚本里加上try-except捕获异常,失败的记录写日志文件,跑完批量重试失败项。10万条记录配上多线程,半小时能跑完。
关键提醒:脚本里一定要做MD5校验。上传后比对本地文件和远端文件的ETag,不一致的重新传。数据迁移备份最怕传一半出问题,校验环节不能省。
方案三:在线迁移服务
如果数据量特别大,比如几百G甚至上T,本地上传带宽跑不满。云厂商提供了在线迁移服务,原理是你把文件打包成特定格式放到一个临时HTTP服务器上,迁移服务从你的服务器拉取数据。
阿里云的“在线迁移”控制台配置源端和目的端,支持HTTP/HTTPS源和S3兼容源。腾讯云COS的“迁移服务平台”类似。这种方式的好处是云厂商用自家内网拉数据,速度比你的上传带宽快得多。前提是你的源数据能通过HTTP访问到。
迁移后的验证清单
上传完成不等于迁移完成。用以下三步验证:第一,文件总数比对,本地和远端文件数量必须一致;第二,随机抽检20个文件,打开确认内容正确;第三,检查目录结构是否完整,尤其深层子目录。验证通过后,本地文件别急着删,保留两周确认线上无异常再清理,这是数据迁移备份的基本原则。