戰(zhàn)指南)
簡(jiǎn)介SQLDeveloper 是 Oracle 官方出品的免費(fèi)數(shù)據(jù)庫(kù)開(kāi)發(fā)工具本包為 21.4.3 正式發(fā)布版面向數(shù)據(jù)庫(kù)開(kāi)發(fā)與管理人員無(wú)需安裝 Oracle 客戶端即可直連使用適用于日常查詢、PL/SQL 調(diào)試、數(shù)據(jù)建模等場(chǎng)景相比 PL/SQL Developer 在功能與合規(guī)性上更具優(yōu)勢(shì)。壓縮包共 2512 個(gè)文件包含 997 個(gè) jar 核心類(lèi)庫(kù)、662 個(gè) xml 配置、172 個(gè) dll 與 31 個(gè) exe 運(yùn)行組件、151 個(gè) sql 示例腳本及 126 個(gè) xslt 模板等整體約 435.95MB目錄結(jié)構(gòu)完整可滿足離線部署與二次配置需要。已有 816 人學(xué)習(xí)下載。作者提供了 MD5 與 SHA1 校驗(yàn)值便于驗(yàn)證包體完整性解壓后即可運(yùn)行省去手動(dòng)配置客戶端的繁瑣步驟特別適合希望借助正版免費(fèi)工具提升數(shù)據(jù)庫(kù)開(kāi)發(fā)效率的團(tuán)隊(duì)或個(gè)人使用。 在公司W(wǎng)indows 11 x64工作站上折騰數(shù)據(jù)庫(kù)工具的時(shí)候sqldeveloper-21.4.3.063.0100-x64.zip 這個(gè)文件在我硬盤(pán)里躺了挺長(zhǎng)時(shí)間。我得說(shuō)這個(gè)版本不算新但它屬于那種“放在生產(chǎn)環(huán)境里不會(huì)給你惹事”的穩(wěn)定貨。如果你日常工作要寫(xiě)PL/SQL存儲(chǔ)過(guò)程、遠(yuǎn)程連庫(kù)排查問(wèn)題、做數(shù)據(jù)比對(duì)又不想為了連個(gè)數(shù)據(jù)庫(kù)裝一個(gè)重達(dá)幾個(gè)G的Oracle客戶端SQL Developer基本就是首選工具。這篇文章我打算把21.4.3這個(gè)x64版本從下載安裝、JDK配置到日常高頻操作和一堆坑一次性梳理清楚給正在用或準(zhǔn)備用的朋友一點(diǎn)參考。1. 版本解構(gòu)與選型邏輯1.1 版本號(hào)拆開(kāi)看是什么含義sqldeveloper-21.4.3.063.0100這一長(zhǎng)串在Oracle的命名體系里并不復(fù)雜拆開(kāi)看就幾層信息21代表2021年的年度版本標(biāo)識(shí)。Oracle從2020年開(kāi)始改成年份命名之前用過(guò)4.x、17.x、18.x、19.x這種叫法現(xiàn)在已經(jīng)統(tǒng)一成“年份功能版本”的格式了。4表示這一年里的第四個(gè)功能版本也就是年度更新中的較新迭代。3第三層補(bǔ)丁號(hào)說(shuō)明這個(gè)版本已經(jīng)修過(guò)三輪問(wèn)題穩(wěn)定性相對(duì)有保證。063.0100內(nèi)部構(gòu)建號(hào)日常使用基本不用關(guān)心只在排查特定bug或聯(lián)系支持時(shí)才會(huì)用到。21.4.3這個(gè)版本線有個(gè)特點(diǎn)它對(duì)應(yīng)的是Oracle Database 21c時(shí)代同時(shí)向下兼容19c、18c、12c乃至更老的11g。很多還在用12c或者19c庫(kù)的公司選這個(gè)版本不會(huì)遇到兼容性跳票的問(wèn)題。而且它支持Java 11和Java 17這意味著你不需要為了跑一個(gè)IDE單獨(dú)去裝一個(gè)老掉牙的JDK 8環(huán)境上省了很多事。如果你接手的是別人的機(jī)器看到這個(gè)版本號(hào)就基本能判斷對(duì)方用的是2021年后的穩(wěn)定分支不太會(huì)遇到老版本連不上新庫(kù)的尷尬。1.2 x64版本的優(yōu)勢(shì)和適用場(chǎng)景文件名末尾的x64標(biāo)明這是一個(gè)64位版本。放在今天的Windows環(huán)境里這個(gè)信息的意義在于兩點(diǎn)絕大多數(shù)現(xiàn)代Windows系統(tǒng)都是64位32位應(yīng)用在兼容層跑沒(méi)問(wèn)題但內(nèi)存占用和性能上限會(huì)吃虧。SQL Developer本身是個(gè)Java應(yīng)用JVM在64位下可用的堆內(nèi)存比32位大得多處理大結(jié)果集、同時(shí)開(kāi)多個(gè)連接時(shí)不容易被內(nèi)存限制拖死。官方對(duì)x64版本的更新和修復(fù)更積極。從實(shí)際使用看Windows上一些關(guān)于OCI驅(qū)動(dòng)、加密錢(qián)包、SSH隧道等企業(yè)級(jí)功能的問(wèn)題x64版本修復(fù)速度明顯更快。如果你所在的環(huán)境里需要同時(shí)打開(kāi)多個(gè)數(shù)據(jù)庫(kù)連接頻繁跑大查詢選x64不是可選項(xiàng)而是必選項(xiàng)。還有人會(huì)問(wèn)那32位版本還有沒(méi)有價(jià)值我只能說(shuō)除非你的機(jī)器上跑著老舊的32位Oracle客戶端、或者有歷史遺留的第三方DLL依賴否則在新機(jī)器上沒(méi)有任何理由再選32位。我自己在虛擬機(jī)和物理機(jī)上分別裝過(guò)這兩個(gè)架構(gòu)的版本x64的啟動(dòng)速度和長(zhǎng)時(shí)間運(yùn)行后的穩(wěn)定性都明顯更好。2. 安裝步驟與JDK環(huán)境配置2.1 安裝前先確認(rèn)JDK版本21.4.3這個(gè)版本對(duì)JDK的要求是11或17注意它不支持JDK 8也不建議用JDK 9、10這種過(guò)渡版本。這一點(diǎn)很多人會(huì)踩坑直接雙擊ZIP解壓后啟動(dòng)拋出一個(gè)“Unable to locate a Java Runtime”之類(lèi)的錯(cuò)誤第一反應(yīng)以為是下載壞了其實(shí)多半就是JDK版本不對(duì)或者環(huán)境變量沒(méi)配好。我的建議是如果機(jī)器上沒(méi)有其他Java應(yīng)用強(qiáng)依賴JDK 8直接裝一個(gè)JDK 17它是長(zhǎng)期支持版本而且SQL Developer官方在21.4.x中對(duì)JDK 17的適配已經(jīng)相當(dāng)成熟了。裝完JDK后在命令行執(zhí)行java -version確認(rèn)一下版本號(hào)如果顯示的是64位JVM那就和x64版的SQL Developer完全匹配。2.2 兩種安裝包怎么選Oracle官方對(duì)這個(gè)版本提供了兩種形式的Windows安裝包ZIP綠色版解壓即用不需要執(zhí)行安裝向?qū)нm合快速部署、便攜使用。EXE安裝版會(huì)帶上安裝向?qū)Э梢赃x擇是否捆綁JDK適合追求快捷配置的用戶。我個(gè)人的習(xí)慣是優(yōu)先用ZIP版原因有三個(gè)一是公司環(huán)境經(jīng)常受權(quán)限管控綠色版解壓到用戶目錄就能跑不用管理員權(quán)限二是便于版本管理同時(shí)保留多個(gè)版本目錄切換起來(lái)比卸載重裝方便三是ZIP版對(duì)JDK路徑是顯式配置的一旦出了問(wèn)題排查起來(lái)更直觀。如果你選擇ZIP版解壓后會(huì)看到完整的目錄結(jié)構(gòu)關(guān)鍵內(nèi)容在sqldeveloper主程序目錄真正的啟動(dòng)入口是sqldeveloper\bin\sqldeveloper.exesqldeveloper\bin\sqldeveloper.confJVM參數(shù)配置改內(nèi)存大小、JDK路徑主要就動(dòng)這個(gè)文件sqldeveloper\product.conf在某些情況下用于指定JDK路徑在第一次啟動(dòng)前建議先手動(dòng)指定JDK路徑。方法是在product.conf里加一行SetJavaHome指向你安裝的JDK目錄例如SetJavaHome C:\Program Files\Java\jdk-17.0.2有的版本也可以在sqldeveloper.conf中設(shè)置兩種方式都行關(guān)鍵是路徑不帶引號(hào)、不要帶多余空格。設(shè)置完成后啟動(dòng)sqldeveloper.exe第一次啟動(dòng)會(huì)建立配置目錄默認(rèn)在C:\Users\你的用戶名\AppData\Roaming\sqldeveloper\21.4.3這個(gè)目錄里保存著連接配置、界面布局、插件狀態(tài)日常備份或遷移環(huán)境時(shí)記得把這個(gè)目錄一起帶走。2.3 首次啟動(dòng)和初始配置第一次啟動(dòng)時(shí)向?qū)?huì)問(wèn)你是否導(dǎo)入之前的配置。如果是從舊版本升級(jí)建議選擇導(dǎo)入這樣連接信息、格式化模板、快捷鍵能無(wú)縫帶過(guò)來(lái)。但這里有一個(gè)小坑舊版本的插件如果和新版不兼容導(dǎo)入過(guò)程可能報(bào)錯(cuò)或者啟動(dòng)變慢。穩(wěn)妥做法是只勾選連接配置不要勾選第三方的插件遷移。進(jìn)入主界面后先別急著連庫(kù)打開(kāi)“工具”菜單里的“首選項(xiàng)”做三件事在“環(huán)境”里把「區(qū)域設(shè)置」改成“中文簡(jiǎn)體”和你期望的顯示語(yǔ)言避免菜單漢化不完整導(dǎo)致的割裂感。在“數(shù)據(jù)庫(kù)”-“高級(jí)參數(shù)”里確認(rèn)使用Oracle JDBC Driver而不是OCI驅(qū)動(dòng)后者需要額外安裝Oracle Client和Thin驅(qū)動(dòng)比沒(méi)有優(yōu)勢(shì)。在“快捷鍵”里看看是否有沖突特別是從PL/SQL Developer轉(zhuǎn)過(guò)來(lái)的用戶順手把格式化、查找之類(lèi)的快捷鍵調(diào)成自己習(xí)慣的。3. 核心功能與日常實(shí)操3.1 建立數(shù)據(jù)庫(kù)連接Thin驅(qū)動(dòng)是最省事的方式打開(kāi)界面左邊的“連接”導(dǎo)航點(diǎn)綠色加號(hào)新建連接這里有幾個(gè)關(guān)鍵輸入項(xiàng)連接名隨便起建議和業(yè)務(wù)庫(kù)名對(duì)應(yīng)方便多人協(xié)作時(shí)識(shí)別。用戶名/密碼數(shù)據(jù)庫(kù)賬號(hào)。主機(jī)名IP或者域名。端口默認(rèn)1521如果改過(guò)就填實(shí)際端口。服務(wù)名/SID這兩個(gè)是不同的概念Oracle 10g以后常用服務(wù)名確認(rèn)DBA給的是哪種再填。連接類(lèi)型建議選“基本Basic”角色保持默認(rèn)。這里最重要的是驅(qū)動(dòng)選擇保持內(nèi)置的Thin driver就行。它的優(yōu)勢(shì)是純Java實(shí)現(xiàn)不需要你在本機(jī)安裝Oracle Client也不依賴TNSNAMES.ORA里的網(wǎng)絡(luò)配置。以前用SQL Server的朋友第一次接觸Oracle總以為必須要裝那個(gè)幾百兆的客戶端其實(shí)早就不需要了。連接建立后左側(cè)會(huì)列出該用戶可見(jiàn)的表、視圖、存儲(chǔ)過(guò)程、包、序列等對(duì)象。雙擊任意表名會(huì)彈出“數(shù)據(jù)”標(biāo)簽頁(yè)直接查看前100行數(shù)據(jù)。右鍵表名有“編輯”、“快速DDL”、“導(dǎo)出”等常用操作。這里有個(gè)使用習(xí)慣如果你要頻繁查看某個(gè)表的數(shù)據(jù)把它拖到快捷訪問(wèn)區(qū)或者干脆右鍵“生成SELECT”省得每次都要重新展開(kāi)層級(jí)。3.2 PL/SQL開(kāi)發(fā)和調(diào)試SQL工作臺(tái)的精髓“工作表”Worksheet是SQL Developer里最重要的窗口。寫(xiě)PL/SQL塊、執(zhí)行多條SQL、格式化代碼、查看執(zhí)行計(jì)劃全在這個(gè)地方完成。先說(shuō)格式化。大段SQL縮進(jìn)混亂的癥狀我見(jiàn)過(guò)太多解決辦法是選中這些SQL按CtrlF7立刻變成規(guī)整的格式。這個(gè)快捷鍵在團(tuán)隊(duì)代碼評(píng)審、代碼上線前尤其有用。再調(diào)試存儲(chǔ)過(guò)程。右鍵一個(gè)存儲(chǔ)過(guò)程選擇“運(yùn)行”Run或者“調(diào)試”DebugDebug模式下可以設(shè)置斷點(diǎn)單步執(zhí)行查看變量值。21.4.3版本的調(diào)試器對(duì)代碼覆蓋率有不錯(cuò)的展示跑完能看到哪些分支沒(méi)被覆蓋到這在寫(xiě)后端接口時(shí)幫助非常大。需要提醒的是調(diào)試需要數(shù)據(jù)庫(kù)端的相應(yīng)權(quán)限D(zhuǎn)EBUG CONNECT SESSION、DEBUG ANY PROCEDURE沒(méi)有權(quán)限的時(shí)候SQL Developer會(huì)有明確報(bào)錯(cuò)提示直接找DBA開(kāi)權(quán)限就行。執(zhí)行計(jì)劃也是一個(gè)日常高頻操作。在SQL工作臺(tái)里選中查詢語(yǔ)句按F10或點(diǎn)擊解釋計(jì)劃圖標(biāo)就能看到執(zhí)行路徑和成本估算。這個(gè)版本還會(huì)把相關(guān)的索引提示直接列出來(lái)對(duì)定位慢查詢特別友好。我處理線上慢SQL的思路一般是先看執(zhí)行計(jì)劃是否走了全表掃描再看是否存在索引跳變最后用DBMS_STATS刷新統(tǒng)計(jì)信息后再對(duì)比這套流程在SQL Developer里一氣呵成。3.3 數(shù)據(jù)導(dǎo)入導(dǎo)出從Excel到數(shù)據(jù)庫(kù)的快速通道數(shù)據(jù)導(dǎo)入導(dǎo)出的使用頻率在業(yè)務(wù)分析場(chǎng)景中相當(dāng)高。比如業(yè)務(wù)方給了一個(gè)Excel表需要導(dǎo)入到Oracle臨時(shí)表里做關(guān)聯(lián)分析。SQL Developer的“導(dǎo)入數(shù)據(jù)”功能可以直接右鍵目標(biāo)表選擇“導(dǎo)入數(shù)據(jù)”然后指定Excel文件。這里有幾個(gè)注意點(diǎn)Excel文件的表頭和目標(biāo)表的字段名嚴(yán)格一致否則導(dǎo)入會(huì)報(bào)錯(cuò)。日期格式要在導(dǎo)入前設(shè)置好常見(jiàn)的yyyy-mm-dd hh24:mi:ss格式基本都能識(shí)別。數(shù)據(jù)量大時(shí)建議分批導(dǎo)入一次幾萬(wàn)行很輕松但幾十萬(wàn)行會(huì)導(dǎo)致界面卡頓這種情況用SQL*Loader或者外部表更合適。導(dǎo)出方面最常見(jiàn)的需求是“把查詢結(jié)果導(dǎo)成CSV或Excel”。查詢出結(jié)果集后右鍵網(wǎng)格數(shù)據(jù)選擇“導(dǎo)出”5秒內(nèi)就能得到一個(gè)文件。21.4.3版本對(duì)導(dǎo)出時(shí)的字符編碼處理比老版本好導(dǎo)出中文CSV默認(rèn)帶UTF-8BOMExcel直接雙擊打開(kāi)不會(huì)亂碼這個(gè)細(xì)節(jié)省了不少事。3.4 數(shù)據(jù)庫(kù)管理DBA面板的價(jià)值21.4.3的DBA管理面板比早期版本強(qiáng)了不少。只要用有DBA權(quán)限的賬號(hào)連接點(diǎn)擊“查看”菜單里的“DBA”就能看到數(shù)據(jù)庫(kù)狀態(tài)、會(huì)話數(shù)、參數(shù)文件、存儲(chǔ)結(jié)構(gòu)等信息。我最常用的功能是“會(huì)話”面板能看到當(dāng)前所有活動(dòng)會(huì)話以及它們執(zhí)行的SQL遇到鎖表或者會(huì)話堆積時(shí)在這里一鍵生成ALTER SYSTEM KILL SESSION語(yǔ)句比登錄服務(wù)器敲命令方便得多?!坝脩艄芾怼币苍谶@個(gè)面板里創(chuàng)建用戶、授權(quán)、改密碼都能圖形化完成。日常提數(shù)而臨時(shí)建賬號(hào)的場(chǎng)景這個(gè)功能能省掉不少和DBA來(lái)回溝通的時(shí)間。但注意權(quán)限管控原則臨時(shí)賬號(hào)用完立刻刪DBA面板這個(gè)便捷性也是一把雙刃劍。4. 常見(jiàn)問(wèn)題與排查技巧4.1 JDK和啟動(dòng)類(lèi)問(wèn)題Q雙擊sqldeveloper.exe沒(méi)反應(yīng)任務(wù)管理器里也沒(méi)有Java進(jìn)程。先檢查product.conf里的SetJavaHome路徑是否真實(shí)存在以及路徑是否包含空格并缺少正確引號(hào)處理。再確認(rèn)JDK版本是11或17最后檢查環(huán)境變量JAVA_HOME是否指向了正確的64位JDK。如果配置沒(méi)問(wèn)題嘗試在命令行里直接運(yùn)行sqldeveloper\bin\sqldeveloper.exe看有沒(méi)有控制臺(tái)輸出錯(cuò)誤信息這是最快定位手段。Q報(bào)錯(cuò)“Error occurred during initialization of VM / Could not reserve enough space for 2097152KB object heap”。這是典型的JVM內(nèi)存參數(shù)配得過(guò)大或者系統(tǒng)可用內(nèi)存不足。查看sqldeveloper.conf里的AddVMOption -Xmx默認(rèn)可能是2G如果你的機(jī)器內(nèi)存吃緊改成AddVMOption -Xmx1024M再重啟即可。4.2 連接和驅(qū)動(dòng)類(lèi)問(wèn)題Q連接時(shí)報(bào)“ORA-12541: TNS:no listener”。這個(gè)錯(cuò)誤絕大多數(shù)時(shí)候不是SQL Developer的問(wèn)題而是數(shù)據(jù)庫(kù)服務(wù)器的監(jiān)聽(tīng)器沒(méi)起來(lái)或者防火墻攔截了端口。先用命令行確認(rèn)tnsping 服務(wù)名通不通或者用telnet 主機(jī)IP 1521測(cè)試端口。少數(shù)情況是連接類(lèi)型填錯(cuò)比如實(shí)際數(shù)據(jù)庫(kù)用的是專(zhuān)用服務(wù)器模式Dedicated Server而連接配置里選了共享服務(wù)器模式報(bào)錯(cuò)信息也類(lèi)似。Q連接測(cè)試成功但查看數(shù)據(jù)時(shí)中文亂碼。多半是字符集不一致。查看數(shù)據(jù)庫(kù)端NLS_CHARACTERSET然后在連接的高級(jí)屬性里配置NLS_LANG比如AMERICAN_AMERICA.AL32UTF8。SQL Developer 21.4.3默認(rèn)支持UTF-8較好但仍建議在“首選項(xiàng)”-“環(huán)境”中把編碼顯式設(shè)為UTF-8。Q連接時(shí)提示“無(wú)法找到OCIDLL”或類(lèi)似信息。這是因?yàn)檫B接配置里選成了OCI驅(qū)動(dòng)。解決方法是改成使用Thin驅(qū)動(dòng)或者按提示安裝完整Oracle Client。平時(shí)保持Thin驅(qū)動(dòng)就好OCI驅(qū)動(dòng)只在需要用特定數(shù)據(jù)庫(kù)特性時(shí)才值得考慮。4.3 性能調(diào)優(yōu)和界面問(wèn)題連著多個(gè)數(shù)據(jù)庫(kù)、數(shù)據(jù)集比較大的情況下SQL Developer偶爾會(huì)明顯變慢。這時(shí)建議做三件事在sqldeveloper.conf里調(diào)大-Xms讓JVM啟動(dòng)時(shí)就分配足夠內(nèi)存減少運(yùn)行期擴(kuò)容開(kāi)銷(xiāo)。關(guān)閉不需要的“數(shù)據(jù)庫(kù)差異檢查”“SQL監(jiān)控”這類(lèi)后臺(tái)自動(dòng)任務(wù)。大結(jié)果集查看時(shí)關(guān)閉“自動(dòng)刷新”功能。這個(gè)功能在查看長(zhǎng)時(shí)間變化的表時(shí)很方便但它會(huì)頻繁重繪界面拖慢整體響應(yīng)。還有一個(gè)不算bug但很影響體驗(yàn)的事21.4.3版本在高DPI屏上字體偶爾發(fā)虛。解決辦法是右鍵sqldeveloper.exe在屬性-兼容性-更改高DPI設(shè)置里勾選“替代高DPI縮放行為”讓?xiě)?yīng)用自己管理縮放基本能解決。5. 幾個(gè)值得長(zhǎng)期堅(jiān)持的使用習(xí)慣文章最后聊一點(diǎn)我的切身體會(huì)。SQL Developer 21.4.3 x64這個(gè)版本我在正式環(huán)境和測(cè)試環(huán)境里都用了很久給我最大的感受是它不花哨但穩(wěn)定的可怕。做數(shù)據(jù)庫(kù)開(kāi)發(fā)的人最怕的不是處理復(fù)雜SQL邏輯而是工具在關(guān)鍵時(shí)刻卡死或者報(bào)一堆莫名其妙的錯(cuò)。這個(gè)版本經(jīng)過(guò)前幾個(gè)迭代的修復(fù)該踩的坑基本都填平了日常使用很少再遇到那種“啟動(dòng)一次要看運(yùn)氣”的情況。我習(xí)慣把連接信息按照“生產(chǎn)/測(cè)試/開(kāi)發(fā)”三個(gè)文件夾分級(jí)管理并在連接名稱(chēng)里標(biāo)注負(fù)責(zé)人和用途。這樣可以避免團(tuán)隊(duì)協(xié)作時(shí)誤操作連錯(cuò)環(huán)境。另外每過(guò)一段時(shí)間我會(huì)把sqldeveloper的配置目錄做一次備份配合系統(tǒng)的文件版本歷史這樣即使機(jī)器重裝10分鐘內(nèi)就能恢復(fù)到熟悉的操作環(huán)境。至于版本升級(jí)問(wèn)題我的建議是除非有明確要使用的新功能否則不要頻繁升級(jí)。就像我用順手了21.4.3并不急著追最新版本穩(wěn)定可用比什么都重要。工具選型這件事很多時(shí)候不是挑功能最全的而是挑最適合自己工作節(jié)奏的。希望這篇內(nèi)容對(duì)你正在使用的工具版本能有些參考價(jià)值少走一點(diǎn)彎路。本文還有配套的精品資源點(diǎn)擊獲取