从 MySQL 迁移到 PostgreSQL:步骤、风险与检查清单

副标题 / 摘要 数据库迁移不是“导出导入”这么简单。本文给出从 MySQL 迁移到 PostgreSQL 的可执行步骤、风险清单与回滚策略。 目标读者 负责数据库迁移的工程师 需要评估迁移成本的技术负责人 对兼容性风险敏感的团队 背景 / 动机 MySQL 与 PostgreSQL 在语法、类型、索引、事务语义上都有差异。 如果缺乏系统化迁移计划,很容易出现数据损坏或线上回滚。 核心概念 兼容性差异:类型、函数、SQL 语法 迁移策略:停机迁移 / 双写迁移 回滚策略:可验证与可恢复 实践指南 / 步骤 评估差异:数据类型、索引、函数、事务语义 准备迁移工具(pgloader / 自研 ETL) 双写验证(可选):新旧库同时写 全量迁移 + 增量同步 切流与回滚预案 可运行示例 # 迁移工具示例(pgloader) pgloader mysql://user:pass@localhost/db postgresql://user:pass@localhost/db 解释与原理 迁移的核心是“数据一致性 + 业务可回滚”。 任何一次迁移都必须可验证、可回滚、可复现。 常见问题与注意事项 类型差异:MySQL 的 TINYINT 在 PG 中可能需改为 SMALLINT 大小写与排序规则:字符集/排序规则差异可能导致查询结果变化 时间精度:时间类型精度不同需特别检查 最佳实践与建议 迁移前做数据与查询基准 全程保留旧库,直到稳定期结束 自动化校验(行数、校验和) 小结 / 结论 MySQL 到 PostgreSQL 迁移是系统工程。 正确做法是:分阶段、可验证、可回滚。 ...

2026年1月24日 · 1 分钟 · map[name:Jeanphilo]

让 FastAPI 异步真正‘不卡’:asyncio.create_task + to_thread 并发实践(含 MySQL 写入)

让 FastAPI 异步真正“不卡”:asyncio.create_task + to_thread 并发实践(含 MySQL 写入) 副标题 / 摘要 把同步重活丢给线程、把可并行的子流程拆出来并发执行,让你的 FastAPI WebSocket/HTTP 服务在高并发文件处理场景下保持流畅与可靠。适合需要在事件循环中混合 CPU 计算与阻塞 I/O 的工程团队。 目标读者 中级后端工程师、服务端架构师 正在用 FastAPI/asyncio 落地异步工作流、混合 I/O/CPU 任务的开发者 背景 / 动机 常见痛点: 在异步服务里不小心执行了同步 CPU/数据库操作,单个请求“卡住”事件循环,导致同一 worker 上的其它请求/WebSocket 心跳/进度推送都被拖慢。 CPU/数据库步骤彼此本无强依赖,却被串行放到一条链上,整体时延被“关键路径”拖长。 目标: 不改变外部行为的前提下,消除事件循环阻塞。 让独立步骤并发执行,缩短关键路径。 核心概念 线程(Thread):同一进程内共享内存,切换开销低;CPython 受 GIL 限制,纯 Python CPU 计算难并行,但适合并发等待阻塞 I/O。 进程(Process):独立内存、无 GIL 约束,CPU 计算可多核并行;切换/通信成本更高,参数/结果需可序列化。 异步(async/await):单线程事件循环的协作式调度;只有在 await 时让出控制权,同步阻塞会“卡死”循环。 asyncio.to_thread:把同步函数放到后台线程,释放事件循环;不等于多核加速,但对阻塞 I/O 有实效。 asyncio.create_task:并发启动一个协程,让它和当前协程重叠运行;用于编排并发,而非解除阻塞。 实践指南 / 步骤 识别阻塞点(示例项目) CPU 构树/展平/序列化:HeaderTree.from_documents、flatten_dfs、FlatHeaderTree.to_dict 同步 MySQL 写入:file_tree_table.upsert_tree 用 to_thread 包裹同步重活(释放事件循环) 在 build_file_tree 中,将 CPU/DB 步骤放入 await asyncio.to_thread(...)。 并发编排,缩短关键路径 在 full_pipeline_async:在 split 后立即 create_task(build_file_tree(...)),并发执行图片/表格处理、重组、存储;返回前再 await 构树结果。 可选:事件屏障与互斥 如需“保证某步骤不早于构树完成”,用 asyncio.Event。 多协程修改共享状态,用 asyncio.Lock 保护原子更新。 观测与参数 MySQL 连接池每进程默认较小(示例为 2),必要时调大。 Uvicorn workers 控制进程数,提升隔离与吞吐。 可运行示例 非阻塞构树与持久化(替换 build_file_tree 内部): ...

2025年11月19日 · 2 分钟 · map[name:Jeanphilo]