279 lines
128 KiB
JavaScript
279 lines
128 KiB
JavaScript
import{_ as i,o as a,c as t,a2 as n}from"./chunks/framework.B-QBKwc1.js";const o=JSON.parse('{"title":"数据库迁移工具","description":"db:migrate 是一个 CLI 命令行工具,支持在 MySQL / PostgreSQL / SQL Server / Oracle / SQLite 五种数据库之间任意组合迁移。","frontmatter":{},"headers":[],"relativePath":"zh/tools/db-migrate.md","filePath":"zh/tools/db-migrate.md"}'),l={name:"zh/tools/db-migrate.md"};function h(e,s,p,k,d,r){return a(),t("div",null,[...s[0]||(s[0]=[n(`<h1 id="_7-6-数据库迁移工具" tabindex="-1">7.6 数据库迁移工具 <a class="header-anchor" href="#_7-6-数据库迁移工具" aria-label="Permalink to "7.6 数据库迁移工具""></a></h1><div class="tip custom-block"><p class="custom-block-title">概述</p><p><code>db:migrate</code> 是一个 CLI 命令行工具,支持在 MySQL / PostgreSQL / SQL Server / Oracle / SQLite 五种数据库之间任意组合迁移。完整迁移流程包含自动建库、建表结构(含索引、外键、注释、自增、collation)、分批迁移数据、重置自增序列、逐表行数校验 5 个步骤。数据迁移基于主键稳定排序,支持事务保护与自动回滚。目标库不存在时自动创建,支持含点号的数据库名。</p></div><h2 id="迁移流程" tabindex="-1">迁移流程 <a class="header-anchor" href="#迁移流程" aria-label="Permalink to "迁移流程""></a></h2><div class="language-text vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span>┌──────────────────────────────────────────────────────────────┐</span></span>
|
||
<span class="line"><span>│ 数据库迁移 5 步流程 │</span></span>
|
||
<span class="line"><span>└──────────────────────────────────────────────────────────────┘</span></span>
|
||
<span class="line"><span></span></span>
|
||
<span class="line"><span>[1/5] 建目标库</span></span>
|
||
<span class="line"><span>│ 目标库不存在时自动创建(所有驱动均支持)</span></span>
|
||
<span class="line"><span>│ 自动从源库读取 collation 并应用(仅源与目标驱动相同时)</span></span>
|
||
<span class="line"><span>│ MySQL: CREATE DATABASE ... COLLATE | PgSQL: LC_COLLATE</span></span>
|
||
<span class="line"><span>│ SqlServer: CREATE DATABASE ... COLLATE | Oracle: CREATE USER</span></span>
|
||
<span class="line"><span>│ SQLite: 自动创建文件</span></span>
|
||
<span class="line"><span>▼</span></span>
|
||
<span class="line"><span>[2/5] 建表结构 + 索引 + 注释 + 外键</span></span>
|
||
<span class="line"><span>│ 源库 getTableFields() → DbSchemaBuilder 生成 DDL → 目标库执行</span></span>
|
||
<span class="line"><span>│ 自动迁移字段注释(MySQL: COMMENT 子句 | PgSQL/Oracle: COMMENT ON COLUMN | SqlServer: sp_addextendedproperty)</span></span>
|
||
<span class="line"><span>│ 自动迁移表注释(MySQL: ALTER TABLE COMMENT | PgSQL/Oracle: COMMENT ON TABLE)</span></span>
|
||
<span class="line"><span>│ 自动迁移非主键索引(UNIQUE INDEX / 普通 INDEX / 全文索引)</span></span>
|
||
<span class="line"><span>│ 自动迁移外键约束(所有表创建后统一添加,避免引用顺序问题)</span></span>
|
||
<span class="line"><span>│ 字段默认值完整保留(含空字符串 DEFAULT '',函数型默认值自动识别)</span></span>
|
||
<span class="line"><span>│ enum/set 类型自动迁移候选值(生成 CHECK 约束)</span></span>
|
||
<span class="line"><span>│ decimal/datetime 精度保留(如 decimal(10,2)、datetime(3))</span></span>
|
||
<span class="line"><span>│ 排序规则(collation)自动迁移:表级 + 列级(MySQL/PostgreSQL)</span></span>
|
||
<span class="line"><span>│ Oracle 自增:自动创建序列+触发器</span></span>
|
||
<span class="line"><span>│ 支持 --drop-target-first 先删后建</span></span>
|
||
<span class="line"><span>▼</span></span>
|
||
<span class="line"><span>[3/5] 逐表迁移数据(事务保护)</span></span>
|
||
<span class="line"><span>│ 按 batch-size(默认 1000)分页读取,每页再拆为 100 行的 INSERT 语句</span></span>
|
||
<span class="line"><span>│ 每个 batch-size 为一个独立事务,提交后即生效</span></span>
|
||
<span class="line"><span>│ 当前批次失败时回滚,已提交的历史批次不受影响</span></span>
|
||
<span class="line"><span>│ 基于主键 ORDER BY 稳定排序,避免分页漏行/重复</span></span>
|
||
<span class="line"><span>│ blob 字段使用 PDO::PARAM_LOB 绑定</span></span>
|
||
<span class="line"><span>│ SQL Server: 自动开关 IDENTITY_INSERT</span></span>
|
||
<span class="line"><span>▼</span></span>
|
||
<span class="line"><span>[4/5] 重置自增序列</span></span>
|
||
<span class="line"><span>│ PostgreSQL: SELECT setval 重置序列到 MAX(id)+1</span></span>
|
||
<span class="line"><span>│ SQL Server: DBCC CHECKIDENT 重置标识种子</span></span>
|
||
<span class="line"><span>│ Oracle: ALTER SEQUENCE 重置序列</span></span>
|
||
<span class="line"><span>│ MySQL / SQLite: 跳过(无需重置)</span></span>
|
||
<span class="line"><span>▼</span></span>
|
||
<span class="line"><span>[5/5] 逐表行数校验</span></span>
|
||
<span class="line"><span> SELECT COUNT(*) 对比源和目标,输出 PASS/FAIL</span></span></code></pre></div><h2 id="命令格式" tabindex="-1">命令格式 <a class="header-anchor" href="#命令格式" aria-label="Permalink to "命令格式""></a></h2><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># =============================================================================</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 数据库迁移命令</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># =============================================================================</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># php artisan db:migrate → 调用 Laravel Artisan 的数据库迁移工具</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># [选项] → 通过 --key=value 格式传入源/目标数据库连接参数</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># =============================================================================</span></span>
|
||
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">php</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> artisan</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> db:migrate</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> [选项]</span></span></code></pre></div><h3 id="必填选项" tabindex="-1">必填选项 <a class="header-anchor" href="#必填选项" aria-label="Permalink to "必填选项""></a></h3><table tabindex="0"><thead><tr><th>选项</th><th>说明</th></tr></thead><tbody><tr><td><code>--src-type</code></td><td>源数据库驱动:<code>mysql</code> / <code>pgsql</code> / <code>sqlsrv</code> / <code>oracle</code> / <code>sqlite</code></td></tr><tr><td><code>--src-database</code></td><td>源数据库名</td></tr><tr><td><code>--dst-type</code></td><td>目标数据库驱动:<code>mysql</code> / <code>pgsql</code> / <code>sqlsrv</code> / <code>oracle</code> / <code>sqlite</code></td></tr><tr><td><code>--dst-database</code></td><td>目标数据库名(SQLite 时为文件路径)</td></tr></tbody></table><h3 id="源连接选项" tabindex="-1">源连接选项 <a class="header-anchor" href="#源连接选项" aria-label="Permalink to "源连接选项""></a></h3><table tabindex="0"><thead><tr><th>选项</th><th>默认值</th><th>说明</th></tr></thead><tbody><tr><td><code>--src-host</code></td><td><code>127.0.0.1</code></td><td>源主机地址</td></tr><tr><td><code>--src-port</code></td><td>自动推断</td><td>源端口(mysql=3306, pgsql=5432, sqlsrv=1433, oracle=1521)</td></tr><tr><td><code>--src-username</code></td><td>-</td><td>源用户名(SQLite 除外)</td></tr><tr><td><code>--src-password</code></td><td>-</td><td>源密码(SQLite 除外)</td></tr></tbody></table><h3 id="目标连接选项" tabindex="-1">目标连接选项 <a class="header-anchor" href="#目标连接选项" aria-label="Permalink to "目标连接选项""></a></h3><table tabindex="0"><thead><tr><th>选项</th><th>默认值</th><th>说明</th></tr></thead><tbody><tr><td><code>--dst-host</code></td><td><code>127.0.0.1</code></td><td>目标主机地址</td></tr><tr><td><code>--dst-port</code></td><td>自动推断</td><td>目标端口</td></tr><tr><td><code>--dst-username</code></td><td>-</td><td>目标用户名(SQLite 除外)</td></tr><tr><td><code>--dst-password</code></td><td>-</td><td>目标密码(SQLite 除外)</td></tr></tbody></table><h3 id="迁移选项" tabindex="-1">迁移选项 <a class="header-anchor" href="#迁移选项" aria-label="Permalink to "迁移选项""></a></h3><table tabindex="0"><thead><tr><th>选项</th><th>默认值</th><th>说明</th></tr></thead><tbody><tr><td><code>--drop-target-first</code></td><td>否</td><td>迁移前先删除目标库中的同名表</td></tr><tr><td><code>--batch-size</code></td><td><code>1000</code></td><td>每批读取的行数(影响内存占用与迁移速度)</td></tr><tr><td><code>--tables</code></td><td>全部</td><td>只迁移指定表(逗号分隔,不含前缀)</td></tr></tbody></table><div class="warning custom-block"><p class="custom-block-title">参数名为 <code>--src-port</code> / <code>--dst-port</code></p><p>选项是 <code>--src-port</code> / <code>--dst-port</code>(<strong>不是</strong> <code>hostport</code>),与签名 <code>DbMigrateCommand::$signature</code> 保持一致。端口缺省时按驱动自动推断。</p></div><h2 id="迁移命令签名" tabindex="-1">迁移命令签名 <a class="header-anchor" href="#迁移命令签名" aria-label="Permalink to "迁移命令签名""></a></h2><h3 id="MySQL-→-PostgreSQL" tabindex="-1">MySQL → PostgreSQL <a class="header-anchor" href="#MySQL-→-PostgreSQL" aria-label="Permalink to "MySQL → PostgreSQL""></a></h3><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># -----------------------------------------------------------------------------</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># MySQL 迁移到 PostgreSQL</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># -----------------------------------------------------------------------------</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># --src-* → 源数据库连接参数(MySQL)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># --dst-* → 目标数据库连接参数(PostgreSQL)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># --drop-target-first → 迁移前先删除目标库中的同名表(避免表已存在报错)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">php</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> artisan</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> db:migrate</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \\</span></span>
|
||
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-type=mysql</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-host=127.0.0.1</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-port=3306</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \\</span></span>
|
||
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-database=rxthinkcmf.laravel13.elevue</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-username=root</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-password=root</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \\</span></span>
|
||
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-type=pgsql</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-host=127.0.0.1</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-port=5432</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \\</span></span>
|
||
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-database=rxthinkcmf.laravel13.elevue</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-username=postgres</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-password=123456</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \\</span></span>
|
||
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --drop-target-first</span></span></code></pre></div><h3 id="MySQL-→-SQL-Server" tabindex="-1">MySQL → SQL Server <a class="header-anchor" href="#MySQL-→-SQL-Server" aria-label="Permalink to "MySQL → SQL Server""></a></h3><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># -----------------------------------------------------------------------------</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># MySQL 迁移到 SQL Server</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># -----------------------------------------------------------------------------</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># --dst-type=sqlsrv → 目标驱动为 SQL Server</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># --dst-port=1433 → SQL Server 默认端口</span></span>
|
||
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">php</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> artisan</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> db:migrate</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \\</span></span>
|
||
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-type=mysql</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-host=127.0.0.1</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-port=3306</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \\</span></span>
|
||
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-database=rxthinkcmf.laravel13.elevue</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-username=root</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-password=root</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \\</span></span>
|
||
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-type=sqlsrv</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-host=127.0.0.1</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-port=1433</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \\</span></span>
|
||
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-database=rxthinkcmf.laravel13.elevue</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-username=sa</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-password=123456</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \\</span></span>
|
||
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --drop-target-first</span></span></code></pre></div><h3 id="MySQL-→-SQLite" tabindex="-1">MySQL → SQLite <a class="header-anchor" href="#MySQL-→-SQLite" aria-label="Permalink to "MySQL → SQLite""></a></h3><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># -----------------------------------------------------------------------------</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># MySQL 迁移到 SQLite</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># -----------------------------------------------------------------------------</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># --dst-type=sqlite → 目标驱动为 SQLite(无需用户名密码)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># --dst-database → SQLite 文件路径(文件不存在时自动创建)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">php</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> artisan</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> db:migrate</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \\</span></span>
|
||
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-type=mysql</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-host=127.0.0.1</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-port=3306</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \\</span></span>
|
||
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-database=rxthinkcmf.laravel13.elevue</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-username=root</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-password=root</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \\</span></span>
|
||
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-type=sqlite</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-database=database/rxthinkcmf.laravel13.elevue.db</span></span></code></pre></div><h3 id="MySQL-→-Oracle" tabindex="-1">MySQL → Oracle <a class="header-anchor" href="#MySQL-→-Oracle" aria-label="Permalink to "MySQL → Oracle""></a></h3><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># -----------------------------------------------------------------------------</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># MySQL 迁移到 Oracle</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># -----------------------------------------------------------------------------</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># --dst-type=oracle → 目标驱动为 Oracle(自动建用户 + 序列 + 触发器)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">php</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> artisan</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> db:migrate</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \\</span></span>
|
||
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-type=mysql</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-host=127.0.0.1</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-port=3306</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \\</span></span>
|
||
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-database=rxthinkcmf.laravel13.elevue</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-username=root</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-password=root</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \\</span></span>
|
||
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-type=oracle</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-host=127.0.0.1</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-port=1521</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \\</span></span>
|
||
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-database=rxthinkcmf.laravel13.elevue</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-username=system</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-password=123456</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \\</span></span>
|
||
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --drop-target-first</span></span></code></pre></div><h3 id="MySQL-→-MySQL-同实例跨库复制-" tabindex="-1">MySQL → MySQL(同实例跨库复制) <a class="header-anchor" href="#MySQL-→-MySQL-同实例跨库复制-" aria-label="Permalink to "MySQL → MySQL(同实例跨库复制)""></a></h3><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># -----------------------------------------------------------------------------</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># MySQL 同库复制(源和目标在同一 MySQL 实例,数据库名不同)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># -----------------------------------------------------------------------------</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 不带 --drop-target-first → 目标表已存在时跳过(不删除)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">php</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> artisan</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> db:migrate</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \\</span></span>
|
||
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-type=mysql</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-host=127.0.0.1</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-port=3306</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \\</span></span>
|
||
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-database=source_db</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-username=root</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-password=root</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \\</span></span>
|
||
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-type=mysql</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-host=127.0.0.1</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-port=3306</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \\</span></span>
|
||
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-database=target_db</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-username=root</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-password=root</span></span></code></pre></div><h3 id="PostgreSQL-→-MySQL" tabindex="-1">PostgreSQL → MySQL <a class="header-anchor" href="#PostgreSQL-→-MySQL" aria-label="Permalink to "PostgreSQL → MySQL""></a></h3><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># -----------------------------------------------------------------------------</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># PostgreSQL 迁移到 MySQL</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># -----------------------------------------------------------------------------</span></span>
|
||
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">php</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> artisan</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> db:migrate</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \\</span></span>
|
||
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-type=pgsql</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-host=127.0.0.1</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-port=5432</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \\</span></span>
|
||
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-database=rxthinkcmf.laravel13.elevue</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-username=postgres</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-password=123456</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \\</span></span>
|
||
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-type=mysql</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-host=127.0.0.1</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-port=3306</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \\</span></span>
|
||
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-database=rxthinkcmf.laravel13.elevue</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-username=root</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-password=root</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \\</span></span>
|
||
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --drop-target-first</span></span></code></pre></div><h3 id="SQL-Server-→-MySQL" tabindex="-1">SQL Server → MySQL <a class="header-anchor" href="#SQL-Server-→-MySQL" aria-label="Permalink to "SQL Server → MySQL""></a></h3><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># -----------------------------------------------------------------------------</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># SQL Server 迁移到 MySQL</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># -----------------------------------------------------------------------------</span></span>
|
||
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">php</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> artisan</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> db:migrate</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \\</span></span>
|
||
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-type=sqlsrv</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-host=127.0.0.1</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-port=1433</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \\</span></span>
|
||
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-database=rxthinkcmf.laravel13.elevue</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-username=sa</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-password=123456</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \\</span></span>
|
||
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-type=mysql</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-host=127.0.0.1</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-port=3306</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \\</span></span>
|
||
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-database=rxthinkcmf.laravel13.elevue</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-username=root</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-password=root</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \\</span></span>
|
||
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --drop-target-first</span></span></code></pre></div><h3 id="只迁移指定表" tabindex="-1">只迁移指定表 <a class="header-anchor" href="#只迁移指定表" aria-label="Permalink to "只迁移指定表""></a></h3><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># -----------------------------------------------------------------------------</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 只迁移指定表(逗号分隔表名,不含前缀)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># -----------------------------------------------------------------------------</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># --tables=laravel_user,laravel_role,laravel_menu → 只迁移这 3 张表</span></span>
|
||
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">php</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> artisan</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> db:migrate</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \\</span></span>
|
||
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-type=mysql</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-host=127.0.0.1</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-port=3306</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \\</span></span>
|
||
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-database=rxthinkcmf.laravel13.elevue</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-username=root</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-password=root</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \\</span></span>
|
||
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-type=pgsql</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-host=127.0.0.1</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-port=5432</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \\</span></span>
|
||
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-database=rxthinkcmf.laravel13.elevue</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-username=postgres</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-password=123456</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \\</span></span>
|
||
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --tables=laravel_user,laravel_role,laravel_menu</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \\</span></span>
|
||
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --drop-target-first</span></span></code></pre></div><h2 id="迁移输出日志" tabindex="-1">迁移输出日志 <a class="header-anchor" href="#迁移输出日志" aria-label="Permalink to "迁移输出日志""></a></h2><h3 id="MySQL-→-PostgreSQL-完整日志" tabindex="-1">MySQL → PostgreSQL 完整日志 <a class="header-anchor" href="#MySQL-→-PostgreSQL-完整日志" aria-label="Permalink to "MySQL → PostgreSQL 完整日志""></a></h3><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">$</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> php</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> artisan</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> db:migrate</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \\</span></span>
|
||
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-type=mysql</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-host=127.0.0.1</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-port=3306</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \\</span></span>
|
||
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-database=rxthinkcmf.laravel13.elevue</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-username=root</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-password=root</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \\</span></span>
|
||
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-type=pgsql</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-host=127.0.0.1</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-port=5432</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \\</span></span>
|
||
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-database=rxthinkcmf.laravel13.elevue</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-username=postgres</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-password=123456</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \\</span></span>
|
||
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --drop-target-first</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">==============================================================</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">迁移开始</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 源: mysql:rxthinkcmf.laravel13.elevue → 目标: pgsql:rxthinkcmf.laravel13.elevue</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">迁移开始</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 待迁移 25 张表</span></span>
|
||
<span class="line"><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">==============================================================</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">·</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">1/5</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 建目标库...</span></span>
|
||
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> ·</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 目标库</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;"> "</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">rxthinkcmf.laravel13.elevue</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">"</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 已就绪</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">✓</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">1/5</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 建目标库 完成(耗时 0ms)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">·</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">2/5</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 建表结构(25 张表)...</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">✓</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">2/5</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 建表结构 完成(耗时 440ms),25 张表,118 个索引,0 个外键</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">·</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">3/5</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 逐表迁移数据...</span></span>
|
||
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> ·</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> [1/25] 正在迁移 laravel_article...</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">laravel_article</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> +13(累计</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 13)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">✓ laravel_article</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> 共</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#2F798A;"> 13</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 行(耗时</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 10ms)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> ·</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> [2/25] 正在迁移 laravel_city...</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">laravel_city</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> +1000(累计</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 1000)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> ...</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">(大表分批输出进度,每批</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#2F798A;"> 1000</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 行)...</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">laravel_city</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> +562(累计</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 783562)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">✓ laravel_city</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> 共</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#2F798A;"> 783562</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 行(耗时</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 10m10s)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> ...</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">(其余表类似)</span><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;">...</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">✓</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">3/5</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 逐表迁移数据 完成(耗时 10m10s),共 785215 行</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">·</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">4/5</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 重置自增序列...</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">✓</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">4/5</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 重置自增序列 完成(耗时 23ms)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">·</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">5/5</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 逐表行数校验...</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">laravel_article</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#B07D48;"> source</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">=</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">13</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#B07D48;"> target</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">=</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">13</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> PASS</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">laravel_city</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#B07D48;"> source</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">=</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">783562</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#B07D48;"> target</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">=</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">783562</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> PASS</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> ...</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">(其余表类似)</span><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;">...</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">✓</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">5/5</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 逐表行数校验 完成(耗时 452ms),25 张表全部 PASS</span></span>
|
||
<span class="line"><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">==============================================================</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">迁移完成</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 成功:785215 行 / 25 张表 / 总耗时 10m11s</span></span>
|
||
<span class="line"><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">==============================================================</span></span></code></pre></div><h3 id="MySQL-→-Oracle-日志摘要" tabindex="-1">MySQL → Oracle 日志摘要 <a class="header-anchor" href="#MySQL-→-Oracle-日志摘要" aria-label="Permalink to "MySQL → Oracle 日志摘要""></a></h3><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">$</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> php</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> artisan</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> db:migrate</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \\</span></span>
|
||
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-type=mysql</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-host=127.0.0.1</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-port=3306</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \\</span></span>
|
||
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-database=rxthinkcmf.laravel13.elevue</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-username=root</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-password=root</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \\</span></span>
|
||
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-type=oracle</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-host=127.0.0.1</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-port=1521</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \\</span></span>
|
||
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-database=rxthinkcmf</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-username=system</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-password=123456</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \\</span></span>
|
||
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --drop-target-first</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">==============================================================</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">迁移开始</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 源: mysql:rxthinkcmf.laravel13.elevue → 目标: oracle:rxthinkcmf.laravel13.elevue</span></span>
|
||
<span class="line"><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">==============================================================</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">·</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">1/5</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 建目标库...</span></span>
|
||
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> ·</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 目标库</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;"> "</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">rxthinkcmf</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">"</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 已就绪(CREATE</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> USER</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> +</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> GRANT)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">✓</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">1/5</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 建目标库 完成(耗时 0ms)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">·</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">2/5</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 建表结构(25 张表)...</span></span>
|
||
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> ·</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 为</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> laravel_article</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 创建序列+触发器(自增列</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> id)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> ·</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 为</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> laravel_city</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 创建序列+触发器(自增列</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> id)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> ...</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">(其余含自增列的表类似)</span><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;">...</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">✓</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">2/5</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 建表结构 完成(耗时 2.1s)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">·</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">3/5</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 逐表迁移数据...</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> ...</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">(Oracle</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> INSERT</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 耗时较</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> MySQL/SQLite</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 更长)...</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">✓</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">3/5</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 逐表迁移数据 完成(耗时 15m30s),共 785215 行</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">·</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">4/5</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 重置自增序列...</span></span>
|
||
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> ·</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 重置序列:</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> laravel_article_id_seq</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> →</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#2F798A;"> 14</span></span>
|
||
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> ·</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 重置序列:</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> laravel_city_id_seq</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> →</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#2F798A;"> 783563</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">✓</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">4/5</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 重置自增序列 完成(耗时 180ms)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">·</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">5/5</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 逐表行数校验...</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> ...</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">(25</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 张表全部</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> PASS)...</span></span>
|
||
<span class="line"><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">==============================================================</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">迁移完成</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 成功:785215 行 / 25 张表 / 总耗时 15m33s</span></span>
|
||
<span class="line"><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">==============================================================</span></span></code></pre></div><div class="tip custom-block"><p class="custom-block-title">Oracle 迁移要点</p><ul><li><strong>建库</strong>:Oracle 通过 <code>CREATE USER</code> 创建用户,库名即用户名,需要 DBA 权限</li><li><strong>自增列</strong>:自动创建序列(<code>_seq</code>)和触发器(<code>_trg</code>),插入时自动填充——与应用侧 <code>OracleProcessor</code> 的主键回填约定一致</li><li><strong>序列重置</strong>:迁移完成后重置到 MAX+1</li><li><strong>分页</strong>:使用 <code>ROW_NUMBER() OVER (ORDER BY 主键)</code> 保证稳定排序</li><li><strong>字段名</strong>:Oracle 默认大写,工具自动处理大小写转换</li></ul></div><h3 id="只迁移指定表日志" tabindex="-1">只迁移指定表日志 <a class="header-anchor" href="#只迁移指定表日志" aria-label="Permalink to "只迁移指定表日志""></a></h3><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">$</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> php</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> artisan</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> db:migrate</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \\</span></span>
|
||
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-type=mysql</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-host=127.0.0.1</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-port=3306</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \\</span></span>
|
||
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-database=rxthinkcmf.laravel13.elevue</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-username=root</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --src-password=root</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \\</span></span>
|
||
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-type=pgsql</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-host=127.0.0.1</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-port=5432</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \\</span></span>
|
||
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-database=rxthinkcmf.laravel13.elevue</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-username=postgres</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --dst-password=123456</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \\</span></span>
|
||
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --tables=laravel_user,laravel_role,laravel_menu</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \\</span></span>
|
||
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --drop-target-first</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">==============================================================</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">迁移开始</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 待迁移 3 张表</span></span>
|
||
<span class="line"><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">==============================================================</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">·</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">2/5</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 建表结构(3 张表)...</span></span>
|
||
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> ·</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 已删除目标表:</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> laravel_user</span></span>
|
||
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> ·</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 已删除目标表:</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> laravel_role</span></span>
|
||
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> ·</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 已删除目标表:</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> laravel_menu</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">✓</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">2/5</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 建表结构 完成(耗时 85ms),3 张表,5 个索引,0 个外键</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">·</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">3/5</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 逐表迁移数据...</span></span>
|
||
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> ·</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> [1/3] 正在迁移 laravel_user...</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">laravel_user</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> +22(累计</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 22)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">✓ laravel_user</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> 共</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#2F798A;"> 22</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 行(耗时</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 9ms)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> ...</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">(其余表类似)</span><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;">...</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">✓</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">3/5</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 逐表迁移数据 完成(耗时 30ms),共 274 行</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">·</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">4/5</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 重置自增序列...</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">✓</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">4/5</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 重置自增序列 完成(耗时 25ms)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">·</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">5/5</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 逐表行数校验...</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">laravel_user</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#B07D48;"> source</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">=</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">22</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#B07D48;"> target</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">=</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">22</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> PASS</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">laravel_role</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#B07D48;"> source</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">=</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">24</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#B07D48;"> target</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">=</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">24</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> PASS</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">laravel_menu</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#B07D48;"> source</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">=</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">228</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#B07D48;"> target</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">=</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">228</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> PASS</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">✓</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">5/5</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 逐表行数校验 完成(耗时 60ms),3 张表全部 PASS</span></span>
|
||
<span class="line"><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">==============================================================</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">迁移完成</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 成功:274 行 / 3 张表 / 总耗时 250ms</span></span>
|
||
<span class="line"><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">==============================================================</span></span></code></pre></div><h2 id="类型映射" tabindex="-1">类型映射 <a class="header-anchor" href="#类型映射" aria-label="Permalink to "类型映射""></a></h2><table tabindex="0"><thead><tr><th>源类型</th><th>MySQL</th><th>PostgreSQL</th><th>SqlServer</th><th>Oracle</th><th>SQLite</th></tr></thead><tbody><tr><td>bigint</td><td>bigint</td><td>bigint</td><td>bigint</td><td>NUMBER(19)</td><td>INTEGER</td></tr><tr><td>int</td><td>int</td><td>integer</td><td>int</td><td>NUMBER(10)</td><td>INTEGER</td></tr><tr><td>smallint</td><td>smallint</td><td>smallint</td><td>smallint</td><td>NUMBER(5)</td><td>INTEGER</td></tr><tr><td>tinyint</td><td>tinyint</td><td>smallint</td><td>tinyint</td><td>NUMBER(3)</td><td>INTEGER</td></tr><tr><td>decimal</td><td>decimal</td><td>numeric</td><td>decimal</td><td>NUMBER</td><td>REAL</td></tr><tr><td>float</td><td>float</td><td>real</td><td>float</td><td>BINARY_FLOAT</td><td>REAL</td></tr><tr><td>double</td><td>double</td><td>double precision</td><td>float</td><td>BINARY_DOUBLE</td><td>REAL</td></tr><tr><td>varchar</td><td>varchar</td><td>varchar</td><td>nvarchar</td><td>VARCHAR2</td><td>TEXT</td></tr><tr><td>char</td><td>char</td><td>char</td><td>nchar</td><td>CHAR</td><td>TEXT</td></tr><tr><td>text</td><td>text</td><td>text</td><td>ntext</td><td>CLOB</td><td>TEXT</td></tr><tr><td>blob</td><td>blob</td><td>bytea</td><td>varbinary</td><td>BLOB</td><td>BLOB</td></tr><tr><td>datetime</td><td>datetime</td><td>timestamp</td><td>datetime</td><td>TIMESTAMP</td><td>TEXT</td></tr><tr><td>timestamp</td><td>timestamp</td><td>timestamp</td><td>datetime</td><td>TIMESTAMP</td><td>TEXT</td></tr><tr><td>date</td><td>date</td><td>date</td><td>date</td><td>DATE</td><td>TEXT</td></tr><tr><td>boolean</td><td>tinyint(1)</td><td>boolean</td><td>bit</td><td>NUMBER(1)</td><td>INTEGER</td></tr><tr><td>json</td><td>json</td><td>jsonb</td><td>ntext</td><td>CLOB</td><td>TEXT</td></tr></tbody></table><div class="tip custom-block"><p class="custom-block-title">精度保留</p><ul><li><code>decimal(10,2)</code> → PostgreSQL <code>numeric(10,2)</code>(精度不丢失)</li><li><code>datetime(3)</code> → PostgreSQL <code>timestamp(3)</code>(毫秒精度保留)</li><li><code>enum('a','b','c')</code> → PostgreSQL <code>varchar</code> + <code>CHECK (col IN ('a','b','c'))</code>(候选值保留)</li></ul></div><h2 id="各驱动特殊处理" tabindex="-1">各驱动特殊处理 <a class="header-anchor" href="#各驱动特殊处理" aria-label="Permalink to "各驱动特殊处理""></a></h2><table tabindex="0"><thead><tr><th>驱动</th><th>建库方式</th><th>分页排序</th><th>自增语法</th><th>索引</th><th>外键</th><th>字段注释</th><th>表注释</th><th>collation</th><th>序列重置</th></tr></thead><tbody><tr><td>MySQL</td><td><code>CREATE DATABASE ... COLLATE</code></td><td>主键 <code>ORDER BY</code></td><td><code>AUTO_INCREMENT</code></td><td>✅</td><td>✅</td><td>✅ <code>COMMENT</code></td><td>✅</td><td>✅ 库/表/列</td><td>跳过</td></tr><tr><td>PostgreSQL</td><td><code>LC_COLLATE</code></td><td>主键 <code>ORDER BY</code></td><td><code>GENERATED BY DEFAULT AS IDENTITY</code></td><td>✅</td><td>✅</td><td>✅ <code>COMMENT ON COLUMN</code></td><td>✅</td><td>✅ 库/列</td><td>✅ <code>setval</code></td></tr><tr><td>SQL Server</td><td><code>COLLATE</code></td><td>主键 <code>ORDER BY</code></td><td><code>IDENTITY(1,1)</code></td><td>✅</td><td>✅</td><td>✅ <code>sp_addextendedproperty</code></td><td>✅</td><td>✅ 库级</td><td>✅ <code>DBCC CHECKIDENT</code></td></tr><tr><td>Oracle</td><td><code>CREATE USER</code> + <code>GRANT</code></td><td><code>ROW_NUMBER()</code></td><td>序列+触发器</td><td>✅</td><td>✅</td><td>✅ <code>COMMENT ON COLUMN</code></td><td>✅</td><td>❌</td><td>✅ <code>ALTER SEQUENCE</code></td></tr><tr><td>SQLite</td><td>自动创建文件</td><td>主键 <code>ORDER BY</code></td><td><code>INTEGER PRIMARY KEY AUTOINCREMENT</code></td><td>✅</td><td>✅</td><td>❌</td><td>❌</td><td>❌</td><td>跳过</td></tr></tbody></table><h2 id="PostgreSQL-特殊处理" tabindex="-1">PostgreSQL 特殊处理 <a class="header-anchor" href="#PostgreSQL-特殊处理" aria-label="Permalink to "PostgreSQL 特殊处理""></a></h2><h3 id="建库" tabindex="-1">建库 <a class="header-anchor" href="#建库" aria-label="Permalink to "建库""></a></h3><p>迁移到 PostgreSQL 时,工具会自动连接 <code>postgres</code> 维护库执行:</p><div class="language-sql vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">sql</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">-- 创建目标数据库(UTF-8 编码)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">-- 若数据库已存在则跳过</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">-- LC_COLLATE / LC_CTYPE:仅当源与目标驱动相同时,从源库读取 collation 并应用</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">CREATE</span><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> DATABASE</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> "</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">数据库名</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">" </span><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">WITH</span><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> ENCODING</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;"> '</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">UTF8</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">'</span></span></code></pre></div><div class="warning custom-block"><p class="custom-block-title">PgSQL 数据库不存在的判定</p><p>PostgreSQL 数据库不存在时返回的 SQLSTATE 可能是 <code>3D000</code>(明确不存在)或 <code>08006</code>(连接异常,中文环境下错误信息可能乱码)。工具会主动连接 <code>postgres</code> 维护库查询 <code>pg_database</code> 确认目标库是否真的不存在,避免误判。</p></div><h3 id="序列重置" tabindex="-1">序列重置 <a class="header-anchor" href="#序列重置" aria-label="Permalink to "序列重置""></a></h3><p>迁移完成后,对每张有自增主键的表分两步重置序列:</p><div class="language-php vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">php</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">// 第一步:通过 pg_get_serial_sequence() 获取列关联的实际序列名</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">// 兼容 serial(序列名如 table_id_seq)和 IDENTITY(序列名由系统自动生成)两种风格</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">$</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#B07D48;">seqName</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> =</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> $</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#B07D48;">dstPdo</span><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;">-></span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">query</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">(</span></span>
|
||
<span class="line"><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;"> "</span><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">SELECT</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> pg_get_serial_sequence('表名', '字段名') </span><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">AS</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> s</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">"</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">)</span><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;">-></span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">fetch</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">()[</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">'</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">s</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">'</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">];</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">// 第二步:查询当前最大值,将序列重置到 max+1</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">// setval 的第三个参数 false 表示下一个 nextval 返回给定值</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">$</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#B07D48;">maxId</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> =</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> $</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#B07D48;">dstPdo</span><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;">-></span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">query</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">(</span></span>
|
||
<span class="line"><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;"> "</span><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">SELECT</span><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> COALESCE</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">(</span><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;">MAX</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">(</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;">\\"</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">字段名</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;">\\"</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">), </span><span style="--shiki-dark:#BF9EEE;--shiki-light:#2F798A;">0</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">) </span><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">AS</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> m </span><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">FROM</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \\"</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">表名</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;">\\"</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">"</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">)</span><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;">-></span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">fetch</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">()[</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">'</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">m</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">'</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">];</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">$</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#B07D48;">dstPdo</span><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;">-></span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">exec</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">(</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">"</span><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">SELECT</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> setval(</span><span style="--shiki-dark:#E7EE98;--shiki-light:#999999;">{</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">$</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#B56959;">quotedSeq</span><span style="--shiki-dark:#E7EE98;--shiki-light:#999999;">}</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">, </span><span style="--shiki-dark:#E7EE98;--shiki-light:#999999;">{</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">$</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#B56959;">maxId</span><span style="--shiki-dark:#E7EE98;--shiki-light:#999999;">}</span><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;"> +</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#2F798A;"> 1</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">, false)</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">"</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">);</span></span></code></pre></div><h2 id="SQL-Server-特殊处理" tabindex="-1">SQL Server 特殊处理 <a class="header-anchor" href="#SQL-Server-特殊处理" aria-label="Permalink to "SQL Server 特殊处理""></a></h2><h3 id="建库-1" tabindex="-1">建库 <a class="header-anchor" href="#建库-1" aria-label="Permalink to "建库""></a></h3><div class="language-sql vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">sql</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">-- 连接 master 库,创建目标数据库</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">-- COLLATE:仅当源与目标驱动相同时,从源库读取 collation 并应用</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">CREATE</span><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> DATABASE</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> [数据库名]</span></span></code></pre></div><div class="warning custom-block"><p class="custom-block-title">SQL Server "登录失败"的判定</p><p>SQL Server 数据库不存在时返回 SQLSTATE <code>28000</code> 并提示"登录失败",容易与密码错误混淆。工具会尝试连接 <code>master</code> 库验证凭据:若 master 连接成功说明凭据正确、是数据库不存在;若 master 也失败则为密码错误。</p></div><h3 id="自增列迁移" tabindex="-1">自增列迁移 <a class="header-anchor" href="#自增列迁移" aria-label="Permalink to "自增列迁移""></a></h3><p>数据迁移时自动处理 <code>IDENTITY_INSERT</code>:</p><div class="language-sql vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">sql</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">-- 迁移前开启(允许显式写入自增列的值)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">SET</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> IDENTITY_INSERT [表名] </span><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">ON</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">-- 批量 INSERT ...</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">-- 迁移后关闭</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">SET</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> IDENTITY_INSERT [表名] </span><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">OFF</span></span></code></pre></div><h3 id="序列重置-1" tabindex="-1">序列重置 <a class="header-anchor" href="#序列重置-1" aria-label="Permalink to "序列重置""></a></h3><div class="language-sql vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">sql</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">-- 重置标识种子到指定值,下一次插入自动加一</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">DBCC CHECKIDENT (</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">'</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">[表名]</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">'</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">, RESEED, {$maxId})</span></span></code></pre></div><h2 id="Oracle-特殊处理" tabindex="-1">Oracle 特殊处理 <a class="header-anchor" href="#Oracle-特殊处理" aria-label="Permalink to "Oracle 特殊处理""></a></h2><h3 id="建库-2" tabindex="-1">建库 <a class="header-anchor" href="#建库-2" aria-label="Permalink to "建库""></a></h3><p>Oracle 的"建库"实际上是创建用户并授权。工具自动连接 Oracle 实例(默认服务名 <code>XE</code>),执行:</p><div class="language-sql vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">sql</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">-- 创建用户(库名即用户名,密码与连接密码一致)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">CREATE</span><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> USER</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> "</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">用户名</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">" IDENTIFIED </span><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">BY</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;"> "</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">密码</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">"</span><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;"> DEFAULT</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> TABLESPACE USERS;</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">-- 授权:CONNECT(连接)、RESOURCE(建表等基础对象操作)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">GRANT</span><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> CONNECT</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">, </span><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">RESOURCE</span><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> TO</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;"> "</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">用户名</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">"</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">;</span></span></code></pre></div><div class="warning custom-block"><p class="custom-block-title">Oracle 连接串</p><p>Oracle 的 DSN 格式为 <code>oci:dbname=//host:port/service_name</code>,其中 <code>service_name</code> 默认为 <code>XE</code>(Express Edition)。生产环境需根据实际的 Oracle 服务名修改,可通过 <code>lsnrctl status</code> 查看。</p></div><h3 id="自增列" tabindex="-1">自增列 <a class="header-anchor" href="#自增列" aria-label="Permalink to "自增列""></a></h3><p>Oracle 没有原生自增语法,工具自动创建序列+触发器实现等效功能:</p><div class="language-sql vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">sql</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">-- 创建序列(从 1 开始,每次递增 1,不缓存)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">-- 序列名规则:表名_列名_SEQ(大写)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">CREATE</span><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> SEQUENCE</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> "</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">TABLE_ID_SEQ</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">" </span><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">START</span><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> WITH</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#2F798A;"> 1</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> INCREMENT </span><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">BY</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#2F798A;"> 1</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> NOCACHE;</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">-- 创建触发器(插入前自动取序列值填充自增列)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">-- 触发器名规则:表名_列名_TRG(大写)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">-- IF :NEW.COL IS NULL 判断:允许显式传值,仅当未指定时才自动取序列</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">CREATE OR REPLACE</span><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> TRIGGER</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> "</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">TABLE_ID_TRG</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">"</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">BEFORE</span><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> INSERT</span><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> ON</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;"> "</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">TABLE</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">"</span><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> FOR</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> EACH </span><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">ROW</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">BEGIN</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> IF</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> :</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;">NEW</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">.</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;">ID</span><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> IS</span><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> NULL</span><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> THEN</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> SELECT</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;"> "</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">TABLE_ID_SEQ</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">"</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">.NEXTVAL </span><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">INTO</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> :</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;">NEW</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">.</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;">ID</span><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> FROM</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> dual;</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> END</span><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> IF</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">;</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">END</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">;</span></span></code></pre></div><div class="tip custom-block"><p class="custom-block-title">与应用侧的衔接</p><p>序列命名 <code>{表}_{列}_seq</code>(大写)与应用侧 <code>App\\Support\\Database\\OracleProcessor</code> 的 <code>insertGetId</code> 回填约定完全一致(见 <a href="/zh/core/exception.html">5.16 统一响应与异常抛出</a> 相关说明与 <a href="/zh/architecture/database-design.html">4.9 数据库设计</a>)。</p></div><h3 id="序列重置-2" tabindex="-1">序列重置 <a class="header-anchor" href="#序列重置-2" aria-label="Permalink to "序列重置""></a></h3><div class="language-sql vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">sql</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">-- 重置序列到 MAX(id)+1</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">ALTER</span><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> SEQUENCE</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;"> "</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">TABLE_ID_SEQ</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">"</span><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> RESTART</span><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> START</span><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> WITH</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#2F798A;"> 1234</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">;</span></span></code></pre></div><div class="warning custom-block"><p class="custom-block-title">Oracle 建库权限</p><p>Oracle 建库实际上是通过 <code>CREATE USER</code> + <code>GRANT CONNECT, RESOURCE</code> 创建用户。需要 DBA 权限或具有 CREATE USER 权限的账号。连接串中的服务名默认为 <code>XE</code>(Express Edition),正式环境需根据实际配置修改。</p></div><h2 id="驱动安装与环境配置" tabindex="-1">驱动安装与环境配置 <a class="header-anchor" href="#驱动安装与环境配置" aria-label="Permalink to "驱动安装与环境配置""></a></h2><p>迁移工具基于 PDO 直连数据库,各驱动需要对应的 PDO 扩展。Laragon 默认自带 MySQL、PostgreSQL 和 SQLite 驱动,SQL Server 和 Oracle 需手动安装。</p><p>运行以下命令检查已安装的驱动:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 检查已安装的 PDO 驱动(-m 列出扩展,findstr /i 不区分大小写过滤)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#B07D48;">$PHP_HOME</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;">\\p</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">hp.exe -m </span><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;">|</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> findstr</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> /i</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> pdo</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 列出所有可用的 PDO 驱动</span></span>
|
||
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#B07D48;">$PHP_HOME</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;">\\p</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">hp.exe -r </span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">"</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">print_r(PDO::getAvailableDrivers());</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">"</span></span></code></pre></div><h3 id="MySQL-Laragon-默认自带-" tabindex="-1">MySQL(Laragon 默认自带) <a class="header-anchor" href="#MySQL-Laragon-默认自带-" aria-label="Permalink to "MySQL(Laragon 默认自带)""></a></h3><p>无需额外操作。验证:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#B07D48;">$PHP_HOME</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;">\\p</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">hp.exe -m </span><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;">|</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> findstr</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> mysql</span></span></code></pre></div><h3 id="PostgreSQL-DLL-随包自带-php-ini-默认注释-" tabindex="-1">PostgreSQL(DLL 随包自带,php.ini 默认注释) <a class="header-anchor" href="#PostgreSQL-DLL-随包自带-php-ini-默认注释-" aria-label="Permalink to "PostgreSQL(DLL 随包自带,php.ini 默认注释)""></a></h3><p><code>ext\\php_pdo_pgsql.dll</code> 与 <code>libpq.dll</code> 已随 PHP 包附带,但 <code>$PHP_HOME\\php.ini</code> 扩展区的 <code>extension=pdo_pgsql</code> 默认是注释状态,<strong>需去掉分号启用</strong>:</p><div class="language-ini vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ini</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">;extension=pdo_odbc</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">extension</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">=</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">pdo_pgsql ← 去掉此行分号</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">extension</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">=</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">pdo_sqlite</span></span></code></pre></div><p>验证(<code>pdo_pgsql</code> 出现即可,<code>PDO::getAvailableDrivers()</code> 应包含 <code>pgsql</code>):</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#B07D48;">$PHP_HOME</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;">\\p</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">hp.exe -m </span><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;">|</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> findstr</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> pgsql</span></span>
|
||
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#B07D48;">$PHP_HOME</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;">\\p</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">hp.exe -r </span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">"</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">print_r(PDO::getAvailableDrivers());</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">"</span></span></code></pre></div><p>CLI 每次进程都会重读 <code>php.ini</code>,无需重启;跑在 Apache(mod_php)下的需重启 Apache 才生效。 未启用时执行 <code>--dst-type=pgsql</code> 会报 <code>could not find driver</code>。</p><h3 id="SQL-Server-需手动安装-" tabindex="-1">SQL Server(需手动安装) <a class="header-anchor" href="#SQL-Server-需手动安装-" aria-label="Permalink to "SQL Server(需手动安装)""></a></h3><p>Laragon 默认不带 SQL Server 驱动,需要安装两个组件。</p><div class="warning custom-block"><p class="custom-block-title">先决条件</p><p>安装 ODBC 驱动前,系统需要 Microsoft Visual C++ Redistributable。大多数 Windows 已预装,如果安装失败,先安装它再重试。</p></div><p><strong>步骤 1:安装 Microsoft ODBC Driver for SQL Server</strong></p><p>这是底层通信组件,sqlsrv 扩展依赖它,必须安装。</p><ul><li>下载地址:<a href="https://learn.microsoft.com/zh-cn/sql/connect/odbc/download-odbc-driver-for-sql-server" target="_blank" rel="noreferrer">https://learn.microsoft.com/zh-cn/sql/connect/odbc/download-odbc-driver-for-sql-server</a></li><li>版本选择:推荐 ODBC Driver 18(最新),两者可与 17 并存</li><li>安装:下载 x64 版本的 <code>msodbcsql.msi</code>,双击按向导完成</li></ul><p><strong>步骤 2:下载 PHP 扩展 DLL</strong></p><p>从微软官方 GitHub 下载:</p><ul><li>下载地址(Releases 页面):<a href="https://github.com/Microsoft/msphpsql/releases" target="_blank" rel="noreferrer">https://github.com/Microsoft/msphpsql/releases</a></li><li>下载文件:<code>Windows_5.13.3RTW.zip</code>(本项目基于 <strong>PHP 8.3 起步</strong>,该包覆盖 PHP 8.3 / 8.4 / 8.5)</li></ul><p>解压后目录结构(平铺,无子目录),文件命名规则:<code>php_{驱动}_{PHP版本}_{线程安全}_{架构}.dll</code></p><ul><li>驱动:<code>sqlsrv</code> 或 <code>pdo_sqlsrv</code></li><li>PHP 版本:<code>83</code>(PHP 8.3)/ <code>84</code>(PHP 8.4)/ <code>85</code>(PHP 8.5)</li><li>线程安全:<code>ts</code>(Thread Safe)/ <code>nts</code>(Non-Thread Safe)</li><li>架构:<code>x64</code> / <code>x86</code></li></ul><p><code>Windows_5.13.3RTW.zip</code> 解压后共 24 个 DLL:</p><div class="language-text vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span>php_sqlsrv_83_nts_x64.dll php_sqlsrv_83_nts_x86.dll</span></span>
|
||
<span class="line"><span>php_sqlsrv_83_ts_x64.dll php_sqlsrv_83_ts_x86.dll</span></span>
|
||
<span class="line"><span>php_sqlsrv_84_nts_x64.dll php_sqlsrv_84_nts_x86.dll</span></span>
|
||
<span class="line"><span>php_sqlsrv_84_ts_x64.dll php_sqlsrv_84_ts_x86.dll</span></span>
|
||
<span class="line"><span>php_sqlsrv_85_nts_x64.dll php_sqlsrv_85_nts_x86.dll</span></span>
|
||
<span class="line"><span>php_sqlsrv_85_ts_x64.dll php_sqlsrv_85_ts_x86.dll</span></span>
|
||
<span class="line"><span>php_pdo_sqlsrv_83_nts_x64.dll php_pdo_sqlsrv_83_nts_x86.dll</span></span>
|
||
<span class="line"><span>php_pdo_sqlsrv_83_ts_x64.dll php_pdo_sqlsrv_83_ts_x86.dll</span></span>
|
||
<span class="line"><span>php_pdo_sqlsrv_84_nts_x64.dll php_pdo_sqlsrv_84_nts_x86.dll</span></span>
|
||
<span class="line"><span>php_pdo_sqlsrv_84_ts_x64.dll php_pdo_sqlsrv_84_ts_x86.dll</span></span>
|
||
<span class="line"><span>php_pdo_sqlsrv_85_nts_x64.dll php_pdo_sqlsrv_85_nts_x86.dll</span></span>
|
||
<span class="line"><span>php_pdo_sqlsrv_85_ts_x64.dll php_pdo_sqlsrv_85_ts_x86.dll</span></span></code></pre></div><p>将以下两个文件复制到 <code>$PHP_HOME\\ext\\</code>(本项目用 <strong>PHP 8.3 TS x64</strong>):</p><ul><li><code>php_sqlsrv_83_ts_x64.dll</code></li><li><code>php_pdo_sqlsrv_83_ts_x64.dll</code></li></ul><div class="tip custom-block"><p class="custom-block-title">版本匹配(PHP 8.3 + TS + x64)</p><ul><li>PHP 版本:<code>83</code> = PHP 8.3</li><li>线程安全:Laragon 的 Apache 用 TS(运行 <code>$PHP_HOME\\php.exe -i | findstr "Thread Safety"</code> 确认 → <code>enabled</code>)</li><li>架构:<code>x64</code>(64 位系统)</li></ul></div><p><strong>步骤 3:在 php.ini 中启用扩展</strong></p><p>编辑 <code>$PHP_HOME\\php.ini</code>:</p><ol><li>启用前置扩展:找到 <code>;extension=mbstring</code> 去掉分号(sqlsrv 依赖 mbstring)</li><li>在 mbstring 之后添加以下两行(文件名必须与 ext 目录中的实际文件一致):</li></ol><div class="language-ini vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ini</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">; SQL Server PHP 扩展(必须在 mbstring 之后加载)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">extension</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">=</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">php_sqlsrv_83_ts_x64.dll </span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">; SQL Server 核心驱动</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">extension</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">=</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">php_pdo_sqlsrv_83_ts_x64.dll </span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">; SQL Server PDO 驱动(迁移工具使用)</span></span></code></pre></div><ol start="3"><li>保存后重启 Apache(命令行验证无需重启 Apache,只需重新运行 php 命令)</li></ol><p><strong>步骤 4:验证安装</strong></p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 检查 SQL Server 驱动是否已加载(应看到 sqlsrv 和 pdo_sqlsrv 两行)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#B07D48;">$PHP_HOME</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;">\\p</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">hp.exe -m </span><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;">|</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> findstr</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> sqlsrv</span></span></code></pre></div><h3 id="Oracle-需手动配置-" tabindex="-1">Oracle(需手动配置) <a class="header-anchor" href="#Oracle-需手动配置-" aria-label="Permalink to "Oracle(需手动配置)""></a></h3><p>迁移工具基于 PDO 连接数据库,需要 <code>pdo_oci</code> 扩展,需安装 Oracle Instant Client 并在 php.ini 中启用 <code>pdo_oci</code>(完整图文步骤见 <a href="/zh/quickstart/environment.html">2.1 开发环境准备</a>「数据库安装 → Oracle」)。</p><p><strong>步骤摘要:</strong></p><ol><li>安装 Oracle Instant Client(Basic Package,x64,推荐 19c),解压到固定路径 <code>C:\\oracle\\instantclient_19_20</code>(⚠️ 避免空格与中文)</li><li>将该路径添加到系统 <code>PATH</code></li><li>安装 VC++ 2015-2022 Redistributable(x64):<a href="https://aka.ms/vc14/vc_redist.x64.exe" target="_blank" rel="noreferrer">https://aka.ms/vc14/vc_redist.x64.exe</a></li><li>编辑 <code>$PHP_HOME\\php.ini</code>,启用 <code>extension=pdo_oci</code></li><li>完全重启 Laragon(不是只重启 Apache)</li></ol><div class="warning custom-block"><p class="custom-block-title">安装 VC++ 运行库</p><p>Oracle Instant Client 19c 依赖 VC++ 2015-2022 Redistributable,缺少会导致 DLL 加载失败。</p></div><p><strong>验证安装:</strong></p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 检查 pdo_oci 扩展是否已加载</span></span>
|
||
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#B07D48;">$PHP_HOME</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;">\\p</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">hp.exe -m </span><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;">|</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> findstr</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> -i</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;"> "</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">pdo_oci</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">"</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 列出所有可用的 PDO 驱动(应包含 oci)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#B07D48;">$PHP_HOME</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;">\\p</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">hp.exe -r </span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">"</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">print_r(PDO::getAvailableDrivers());</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">"</span></span></code></pre></div><p>应看到 <code>pdo_oci</code> 输出,且 <code>PDO::getAvailableDrivers()</code> 返回的数组中包含 <code>oci</code>。</p><h3 id="SQLite-默认自带-" tabindex="-1">SQLite(默认自带) <a class="header-anchor" href="#SQLite-默认自带-" aria-label="Permalink to "SQLite(默认自带)""></a></h3><p>无需额外操作。验证:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#B07D48;">$PHP_HOME</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;">\\p</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">hp.exe -m </span><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;">|</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> findstr</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> sqlite</span></span></code></pre></div><h3 id="驱动安装速查表" tabindex="-1">驱动安装速查表 <a class="header-anchor" href="#驱动安装速查表" aria-label="Permalink to "驱动安装速查表""></a></h3><table tabindex="0"><thead><tr><th>驱动</th><th>Laragon 默认</th><th>安装方式</th><th>验证命令</th></tr></thead><tbody><tr><td>pdo_mysql</td><td>✅ 自带</td><td>无需安装</td><td><code>php -m | findstr mysql</code></td></tr><tr><td>pdo_pgsql</td><td>✅ 自带</td><td>php.ini 启用</td><td><code>php -m | findstr pgsql</code></td></tr><tr><td>pdo_sqlsrv</td><td>❌ 需安装</td><td>ODBC 驱动 + 扩展 DLL(83_ts_x64)</td><td><code>php -m | findstr sqlsrv</code></td></tr><tr><td>pdo_oci</td><td>❌ 需配置</td><td>InstantClient + VC++ 运行库 + php.ini 启用</td><td><code>php -m | findstr pdo_oci</code></td></tr><tr><td>pdo_sqlite</td><td>✅ 自带</td><td>无需安装</td><td><code>php -m | findstr sqlite</code></td></tr></tbody></table><h2 id="相关代码" tabindex="-1">相关代码 <a class="header-anchor" href="#相关代码" aria-label="Permalink to "相关代码""></a></h2><table tabindex="0"><thead><tr><th>文件</th><th>说明</th></tr></thead><tbody><tr><td><code>app/Console/Commands/DbMigrateCommand.php</code></td><td>CLI 命令入口(参数解析、退出码,Laravel 自动发现注册)</td></tr><tr><td><code>app/Services/DbMigrateService.php</code></td><td>迁移引擎服务(连接、建库、建表、数据迁移、序列重置、行数校验)</td></tr><tr><td><code>app/Services/DbSchemaBuilder.php</code></td><td>DDL 生成器(类型映射、CREATE TABLE / INDEX / FK / COMMENT 语句生成)</td></tr></tbody></table><h2 id="注意事项" tabindex="-1">注意事项 <a class="header-anchor" href="#注意事项" aria-label="Permalink to "注意事项""></a></h2><div class="warning custom-block"><p class="custom-block-title">迁移前检查</p><ol><li>确保目标数据库用户有 CREATE TABLE / INSERT / CREATE INDEX / ALTER TABLE(外键)权限</li><li>PostgreSQL 迁移还需要 CREATE DATABASE 权限</li><li>SQL Server 迁移需要 sa 或有 CREATE DATABASE 权限的用户</li><li>Oracle 迁移需要 DBA 权限或具有 CREATE USER / CREATE SEQUENCE / CREATE TRIGGER 权限的账号</li><li><code>--drop-target-first</code> 会删除目标表的全部数据(含索引、外键和注释),请谨慎使用</li><li>大表迁移建议调大 <code>--batch-size</code>(如 5000)以提高效率</li><li>迁移过程中如遇中断,已提交的 <code>--batch-size</code> 批次数据不会回滚,建议使用 <code>--drop-target-first</code> 重试</li><li>含点号的数据库名(如 <code>rxthinkcmf.laravel13.elevue</code>)各驱动均已适配</li><li>索引、外键和注释在建表阶段同步迁移,使用 <code>--drop-target-first</code> 重建时会一并重建</li><li>外键约束在所有表创建后统一添加,避免引用顺序问题</li><li>命令退出码:成功返回 0,失败或行数校验未通过返回 1(可用于 CI/CD 判断)</li></ol></div><h2 id="常见问题" tabindex="-1">常见问题 <a class="header-anchor" href="#常见问题" aria-label="Permalink to "常见问题""></a></h2><h3 id="Q-迁移失败后如何重试-" tabindex="-1">Q: 迁移失败后如何重试? <a class="header-anchor" href="#Q-迁移失败后如何重试-" aria-label="Permalink to "Q: 迁移失败后如何重试?""></a></h3><p>A: 使用 <code>--drop-target-first</code> 选项重新执行,会先删除目标表再重建。</p><h3 id="Q-如何只迁移部分表-" tabindex="-1">Q: 如何只迁移部分表? <a class="header-anchor" href="#Q-如何只迁移部分表-" aria-label="Permalink to "Q: 如何只迁移部分表?""></a></h3><p>A: 使用 <code>--tables</code> 选项指定表名,逗号分隔(不含前缀):</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">php</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> artisan</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> db:migrate</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> ...</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --tables=laravel_user,laravel_role</span></span></code></pre></div><h3 id="Q-大表迁移很慢怎么办-" tabindex="-1">Q: 大表迁移很慢怎么办? <a class="header-anchor" href="#Q-大表迁移很慢怎么办-" aria-label="Permalink to "Q: 大表迁移很慢怎么办?""></a></h3><p>A: 调大 <code>--batch-size</code>,如 <code>--batch-size=5000</code>。默认 1000 行一批,增大批量可减少数据库交互次数。</p><h3 id="Q-目标库不存在会自动创建吗-" tabindex="-1">Q: 目标库不存在会自动创建吗? <a class="header-anchor" href="#Q-目标库不存在会自动创建吗-" aria-label="Permalink to "Q: 目标库不存在会自动创建吗?""></a></h3><p>A: 会。所有驱动(MySQL / PostgreSQL / SQL Server / Oracle / SQLite)在目标库不存在时都会自动创建,无需手动建库。建库时会自动从源库读取 collation 并应用(仅当源与目标驱动相同时)。</p><p>PostgreSQL 走维护库 <code>postgres</code> 执行 <code>CREATE DATABASE</code>,含点号的库名会自动加双引号(如 <code>"rxthinkcmf.laravel13.elevue"</code>);建库失败时抛出 <code>创建目标数据库失败: …</code> 并把原始异常保留在 previous 中。</p><h3 id="Q-报-could-not-find-driver-怎么办-" tabindex="-1">Q: 报 <code>could not find driver</code> 怎么办? <a class="header-anchor" href="#Q-报-could-not-find-driver-怎么办-" aria-label="Permalink to "Q: 报 \`could not find driver\` 怎么办?""></a></h3><p>A: PHP 缺少目标驱动的 PDO 扩展。迁到 PostgreSQL 需要 <code>pdo_pgsql</code>:在 <code>$PHP_HOME\\php.ini</code> 扩展区去掉 <code>extension=pdo_pgsql</code> 的分号(DLL 随包自带,无需下载),CLI 重读 <code>php.ini</code> 即生效;Linux 用 <code>apt install php8.3-pgsql</code>。可用 <code>$PHP_HOME\\php.exe -r "print_r(PDO::getAvailableDrivers());"</code> 确认驱动已加载。</p><h3 id="Q-PostgreSQL-报-SQLSTATE-08006-错误怎么办-" tabindex="-1">Q: PostgreSQL 报 SQLSTATE 08006 错误怎么办? <a class="header-anchor" href="#Q-PostgreSQL-报-SQLSTATE-08006-错误怎么办-" aria-label="Permalink to "Q: PostgreSQL 报 SQLSTATE 08006 错误怎么办?""></a></h3><p>A: <code>08006</code> 是连接异常的通用错误码,服务端消息可能是英文(<code>database "x" does not exist</code>)或中文(<code>数据库 "x" 不存在</code>),中文环境下控制台还可能出现乱码(先 <code>chcp 65001</code> 或换 Windows Terminal 查看)。工具对两种语言的消息都会识别,并<strong>主动连接 <code>postgres</code> 维护库查询 <code>pg_database</code></strong> 权威确认目标库是否缺失:确认缺失则自动建库后重连;维护库也连不上时按原始异常抛出,请检查 PostgreSQL 服务是否启动、端口是否正确、密码是否正确。</p><h3 id="Q-SQL-Server-报-登录失败-怎么办-" tabindex="-1">Q: SQL Server 报"登录失败"怎么办? <a class="header-anchor" href="#Q-SQL-Server-报-登录失败-怎么办-" aria-label="Permalink to "Q: SQL Server 报"登录失败"怎么办?""></a></h3><p>A: SQL Server 数据库不存在时会返回"登录失败"(SQLSTATE 28000),工具会自动连接 <code>master</code> 库验证凭据并区分。如果确实是密码错误,请检查 <code>--dst-password</code>。</p><h3 id="Q-索引、外键、注释、默认值会迁移吗-" tabindex="-1">Q: 索引、外键、注释、默认值会迁移吗? <a class="header-anchor" href="#Q-索引、外键、注释、默认值会迁移吗-" aria-label="Permalink to "Q: 索引、外键、注释、默认值会迁移吗?""></a></h3><p>A: 会。迁移工具在建表阶段会同步迁移以下元数据:</p><ul><li><strong>索引</strong>:自动读取源表的非主键索引(UNIQUE / 普通 / 全文),在目标表创建后执行 <code>CREATE INDEX</code></li><li><strong>外键</strong>:自动读取源表的外键约束,在所有表创建后统一添加 <code>ALTER TABLE ... ADD CONSTRAINT ... FOREIGN KEY</code>,避免引用顺序问题</li><li><strong>字段注释</strong>:MySQL 目标直接写入 <code>COMMENT</code> 子句;PostgreSQL / Oracle 使用 <code>COMMENT ON COLUMN</code>;SQL Server 使用 <code>sp_addextendedproperty</code></li><li><strong>表注释</strong>:MySQL 使用 <code>ALTER TABLE COMMENT</code>;PostgreSQL / Oracle 使用 <code>COMMENT ON TABLE</code></li><li><strong>默认值</strong>:完整保留,包括空字符串 <code>DEFAULT ''</code>、数值默认值、<code>CURRENT_TIMESTAMP</code>、<code>CURRENT_DATE</code>、函数调用等</li><li><strong>enum/set</strong>:自动迁移候选值,生成 <code>CHECK</code> 约束</li><li><strong>decimal/datetime 精度</strong>:保留精度参数(如 <code>decimal(10,2)</code> → <code>numeric(10,2)</code>,<code>datetime(3)</code> → <code>timestamp(3)</code>)</li><li><strong>collation</strong>:建库时自动应用源库 collation(仅同驱动时);建表时迁移表级和列级 collation(MySQL / PostgreSQL)</li></ul><h3 id="Q-数据迁移的可靠性如何保证-" tabindex="-1">Q: 数据迁移的可靠性如何保证? <a class="header-anchor" href="#Q-数据迁移的可靠性如何保证-" aria-label="Permalink to "Q: 数据迁移的可靠性如何保证?""></a></h3><p>A: 迁移工具有以下保障机制:</p><ul><li><strong>事务保护</strong>:每个 <code>--batch-size</code>(默认 1000 行)为一个独立事务,提交后即生效;当前批次失败时回滚,已提交的历史批次不受影响</li><li><strong>稳定排序</strong>:分页查询基于主键列 <code>ORDER BY</code>,确保大表分批迁移不会漏行或重复</li><li><strong>退出码</strong>:命令成功返回 0,失败或行数校验未通过返回 1,可用于 CI/CD 自动化判断</li><li><strong>行数校验</strong>:迁移完成后逐表对比源和目标的行数,输出 PASS/FAIL</li></ul><h3 id="Q-Oracle-自增列如何处理-" tabindex="-1">Q: Oracle 自增列如何处理? <a class="header-anchor" href="#Q-Oracle-自增列如何处理-" aria-label="Permalink to "Q: Oracle 自增列如何处理?""></a></h3><p>A: Oracle 没有原生自增语法。迁移工具会自动为自增列创建序列(<code>CREATE SEQUENCE</code>)和触发器(<code>CREATE TRIGGER</code>),实现等效的自增功能;序列命名与应用侧 <code>OracleProcessor</code> 主键回填约定一致。</p><h3 id="Q-含点号的数据库名支持吗-" tabindex="-1">Q: 含点号的数据库名支持吗? <a class="header-anchor" href="#Q-含点号的数据库名支持吗-" aria-label="Permalink to "Q: 含点号的数据库名支持吗?""></a></h3><p>A: 支持。如 <code>rxthinkcmf.laravel13.elevue</code> 这类含点号的库名,各驱动均已适配。</p><h3 id="Q-SQLite-作为目标有什么限制-" tabindex="-1">Q: SQLite 作为目标有什么限制? <a class="header-anchor" href="#Q-SQLite-作为目标有什么限制-" aria-label="Permalink to "Q: SQLite 作为目标有什么限制?""></a></h3><p>A: SQLite 不支持字段注释、表注释和 collation。迁移完成后数据完整,索引和外键正常迁移。</p><h3 id="Q-与-document-下的-SQL-脚本有何区别-" tabindex="-1">Q: 与 document/ 下的 SQL 脚本有何区别? <a class="header-anchor" href="#Q-与-document-下的-SQL-脚本有何区别-" aria-label="Permalink to "Q: 与 document/ 下的 SQL 脚本有何区别?""></a></h3><p>A: <code>document/</code> 下的五套 SQL 脚本是<strong>静态初始化脚本</strong>(建库 + 初始数据,见 <a href="/zh/quickstart/database-init.html">2.5 数据库初始化</a>);<code>db:migrate</code> 是<strong>活的迁移工具</strong>,用于把一个已有数据库完整搬到另一个数据库(结构 + 数据 + 元数据),两者互补。</p>`,158)])])}const c=i(l,[["render",h]]);export{o as __pageData,c as default};
|