Files
rxthinkcmf-wiki/RXThinkCMF_ThinkPhp8_EleVue/.vitepress/dist/assets/zh_tools_db-migrate.md.DSxjRdYV.lean.js
T
2026-10-25 18:52:36 +08:00

353 lines
154 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import{_ as i,o as a,c as n,a2 as t}from"./chunks/framework.B-QBKwc1.js";const E=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"}'),h={name:"zh/tools/db-migrate.md"};function l(p,s,k,e,d,r){return a(),n("div",null,[...s[0]||(s[0]=[t(`<h1 id="_7-6-数据库迁移工具" tabindex="-1">7.6 数据库迁移工具 <a class="header-anchor" href="#_7-6-数据库迁移工具" aria-label="Permalink to &quot;7.6 数据库迁移工具&quot;">​</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 &quot;迁移流程&quot;">​</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 &#39;&#39;,函数型默认值自动识别)</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 &quot;命令格式&quot;">​</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 think db:migrate → 调用 ThinkPHP 命令行的数据库迁移工具</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;"> think</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 &quot;必填选项&quot;">​</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>目标数据库名</td></tr></tbody></table><h3 id="源连接选项" tabindex="-1">源连接选项 <a class="header-anchor" href="#源连接选项" aria-label="Permalink to &quot;源连接选项&quot;">​</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-hostport</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 &quot;目标连接选项&quot;">​</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-hostport</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 &quot;迁移选项&quot;">​</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><h2 id="迁移命令签名" tabindex="-1">迁移命令签名 <a class="header-anchor" href="#迁移命令签名" aria-label="Permalink to &quot;迁移命令签名&quot;">​</a></h2><h3 id="MySQL-→-PostgreSQL" tabindex="-1">MySQL → PostgreSQL <a class="header-anchor" href="#MySQL-→-PostgreSQL" aria-label="Permalink to &quot;MySQL → PostgreSQL&quot;">​</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;"> think</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-hostport=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.thinkphp8.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-hostport=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.thinkphp8.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 &quot;MySQL → SQL Server&quot;">​</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-hostport=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;"> think</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-hostport=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.thinkphp8.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-hostport=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.thinkphp8.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 &quot;MySQL → SQLite&quot;">​</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;"> think</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-hostport=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.thinkphp8.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=runtime/rxthinkcmf.thinkphp8.elevue.db</span></span></code></pre></div><h3 id="MySQL-→-MySQL-同库复制-" tabindex="-1">MySQL → MySQL(同库复制) <a class="header-anchor" href="#MySQL-→-MySQL-同库复制-" aria-label="Permalink to &quot;MySQL → MySQL(同库复制)&quot;">​</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;"> think</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-hostport=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-hostport=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 &quot;PostgreSQL → MySQL&quot;">​</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;"> think</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-hostport=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.thinkphp8.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-hostport=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.thinkphp8.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 &quot;SQL Server → MySQL&quot;">​</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;"> think</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-hostport=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.thinkphp8.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-hostport=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.thinkphp8.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 &quot;只迁移指定表&quot;">​</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=think_user,think_role,think_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;"> think</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-hostport=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.thinkphp8.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-hostport=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.thinkphp8.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=think_user,think_role,think_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 &quot;迁移输出日志&quot;">​</a></h2><h3 id="MySQL-→-PostgreSQL-完整日志" tabindex="-1">MySQL → PostgreSQL 完整日志 <a class="header-anchor" href="#MySQL-→-PostgreSQL-完整日志" aria-label="Permalink to &quot;MySQL → PostgreSQL 完整日志&quot;">​</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;"> think</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-hostport=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.thinkphp8.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-hostport=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.thinkphp8.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.thinkphp8.elevue → 目标: pgsql:rxthinkcmf.thinkphp8.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;"> &quot;</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">rxthinkcmf.thinkphp8.elevue</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">&quot;</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] 正在迁移 think_article...</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">think_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;">✓ think_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] 正在迁移 think_category...</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">think_category</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> +150(累计</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 150)</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">✓ think_category</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;"> 150</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 行(耗时</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 12ms)</span></span>
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> ·</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> [3/25] 正在迁移 think_city...</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">think_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:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">think_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;"> 2000)</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">think_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;"> 3000)</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;">think_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;">✓ think_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:#62E884;--shiki-light:#59873A;"> ·</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> [4/25] 正在迁移 think_config...</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">think_config</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> +1(累计</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 1)</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">✓ think_config</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;"> 1</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 行(耗时</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 11ms)</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:#62E884;--shiki-light:#59873A;"> ·</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> [25/25] 正在迁移 think_user_role...</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">think_user_role</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> +25(累计</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 25)</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">✓ think_user_role</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;"> 25</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 行(耗时</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 6ms)</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;">think_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;">think_category</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;">150</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;">150</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;">think_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:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">think_config</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;">1</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;">1</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;">think_user_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;">25</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;">25</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;"> 逐表行数校验 完成(耗时 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-→-SQL-Server-日志摘要" tabindex="-1">MySQL → SQL Server 日志摘要 <a class="header-anchor" href="#MySQL-→-SQL-Server-日志摘要" aria-label="Permalink to &quot;MySQL → SQL Server 日志摘要&quot;">​</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;"> think</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-hostport=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.thinkphp8.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-hostport=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.thinkphp8.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>
<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.thinkphp8.elevue → 目标: sqlsrv:rxthinkcmf.thinkphp8.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;"> &quot;</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">rxthinkcmf.thinkphp8.elevue</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">&quot;</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;"> 建表结构 完成(耗时 1.5s),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:#97E1F1;--shiki-light:#998418;"> ...</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">(逐表迁移,SQL</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> Server</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;"> 逐表迁移数据 完成(耗时 11m48s),共 785231 行</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;"> 重置自增序列 完成(耗时 52ms)</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:#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;"> 逐表行数校验 完成(耗时 681ms),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;"> 成功:785231 行 / 25 张表 / 总耗时 11m50s</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 &quot;MySQL → Oracle 日志摘要&quot;">​</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;"> think</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-hostport=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.thinkphp8.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-hostport=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.thinkphp8.elevue → 目标: oracle:rxthinkcmf.thinkphp8.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;"> &quot;</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">rxthinkcmf</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">&quot;</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:#62E884;--shiki-light:#59873A;"> ·</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 为</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> think_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;"> think_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),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] 正在迁移 think_article...</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">think_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;">✓ think_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;"> 45ms)</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;"> think_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;"> think_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:#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;">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:#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;"> 逐表行数校验 完成(耗时 820ms),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 张表 / 总耗时 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>),插入时自动填充</li><li><strong>序列重置</strong>:迁移完成后通过 <code>ALTER SEQUENCE ... RESTART</code> 重置到 MAX+1</li><li><strong>分页</strong>:使用 <code>ROW_NUMBER() OVER (ORDER BY 主键)</code> 保证稳定排序</li><li><strong>字段名</strong>:Oracle 默认大写,工具自动处理大小写转换</li></ul></div><h3 id="MySQL-→-SQLite-日志摘要" tabindex="-1">MySQL → SQLite 日志摘要 <a class="header-anchor" href="#MySQL-→-SQLite-日志摘要" aria-label="Permalink to &quot;MySQL → SQLite 日志摘要&quot;">​</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;"> think</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-hostport=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.thinkphp8.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=runtime/rxthinkcmf.thinkphp8.elevue.db</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.thinkphp8.elevue → 目标: sqlite:runtime/rxthinkcmf.thinkphp8.elevue.db</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;"> &quot;</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">runtime/rxthinkcmf.thinkphp8.elevue.db</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">&quot;</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;"> 建表结构 完成(耗时 1s),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:#97E1F1;--shiki-light:#998418;"> ...</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">(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;"> 逐表迁移数据 完成(耗时 9m44s),共 785235 行</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:#F6F6F4;--shiki-light:#393A34;"> (sqlite) 无需重置序列,跳过</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;"> 重置自增序列 完成(耗时 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;">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:#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;"> 逐表行数校验 完成(耗时 427ms),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;"> 成功:785235 行 / 25 张表 / 总耗时 9m46s</span></span>
<span class="line"><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">==============================================================</span></span></code></pre></div><h3 id="只迁移指定表日志" tabindex="-1">只迁移指定表日志 <a class="header-anchor" href="#只迁移指定表日志" aria-label="Permalink to &quot;只迁移指定表日志&quot;">​</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;"> think</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-hostport=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.thinkphp8.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-hostport=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.thinkphp8.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=think_user,think_role,think_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;"> 源: mysql:rxthinkcmf.thinkphp8.elevue → 目标: pgsql:rxthinkcmf.thinkphp8.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;"> 待迁移 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;">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;"> &quot;</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">rxthinkcmf.thinkphp8.elevue</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">&quot;</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;"> 建表结构(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;"> think_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;"> think_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;"> think_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] 正在迁移 think_user...</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">think_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;">✓ think_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:#62E884;--shiki-light:#59873A;"> ·</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> [2/3] 正在迁移 think_role...</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">think_role</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> +24(累计</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 24)</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">✓ think_role</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;"> 24</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 行(耗时</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 5ms)</span></span>
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> ·</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> [3/3] 正在迁移 think_menu...</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">think_menu</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> +228(累计</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 228)</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">✓ think_menu</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;"> 228</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 行(耗时</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 12ms)</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;">think_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;">think_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;">think_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 &quot;类型映射&quot;">​</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(&#39;a&#39;,&#39;b&#39;,&#39;c&#39;)</code> → PostgreSQL <code>varchar</code> + <code>CHECK (col IN (&#39;a&#39;,&#39;b&#39;,&#39;c&#39;))</code>(候选值保留)</li></ul></div><h2 id="各驱动特殊处理" tabindex="-1">各驱动特殊处理 <a class="header-anchor" href="#各驱动特殊处理" aria-label="Permalink to &quot;各驱动特殊处理&quot;">​</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 &quot;PostgreSQL 特殊处理&quot;">​</a></h2><h3 id="建库" tabindex="-1">建库 <a class="header-anchor" href="#建库" aria-label="Permalink to &quot;建库&quot;">​</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;"> &quot;</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">数据库名</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">&quot; </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;"> &#39;</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">UTF8</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">&#39;</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 &quot;序列重置&quot;">​</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;">-&gt;</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;"> &quot;</span><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">SELECT</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> pg_get_serial_sequence(&#39;表名&#39;, &#39;字段名&#39;) </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;">&quot;</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">)</span><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;">-&gt;</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;">&#39;</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">s</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">&#39;</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;">-&gt;</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;"> &quot;</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;">\\&quot;</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">字段名</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;">\\&quot;</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;"> \\&quot;</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">表名</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;">\\&quot;</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">&quot;</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">)</span><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;">-&gt;</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;">&#39;</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">m</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">&#39;</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;">-&gt;</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;">&quot;</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;">&quot;</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 &quot;SQL Server 特殊处理&quot;">​</a></h2><h3 id="建库-1" tabindex="-1">建库 <a class="header-anchor" href="#建库-1" aria-label="Permalink to &quot;建库&quot;">​</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 &quot;登录失败&quot;的判定</p><p>SQL Server 数据库不存在时返回 SQLSTATE <code>28000</code> 并提示&quot;登录失败&quot;,容易与密码错误混淆。工具会尝试连接 <code>master</code> 库验证凭据:若 master 连接成功说明凭据正确、是数据库不存在;若 master 也失败则为密码错误。</p></div><h3 id="自增列迁移" tabindex="-1">自增列迁移 <a class="header-anchor" href="#自增列迁移" aria-label="Permalink to &quot;自增列迁移&quot;">​</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 &quot;序列重置&quot;">​</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:#7B7F8B;--shiki-light:#A0ADA0;">-- 第一个参数:表名(带方括号)</span></span>
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">-- 第三个参数:RESEED 值(当前最大 ID)</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">DBCC CHECKIDENT (</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">&#39;</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">[表名]</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">&#39;</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 &quot;Oracle 特殊处理&quot;">​</a></h2><h3 id="建库-2" tabindex="-1">建库 <a class="header-anchor" href="#建库-2" aria-label="Permalink to &quot;建库&quot;">​</a></h3><p>Oracle 的&quot;建库&quot;实际上是创建用户并授权。工具自动连接 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;"> &quot;</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">用户名</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">&quot; IDENTIFIED </span><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">BY</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;"> &quot;</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">密码</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">&quot;</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;"> &quot;</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">用户名</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">&quot;</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 &quot;自增列&quot;">​</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;"> &quot;</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">TABLE_ID_SEQ</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">&quot; </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:#7B7F8B;--shiki-light:#A0ADA0;">-- :NEW 引用的列名必须大写且不带引号</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;"> &quot;</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">TABLE_ID_TRG</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">&quot;</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;"> &quot;</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">TABLE</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">&quot;</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;"> &quot;</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">TABLE_ID_SEQ</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">&quot;</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><h3 id="序列重置-2" tabindex="-1">序列重置 <a class="header-anchor" href="#序列重置-2" aria-label="Permalink to &quot;序列重置&quot;">​</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:#7B7F8B;--shiki-light:#A0ADA0;">-- ALTER SEQUENCE ... RESTART:将序列起点设置为指定值,下一次 nextval 返回该值</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;"> &quot;</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">TABLE_ID_SEQ</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">&quot;</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 &quot;驱动安装与环境配置&quot;">​</a></h2><p>迁移工具基于 PDO 直连数据库,各驱动需要对应的 PDO 扩展。XAMPP 默认只自带 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:#62E884;--shiki-light:#59873A;">D:\\xampp8.2\\php\\php.exe</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> -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></code></pre></div><h3 id="MySQL-XAMPP-默认自带-" tabindex="-1">MySQL(XAMPP 默认自带) <a class="header-anchor" href="#MySQL-XAMPP-默认自带-" aria-label="Permalink to &quot;MySQL(XAMPP 默认自带)&quot;">​</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:#7B7F8B;--shiki-light:#A0ADA0;"># 检查 MySQL 驱动是否已加载</span></span>
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">D:\\xampp8.2\\php\\php.exe</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> -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-XAMPP-默认自带-" tabindex="-1">PostgreSQL(XAMPP 默认自带) <a class="header-anchor" href="#PostgreSQL-XAMPP-默认自带-" aria-label="Permalink to &quot;PostgreSQL(XAMPP 默认自带)&quot;">​</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:#7B7F8B;--shiki-light:#A0ADA0;"># 检查 PostgreSQL 驱动是否已加载</span></span>
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">D:\\xampp8.2\\php\\php.exe</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> -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></code></pre></div><p>若未安装,编辑 <code>D:\\xampp8.2\\php\\php.ini</code>,找到 <code>;extension=pdo_pgsql</code> 去掉分号启用。</p><h3 id="SQL-Server-需手动安装-" tabindex="-1">SQL Server(需手动安装) <a class="header-anchor" href="#SQL-Server-需手动安装-" aria-label="Permalink to &quot;SQL Server(需手动安装)&quot;">​</a></h3><p>XAMPP 默认不带 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.12.0RTW.zip</code></li></ul><p>解压后目录结构(平铺,无子目录):</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>Windows_5.12.0RTW/</span></span>
<span class="line"><span>├── php_pdo_sqlsrv_81_nts_x64.dll</span></span>
<span class="line"><span>├── php_pdo_sqlsrv_81_ts_x64.dll</span></span>
<span class="line"><span>├── php_pdo_sqlsrv_82_nts_x64.dll</span></span>
<span class="line"><span>├── php_pdo_sqlsrv_82_ts_x64.dll ← PHP 8.2 TS x64</span></span>
<span class="line"><span>├── php_pdo_sqlsrv_83_nts_x64.dll</span></span>
<span class="line"><span>├── php_pdo_sqlsrv_83_ts_x64.dll</span></span>
<span class="line"><span>├── php_sqlsrv_81_nts_x64.dll</span></span>
<span class="line"><span>├── php_sqlsrv_81_ts_x64.dll</span></span>
<span class="line"><span>├── php_sqlsrv_82_nts_x64.dll</span></span>
<span class="line"><span>├── php_sqlsrv_82_ts_x64.dll ← PHP 8.2 TS x64</span></span>
<span class="line"><span>├── php_sqlsrv_83_nts_x64.dll</span></span>
<span class="line"><span>├── php_sqlsrv_83_ts_x64.dll</span></span>
<span class="line"><span>└── ...(另有 x86 版本)</span></span></code></pre></div><p><strong>文件命名规则</strong>:<code>php_{驱动}_{PHP版本}_{线程安全}_{架构}.dll</code></p><ul><li>驱动:<code>sqlsrv</code> 或 <code>pdo_sqlsrv</code></li><li>PHP 版本:<code>81</code> / <code>82</code> / <code>83</code></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>D:\\xampp8.2\\php\\ext\\</code>:</p><ul><li><code>php_sqlsrv_82_ts_x64.dll</code></li><li><code>php_pdo_sqlsrv_82_ts_x64.dll</code></li></ul><div class="tip custom-block"><p class="custom-block-title">版本匹配(PHP 8.2 + TS + x64)</p><ul><li>PHP 版本:<code>82</code> = PHP 8.2</li><li>线程安全:XAMPP 默认 TS(运行 <code>php -v</code> 确认,输出含 <code>Thread Safety =&gt; enabled</code>)</li><li>架构:<code>x64</code>(64 位系统)</li></ul></div><p><strong>步骤 3:在 php.ini 中启用扩展</strong></p><p>编辑 <code>D:\\xampp8.2\\php\\php.ini</code>(注意不是 <code>apache\\bin\\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_82_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_82_ts_x64.dll </span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">; SQL Server PDO 驱动(迁移工具使用)</span></span></code></pre></div><ol start="3"><li>保存后重启 XAMPP 中的 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:#62E884;--shiki-light:#59873A;">D:\\xampp8.2\\php\\php.exe</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> -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><p>应看到 <code>sqlsrv</code> 和 <code>pdo_sqlsrv</code> 两行输出。</p><h3 id="Oracle-需手动配置-" tabindex="-1">Oracle(需手动配置) <a class="header-anchor" href="#Oracle-需手动配置-" aria-label="Permalink to &quot;Oracle(需手动配置)&quot;">​</a></h3><p>XAMPP 8.2 已自带 <code>php_pdo_oci.dll</code>(位于 <code>D:\\xampp8.2\\php\\ext\\</code>)。迁移工具基于 PDO 连接数据库,需要 <code>pdo_oci</code> 扩展,只需安装 Oracle Instant Client 并在 php.ini 中启用 <code>pdo_oci</code> 即可。</p><p><strong>步骤 1:安装 Oracle Instant Client</strong></p><p>pdo_oci 扩展依赖 Oracle 客户端库,必须先安装。</p><ul><li>下载地址:<a href="https://www.oracle.com/database/technologies/instant-client/downloads.html" target="_blank" rel="noreferrer">https://www.oracle.com/database/technologies/instant-client/downloads.html</a></li><li>版本选择:下载 Basic Package,选择 x64 版本,推荐 19c(与 XAMPP 自带的 DLL 对应)</li><li>安装: <ol><li>下载 <code>instantclient-basic-windows.x64-19.20.0.0.0dbru.zip</code></li><li>解压到固定路径,如 <code>C:\\oracle\\instantclient_19_20</code>(⚠️ 避免空格与中文)</li><li>配置系统环境变量: <ul><li>将 <code>C:\\oracle\\instantclient_19_20</code> 添加到系统 <code>PATH</code></li><li>新建系统变量 <code>TNS_ADMIN</code> = <code>C:\\oracle\\instantclient_19_20</code>(可选,用于 tnsnames.ora)</li></ul></li><li>重启终端或重启电脑使环境变量生效</li></ol></li></ul><div class="warning custom-block"><p class="custom-block-title">安装 VC++ 运行库</p><p>Oracle Instant Client 19c 依赖 VC++ 2015-2022 Redistributable,缺少会导致 DLL 加载失败。 下载地址:<a href="https://aka.ms/vc14/vc_redist.x64.exe" target="_blank" rel="noreferrer">https://aka.ms/vc14/vc_redist.x64.exe</a></p></div><p><strong>步骤 2:在 php.ini 中启用扩展</strong></p><p>编辑 <code>D:\\xampp8.2\\php\\php.ini</code>(注意不是 <code>apache\\bin\\php.ini</code>):</p><p>找到以下行:</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_oci ; Oracle PDO 驱动(默认被注释)</span></span></code></pre></div><p>去掉前面的分号,改为:</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:#F286C4;--shiki-light:#1E754F;">extension</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">=</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">pdo_oci </span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">; 启用 Oracle PDO 驱动(迁移工具依赖此扩展)</span></span></code></pre></div><p>保存后重启 XAMPP(完全关闭再启动,不是只重启 Apache)。</p><p><strong>步骤 3:验证安装</strong></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_oci 扩展是否已加载</span></span>
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">D:\\xampp8.2\\php\\php.exe</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> -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;"> &quot;</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">pdo_oci</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">&quot;</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:#62E884;--shiki-light:#59873A;">D:\\xampp8.2\\php\\php.exe</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> -r</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;"> &quot;</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">print_r(PDO::getAvailableDrivers());</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">&quot;</span></span></code></pre></div><p>应看到 <code>pdo_oci</code> 输出,且 <code>PDO::getAvailableDrivers()</code> 返回的数组中包含 <code>oci</code>。</p><p>phpinfo() 验证:创建 <code>&lt;?php phpinfo(); ?&gt;</code> 放入 htdocs,浏览器访问后搜索 <code>pdo_oci</code>,能看到 PDO drivers 中有 <code>oci</code> 且 Oracle Instant Client 版本号显示即成功。</p><h3 id="SQLite-XAMPP-默认自带-" tabindex="-1">SQLite(XAMPP 默认自带) <a class="header-anchor" href="#SQLite-XAMPP-默认自带-" aria-label="Permalink to &quot;SQLite(XAMPP 默认自带)&quot;">​</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:#7B7F8B;--shiki-light:#A0ADA0;"># 检查 SQLite 驱动是否已加载</span></span>
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">D:\\xampp8.2\\php\\php.exe</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> -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 &quot;驱动安装速查表&quot;">​</a></h3><table tabindex="0"><thead><tr><th>驱动</th><th>XAMPP 默认</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 驱动 + PECL 扩展</td><td><code>php -m | findstr sqlsrv</code></td></tr><tr><td>pdo_oci</td><td>⚠️ DLL 自带,需启用</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 &quot;相关代码&quot;">​</a></h2><table tabindex="0"><thead><tr><th>文件</th><th>说明</th></tr></thead><tbody><tr><td><code>app/command/DbMigrateCommand.php</code></td><td>CLI 命令入口(参数解析、退出码)</td></tr><tr><td><code>app/service/DbMigrateService.php</code></td><td>迁移引擎服务(连接、建库、建表、数据迁移、序列重置、行数校验)</td></tr><tr><td><code>app/service/DbSchemaBuilder.php</code></td><td>DDL 生成器(类型映射、CREATE TABLE / INDEX / FK / COMMENT 语句生成)</td></tr><tr><td><code>config/console.php</code></td><td>命令注册</td></tr></tbody></table><h2 id="注意事项" tabindex="-1">注意事项 <a class="header-anchor" href="#注意事项" aria-label="Permalink to &quot;注意事项&quot;">​</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.thinkphp8.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 &quot;常见问题&quot;">​</a></h2><h3 id="Q-迁移失败后如何重试-" tabindex="-1">Q: 迁移失败后如何重试? <a class="header-anchor" href="#Q-迁移失败后如何重试-" aria-label="Permalink to &quot;Q: 迁移失败后如何重试?&quot;">​</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 &quot;Q: 如何只迁移部分表?&quot;">​</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;"> think</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=think_user,think_role</span></span></code></pre></div><h3 id="Q-大表迁移很慢怎么办-" tabindex="-1">Q: 大表迁移很慢怎么办? <a class="header-anchor" href="#Q-大表迁移很慢怎么办-" aria-label="Permalink to &quot;Q: 大表迁移很慢怎么办?&quot;">​</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 &quot;Q: 目标库不存在会自动创建吗?&quot;">​</a></h3><p>A: 会。所有驱动(MySQL / PostgreSQL / SQL Server / Oracle / SQLite)在目标库不存在时都会自动创建,无需手动建库。建库时会自动从源库读取 collation 并应用(仅当源与目标驱动相同时)。</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 &quot;Q: PostgreSQL 报 SQLSTATE 08006 错误怎么办?&quot;">​</a></h3><p>A: <code>08006</code> 是连接异常的通用错误码,在中文环境下错误信息可能乱码。工具会主动连接 <code>postgres</code> 维护库查询 <code>pg_database</code> 确认目标库是否不存在。如果确认不存在会自动建库;如果维护库也连不上,请检查 PostgreSQL 服务是否启动、端口是否正确、密码是否正确。</p><h3 id="Q-SQL-Server-报-登录失败-怎么办-" tabindex="-1">Q: SQL Server 报&quot;登录失败&quot;怎么办? <a class="header-anchor" href="#Q-SQL-Server-报-登录失败-怎么办-" aria-label="Permalink to &quot;Q: SQL Server 报&quot;登录失败&quot;怎么办?&quot;">​</a></h3><p>A: SQL Server 数据库不存在时会返回&quot;登录失败&quot;(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 &quot;Q: 索引、外键、注释、默认值会迁移吗?&quot;">​</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 &#39;&#39;</code>、数值默认值、<code>CURRENT_TIMESTAMP</code>、<code>CURRENT_DATE</code>、函数调用(如 <code>uuid_generate_v4()</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 &quot;Q: 数据迁移的可靠性如何保证?&quot;">​</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 &quot;Q: Oracle 自增列如何处理?&quot;">​</a></h3><p>A: Oracle 没有原生自增语法。迁移工具会自动为自增列创建序列(<code>CREATE SEQUENCE</code>)和触发器(<code>CREATE TRIGGER</code>),实现等效的自增功能。</p><h3 id="Q-含点号的数据库名支持吗-" tabindex="-1">Q: 含点号的数据库名支持吗? <a class="header-anchor" href="#Q-含点号的数据库名支持吗-" aria-label="Permalink to &quot;Q: 含点号的数据库名支持吗?&quot;">​</a></h3><p>A: 支持。如 <code>rxthinkcmf.thinkphp8.elevue</code> 这类含点号的库名,各驱动均已适配。</p><h3 id="Q-SQLite-作为目标有什么限制-" tabindex="-1">Q: SQLite 作为目标有什么限制? <a class="header-anchor" href="#Q-SQLite-作为目标有什么限制-" aria-label="Permalink to &quot;Q: SQLite 作为目标有什么限制?&quot;">​</a></h3><p>A: SQLite 不支持字段注释、表注释和 collation。迁移完成后数据完整,索引和外键正常迁移。</p>`,162)])])}const g=i(h,[["render",l]]);export{E as __pageData,g as default};