简介:Oracle SQL Developer 4.0.3.16.84-x64 是 Oracle 官方推出的免费数据库管理工具,面向 Oracle 数据库开发人员与 DBA,尤其适合刚接触 Oracle 的新手快速上手。它提供图形化集成环境,覆盖数据库连接向导、SQL 编辑器、数据浏览与编辑、数据模型设计、报表图表、数据迁移、PL/SQL 调试、Git 版本控制集成、SQL Tuning Advisor 与 AWR 性能分析以及权限角色管理等完整能力,可满足日常开发、查询优化与库表维护需求。资源包为 zip 格式,共约 2000 个文件,整体 312.28MB,以 jar 核心库、xml 配置、sql 脚本、xslt 样式、exe 与 dll 运行组件为主,另含少量 html、pdf 文档及多语言时区资源,解压后目录结构完整。目前已有 766 人学习下载,适合希望获得稳定、功能齐全的 64 位 Oracle 管理工具的用户直接使用。
1. 为什么 2024 年还有人死磕 sqldeveloper-4.0.3.16.84-x64
上周帮一个做电力计费的老哥排查问题,他生产库是 Oracle 11.2.0.4,跑在一台内网 Windows Server 上,外网连不进去,只能靠跳板机。他手里那台 Win10 装了最新版 SQL Developer,连上去执行一条带TRUNC(SYSDATE)的统计 SQL,结果直接卡死,日志里报 JDBC 驱动版本不兼容。换回 sqldeveloper-4.0.3.16.84-x64 之后,一切正常。这不是玄学,是版本匹配的血泪经验。
Oracle 连接工具 sqldeveloper-4.0.3.16.84-x64 是 Oracle 官方在 2015 年前后发布的 SQL Developer 4.0.3 分支的 64 位 Windows 安装包。它自带 JDBC 驱动,对 10g、11g 支持极稳,对 12c 的兼容性也比后期某些版本更少出幺蛾子。适合谁?还在维护 Oracle 11g 及更早版本、内网离线环境、需要图形化查存储过程和包状态、又不想折腾驱动配置的 DBA 和开发。如果你正在搜 oracle 连接工具、sqldeveloper 下载、x64 版本,这篇就是给你写的。
2. 把 sqldeveloper-4.0.3.16.84-x64 跑起来:从解压到连上第一个 Oracle 用户
2.1 解压即用的前提:JDK 版本别选错
sqldeveloper-4.0.3.16.84-x64 这个包本身不捆绑 JDK,它启动时会去找系统里的 Java。官方文档写的是需要 JDK 7 或 JDK 8,但实测 JDK 8u202 之后的版本也能跑,只是启动脚本里的路径要改。我一般直接放一个 jdk1.8.0_181 的绿色版在 D 盘,然后在sqldeveloper\bin\sqldeveloper.conf里写死SetJavaHome。
# 编辑 sqldeveloper/bin/sqldeveloper.conf # 在文件末尾追加,路径换成你自己的 JDK 目录 SetJavaHome D:\jdk1.8.0_181逻辑说明:这个配置告诉 SQL Developer 用哪个 Java 运行时,避免它去读系统环境变量里的 JAVA_HOME,防止和别的 Oracle 工具(比如 Oracle Client 11.2.0.4 自带的 jre)打架。参数说明:SetJavaHome后面跟绝对路径,不要带引号,路径里不要有中文和空格。改完保存,双击sqldeveloper.exe就能看到启动画面。
2.2 新建连接:主机名、端口、SID 还是服务名
第一次打开,左侧连接面板右键 → 新建连接。数据库连接类型选「基本」,然后填四样东西:主机名、端口、SID 或服务名、用户名密码。这里有个高频翻车点:Oracle 11g 默认用 SID,12c 以后用服务名。如果你连的是 11.2.0.4 单实例,SID 通常等于实例名,比如orcl;服务名可能是orcl.example.com。填错了会报ORA-12505: TNS:listener does not currently know of SID given in connect descriptor。
-- 连上之后先跑这条,确认自己到底连的是哪个实例 SELECT instance_name, host_name, version, status FROM v$instance;逻辑说明:v$instance是 Oracle 的动态性能视图,任何有权限的用户都能查。参数说明:instance_name是实例名,host_name是主机名,version是数据库版本,status显示 OPEN 才算正常。如果这条都跑不了,说明连接根本没建立,回去检查监听和防火墙。
2.3 用 tnsnames.ora 管理多个 Oracle 连接
内网 DBA 手里往往有十几套库,每次新建连接太麻烦。sqldeveloper-4.0.3.16.84-x64 支持直接读tnsnames.ora。在「新建连接」窗口选「TNS」类型,然后指定tnsnames.ora所在目录。常见做法是把 Oracle Client 11.2.0.4 的network\admin目录指过去,或者自己写一个精简版。
# tnsnames.ora 片段,放在 D:\oracle\network\admin 下 ORCL11G = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.100)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl) ) )逻辑说明:这段配置定义了一个叫ORCL11G的网络服务名,SQL Developer 里选 TNS 类型后就能在下拉框里看到它。参数说明:HOST填数据库服务器 IP,PORT默认 1521,SERVICE_NAME和SID二选一,11g 用 SID 就把SERVICE_NAME换成SID = orcl。注意括号要成对,少一个右括号会报ORA-12154: TNS:could not resolve the connect identifier specified。
3. 连上之后干什么:sqldeveloper 里查 Oracle 存储过程、包状态和会话
3.1 查包状态被丢弃:user_objects 和 dba_objects 的区别
热词里有人搜「oracle 为什么会出现 包状态 被丢弃」,这问题在 sqldeveloper-4.0.3.16.84-x64 里查最直观。包状态被丢弃通常是因为依赖的对象被改了,比如包体引用的表结构变了,或者权限被回收。用普通用户连上去,查user_objects只能看到自己 schema 下的对象;要查全库得用dba_objects,但需要 DBA 权限。
-- 查当前用户下所有无效对象,包括包、存储过程、函数 SELECT object_name, object_type, status, last_ddl_time FROM user_objects WHERE status = 'INVALID' ORDER BY last_ddl_time DESC; -- 如果有 DBA 权限,查全库无效对象 SELECT owner, object_name, object_type, status FROM dba_objects WHERE status = 'INVALID' AND owner NOT IN ('SYS','SYSTEM') ORDER BY owner, object_type;逻辑说明:status = 'INVALID'就是「被丢弃」的状态,last_ddl_time能帮你定位最近一次变更时间。参数说明:user_objects不需要额外权限,dba_objects需要SELECT ANY DICTIONARY或 DBA 角色。查到无效对象后,用ALTER PACKAGE 包名 COMPILE;或ALTER PROCEDURE 过程名 COMPILE;重新编译。
3.2 查看会话 SID 和阻塞关系
热词里「oracle 查看会话 sid」也是高频操作。sqldeveloper 的「工具」→「会话」面板能图形化看,但有时候面板刷不出来,还是得靠 SQL。下面这条查当前所有活动会话,以及它们是否被阻塞。
SELECT s.sid, s.serial#, s.username, s.status, s.machine, s.sql_id, s.blocking_session, s.event FROM v$session s WHERE s.type = 'USER' AND s.status = 'ACTIVE' ORDER BY s.sid;逻辑说明:v$session是会话视图,blocking_session非空表示这个会话被另一个会话堵住了。参数说明:sid和serial#合起来唯一标识一个会话,杀会话用ALTER SYSTEM KILL SESSION 'sid,serial#';。event列显示当前等待事件,如果是enq: TX - row lock contention,说明有行锁竞争。
3.3 用 sqldeveloper 调试存储过程:断点、单步、看变量
sqldeveloper-4.0.3.16.84-x64 的调试功能在 11g 上很稳。右键存储过程 → 「调试」,然后点「生成调试信息」,它会自动编译并附加调试器。在代码行号左边双击设断点,然后点「调试」按钮,程序会停在断点处。此时可以在「智能数据」窗口看变量值,或者把鼠标悬停在变量上。
-- 如果调试按钮灰色,先手动编译带调试信息 ALTER PROCEDURE 你的过程名 COMPILE DEBUG; -- 对于包,编译包体和包规范 ALTER PACKAGE 你的包名 COMPILE DEBUG BODY;逻辑说明:COMPILE DEBUG会生成调试所需的符号信息,不加这个,断点打不上。参数说明:包需要分别编译规范和包体,通常COMPILE DEBUG BODY就够了。调试完成后,记得重新用COMPILE不带 DEBUG 编译一次,否则性能会略降。
4. 避坑与排查:sqldeveloper-4.0.3.16.84-x64 的 5 个血泪翻车点
4.1 启动报「Unable to create an instance of the Java Virtual Machine」
现象:双击 exe 后弹窗,说无法创建 JVM,然后闪退。原因:sqldeveloper.conf里SetJavaHome指向的 JDK 是 32 位的,或者路径里有中文。解决:换成 64 位 JDK 8,路径全英文,且SetJavaHome后面不要有空格。如果还不行,把sqldeveloper\jdev\bin\jdev.conf里的AddVMOption -Xmx调小,比如-Xmx1024m。
4.2 连接报「ORA-28040: No matching authentication protocol」
现象:用 sqldeveloper-4.0.3.16.84-x64 连 Oracle 12c 或 19c 时,报这个错。原因:这个版本的 SQL Developer 自带 JDBC 驱动太老,不支持 12c 以后的新认证协议。解决:去 Oracle 官网下ojdbc8.jar,替换sqldeveloper\jdbc\lib下的旧驱动,然后在sqldeveloper.conf里加一行AddJavaLibFile指向新 jar。或者更简单:连 11g 就用这个版本,连 12c 以上换新版 SQL Developer。
4.3 查询结果中文乱码
现象:查出来的中文显示成问号或方块。原因:数据库字符集是 ZHS16GBK,而 SQL Developer 默认用 UTF-8 解码。解决:在「工具」→「首选项」→「环境」→「编码」里,把「文件编码」和「显示编码」都改成 GBK。或者更彻底:在sqldeveloper.conf里加AddVMOption -Dfile.encoding=GBK。
4.4 执行长 SQL 卡死,进度条不动
现象:一条几万行的查询,跑了几分钟没反应,取消也取消不掉。原因:sqldeveloper-4.0.3.16.84-x64 默认的抓取大小是 50 行,但「自动跟踪」开着的时候会缓存全部结果。解决:在「工具」→「首选项」→「数据库」→「高级」里,把「SQL 数组抓取大小」改成 500,把「自动跟踪」关掉。如果已经卡死,去任务管理器杀sqldeveloper.exe进程。
4.5 导出数据时 ORA-01555 快照过旧
现象:用「导出」功能导一张大表,报ORA-01555: snapshot too old。原因:导出走的是一致性读,UNDO 表空间不够大,或者导出时间太长。解决:不要用图形化导出,改用sqlplus加SET ARRAYSIZE 5000和SET COPYCOMMIT 1000分批次导。或者在 sqldeveloper 里把导出拆成多个小查询,每次只导一部分。
5. 进阶:用 sqldeveloper-4.0.3.16.84-x64 做 Oracle 日常巡检与 SQL 调优
5.1 用「实时 SQL 监视」抓正在跑的慢 SQL
sqldeveloper-4.0.3.16.84-x64 有一个「实时 SQL 监视」报告,在「工具」→「实时 SQL 监视」里。输入一个 SQL ID,它能显示执行计划、等待事件、I/O 统计。我一般先用v$session找到status = 'ACTIVE'且event不是SQL*Net message from client的会话,拿到sql_id,然后丢进实时监视里看。
-- 找当前正在跑的慢 SQL SELECT s.sid, s.sql_id, s.event, s.seconds_in_wait, q.sql_text FROM v$session s JOIN v$sql q ON s.sql_id = q.sql_id WHERE s.status = 'ACTIVE' AND s.type = 'USER' AND s.event NOT LIKE 'SQL*Net%' ORDER BY s.seconds_in_wait DESC;逻辑说明:seconds_in_wait越大说明等得越久,sql_text是完整 SQL 文本。参数说明:v$sql里同一个sql_id可能有多条子游标,加AND q.child_number = 0可以只取第一条。拿到 SQL 后,在 sqldeveloper 里按 F5 看执行计划,重点看有没有TABLE ACCESS FULL和HASH JOIN成本特别高的。
5.2 用「数据库差异」对比两套环境的表结构
内网经常有测试库和 production 库结构不一致的情况。sqldeveloper-4.0.3.16.84-x64 的「数据库差异」功能可以对比两个连接下的 schema。在「工具」→「数据库差异」里,左边选源连接,右边选目标连接,勾选要对比的对象类型(表、索引、约束),点「应用」就能生成差异报告。我一般用它来核对 11g 和 12c 迁移前的表结构,避免漏掉某个字段的默认值。
5.3 一个我坚持了多年的习惯:连生产库前先跑这三条
每次用 sqldeveloper 连上生产库,我第一件事不是查业务表,而是跑下面三条,确认环境没变、权限没丢、会话没堵。
-- 1. 确认当前用户和权限 SELECT user, sys_context('USERENV','DB_NAME') AS db_name, sys_context('USERENV','HOST') AS client_host FROM dual; -- 2. 确认没有无效对象 SELECT COUNT(*) AS invalid_count FROM user_objects WHERE status = 'INVALID'; -- 3. 确认没有长时间阻塞的会话 SELECT COUNT(*) AS blocking_count FROM v$session WHERE blocking_session IS NOT NULL AND type = 'USER';逻辑说明:第一条确认自己是谁、连的哪个库、从哪台机器连的;第二条确认自己的存储过程没被改坏;第三条确认没有锁等待。参数说明:sys_context是 Oracle 的内置函数,USERENV命名空间下有很多有用的上下文信息。这三条跑完,心里有底了再开始干活。
这个习惯帮我省过很多次后悔药。有一次就是第二条查出invalid_count = 3,发现是同事昨晚改表结构没重新编译包,提前发现避免了第二天批量作业失败。sqldeveloper-4.0.3.16.84-x64 虽然老,但配合这些巡检 SQL,在内网 Oracle 11g 环境里依然是顺手工具。希望帮到你。
本文还有配套的精品资源,点击获取