# 11.3 数据库迁移 :::tip 概述 部署场景的两类迁移:① 全新环境初始化(导入定稿脚本);② 存量环境跨方言迁移(整库迁移器)。迁移器用法详见 [7.6 数据库迁移工具](../tools/db-migrate),本节聚焦部署视角。 ::: ## 场景一:全新环境初始化 ```sh # MySQL(推荐基准) mysql -uroot -p -e "CREATE DATABASE \`easygoadmin.goframe.elevue\` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;" mysql -uroot -p easygoadmin.goframe.elevue < document/mysql/easygoadmin.goframe.elevue.sql # 验证:25 张表 + admin 账号 + 种子数据(菜单/字典/参数/租户) ``` 脚本含超管账号(admin/123456——**上线后立即改密**)、菜单权限树、字典种子、参数种子。 ## 场景二:跨方言整库迁移 ```sh go run ./cmd/migrator \ -src-type=mysql -src-host=127.0.0.1 -src-hostport=3306 \ -src-database=easygoadmin.goframe.elevue -src-username=root -src-password=root \ -dst-type=pgsql -dst-host=127.0.0.1 -dst-hostport=5432 \ -dst-database=easygoadmin.goframe.elevue -dst-username=postgres -dst-password=123456 \ -drop-target-first ``` 部署注意: ```text □ 目标库确认无他用(-drop-target-first 清空全部表!) □ 迁移前备份源库与目标库 □ 先 -tables 白名单迁小表验证方言转换 □ 观察五阶段输出与行数校验 PASS/FAIL □ FAIL 表排查后 -tables 单独重迁 □ 迁移后切应用配置:database.default.type/link → 重启 ``` 限制提醒:无外键/视图/存储过程;无主键表拒绝搬运;mssql/oracle 作为源库时二级索引丢失;逐表串行。 ## 场景三:存量环境版本升级(同方言) ```text 本项目无自动 schema 升级工具——增量变更走 ALTER 工作流: 1. 以 document/mysql/ 定稿为基准整理 ALTER 脚本 (含列注释枚举、uk_* 唯一索引) 2. 备份 → 执行 ALTER 3. gf gen dao 刷新(如本地验证)→ 部署新二进制 4. 同步 document/ 其余四方言脚本 5. 租户级新表 → hooks.tenantTables 登记(随代码发布) 6. 验证:登录/核心接口/新功能冒烟 ``` ## 版本升级通用纪律 ```text □ 数据库变更先行(向后兼容的加列/加表最安全) □ 应用滚动(新版本兼容旧数据结构) □ 破坏性变更(删列/改枚举值)走双版本过渡:先发兼容版 → 清理旧结构 □ 每步可回滚(备份 + 旧二进制) □ 黄金样本接口回归(hack/golden) ``` ## 定稿脚本与漂移 ```text 五方言脚本位于 document/{mysql,postgresql,sqlserver,oracle,sqlite}/ MySQL 版为规范基准,后四份待人工校对 已知漂移注意:以 resource 定稿逻辑为准核对 uk_* 索引—— 导入后验证 13 个唯一索引齐全(并发唯一性最终保证) ```