ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Oracle SQL Developer 迁移 MySQL 到 Oracle,这次用 TaoToken 让 Codex 复查转换 SQL

Oracle SQL Developer 迁移 MySQL 到 Oracle,这次用 TaoToken 让 Codex 复查转换 SQL MySQL 迁 Oracle 的收尾活是复查 DDL这次用 TaoToken 把 Codex 拉进来先打开 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 创建一把 Key再把 Codex 的 Base URL 填成 https://taotoken.net/api之后让它在脚本生成之后逐条核对。迁移路径本身没变——装好 Oracle SQL Developer 和对应 JDK调首选项挂一个权限足够的中间 Oracle 库做媒介加 MySQL 数据源捕获模型转成 Oracle 数据模型生成带序列、触发器和主键约束的建表脚本最后右键移动数据把行灌进目标库。真正变的是原来没人复查的那一步Sequence 的起始值和上限、触发器里 max(id) 的兜底逻辑、ALTER TABLE ADD CONSTRAINT 后面那个约束名现在有人陪着过一遍。1. Oracle SQL Developer 捕获模型之后DDL 才是真正的坑1.1 转换出来的脚本为什么一点就炸Oracle SQL Developer 的迁移向导界面很友好捕获模型、转模型都是右键的事失败往往发生在你以为已经成功的第 5 步之后。MySQL 里的AUTO_INCREMENT在 Oracle 里没有对应物向导的常规做法是拆成三件套一个独立序列、一个 BEFORE INSERT 触发器、一条给主键列补上的约束。三件套之间靠名字串起来序列名少一个后缀、触发器里引用的序列写错、约束名撞上保留字导入就会卡住。原文里那张ddd表的脚本就是典型长相先建用户、授权再建一个存放自增值的包然后CREATE SEQUENCE ddd_id_SEQ接着建表、加主键约束最后CREATE OR REPLACE TRIGGER ddd_id_TRG去补 id。触发器内部先看是不是 INSERT 且:new.id为空为空就取序列的下一个值如果取到的是 1还要回表SELECT max(id)兜底再把结果写回:new.id。这段逻辑本身没问题问题在于它会引用一个叫mysql_utilities的包包没先建触发器编译就过不去报 PLS-00201表照样建出来插入时直接 ORA-01400 说 id 不能为空。还有一个几乎人人踩的点向导生成的约束名常常直接叫PRIMARY。看着像主键的意思实际是 Oracle 的保留字ALTER TABLE ... ADD CONSTRAINT PRIMARY PRIMARY KEY (...)这类写法在不少版本上会被拒绝执行。脚本生成完直接扔进 SQL*Plus第一句报错就在这里。1.2 复查交给 Codex执行留在你本地这一点必须先讲清楚Codex 不是数据库客户端它不连你的目标库也不执行任何 DDL。它能做的是读懂你贴过去的这段转换 SQL对照你描述的 Oracle 版本、表空间、字段类型指出哪里可能编译不过、哪里和源表语义对不上。真正跑脚本动作还是你在 SQL*Plus 或 Oracle SQL Developer 的 Worksheet 里按 F5把报错原样贴回对话再让它解释下一轮。这样分工的好处很直接DDL 是有破坏性的语句让任何自动化工具直连生产库都不合适而“看着这段 SQL 找茬”恰好是语言模型最擅长的事。你要给的输入只有三样生成的脚本、目标库的关键信息版本、表空间名、是否已有同名序列、以及你希望它重点看的对象。2. 转换模型之前先把 Codex 接到 TaoToken2.1 先拿到一把能用的 Key顺序别搞反不是等脚本出错了才去配工具而是在第 4 步“转化为 Oracle 数据模型”之前就把通道接好这样脚本一生成就能立刻贴过去复查。打开 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 注册并登录在控制台里创建 API Key复制出来先存到本地。这个 Key 后面只出现在两个地方Codex 的配置里以及你自己的环境变量里。这里顺手提醒一句Key 不要贴进任何要提交到 Git 的文件。养成把 Key 放进环境变量、配置文件里只写变量名的习惯后面换 Key 的时候也只需要改一处。2.2 ~/.codex/config.toml 里写 model_provider 和 base_urlCodex 的配置走 TOML路径在用户目录下的.codex/config.toml。要接 TaoToken核心是声明一个自定义 provider把base_url指到https://taotoken.net/api注意末尾不要再补/v1配置里的地址和官网落地页是两个不同的东西落地页给人点Base URL 给工具填。# ~/.codex/config.toml model YOUR_MODEL_ID model_provider taotoken [model_providers.taotoken] name TaoToken base_url https://taotoken.net/api env_key TAOTOKEN_API_KEY wire_api chatYOUR_MODEL_ID不要凭印象写模型广场上的列表才是准的以 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 上当时显示的可选模型为准复制过来覆盖即可。env_key指向的是一个环境变量名不是 Key 本身所以还要在 shell 里补一句export TAOTOKEN_API_KEYYOUR_API_KEYWindows 下如果用 PowerShell对应写法是$env:TAOTOKEN_API_KEYYOUR_API_KEY想让它长期生效就写进系统环境变量别每次开终端都手动敲。2.3 用一条测试消息确认通道活着配置改完别急着上 DDL先让 Codex 干一件无关紧要的小事比如让它解释一句SELECT ddd_id_SEQ.NEXTVAL FROM DUAL是干什么的。能正常回字说明 Key、Base URL、模型 ID 三样都对上了。如果这一步就报 401八成是 Key 复制时带了空格或者环境变量没生效如果报 404 或者提示接口不存在回头看看base_url是不是被写成了带/v1的形式。3. 按原文路径走到“转成 Oracle 数据模型”3.1 JDK 与 Oracle SQL Developer 的版本对齐原文第一条就是装 Oracle SQL Developer 和所需 JDK后面那句括号里的“不然会出现”基本不用猜配错 JDK 的症状就是软件双击了没反应或者闪一下就退。稳妥的次序是先确认 JDK 版本再解压 SQL Developer启动时如果它问 JDK 路径指到你刚装好的那个目录。启动一次成功之后再往下走后面所有步骤都建立在这套环境能跑的前提上。3.2 首选项里先改掉的两项首次启动会停在首选项那一步这里两个地方值得改一是数据库的默认日期格式和时间显示二是 SQL 编辑器的自动提交行为。迁移过程中你会反复跑 DDL 和 DML自动提交开着容易在试错时留下半成品数据关掉之后可以自己决定什么时候 COMMIT。这两个设置跟迁移逻辑没关系但会直接影响你排查问题时看到的现场。3.3 添加 MySQL 数据源和中间 Oracle 连接这一步是原文第 3 步的翻版先加一个 MySQL 连接指向源库再建一个 Oracle 连接角色是“媒介”。为什么需要这个中间 Oracle 库因为 SQL Developer 的模型转换流程要在 Oracle 侧落地一套元数据它需要的是一个权限足够大的目标能建表、建序列、建包、建触发器当然也要能删。用一个专门的测试库或者开发库别拿生产库当试验场。中间的 Oracle 连接建好后把 MySQL 和 Oracle 两个连接都展开应该能在树里看到各自的对象列表。看不到 MySQL 的表通常是驱动或者库名大小写的问题跟通道配置无关。3.4 捕获模型、断开重连、转成数据模型原文第 4 步的操作顺序很关键写反了就会觉得“捕出来的模型是空的”。先把 Oracle 连接断开再对 MySQL 侧选择捕获模型等进度条走完之后重新连上 Oracle此时树里才会出现刚才捕获的那份模型。接下来对这份模型右键选择转化为 Oracle 数据模型转换器会按 Oracle 的类型系统重新映射一遍VARCHAR变VARCHAR2DATETIME变DATE或TIMESTAMPINT AUTO_INCREMENT则变成NUMBER加上后面那套序列、触发器方案。转换完成的那一刻源表和目标表之间已经建立了对照关系但脚本还没生成。真正要复查的内容就在下一步。4. 把生成的 DDL 交给 Codex三类对象逐条核对4.1 贴给 Codex 的复查提示词在第 5 步对某张表右键选择生成之后把输出的整段脚本连同建用户、授权那部分一起复制下来粘进 Codex 的对话再附上目标库信息。提示词不用写得很花把关注点讲明白就行下面是从 MySQL 迁移到 Oracle 的转换脚本目标库是 Oracle 19c 中间 Oracle 库已建好用户和表空间。请检查 1. CREATE SEQUENCE 的选项是否会导致插入时取到空值或重复值 2. CREATE TRIGGER 主体是否依赖某个包或函数这些对象脚本里有没有先建 3. ALTER TABLE ADD CONSTRAINT 的约束名是否合法列类型是否与建表语句一致。 只做静态检查不要建议我连库执行。最后那句约束很重要把它的能力范围框在“读脚本”上输出就会停留在分析层面。4.2 三类对象的对照要点对象常见毛病复查时看什么CREATE SEQUENCE名字与触发器里引用的不一致MAXVALUE 写得过小序列名是否与表名对应、INCREMENT 是否为 1、是否 NOCYCLECREATE TRIGGER引用了未创建的包只处理 INSERT 不处理 UPDATE:new.id IS NULL的判断、max(id) 兜底逻辑、包的创建顺序ADD CONSTRAINT约束名撞保留字主键列精度与 NUMBER(10,0) 不匹配换一个带表名前缀的约束名、ENABLE 是否保留、列类型是否一致原文里那段脚本用PRIMARY当约束名就是表格第一行的典型情况Codex 一般会直接点出来并给一个PK_DDD之类的替代名。触发器依赖的mysql_utilities包也要确认它在脚本里出现在触发器之前否则整段脚本按顺序执行时触发器会编译成 INVALID 状态插入时才暴露问题。4.3 本地执行报错原样贴回脚本改完在 Oracle SQL Developer 里新开一个 Worksheet按顺序执行建用户、授权、切换用户、建包、建序列、建表、加约束、建触发器。中间任何一个对象报错都停下来别带着 INVALID 的对象继续。常见的几个ORA-00955 名字已被现有对象占用说明序列或表已经建过ORA-04098 触发器无效且无法重新验证多半是依赖对象没建ORA-01400 无法将 NULL 插入 id说明触发器根本没生效。把这些报错连同上下文一起贴回 Codex 的对话里让它解释原因、给出修正后的语句你再一次本地执行。来回两三轮之后脚本基本就能落稳第 6 步重建连接、第 7 步右键移动数据也就顺理成章不会在建表阶段就被拦住。5. 跑通一轮复查后去用量记录确认这次 Codex 的消耗5.1 用量页上该看什么复查对话结束别急着关终端。打开 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 进控制台找到用量记录看两样东西这次对话有没有被记上以及消耗的 Token 数量大致是多少。记上了说明请求确实经过了这条兼容通道Key、Base URL、模型 ID 这一整套配置是真的通一条记录都没有就说明请求根本没发出去或者被打回来了。Token 的绝对数值不用太纠结DDL 脚本长、问题多消耗自然高一些把它当成一个“通道活着”的证据就好。如果你打算长期用这种方式复查迁移脚本可以在控制台里看看近几天的累计消耗判断自己的使用节奏。5.2 消耗为 0 或者直接报错时的排查顺序第一顺位看 Key是不是从 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 创建的同一把环境变量有没有在 Codex 启动的那个终端里生效。第二顺位看 Base URLhttps://taotoken.net/api后面有没有被顺手加上/v1这个后缀是配置里最常见的翻车点。第三顺位看模型 ID配置文件里的名字和模型广场上当时列的选项是否一致写错一个字符请求就直接被拒。三样都确认过还是不通就把 Codex 的报错原文留下来对着错误码去找原因而不是反复改配置文件。配置这东西改动越多越难定位。5.3 迁移完成之后还能接着做的事ddd这张表只是样例实际的库里有几十张几百张表每张的序列名、触发器体都不一样。把这次复查用的提示词存成一段模板后面换表时只替换脚本内容就能复用同一套流程。移动数据跑完抽查几张表的行数和主键最大值确认序列的当前值已经越过已有数据否则下一次插入会直接撞主键冲突。想省点试错时间的话可以先在 TaoToken 模型对话 里用同一把 Key 发条消息确认模型 ID 和通道都正常长期跑迁移复查可以看下 Coding Plan 的额度是否够用需要再开一把 Key 或者换一把给同事用在 控制台 API Keys 里创建就行。
返回列表