Skip to content

DBeaver ​

DBeaver 是一款开源免费的通用数据库客户端(Universal Database Client),基于 Java 与 Eclipse 平台构建,通过 Java 数据库连接(JDBC, Java Database Connectivity)驱动访问各类数据库。本节将介绍社区版与企业版的差异、JDBC 驱动配置、PostgreSQL 连接建立、SQL 编辑器能力、数据导入导出、ER 图与执行计划分析。

前置知识

阅读本节前,建议先了解:pgAdmin(官方 GUI)

基础概念 ​

DBeaver 与 pgAdmin 最大的差别在于「通用性」:pgAdmin 只服务 PostgreSQL,DBeaver 用统一的界面管理数十种数据库。这一设计带来两个关键结果:

  • 跨库操作只需切换驱动:同一套 SQL 编辑器、数据网格、导出向导可同时用于 PostgreSQL、MySQL、Oracle、ClickHouse 等
  • 连接依赖 JDBC 驱动:PostgreSQL 使用 org.postgresql.Driver(PGJDBC),由 DBeaver 自动下载或手工指定

DBeaver 不是简单的查询工具,它把「数据库元数据」抽象成了一套统一模型(Database Navigator),并在此之上提供数据编辑、DDL 生成、数据传输、ER 图等能力。理解这个抽象层,就能理解为什么某些 PostgreSQL 特有功能(如列表分区、自定义类型)在 DBeaver 中展示可能与 pgAdmin 不完全一致。

术语英文名说明
连接Connection一组 JDBC URL + 驱动 + 认证配置
驱动DriverJDBC 驱动定义,含类名与默认端口
数据库导航器Database Navigator左侧树形对象浏览面板
SQL 编辑器SQL Editor支持自动补全与多结果集的主编辑区
数据传输Data Transfer跨表、跨库、跨类型的数据迁移向导

安装与配置 ​

社区版与企业版对比 ​

维度Community Edition(CE)Enterprise Edition(EE)
价格免费开源(Apache 2.0)付费订阅(按年/人)
数据库类型全部主流数据库同上
SQL 编辑器自动补全、格式化增强补全、可视化查询构建器(Visual Query Builder)
NoSQLMongoDB(基础支持)MongoDB 完整支持(Redis、Cassandra、Couchbase 等)
数据传输支持(单线程为主)支持并行传输、任务调度
执行计划表格/树形展示可视化执行计划、计划对比
安全基础主密码、凭据加密管理、SSH 隧道增强
支持社区论坛官方工单支持
适用个人开发、中小团队企业级、多库种运维团队

对 PostgreSQL 开发者而言,社区版已覆盖 95% 的日常需求,可先用 CE,遇到「需要可视化查询构建器」「需要跨库批量传输」等场景再评估 EE。

安装 ​

bash
# macOS 桌面版
brew install --cask dbeaver-community

# Debian / Ubuntu:优先使用官方仓库(版本更新更快)
wget -O - https://dbeaver.io/debs/dbeaver.gpg.key | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/dbeaver.gpg
echo "deb https://dbeaver.io/debs/dbeaver-ce /" | sudo tee /etc/apt/sources.list.d/dbeaver.list
sudo apt update && sudo apt install -y dbeaver-ce

# Windows:通过 winget 或官网安装包
winget install dbeaver.dbeaver

# 无界面环境(仅命令行导出):DBeaver 提供 CLI 版本
dbeaver-cli -help
bash
# DBeaver 是 Java 应用,若报内存不足可调大堆内存
# 编辑 dbeaver.ini(Windows/Linux)或通过 macOS 的 Info.plist 调整
-Xms512m
-Xmx4096m

JDBC 驱动配置 ​

历史版本需要手工下载驱动 jar 并填 Java 类名;新版 DBeaver 已内置驱动下载器,首次连接时自动拉取。

text
自动配置(推荐):
  Database → New Database Connection → PostgreSQL
  → 首次点击 Test Connection 时弹窗提示「Download driver files」
  → 确认下载,驱动会缓存到
      ~/Library/DBeaverData/drivers   (macOS)
      ~/.local/share/DBeaverData/drivers (Linux)

手工配置(内网无法访问 Maven 中央仓库时):

