迁移前准备工作
1. 全量数据盘点
首先梳理原档案管理软件的两类数据:结构化元数据(档案编号、题名、归档日期、权限等信息)、非结构化文件(电子档案原文),统计两类数据的总大小、总条数,预留出比原数据大30%以上的磁盘空间,避免解压、导入过程中空间不足。
导出前确认所有档案都已经完成归档,没有未入库的零散文件,提取所有档案的唯一编号,提前排查重复编号,若有重复提前重编号处理。
2. 工具与环境准备
无需额外下载第三方工具,系统自带工具即可完成全流程操作,提前完成以下准备:
- 新档案管理软件已经完成基础初始化:组织机构、用户权限、档案分类体系已经和原系统对齐
- 新系统数据库已经创建完成,存储目录已经创建
- 原服务器和新服务器已经开通网络访问权限
分阶段实操步骤
1. 原系统全量数据导出
先导出结构化元数据,分两种场景:
- 原软件用独立MySQL数据库:执行以下命令导出全量元数据:
```
mysqldump -h[原数据库地址] -u[用户名] -p[原数据库名] > archive_metadata.sql
```
输入命令后按提示输入数据库密码,回车即可完成导出,执行
head -10 archive_metadata.sql(Windows执行type archive_metadata.sql | more)确认导出内容正常。
- 商用原软件自带导出功能:进入系统后台「数据导出」模块,勾选所有元数据字段,导出格式选CSV,必须勾选「档案唯一编号」字段,编码选择UTF-8,禁止使用GBK编码,避免后续乱码。
再导出非结构化电子文件:打包压缩时保留原有的年度-机构-档案类型目录层级,不要打乱结构,打包完成后计算MD5校验值,记录下来用于后续校验:
- Windows PowerShell命令:
```
Get-FileHash .\archive_package.zip -Algorithm MD5
```
- Mac/Linux命令:
```
md5 archive_package.zip
```
2. 数据传输与预校验
跨网传输推荐使用rsync实现断点续传,避免大文件传输中断,执行命令:
```
rsync -P ./archive_package.zip 新服务器用户名@新服务器IP:/目标存储路径/
```

传输完成后,重新计算新服务器上压缩包的MD5,和原记录比对,一致再解压。解压后核对文件总数量,确认和原系统导出的数量一致:
- Windows PowerShell命令:
```
(Get-ChildItem -Path .\extract\ -Recurse -File).Count
```
- Mac/Linux命令:
```
find ./extract/ -type f | wc -l
```
元数据导入新数据库,MySQL导入命令:
```
mysql -h[新数据库地址] -u[用户名] -p[新数据库名] < archive_metadata.sql
```
导入后核对元数据总条数,和原系统导出条数一致,再进入下一步。
3. 元数据与文件关联匹配
匹配的核心依据是档案唯一编号,分两种场景操作:
- 新系统自带迁移工具:在导入界面选择元数据文件,设置匹配字段为「档案唯一编号」,填写解压后的文件根目录,点击自动匹配即可完成,等待系统执行完成即可。
- 无自带工具可使用以下Python脚本批量匹配,直接复制修改配置项即可运行:
```
import os
import csv
下方修改为你自己的配置
metadata_path = "./archive_metadata.csv" 元数据CSV路径
file_root = "./extract_files/" 解压后的文件根目录
unique_id_field = "档案唯一编号" CSV中唯一编号的字段名
target_table = "archive_info" 新系统档案表名
id_column = "unique_id" 新系统档案表唯一编号字段名
path_column = "file_path" 新系统存储路径字段名
output_sql = "./match_result.sql" 输出结果SQL路径
配置修改结束,无需改下方代码
with open(metadata_path, 'r', encoding='utf-8') as f:
reader = csv.DictReader(f)
with open(output_sql, 'w', encoding='utf-8') as out:
for row in reader:
uid = row[unique_id_field].strip()
matched = False
for root, _, files in os.walk(file_root):
for file in files:
if file.startswith(uid) or uid in file:
full_path = os.path.join(root, file).replace("\\", "/")
out.write(f"UPDATE {target_table} SET {path_column} = '{full_path}' WHERE {id_column} = '{uid}';\n")
matched = True
break
if matched:
break
```
运行脚本后会生成匹配结果SQL,将SQL导入新数据库即可完成匹配。
4. 迁移后校验收尾
- 抽样校验:随机抽取10%的档案,核对元数据信息和文件是否对应,文件能否正常打开,核心/涉密档案100%全量核对
- 权限校验:使用不同权限的账号登录新系统,检查档案访问权限是否和原系统一致
- 备份收尾:确认迁移无误后,删除临时压缩包、中间文件,给新系统做一次全量离线备份
常见坑点避坑
1. 中文乱码问题
导出元数据时必须选择UTF-8编码,若已经出现乱码,执行以下命令转码修复:
```
iconv -f gbk -t utf-8 乱码文件.csv > 正确文件.csv
```
2. 文件无法访问问题
新系统文件存储目录需要给运行进程开通读写权限,Nginx运行的系统执行以下命令:
```
chown -R nginx:nginx /data/archive_files/
chmod -R 755 /data/archive_files/
```
3. 大文件传输失败
超过10G的压缩包建议分卷压缩,每卷1G,使用rsync分卷传输,避免网络波动导致传输中断,所有分卷传输完成后再合并解压。