替代Navicat?開源數(shù)據(jù)庫管理工具實(shí)戰(zhàn)指南)
說實(shí)話這幾年在技術(shù)社區(qū)里被問得最多的一個(gè)問題不是“哪個(gè)數(shù)據(jù)庫好用”而是“Navicat 太貴了有沒有免費(fèi)的替代品”。不管是剛?cè)胄械拈_發(fā)還是帶了幾個(gè)人小團(tuán)隊(duì)的 Leader幾乎都動(dòng)過這個(gè)念頭。Navicat 確實(shí)做得成熟但 Premium 版的授權(quán)費(fèi)對(duì)個(gè)人開發(fā)者來說并不便宜很多公司采購時(shí)也要反復(fù)比價(jià)。我先后試過一堆號(hào)稱“替代 Navicat”的工具最后長(zhǎng)期留在日常開發(fā)環(huán)境里的是一款完全免費(fèi)、開源、現(xiàn)代化而且啟動(dòng)速度和體積都控制得相當(dāng)好的數(shù)據(jù)庫管理工具DBeaver Community 版。這篇文章就圍繞這個(gè)工具聊聊它到底能不能替代 Navicat、實(shí)際用起來有哪些值得稱道的地方以及我踩過的幾個(gè)坑。這次的內(nèi)容適合個(gè)人開發(fā)者、學(xué)生、運(yùn)維同學(xué)也適合正在為公司尋找低成本數(shù)據(jù)庫管理方案的技術(shù)負(fù)責(zé)人。1. 為什么我放棄了 Navicat費(fèi)用、破解風(fēng)險(xiǎn)與替代思路1.1 Navicat的定價(jià)策略和免費(fèi)版的“隱形天花板”Navicat 的體驗(yàn)確實(shí)沒話說界面順手、功能整合度高尤其是畫邏輯模型、數(shù)據(jù)同步這些功能在同級(jí)別工具里都算好用。但問題也很現(xiàn)實(shí)它是一款商業(yè)軟件Premium 版本的價(jià)格對(duì)個(gè)人來說不是“閉眼就買”的數(shù)字。即使有 Lite 版本或者試用期功能上也做了明顯裁剪比如限制連接數(shù)量、減少高級(jí)功能用起來總有一種“鞋里硌腳”的感覺。這幾年我還注意到一個(gè)現(xiàn)象就是網(wǎng)上關(guān)于 Navicat 的討論很大一部分集中在“找激活碼”“求舊版本”“有沒有永久許可證”上。我不否認(rèn)有人確實(shí)靠一些非常規(guī)手段用上了完整版但這里必須說句實(shí)在話破解工具本身的下載渠道、注冊(cè)機(jī)來源都不受控為了省一點(diǎn)軟件費(fèi)用把開發(fā)機(jī)暴露在來路不明的可執(zhí)行文件面前這個(gè)風(fēng)險(xiǎn)不值得冒。尤其是公司環(huán)境里授權(quán)合規(guī)問題一旦被盯上不是個(gè)人能扛得住的。1.2 我對(duì)“合格替代品”的五條底線在動(dòng)手替換之前我先給自己定了幾條標(biāo)準(zhǔn)免得從一個(gè)坑跳到另一個(gè)坑免費(fèi)且授權(quán)清晰最好是開源協(xié)議或者明確的免費(fèi)社區(qū)版不能是“限時(shí)免費(fèi)”“試用期 30 天”這種。多數(shù)據(jù)庫支持我日常要連 MySQL、PostgreSQL偶爾還要摸 SQLite 和達(dá)夢(mèng)單庫工具只能算補(bǔ)充。性能和體積可接受不能為了省授權(quán)費(fèi)換來一個(gè)打開要等半天的“巨無霸”。界面現(xiàn)代化天天盯著用的工具交互太老舊真的很影響心情?;钴S維護(hù)一個(gè)項(xiàng)目停在兩三年不更新遇到新數(shù)據(jù)庫版本驅(qū)動(dòng)基本就廢了。把這幾條往上一擺DBeaver Community 版幾乎是無懸念的第一名。它基于 Eclipse 框架開發(fā)但做了大量精簡(jiǎn)日常使用體感上比很多商業(yè)化工具還輕快默認(rèn)支持幾乎所有主流數(shù)據(jù)庫社區(qū)版完全開源GitHub 上更新非常頻繁。下面我會(huì)從下載到實(shí)戰(zhàn)完整講一遍。2. DBeaver 憑什么能扛起“替代 Navicat”這面旗2.1 “輕量”不能光看體積要看資源調(diào)度方式很多人第一次接觸 DBeaver 會(huì)下意識(shí)問基于 Eclipse 的東西會(huì)不會(huì)很吃內(nèi)存這是一個(gè)合理的懷疑但實(shí)際用下來你會(huì)發(fā)現(xiàn)DBeaver 的“輕量”和傳統(tǒng)意義上安裝包小是兩回事。它采用的是按需加載驅(qū)動(dòng)的機(jī)制啟動(dòng)時(shí)只加載核心框架JDBC 驅(qū)動(dòng)是在你新建連接的那一刻才動(dòng)態(tài)拉取并加載的。這就意味著你平時(shí)只連 MySQL就不會(huì)被 PostgreSQL、Oracle 的驅(qū)動(dòng)白白占著內(nèi)存。我自己的開發(fā)機(jī)上DBeaver 的常駐內(nèi)存大概在 400MB 到 600MB 之間作為對(duì)比我同時(shí)開著 IDEA 和一個(gè)測(cè)試用瀏覽器內(nèi)存占用基本可以忽略不計(jì)。而 Navicat 雖然原生界面很流暢但多開幾個(gè)連接窗口、打開大表數(shù)據(jù)之后內(nèi)存增長(zhǎng)同樣很可觀。所以“輕量”這個(gè)評(píng)價(jià)放在真實(shí)場(chǎng)景里看的是綜合表現(xiàn)而不是安裝包那幾十 MB 的差別。2.2 社區(qū)版與企業(yè)版免費(fèi)的邊界在哪里DBeaver 分為 Community 版和 Enterprise 版我們平時(shí)說的免費(fèi)替代品指的就是 Community。它的開源協(xié)議是 GPLv2意味著你可以自由使用、分發(fā)甚至查看源碼。Community 版已經(jīng)覆蓋了絕大多數(shù)日常開發(fā)需求連接管理、SQL 編輯器、數(shù)據(jù)查看與編輯、ER 圖、導(dǎo)入導(dǎo)出、執(zhí)行計(jì)劃等。企業(yè)版額外提供的功能主要是 NoSQL 數(shù)據(jù)庫支持、云數(shù)據(jù)庫對(duì)接、數(shù)據(jù)脫敏、團(tuán)隊(duì)協(xié)作這類偏運(yùn)維和管理向的能力。對(duì)個(gè)人開發(fā)者和中小團(tuán)隊(duì)來說社區(qū)版完全夠用你不需要為自己用不到的功能掏錢。我在實(shí)際項(xiàng)目中甚至見過一些公司直接全員部署 Community 版配合內(nèi)部規(guī)范來管理數(shù)據(jù)庫連接整個(gè)流程跑下來沒有任何阻塞。3. 從下載到連上第一個(gè) MySQL 庫可以照抄的完整流程3.1 三個(gè)平臺(tái)的安裝差異DBeaver 官方提供了 Windows、macOS、Linux 三個(gè)平臺(tái)的安裝包這點(diǎn)比很多只照顧 Windows 的工具良心。Windows 下直接下載 exe 安裝包一路下一步即可macOS 除了 dmg 之外如果你裝了 Homebrew也可以直接用brew install --cask dbeaver-community命令行安裝后續(xù)升級(jí)更省事Linux 下面則有 debrpm 包或者免安裝的 tar.gz 壓縮版。這里有個(gè)細(xì)節(jié)值得注意官網(wǎng)下載頁默認(rèn)彈出的可能是 Enterprise 試用版需要手動(dòng)點(diǎn)一下“Download Community Edition”的入口。別裝著裝著發(fā)現(xiàn)是帶時(shí)間限制的試用版還以為自己沒找對(duì)地方。3.2 配置 MySQL 連接時(shí)最關(guān)鍵的幾個(gè)字段安裝完成后第一步自然是建連接。頂部工具欄點(diǎn)“新建連接”在數(shù)據(jù)庫類型列表里選 MySQL。我見過的多數(shù)新手在這里都會(huì)懵一下因?yàn)閺棾龅呐渲庙?xiàng)比想象的多。其實(shí)只需要關(guān)注五個(gè)字段主機(jī)名默認(rèn) localhost連接遠(yuǎn)程庫改成具體 IP 或域名。端口默認(rèn) 3306除非你的庫開了別的端口。數(shù)據(jù)庫要連接的庫名不填也能連上但連上后要手動(dòng)切換。用戶名和密碼建議先勾選“保存密碼”免得每次重開都要輸一遍。填完之后千萬別急著點(diǎn)“完成”先點(diǎn)一下“測(cè)試連接”。DBeaver 會(huì)在這個(gè)階段自動(dòng)下載對(duì)應(yīng)的 JDBC 驅(qū)動(dòng)。首次下載可能會(huì)因?yàn)榫W(wǎng)絡(luò)原因卡住如果遇到這種情況可以手動(dòng)把 MySQL 驅(qū)動(dòng) jar 包放進(jìn)本機(jī)的驅(qū)動(dòng)目錄里或者用加速方式下載后替換。多數(shù)情況下網(wǎng)絡(luò)正常時(shí)這個(gè)流程是靜默的十秒內(nèi)就能看到綠色提示。3.3 連接成功后的界面導(dǎo)航先搞懂這三個(gè)面板第一次連上 MySQL 后DBeaver 的界面布局可能讓你覺得信息有點(diǎn)多。其實(shí)核心就三塊左側(cè)是“數(shù)據(jù)庫導(dǎo)航器”展示連接下的所有庫、表、視圖、存儲(chǔ)過程等對(duì)象中間是主工作區(qū)SQL 編輯器、數(shù)據(jù)表格、ER 圖都在這塊區(qū)域以標(biāo)簽頁的形式切換下方和右側(cè)是“屬性視圖”當(dāng)你點(diǎn)選某張表時(shí)這里會(huì)顯示字段定義、索引、外鍵、DDL 等信息。剛上手時(shí)只需要記住Ctrl N能快速新建 SQL 編輯器雙擊表名能在右側(cè)直接打開數(shù)據(jù)預(yù)覽這兩個(gè)操作基本覆蓋 80% 的日常查看需求。導(dǎo)航器里的樹形結(jié)構(gòu)支持拖拽你可以把常用的幾張表收藏到“書簽”里省得每次從一堆表中間翻。4. 日常開發(fā)里真正高頻用到的功能不只是“看一眼數(shù)據(jù)”4.1 SQL 編輯器自動(dòng)補(bǔ)全、格式化與執(zhí)行計(jì)劃DBeaver 的 SQL 編輯器是我認(rèn)為它最值得稱道的地方。編輯器支持智能自動(dòng)補(bǔ)全輸入表名字段名時(shí)提示速度很快而且能識(shí)別別名和子查詢上下文不是那種簡(jiǎn)單的關(guān)鍵字匹配。寫大 SQL 時(shí)CtrlShiftF可以一鍵格式化縮進(jìn)和換行風(fēng)格支持自定義比如我可以設(shè)置關(guān)鍵字大寫、逗號(hào)前置這樣團(tuán)隊(duì)評(píng)審代碼時(shí)看著統(tǒng)一很多。執(zhí)行 SQL 時(shí)有個(gè)特別實(shí)用的設(shè)計(jì)CtrlEnter只執(zhí)行當(dāng)前光標(biāo)選中的語句而不是整個(gè)腳本文件。這個(gè)習(xí)慣一旦養(yǎng)成在跑包含多個(gè)查詢的腳本時(shí)會(huì)特別從容不用反復(fù)注釋掉暫時(shí)不用的語句。要分析慢 SQL直接在編輯器里選中語句右鍵選擇“執(zhí)行計(jì)劃”DBeaver 會(huì)把 MySQL 的 EXPLAIN 結(jié)果渲染成表格成本、索引命中情況一目了然。4.2 ER 圖和邏輯模型畫圖不用來回切換工具以前用 Navicat 畫邏輯模型很多同學(xué)覺得方便但 DBeaver 在這方面同樣有自己的優(yōu)勢(shì)。當(dāng)你需要看一個(gè)庫的整體表結(jié)構(gòu)關(guān)系時(shí)右鍵點(diǎn)擊數(shù)據(jù)庫連接或某個(gè) Schema選擇“ER 圖”DBeaver 會(huì)自動(dòng)根據(jù)外鍵關(guān)系把相關(guān)的表擺出來并連好關(guān)系線。你可以拖動(dòng)表的位置、批量調(diào)整布局、過濾掉無關(guān)表最終可以導(dǎo)出圖片放進(jìn)設(shè)計(jì)文檔里。這個(gè)功能對(duì)于接手老項(xiàng)目特別有用。我經(jīng)常遇到的情況是文檔早過期了只能靠讀建表語句猜邏輯。用 ER 圖功能一次性加載整個(gè)庫的表再按外鍵鏈條梳理核心鏈路往往半小時(shí)就能還原差不多。和 Navicat 相比DBeaver 的 ER 圖可能沒那么“漂亮”但它免費(fèi)、實(shí)時(shí)、可交互這幾條才是日常真正關(guān)心的。4.3 數(shù)據(jù)導(dǎo)入導(dǎo)出CSV、Excel、JSON 和跨庫遷移數(shù)據(jù)導(dǎo)入導(dǎo)出是很多人從 Navicat 遷移過來的第一個(gè)痛點(diǎn)生怕功能不完整。DBeaver 的導(dǎo)出能力其實(shí)相當(dāng)強(qiáng)。選中查詢結(jié)果集右鍵“導(dǎo)出數(shù)據(jù)”可以選擇 CSV、Excel、JSON、XML、HTML 等格式還可以直接導(dǎo)出為 SQL INSERT 語句。導(dǎo)出向?qū)Ю锬茉O(shè)置編碼、分隔符、日期格式、包含或不包含列標(biāo)題基本能滿足交付數(shù)據(jù)、生成測(cè)試數(shù)據(jù)、歸檔記錄三種典型需求。導(dǎo)入功能同樣能打。建好表之后右鍵表名選“導(dǎo)入數(shù)據(jù)”可以讀取 CSV、Excel 或者另一個(gè)數(shù)據(jù)庫連接里的數(shù)據(jù)。這里分享一個(gè)隱藏技巧DBeaver 支持直接從“一個(gè)數(shù)據(jù)庫連接里拖表到另一個(gè)連接”實(shí)現(xiàn)跨庫導(dǎo)表。比如想把 MySQL 的一張業(yè)務(wù)表搬到本地 PostgreSQL 做測(cè)試直接拖過去DBeaver 會(huì)自動(dòng)建表并把數(shù)據(jù)搬過去省去先導(dǎo)出再導(dǎo)入的中間環(huán)節(jié)。5. 我實(shí)際使用中踩過的坑和針對(duì)性的優(yōu)化5.1 連接池與 SSH 隧道內(nèi)網(wǎng)數(shù)據(jù)庫連接的常見痛點(diǎn)開發(fā)環(huán)境里很多數(shù)據(jù)庫不允許直連只能通過跳板機(jī)走 SSH 隧道。DBeaver 對(duì)這種情況支持得比較到位在連接配置的“SSH”標(biāo)簽頁里勾選“使用 SSH 隧道”填入跳板機(jī)地址、端口、用戶名認(rèn)證方式支持密碼和密鑰文件。我最開始用的時(shí)候忽略了密鑰文件格式問題OpenSSH 的私鑰可以直接用但 PuTTY 的 .ppk 格式需要先轉(zhuǎn)換否則會(huì)一直報(bào)認(rèn)證失敗這個(gè)坑相信不少人也踩過。連接池方面DBeaver 默認(rèn)配置比較保守連接空閑超時(shí)設(shè)置得相對(duì)短。如果你習(xí)慣掛著編輯器寫一會(huì)兒代碼然后回來繼續(xù)操作可能會(huì)偶爾遇到“connection is not available”的提示。解決辦法是進(jìn)入連接配置的“連接池”標(biāo)簽頁把“空閑超時(shí)”從默認(rèn)值調(diào)大比如改成 600 秒或者直接勾選“保持連接”避免長(zhǎng)時(shí)間閑置后被服務(wù)端斷開。5.2 MySQL 8 驅(qū)動(dòng)那兩個(gè)著名報(bào)錯(cuò)因?yàn)?MySQL 8 的認(rèn)證機(jī)制變化DBeaver 連 MySQL 8 時(shí)有兩個(gè)報(bào)錯(cuò)出現(xiàn)頻率極高一個(gè)是Public Key Retrieval is not allowed另一個(gè)是關(guān)于serverTimezone的時(shí)區(qū)問題。第一個(gè)報(bào)錯(cuò)本質(zhì)上是客戶端首次連接時(shí)請(qǐng)求拿 RSA 公鑰但 JDBC 驅(qū)動(dòng)默認(rèn)不允許這個(gè)行為。解決辦法是在連接配置的自定義 JDBC URL 里加上參數(shù)allowPublicKeyRetrievaltrueuseSSLfalse第二個(gè)報(bào)錯(cuò)是時(shí)區(qū)未對(duì)齊導(dǎo)致的。在 MySQL 8 里如果服務(wù)端時(shí)區(qū)設(shè)置不規(guī)范連接時(shí)會(huì)出現(xiàn)時(shí)區(qū)相關(guān)的異常。同樣在 JDBC URL 里追加serverTimezoneAsia/Shanghai這兩個(gè)參數(shù)加完絕大多數(shù) MySQL 8 連接問題都能解決。不同數(shù)據(jù)庫版本對(duì)參數(shù)敏感度不一建議在測(cè)試環(huán)境驗(yàn)證通過后再用到生產(chǎn)連接上。5.3 中文字體和界面顯示問題DBeaver 是基于 Java 的應(yīng)用在 Windows 上有時(shí)會(huì)出現(xiàn)中文字體渲染發(fā)虛、字間距不對(duì)的情況macOS 上則可能表現(xiàn)為界面字體偏小。我自己的處理方案是修改界面字體設(shè)置進(jìn)入“窗口 → 首選項(xiàng) → 用戶界面 → 外觀 → 字體和顏色”把“基本”字體從默認(rèn)調(diào)到 12 號(hào)或更大部分對(duì)話框字體單獨(dú)調(diào)整。還有個(gè)細(xì)節(jié)SQL 編輯器里如果中文注釋顯示成方塊或亂碼通常是文件編碼沒對(duì)齊。DBeaver 默認(rèn)編碼可以在首選項(xiàng)里改成 UTF-8同時(shí)連接屬性里也要確認(rèn)數(shù)據(jù)庫客戶端編碼一致前后端編碼都統(tǒng)一中文基本不會(huì)再出問題。5.4 大表查詢卡頓的優(yōu)化思路很多從 Navicat 過來的人第一次在 DBeaver 里雙擊一個(gè)百萬行的表可能覺得卡因?yàn)樗J(rèn)會(huì)把數(shù)據(jù)一次性拉出來。解決這個(gè)問題有兩個(gè)辦法一是修改結(jié)果集獲取上限。在連接配置的“驅(qū)動(dòng)屬性”里可以通過 JDBC URL 加defaultFetchSize參數(shù)限制每次從數(shù)據(jù)庫讀取的行數(shù)比如設(shè)為 5000這樣翻頁時(shí)按需加載內(nèi)存占用會(huì)明顯下降。二是利用“虛擬列”和“過濾條件”。雙擊表打開數(shù)據(jù)后在表格視圖上方可以直接輸入 WHERE 條件做過濾DBeaver 會(huì)在后臺(tái)執(zhí)行帶條件的查詢而不是把整張表拖回來再篩選。這個(gè)習(xí)慣養(yǎng)成后大表操作基本不會(huì)再卡。6. 如果還想再看看其他工具一份免費(fèi)方案對(duì)比清單6.1 專注 SQLite 的輕量選項(xiàng)DB Browser for SQLite如果你主要維護(hù)的是 SQLite 數(shù)據(jù)庫DBeaver 可能有點(diǎn)“殺雞用牛刀”的感覺這種情況下可以考慮 DB Browser for SQLite簡(jiǎn)稱 DB4S。它是開源跨平臺(tái)工具界面直觀瀏覽數(shù)據(jù)、編輯表結(jié)構(gòu)、操作查詢都很順手尤其對(duì) SQLite 的單文件數(shù)據(jù)庫場(chǎng)景支持非常純粹。不過它的定位就是 SQLite 專用無法作為 Navicat 的多數(shù)據(jù)庫替代品。我自己的習(xí)慣是涉及 SQLite 的快速臨時(shí)任務(wù)用 DB4S需要和 MySQL、PostgreSQL 聯(lián)動(dòng)或做跨庫對(duì)比時(shí)回到 DBeaver。6.2 界面更現(xiàn)代的選擇Beekeeper Studio CommunityBeekeeper Studio 的最大優(yōu)勢(shì)是界面非常現(xiàn)代操作流暢學(xué)習(xí)成本極低。它的 Community 版支持 MySQL、PostgreSQL、SQLite、SQL Server 等主流數(shù)據(jù)庫對(duì)于只需要簡(jiǎn)單查詢和數(shù)據(jù)查看的場(chǎng)景體驗(yàn)相當(dāng)不錯(cuò)。但它的社區(qū)版在功能深度上比 DBeaver 保守一些比如復(fù)雜的工具集、擴(kuò)展插件和高級(jí)數(shù)據(jù)導(dǎo)出能力相對(duì)有限。我的建議是如果你平時(shí)的工作重心不在數(shù)據(jù)庫管理上只是偶爾想有個(gè)順手的客戶端連一下生產(chǎn)庫看看數(shù)據(jù)Beekeeper 值得一試如果你要在數(shù)據(jù)庫上做大篇幅開發(fā)、排障和設(shè)計(jì)工作DBeaver 更穩(wěn)當(dāng)。6.3 到底怎么選決策邏輯參考寫到最后我把自己的選擇邏輯整理成一張表方便你對(duì)號(hào)入座需求場(chǎng)景推薦工具理由多數(shù)據(jù)庫、開發(fā)寫 SQL、排障DBeaver Community功能全面、活躍更新、免費(fèi)只要 SQLite 單庫DB Browser for SQLite輕量純粹、打開就查追求界面現(xiàn)代、操作簡(jiǎn)單Beekeeper Studio Community顏值高、上手快預(yù)算充足、需要企業(yè)功能Navicat Premium / DataGrip生態(tài)成熟、功能整合度高我個(gè)人在實(shí)際操作中的體會(huì)是工具的替換不是一朝一夕的事別貪多先用熟 DBeaver 的“連接管理 SQL 編輯器 ER 圖”這三個(gè)核心功能等建立起自己的操作節(jié)奏后你會(huì)發(fā)現(xiàn) Navicat 的不可替代性比想象中低很多。最后再分享一個(gè)小技巧連接信息記得定期用 DBeaver 的“導(dǎo)出連接配置”功能備份換電腦時(shí)一鍵恢復(fù)比重新敲幾十個(gè)連接參數(shù)省事得多。