text
Database → Driver Manager → PostgreSQL → Edit
  Class Name : org.postgresql.Driver
  URL Template : jdbc:postgresql://{host}[:{port}]/[{database}]
  Default Port : 5432

  Libraries 标签页 → Add File → 选择本地 postgresql-42.7.x.jar
  (驱动 jar 可从 https://jdbc.postgresql.org/download/ 下载)
bash
# 内网环境:提前把驱动 jar 放到共享目录,团队成员手工挂载
ls -l /opt/jdbc/postgresql-42.7.4.jar
# 校验驱动可用性(Java 环境已就绪时)
java -cp /opt/jdbc/postgresql-42.7.4.jar org.postgresql.util.PSQLDriverVersion
text
PostgreSQL JDBC Driver 42.7.4

驱动版本与 PostgreSQL 服务端的兼容性:

PGJDBC 版本支持的服务端说明
42.7.x8.4 ~ 18当前主线,支持 SCRAM-SHA-256
42.6.x8.2 ~ 17稳定,缺少部分新特性支持
42.2.x 及更早≤ 14不支持 PostgreSQL 15+ 的部分新类型

主要 JDBC URL 参数:

参数作用示例
ssl是否启用 SSLssl=true
sslmodeSSL 模式sslmode=verify-full
sslrootcert根证书路径sslrootcert=/etc/ssl/root.crt
currentSchema默认 search_pathcurrentSchema=app
ApplicationName应用标识ApplicationName=dbeaver
connectTimeout连接超时(秒)connectTimeout=10
socketTimeout读超时(秒)socketTimeout=0(不限)
reWriteBatchedInserts批量插入重写为多值 INSERTreWriteBatchedInserts=true

建立连接 ​

text
Database → New Database Connection → PostgreSQL

Main 标签页:
  Host      : 127.0.0.1
  Port      : 5432
  Database  : demo
  Username  : app_user
  Password  : ********        [x] Save password
  [x] Show all databases       # 显示实例下所有可访问的库

PostgreSQL 标签页:
  [x] Show databases
  [x] Show templates
  Show system objects : 按需

SSH 标签页(跳板机场景):
  [x] Use SSH tunnel
  Host/IP   : jump.example.com
  Port      : 22
  User Name : ops
  Authentication Method : Public Key
  Private Key : ~/.ssh/id_ed25519

连接测试等效的 JDBC URL:

text
jdbc:postgresql://127.0.0.1:5432/demo?ssl=true&sslmode=require&ApplicationName=dbeaver&connectTimeout=10

详细说明 ​

SQL 编辑器与自动补全 ​

DBeaver 的 SQL 编辑器基于 Eclipse 文本框架,自动补全(Auto-completion)依赖对数据库元数据的本地缓存。

快捷键功能
Ctrl/Cmd + Enter执行当前语句或选中内容
Alt/Option + X执行全部 SQL 脚本
Ctrl/Cmd + Shift + Enter执行并保留结果集(新标签打开)
Ctrl/Cmd + Space手动触发自动补全
Ctrl/Cmd + Shift + F格式化 SQL
Ctrl/Cmd + /切换行注释
Ctrl/Cmd + Alt/Option + ↑/↓上/下移动当前行
F3跳转到对象定义(Open Declaration)
sql
-- 自动补全的关键前提:元数据缓存是最新的
-- 表结构变更后,右键连接 → Refresh → 或按 F5 刷新缓存
SELECT u.id,
       u.email,
       count(o.id)              AS order_cnt,
       coalesce(sum(o.amount), 0) AS total_amount
FROM users AS u
LEFT JOIN orders AS o ON o.user_id = u.id
WHERE u.status = 1
GROUP BY u.id, u.email
HAVING count(o.id) > 0
ORDER BY total_amount DESC
LIMIT 20;
text
-- 结果网格摘要(DBeaver 会在状态栏显示行数与耗时)
20 rows retrieved in 87 ms (53 ms fetch time)

DBeaver 支持在同一个编辑器里执行多条语句并保留多个结果集(用分号分隔后全选执行),这点比 pgAdmin 更接近日常分析场景:

sql
-- 一次执行两条查询,DBeaver 会生成两个结果标签页
SELECT count(*) AS total_users FROM users;

SELECT channel, count(*) AS order_cnt
FROM orders
GROUP BY channel
ORDER BY order_cnt DESC;

数据导入导出 ​

DBeaver 提供图形化数据传输向导,内部通过 COPY(PostgreSQL 专属优化)或 JDBC 批量插入完成。

text
导出(Export Data):
  右键表 → Export Data
  → Export Target : CSV / JSON / SQL / XML / Excel / 另一个数据库表
  → Extraction settings : 
       [x] Use COPY command       # PostgreSQL 下最快的导出方式
       Row delimiter, Quote char, Encoding
  → Format settings
  → 保存为任务(Save task)后可重复执行

导入(Import Data):
  右键表 → Import Data
  → Import Source : CSV / JSON / SQL / Excel
  → Preview 确认列映射与类型推断
  → [x] Truncate table before import (谨慎)
  → [x] Use multi-row INSERT 或 COPY
bash
# 向导生成的导出动作,等价命令行如下(推荐生产用命令行,可脚本化)
psql -h 127.0.0.1 -U app_user -d demo \
  -c "\copy (SELECT id, email, status, created_at FROM users ORDER BY id) TO '/tmp/users.csv' WITH (FORMAT csv, HEADER true)"

# 大批量导入:用 COPY 而非逐行 INSERT,性能差异可达上百倍
psql -h 127.0.0.1 -U app_user -d demo \
  -c "\copy users(id, email, nickname, status) FROM '/tmp/users.csv' WITH (FORMAT csv, HEADER true)"

COPY 与客户端权限

DBeaver 的「Use COPY command」使用服务端 COPY ... FROM/TO 'file' 语法,要求数据库超级用户或 pg_read_server_files 角色,且文件路径是服务端路径。若用普通业务账号导出,DBeaver 会自动降级为 JDBC 批量读取,速度明显变慢。选择「File based export」并让 DBeaver 在客户端写文件可规避此限制。

ER 图 ​

DBeaver 的 ER 图支持双向工程,这是它相对 pgAdmin 的核心优势之一。

text
反向工程(从库生成 ER 图):
  展开 Tables → 全选目标表 → 右键 → View Diagram
  或:Database Navigator 中选中 Schema → 右键 → View Diagram

图内可操作:
  - 拖拽实体调整布局,自动保存到 .erd 文件
  - 双击实体直接在图上编辑列(会生成 ALTER TABLE)
  - 工具栏 Customize → 显示/隐藏注释、约束、索引
  - 导出:右键图 → Save As → PNG / SVG / PDF
  - 布局算法:Layout → 可选 Grid / Circular / Hierarchical

正向工程(DDL → ER 图):

text
1. File → New → DBeaver → ER Diagram
2. 在编辑器中粘贴或编写 CREATE TABLE 语句
3. 右键 → Generate Diagram,DBeaver 解析 DDL 生成实体
4. 可再反向导出为其他方言的 DDL(PostgreSQL → MySQL 等)

执行计划查看 ​

DBeaver 提供三种执行计划视图,需配合 PostgreSQL 的 EXPLAIN 使用:

text
快捷键:Ctrl/Cmd + Shift + E   (Explain Execution Plan)
        Ctrl/Cmd + Shift + Alt + E (Explain Analyze,真正执行)

结果区可选视图:
  - Plain Text  : 原生 EXPLAIN 文本
  - Grid        : 每个节点一行,便于排序与筛选
  - Tree        : 树形层级视图
  - Visual      : 图形化执行计划(需企业版或新版社区版)
sql
-- 在 DBeaver 中选中该语句后按 Explain Analyze
EXPLAIN (ANALYZE, BUFFERS, VERBOSE, FORMAT TEXT)
SELECT u.email, count(*) AS order_cnt
FROM users AS u
JOIN orders AS o ON o.user_id = u.id
WHERE o.created_at >= now() - interval '30 days'
GROUP BY u.email
ORDER BY order_cnt DESC
LIMIT 10;
text
Limit  (cost=18234.55..18234.57 rows=10 width=41) (actual time=241.882..241.889 rows=10 loops=1)
  Buffers: shared hit=1820 read=412
  ->  Sort  (cost=18234.55..18247.02 rows=4978 width=41) (actual time=241.876..241.879 rows=10 loops=1)
        Sort Key: (count(*)) DESC
        Sort Method: top-N heapsort  Memory: 26kB
        ->  HashAggregate  (cost=18059.72..18109.50 rows=4978 width=41) (actual time=239.104..241.010 rows=4372 loops=1)
              Group Key: u.email
              ->  Hash Join  (cost=4210.11..17621.60 rows=87622 width=37) (actual time=42.771..210.331 rows=92140 loops=1)
                    Hash Cond: (o.user_id = u.id)
                    ->  Index Scan using idx_orders_created_at on orders o  (cost=0.43..11842.30 rows=92140 width=16)
                    ->  Hash  (cost=2341.00..2341.00 rows=45000 width=29)
Planning Time: 0.412 ms
Execution Time: 242.156 ms

读执行计划时重点关注:估算行数与实际行数的偏差(偏差大说明统计信息过期)、Buffers: read 是否偏高(偏高说明缓存未命中)、以及是否出现 Seq Scan 大表全扫。

实战示例 ​

场景:把生产库的一张日志表迁移到分析库,并生成 ER 图供设计评审。

bash
# 1) 在 DBeaver 中先创建两个连接
#    demo-prod  : postgresql://app_user@db-prod.internal:5432/demo
#    demo-dwh   : postgresql://app_user@db-dwh.internal:5432/demo
#    两个连接都勾选 Show all databases,并配置 SSH 隧道(若在内网)
sql
-- 2) 在 demo-dwh 中创建目标表(结构对齐源表,追加分析字段)
CREATE TABLE IF NOT EXISTS fact_orders (
  order_id    bigint PRIMARY KEY,
  user_id     bigint NOT NULL,
  channel     text   NOT NULL,
  amount      numeric(12, 2) NOT NULL,
  status      text   NOT NULL,
  created_at  timestamptz NOT NULL,
  loaded_at   timestamptz NOT NULL DEFAULT now()
);

