签入版本

This commit is contained in:
小蚂蚁云
2026-10-25 17:24:27 +08:00
parent 48911cc08f
commit fdbeae092a
1010 changed files with 30682 additions and 95274 deletions
@@ -1,86 +1,49 @@
# 11.3 数据库迁移
# 11.3 数据库初始化与迁移
:::tip CLI 迁移工具
除了 SQL 脚本导入,项目还提供了 `php think db:migrate` 命令行工具,支持跨数据库自动迁移(MySQL → PostgreSQL 等),自动迁移索引、外键、字段注释、表注释、默认值和排序规则(collation),数据迁移基于主键稳定排序并支持事务回滚,详见 [7.6 数据库迁移工具](/zh/tools/db-migrate.html)。
:::tip 概述
生产数据库两条路径:**全新初始化**导入种子脚本;**存量搬迁**用 migrator 跨库迁移。两者都需在应用启动前完成,并配合连接账号最小权限。
:::
## SQL 脚本目录
```text
document/
├── mysql/rxthinkcmf.thinkphp8.elevue.sql # MySQL 版本(约 78 万行)
├── postgresql/rxthinkcmf.thinkphp8.elevue.sql # PostgreSQL 版本
├── sqlserver/rxthinkcmf.thinkphp8.elevue.sql # SQL Server 版本
├── oracle/rxthinkcmf.thinkphp8.elevue.sql # Oracle 版本
└── sqlite/rxthinkcmf.thinkphp8.elevue.sql # SQLite 版本
```
各数据库脚本已针对对应的 SQL 语法做了适配,可直接导入。
## 各数据库导入命令
### MySQL
## 全新初始化
```bash
# -----------------------------------------------------------------------------
# MySQL 导入(mysql 命行工具)
# -----------------------------------------------------------------------------
# -u root -proot → 用户名和密码
# rxthinkcmf... → 目标数据库名
# < file.sql → 将 SQL 文件作为输入执行
mysql -u root -proot rxthinkcmf.thinkphp8.elevue < document/mysql/rxthinkcmf.thinkphp8.elevue.sql
mysql -uroot -p -e "CREATE DATABASE \`easygoadmin.gin.elevue\` DEFAULT CHARSET utf8mb4;"
mysql -uroot -p easygoadmin.gin.elevue < document/mysql/easygoadmin.gin.elevue.sql
```
### PostgreSQL
25 张 `gin_` 表 + 初始化数据(菜单、字典、超管账号等)。其他方言用 `document/` 对应目录脚本。
## 存量搬迁(migrator)
```bash
# -----------------------------------------------------------------------------
# PostgreSQL 导入(psql 命令行工具)
# -----------------------------------------------------------------------------
# -U postgres → 连接用户
# -d ... → 目标数据库
# -f file.sql → 执行 SQL 文件
psql -U postgres -d rxthinkcmf.thinkphp8.elevue -f document/postgresql/rxthinkcmf.thinkphp8.elevue.sql
make migrator ARGS="-src-type=mysql -src-database=db1 -dst-type=pgsql -dst-database=db2 ..."
```
### SQL Server
流水线:内省 → 目标方言 DDL → 建表 → 分批搬运 → 序列修复。要点:
```bash
# -----------------------------------------------------------------------------
# SQL Server 导入(sqlcmd 命令行工具)
# -----------------------------------------------------------------------------
# -S localhost → 服务器地址
# -U sa → 用户名(sa 为管理员)
# -P root → 密码
# -d ... → 目标数据库
# -i file.sql → 执行 SQL 文件
sqlcmd -S localhost -U sa -P root -d rxthinkcmf.thinkphp8.elevue -i document/sqlserver/rxthinkcmf.thinkphp8.elevue.sql
- 迁移期间**停写**(防搬运窗口数据变动)
- 大库关注分批内存与锁时间
- 迁移后核对行数与自增/序列
- 目标库统一 utf8mb4
## 应用连接账号
生产不用 root 跑应用:
```sql
CREATE USER 'easygoadmin'@'%' IDENTIFIED BY '<强密码>';
GRANT SELECT,INSERT,UPDATE,DELETE ON easygoadmin.\`gin_*\` TO 'easygoadmin'@'%';
```
### Oracle
最小权限原则:应用只需 DML(钩子做软删,无 DDL 需求)。
```bash
# -----------------------------------------------------------------------------
# Oracle 导入(sqlplus 命令行工具)
# -----------------------------------------------------------------------------
# root/root@localhost:1521/XE → 用户/密码@主机:端口/服务名
# @file.sql → 执行 SQL 文件
sqlplus root/root@localhost:1521/XE @document/oracle/rxthinkcmf.thinkphp8.elevue.sql
```
## 变更管理
### SQLite
- 结构变更走 SQL 脚本 + 评审,不在线上手改
- 种子脚本仅用于初始化,升级变更用增量脚本
- 变更前备份([11.9 备份与恢复](/zh/deploy/backup.html))
```bash
# -----------------------------------------------------------------------------
# SQLite 导入(sqlite3 命令行工具)
# -----------------------------------------------------------------------------
# 数据库文件路径 → SQLite 数据库存储在单个文件中
# < file.sql → 将 SQL 文件作为输入执行
sqlite3 /www/api/runtime/database.sqlite < document/sqlite/rxthinkcmf.thinkphp8.elevue.sql
```
## 相关
## 注意事项
- 每种数据库的主脚本已做语法适配,无需手动转换
- 导入前请先创建数据库并配置好用户权限
- 详见 [2.4 数据库初始化](/zh/quickstart/database-init.html)
- [7.6 数据库迁移工具](/zh/tools/db-migrate.html)
- [4.10 数据库设计](/zh/architecture/database-design.html)