sql developer 连不上 oracle 需检查三处:hostname(填真实ip/域名)、port(查lsnrctl status确认)、sid/service name(12c+用service name防ora-12505)。

SQL Developer 连不上 Oracle?先检查这三处配置
SQL Developer 默认用 JDBC 连 Oracle,连不上八成是驱动或连接参数没对上。它不读本地 tnsnames.ora,也不自动识别 Oracle 客户端环境变量,得手动填全。
-
Hostname填真实 IP 或域名,别用localhost除非确认监听在 127.0.0.1 而非仅 0.0.0.0 -
Port默认是1521,但有些容器或高可用部署会改,查lsnrctl status输出里的PORT=... -
SID和Service name别混:旧库常用SID(如ORCL),12c+ 推荐用Service name(如ORCLPDB1),错一个就报ORA-12505: TNS:listener does not currently know of SID given in connect descriptor
Oracle 迁移到 PostgreSQL:pgloader 比 ora2pg 更省事
ora2pg 功能全但配置绕,pgloader 上手快、默认行为更合理,尤其对大表和 BLOB 处理更稳。但它不支持 Oracle 的物化视图、PL/SQL 函数迁移,这些得人工补。
- 用
pgloader时,Oracle 连接串必须写成oracle://user:pass@host:port/SERVICE_NAME,SID格式会失败 - 默认把
NUMBER(1)映射为boolean,但 Oracle 里常存 0/1 当标志位,得加规则:CAST column_name AS integer - 中文乱码常见于 Oracle 字符集是
ZHS16GBK而 PostgreSQL 是UTF8,pgloader 会自动转,但要确保 Oracle 客户端 NLS_LANG 设为AMERICAN_AMERICA.AL32UTF8,否则读出来就是问号
MySQL 不支持 Oracle 的 CONNECT BY?用 CTE + 递归替代
Oracle 的层次查询语法在 MySQL 8.0+ 才有等效支持,低版本只能靠自关联或应用层拼。直接照搬 CONNECT BY 肯定报错 ERROR 1064 (42000): You have an error in your SQL syntax。
- MySQL 8.0+ 用
WITH RECURSIVE,注意锚点查询和递归部分的列顺序、类型必须严格一致,否则报ERROR 3638 (HY000): Recursive query aborted after 1001 iterations - Oracle 的
START WITH ... CONNECT BY PRIOR parent_id = id,对应 MySQL 要写成SELECT ... FROM t WHERE id = ? UNION ALL SELECT ... FROM t JOIN cte ON t.parent_id = cte.id - PostgreSQL 同样支持
WITH RECURSIVE,但语法细节不同:它允许在RECURSIVE子句里用ORDER BY控制遍历顺序,MySQL 不行
迁移工具跑一半挂了?别急着重跑,先看日志里这行
ora2pg 和 pgloader 都会在日志末尾打印最后成功处理的表名或主键值,这是断点续传的关键。盲目删目标库重来,既浪费时间又可能丢数据一致性。
- ora2pg 日志里找
Writing table "xxx" ... done,下一行如果中断,说明该表已写完,下次可加--schema-only跳过 - pgloader 日志中搜
table name: xxx, rows: NNN,再往下看有没有failed或error,往往卡在某个字段类型映射上(比如 Oracle 的INTERVAL DAY TO SECOND没对应 MySQL 类型) - 所有工具都依赖源库事务一致性,迁移期间禁止对正在导出的表做 DML,否则 pgloader 可能报
could not serialize access due to concurrent update
迁移不是按钮一按就完的事,真正耗时的是类型对齐、索引重建、约束校验——这些步骤工具不会替你决定,得盯着日志里每一行 warning。