CREATE INDEX IF NOT EXISTS idx_fact_orders_created_at ON fact_orders (created_at);
text
3) 用数据传输向导完成迁移
   在 demo-prod 中右键 orders 表
   → Export Data → Export Target 选「Database table」
   → Target 选择 demo-dwh / public / fact_orders
   → Column mapping 手工映射(order_id→order_id, amount→amount ...)
   → Extraction:勾选 Use COPY command
   → 执行,任务区显示进度
sql
-- 4) 迁移后校验:行数与金额合计必须一致
-- 源库
SELECT count(*) AS cnt, sum(amount) AS total FROM orders;
text
  cnt   |   total
--------+------------
 128437 | 21874312.55
sql
-- 目标库
SELECT count(*) AS cnt, sum(amount) AS total FROM fact_orders;
text
  cnt   |   total
--------+------------
 128437 | 21874312.55
text
5) 生成 ER 图
   选中 demo-dwh 的 fact_orders 与 dim_users
   → 右键 → View Diagram
   → Layout 选 Hierarchical
   → 双击 fact_orders 确认 created_at 类型为 timestamptz
   → Save As → PNG,提交到设计文档

注意事项 ​

  • 元数据缓存会过期:DBeaver 的自动补全与对象树基于缓存,别的会话执行 ALTER TABLE 后需刷新(F5)才能看到新列,否则会补全出已删除的列。
  • 不要用 Edit Grid 直接改生产数据:网格编辑默认按主键生成 UPDATE,无主键的表 DBeaver 会警告并拒绝保存。
