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 + 驱动 + 认证配置 |
| 驱动 | Driver | JDBC 驱动定义,含类名与默认端口 |
| 数据库导航器 | Database Navigator | 左侧树形对象浏览面板 |
| SQL 编辑器 | SQL Editor | 支持自动补全与多结果集的主编辑区 |
| 数据传输 | Data Transfer | 跨表、跨库、跨类型的数据迁移向导 |
安装与配置
社区版与企业版对比
| 维度 | Community Edition(CE) | Enterprise Edition(EE) |
|---|---|---|
| 价格 | 免费开源(Apache 2.0) | 付费订阅(按年/人) |
| 数据库类型 | 全部主流数据库 | 同上 |
| SQL 编辑器 | 自动补全、格式化 | 增强补全、可视化查询构建器(Visual Query Builder) |
| NoSQL | MongoDB(基础支持) | MongoDB 完整支持(Redis、Cassandra、Couchbase 等) |
| 数据传输 | 支持(单线程为主) | 支持并行传输、任务调度 |
| 执行计划 | 表格/树形展示 | 可视化执行计划、计划对比 |
| 安全 | 基础 | 主密码、凭据加密管理、SSH 隧道增强 |
| 支持 | 社区论坛 | 官方工单支持 |
| 适用 | 个人开发、中小团队 | 企业级、多库种运维团队 |
对 PostgreSQL 开发者而言,社区版已覆盖 95% 的日常需求,可先用 CE,遇到「需要可视化查询构建器」「需要跨库批量传输」等场景再评估 EE。
安装
# 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# DBeaver 是 Java 应用,若报内存不足可调大堆内存
# 编辑 dbeaver.ini(Windows/Linux)或通过 macOS 的 Info.plist 调整
-Xms512m
-Xmx4096mJDBC 驱动配置
历史版本需要手工下载驱动 jar 并填 Java 类名;新版 DBeaver 已内置驱动下载器,首次连接时自动拉取。
自动配置(推荐):
Database → New Database Connection → PostgreSQL
→ 首次点击 Test Connection 时弹窗提示「Download driver files」
→ 确认下载,驱动会缓存到
~/Library/DBeaverData/drivers (macOS)
~/.local/share/DBeaverData/drivers (Linux)手工配置(内网无法访问 Maven 中央仓库时):
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/ 下载)# 内网环境:提前把驱动 jar 放到共享目录,团队成员手工挂载
ls -l /opt/jdbc/postgresql-42.7.4.jar
# 校验驱动可用性(Java 环境已就绪时)
java -cp /opt/jdbc/postgresql-42.7.4.jar org.postgresql.util.PSQLDriverVersionPostgreSQL JDBC Driver 42.7.4驱动版本与 PostgreSQL 服务端的兼容性:
| PGJDBC 版本 | 支持的服务端 | 说明 |
|---|---|---|
| 42.7.x | 8.4 ~ 18 | 当前主线,支持 SCRAM-SHA-256 |
| 42.6.x | 8.2 ~ 17 | 稳定,缺少部分新特性支持 |
| 42.2.x 及更早 | ≤ 14 | 不支持 PostgreSQL 15+ 的部分新类型 |
主要 JDBC URL 参数:
| 参数 | 作用 | 示例 |
|---|---|---|
ssl | 是否启用 SSL | ssl=true |
sslmode | SSL 模式 | sslmode=verify-full |
sslrootcert | 根证书路径 | sslrootcert=/etc/ssl/root.crt |
currentSchema | 默认 search_path | currentSchema=app |
ApplicationName | 应用标识 | ApplicationName=dbeaver |
connectTimeout | 连接超时(秒) | connectTimeout=10 |
socketTimeout | 读超时(秒) | socketTimeout=0(不限) |
reWriteBatchedInserts | 批量插入重写为多值 INSERT | reWriteBatchedInserts=true |
建立连接
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:
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) |
-- 自动补全的关键前提:元数据缓存是最新的
-- 表结构变更后,右键连接 → 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;-- 结果网格摘要(DBeaver 会在状态栏显示行数与耗时)
20 rows retrieved in 87 ms (53 ms fetch time)DBeaver 支持在同一个编辑器里执行多条语句并保留多个结果集(用分号分隔后全选执行),这点比 pgAdmin 更接近日常分析场景:
-- 一次执行两条查询,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 批量插入完成。
导出(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# 向导生成的导出动作,等价命令行如下(推荐生产用命令行,可脚本化)
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 的核心优势之一。
反向工程(从库生成 ER 图):
展开 Tables → 全选目标表 → 右键 → View Diagram
或:Database Navigator 中选中 Schema → 右键 → View Diagram
图内可操作:
- 拖拽实体调整布局,自动保存到 .erd 文件
- 双击实体直接在图上编辑列(会生成 ALTER TABLE)
- 工具栏 Customize → 显示/隐藏注释、约束、索引
- 导出:右键图 → Save As → PNG / SVG / PDF
- 布局算法:Layout → 可选 Grid / Circular / Hierarchical正向工程(DDL → ER 图):
1. File → New → DBeaver → ER Diagram
2. 在编辑器中粘贴或编写 CREATE TABLE 语句
3. 右键 → Generate Diagram,DBeaver 解析 DDL 生成实体
4. 可再反向导出为其他方言的 DDL(PostgreSQL → MySQL 等)执行计划查看
DBeaver 提供三种执行计划视图,需配合 PostgreSQL 的 EXPLAIN 使用:
快捷键:Ctrl/Cmd + Shift + E (Explain Execution Plan)
Ctrl/Cmd + Shift + Alt + E (Explain Analyze,真正执行)
结果区可选视图:
- Plain Text : 原生 EXPLAIN 文本
- Grid : 每个节点一行,便于排序与筛选
- Tree : 树形层级视图
- Visual : 图形化执行计划(需企业版或新版社区版)-- 在 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;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 图供设计评审。
# 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 隧道(若在内网)-- 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);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
→ 执行,任务区显示进度-- 4) 迁移后校验:行数与金额合计必须一致
-- 源库
SELECT count(*) AS cnt, sum(amount) AS total FROM orders; cnt | total
--------+------------
128437 | 21874312.55-- 目标库
SELECT count(*) AS cnt, sum(amount) AS total FROM fact_orders; cnt | total
--------+------------
128437 | 21874312.555) 生成 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 会警告并拒绝保存。
# 错误!无主键表在 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。
# 错误!驱动过旧
ERROR: The authentication type 10 is not supported.
Check that you have configured the pg_hba.conf file...
# 正确做法:升级 PGJDBC 到 42.7.x- 大结果集设置行数上限:默认会一次性拉取全部结果导致内存爆满。
窗口 → 首选项 → Editors → Data Editor →
[x] Limit result set to : 20000 rowsSave 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