- scripts/migrate_sqlite_to_mysql.py(新增):源库完整性校验 → 列宽审计(SQLite 不强制 长度,MySQL 严格模式下超长直接报错,先拦下)→ 建目标 schema(复用平台的 create_all + _sync_columns + 唯一索引)→ 逐表单事务搬行 → 逐表行数 + 全行 SHA-256 比对 → 写库环境标签与 schema_version。支持 --dry-run / --mode verify / --schema-only; --env prod 必须 --allow-prod(+ 交互确认或 --yes);目标库已登记别的环境时拒绝 - scripts/sql/init_mysql_5.7.sql(新增):建 auto_control / auto_control_dev 两个库 (utf8mb4 + utf8mb4_bin)+ 专用账号与授权 - doc/DEPLOY.md §7.2:补 SQLite→MySQL 迁移流程与注意事项 比对口径踩坑记录:验证哈希必须两边都从**驱动层原生读**。走 ORM/Core 的 typed select 会把 Boolean 读成 True/False,而源库 SQLite 原始读出来是 1/0 —— 三张带 布尔列的表(user/device/task_job)会全部误报"不一致"。现在统一用原生 SQL 回读 + 值规范化(bool→int、整数值浮点→int、bytes→str)。 自测(目标用 SQLite 代跑,MySQL 专属部分待 P4 真库验证):12 张表逐表 SHA-256 一致、 重复迁移幂等、verify 模式通过。
51 lines
2.8 KiB
SQL
51 lines
2.8 KiB
SQL
-- ==============================================================================
|
||
-- auto_control —— MySQL 5.7 环境初始化(建库 + 建账号 + 授权)
|
||
--
|
||
-- 用法(在 MySQL 主机上以 root 执行):
|
||
-- mysql -uroot -p < scripts/sql/init_mysql_5.7.sql
|
||
--
|
||
-- 建两个库,与 .env 的 DEPLOY_ENV 一一绑定(core/db_config.py 会强制校验):
|
||
-- auto_control_dev ← 本地开发机(DEPLOY_ENV=dev)
|
||
-- auto_control ← 生产 220 容器(DEPLOY_ENV=prod)
|
||
--
|
||
-- 字符集固定 utf8mb4 + utf8mb4_bin:
|
||
-- * utf8mb4:中文/emoji 都不能丢(MySQL 的 "utf8" 是 3 字节残缺版)
|
||
-- * _bin :逐码点比较(大小写敏感),等价 SQLite 的字节序语义。
|
||
-- 用默认的 utf8mb4_general_ci 会让 Admin/admin、Phone1/phone1 被判重复,
|
||
-- 唯一索引与等值查询语义全变。
|
||
--
|
||
-- ⚠️ 执行前把下面的 <改我> 换成强口令,并把主机段按实际情况收紧:
|
||
-- '192.168.20.%' 局域网
|
||
-- '100.100.10.%' Tailscale(若走 tailnet 连库)
|
||
-- 220 容器是 host 网络,出口 IP 取决于路由,两条都要覆盖;图省事可用 '%' + 强口令。
|
||
-- ==============================================================================
|
||
|
||
CREATE DATABASE IF NOT EXISTS auto_control
|
||
DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
|
||
CREATE DATABASE IF NOT EXISTS auto_control_dev
|
||
DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
|
||
|
||
-- 一个专用账号,只授权这两个库(不用 root 跑应用)
|
||
CREATE USER IF NOT EXISTS 'auto_control'@'%' IDENTIFIED BY '<改我>';
|
||
GRANT ALL PRIVILEGES ON auto_control.* TO 'auto_control'@'%';
|
||
GRANT ALL PRIVILEGES ON auto_control_dev.* TO 'auto_control'@'%';
|
||
FLUSH PRIVILEGES;
|
||
|
||
-- 授权说明:
|
||
-- * 应用需要 DDL 权限(建表 / 补列 / 建生成列与索引),所以给的是 ALL;
|
||
-- 若你的 DBA 只肯给 DML,就先用下面的「可选」段预建 schema,再只授
|
||
-- SELECT/INSERT/UPDATE/DELETE。
|
||
-- * 表结构由平台启动时自动创建(db.create_all + _sync_columns),
|
||
-- 正常情况下不需要手工建表。
|
||
|
||
-- ---------------------------------------------------------------------------
|
||
-- 可选:只给 DML 权限时,先让平台在别的环境把 schema 建好,再由本脚本导入。
|
||
-- 也可用迁移脚本的「先建 schema」路径:
|
||
-- python scripts/migrate_sqlite_to_mysql.py --sqlite data/users.db --env dev --schema-only
|
||
-- ---------------------------------------------------------------------------
|
||
|
||
-- 校验(执行完可以跑一下):
|
||
-- SELECT schema_name, default_character_set_name, default_collation_name
|
||
-- FROM information_schema.schemata WHERE schema_name LIKE 'auto_control%';
|
||
-- SHOW GRANTS FOR 'auto_control'@'%';
|