text
# 错误!无主键表在 Edit Grid 中修改可能影响多行
-- DBeaver 会提示:Cannot save data - table has no primary key
-- 正确做法:为该表建立主键或唯一索引,或改用显式 UPDATE 语句
  • 驱动版本过旧会认证失败:PostgreSQL 14 起默认使用 scram-sha-256,PGJDBC 低于 42.2.19 不支持,报错为 The authentication type 10 is not supported。
text
# 错误!驱动过旧
ERROR: The authentication type 10 is not supported.
       Check that you have configured the pg_hba.conf file...

# 正确做法:升级 PGJDBC 到 42.7.x
  • 大结果集设置行数上限:默认会一次性拉取全部结果导致内存爆满。
text
窗口 → 首选项 → Editors → Data Editor → 
  [x] Limit result set to : 20000 rows
  • Save password 与主密码:企业版可加密存储,社区版保存在本地配置目录,多用户共用机器时不要勾选。
  • SSH 隧道与 localhost 的陷阱:启用 SSH 隧道后,主机必须填隧道出口侧看到的主机名(通常是 localhost 或内网 IP),不是公网地址。
  • 时区显示不一致:timestamptz 在 DBeaver 中按 JVM 时区渲染,常用 -Duser.timezone=Asia/Shanghai 统一。
  • 不要依赖 DBeaver 生成迁移脚本:它的 DDL 生成偏向「当前状态」,不适合作为版本化迁移工具,应使用 Flyway / Liquibase / sqitch。

最佳实践 ​

  • 连接命名带环境与用途:demo-prod-ro(只读)、demo-dev-rw,用颜色标记(连接 → Edit → 连接颜色)区分生产环境,避免误操作。
  • 生产连接默认只读:Window → Preferences → Connections → 勾选 Read-only connection 或使用只读角色,物理上避免误发 DDL。
  • 把常用 SQL 保存为 Script:SQL Editor → Save as script,团队共享脚本目录;比复制粘贴更可控。
  • 批量导入大文件用命令行 COPY:DBeaver 向导适合交互式小批量,GB 级导入请用 \copy 或 COPY FROM PROGRAM。
  • 导出统一用基于文件的 COPY:避免服务端路径权限问题,同时比 JDBC 批量读取快一个数量级。
  • 提交前先看执行计划:在 DBeaver 中用 Explain Analyze 验证新写的复杂查询,关注估算偏差与 Buffer 命中。
  • 社区版优先:先充分使用 CE,只有当确需 Visual Query Builder、并行数据传输或官方支持时才升级 EE。

下一节

继续学习:Navicat / DataGrip

参考链接 ​