寫 SQL、跑查詢、複製結果、貼給 AI、等回覆、發現少撈了一個欄位、再跑一次。這個迴圈跑過三輪以上的人,大概都會冒出同一個念頭:讓 AI 自己去查不就好了?

DBHub 就是幹這件事的。Bytebase 團隊開源的資料庫 MCP Server,裝上去之後 AI 直接透過 MCP 協定存取資料庫——查結構、跑 SQL 都行,你不用再當中間人搬運資料。

支援的資料庫

MSSQL、MySQL、PostgreSQL、MariaDB、SQLite、Oracle,涵蓋範圍比預期廣。安裝走 npx 或 Docker 都行。

安裝方式

專案級安裝

連線資訊只在當前專案目錄下生效,不會跨專案污染。

MSSQL:

1
claude mcp add dbhub --scope project -- npx @bytebase/dbhub --transport stdio --dsn "sqlserver://user:password@host:port/database"

MySQL:

1
claude mcp add dbhub --scope project -- npx @bytebase/dbhub --transport stdio --dsn "mysql://user:password@host:port/database"

PostgreSQL:

1
claude mcp add dbhub --scope project -- npx @bytebase/dbhub --transport stdio --dsn "postgresql://user:password@host:port/database"

裝完要重啟 AI 工具,MCP 連線才會生效。

全域安裝

所有專案共用同一個資料庫連線,不加 --scope

1
claude mcp add dbhub -- npx @bytebase/dbhub --transport stdio --dsn "sqlserver://user:password@host:port/database"

Docker 方式

1
2
3
4
5
docker run --rm --init --name dbhub \
--publish 8080:8080 \
bytebase/dbhub \
--transport http --port 8080 \
--dsn "sqlserver://user:password@host:port/database"

DSN 格式對照表

DB DSN 格式 預設 Port
MSSQL sqlserver://user:pwd@host:1433/database 1433
MySQL mysql://user:pwd@host:3306/database 3306
PostgreSQL postgresql://user:pwd@host:5432/database 5432
MariaDB mysql://user:pwd@host:3306/database 3306
SQLite sqlite:///path/to/database.db
Oracle oracle://user:pwd@host:1521/service 1521

裝好後能做什麼

安裝完成後 AI 拿到幾個 MCP 工具:

  • **execute_sql**:執行 SQL 查詢,預設可讀寫(建議改唯讀)
  • **search_objects**:搜尋 tables、columns、indexes、procedures 等結構
  • 自訂工具:透過 dbhub.toml 定義參數化 SQL

用自然語言下指令就行了。「列出所有資料表」、「查看 user_info 的結構」、「撈最近 10 筆訂單」——AI 會自己組 SQL 去跑。

權限管理:預設讀寫全開

這點要注意。DBHub 出廠設定是讀寫全開的,沒調整的話 AI 有權限對你的資料庫做 INSERT、UPDATE、DELETE。在正式環境不設防,等於給 AI 一把沒上鎖的刀。

dbhub.toml 把讀寫拆開:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[[sources]]
id = "mydb"
dsn = "sqlserver://${DB_USER}:${DB_PASSWORD}@host:1433/database"

# 日常查詢用,唯讀
[[tools]]
name = "execute_sql"
source = "mydb"
readonly = true
max_rows = 1000

# 需要改資料時才用
[[tools]]
name = "execute_sql_write"
source = "mydb"
readonly = false

安裝時指定設定檔:

1
claude mcp add dbhub --scope project -- npx @bytebase/dbhub --transport stdio --config ./dbhub.toml

日常操作只開 readonly = true 的那支。就算 AI 判斷失誤,唯讀模式下也改不了東西。

把 SQL 鎖死在你定義的範圍

連「能跑什麼 SQL」都要控制的話,可以自訂具名工具:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[[tools]]
name = "update_user_status"
description = "更新使用者狀態"
source = "mydb"
statement = "UPDATE users SET status = @status WHERE user_id = @user_id"

[[tools.parameters]]
name = "user_id"
type = "string"
description = "使用者 ID"

[[tools.parameters]]
name = "status"
type = "string"
description = "新狀態"
allowed_values = ["active", "inactive", "suspended"]

AI 能做的事被框在你定義好的 SQL 裡面,不會有意外。

TOML 設定選項

設定 說明 預設值
readonly true 限制為 SELECT;false 允許全部 false
max_rows SELECT 結果最大行數 無限制
query_timeout 查詢超時秒數 無限制
connection_timeout 連線超時秒數 無限制
lazy 延遲連線(首次查詢才連) false

DSN 裡可以用 ${DB_USER}${DB_PASSWORD} 讀取環境變數,不用把密碼硬寫進檔案。HTTP 模式改 TOML 會自動 Hot Reload,STDIO 要重啟。

拿來做效能分析

DBHub 本身沒有效能分析功能。但它打開了一條路——讓 AI 直接去查資料庫內建的效能視圖(DMV)。排查慢查詢、檢查索引狀況的時候特別有用。不用記那些 sys.dm_exec_query_stats 的欄位名稱,跟 AI 說「找出目前最慢的 10 條 SQL」它就去撈了。

MSSQL 效能查詢範例

Top 10 最耗資源的查詢:

1
2
3
4
5
6
7
8
9
SELECT TOP 10
qs.total_elapsed_time / qs.execution_count AS avg_elapsed_ms,
qs.execution_count,
SUBSTRING(st.text, (qs.statement_start_offset/2)+1,
((CASE qs.statement_end_offset WHEN -1 THEN DATALENGTH(st.text)
ELSE qs.statement_end_offset END - qs.statement_start_offset)/2)+1) AS query_text
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) st
ORDER BY avg_elapsed_ms DESC;

缺少索引建議:

1
2
3
4
5
6
7
8
9
10
11
12
SELECT TOP 10
migs.avg_user_impact,
mid.statement AS table_name,
mid.equality_columns,
mid.inequality_columns,
mid.included_columns
FROM sys.dm_db_missing_index_group_stats migs
JOIN sys.dm_db_missing_index_groups mig
ON migs.group_handle = mig.index_group_handle
JOIN sys.dm_db_missing_index_details mid
ON mig.index_handle = mid.index_handle
ORDER BY migs.avg_user_impact DESC;

索引使用狀況:

1
2
3
4
5
6
7
8
9
10
SELECT
OBJECT_NAME(i.object_id) AS table_name,
i.name AS index_name,
ius.user_seeks, ius.user_scans,
ius.user_lookups, ius.user_updates
FROM sys.indexes i
JOIN sys.dm_db_index_usage_stats ius
ON i.object_id = ius.object_id AND i.index_id = ius.index_id
WHERE OBJECTPROPERTY(i.object_id, 'IsUserTable') = 1
ORDER BY ius.user_seeks + ius.user_scans DESC;

MySQL

1
2
3
4
5
6
7
8
-- 慢查詢(需開啟 slow_query_log)
SELECT * FROM mysql.slow_log ORDER BY query_time DESC LIMIT 10;

-- 目前執行中的查詢
SHOW FULL PROCESSLIST;

-- 表索引統計
SHOW INDEX FROM table_name;

PostgreSQL

1
2
3
4
5
6
7
8
9
10
-- Top 10 最慢查詢(需啟用 pg_stat_statements)
SELECT query, calls, mean_exec_time, total_exec_time
FROM pg_stat_statements
ORDER BY mean_exec_time DESC LIMIT 10;

-- 未使用的索引
SELECT indexrelid::regclass AS index, relid::regclass AS table,
idx_scan, idx_tup_read
FROM pg_stat_user_indexes
WHERE idx_scan = 0;

管理指令

1
2
3
4
5
6
7
8
# 查看已安裝的 MCP
claude mcp list

# 移除 DBHub
claude mcp remove dbhub

# 更新(移除後重新安裝)
claude mcp remove dbhub && claude mcp add dbhub --scope project -- npx @bytebase/dbhub --transport stdio --dsn "..."

跟其他資料庫 MCP Server 的比較

名稱 支援 DB 特點
DBHub 全部主流 零依賴、Bytebase 維護、MIT 授權
mcp-alchemy 全部主流 基於 SQLAlchemy(需 Python)
server-postgres(官方) 僅 PostgreSQL Anthropic 官方維護
server-sqlite(官方) 僅 SQLite Anthropic 官方維護
mcp-server-mysql 僅 MySQL 社群最受歡迎的 MySQL 專用

如果你的專案只用單一種資料庫,官方的 server-postgres 或社群的 mcp-server-mysql 也夠用。但需要跨多個 DB 的話,DBHub 的泛用性最高——支援種類多、不吃 Python、Bytebase 團隊持續更新。

參考來源:Claude Code in Action - Anthropic Academy 的 MCP Server 整合單元也有介紹類似的資料庫連接方式。

踩過的坑

  • 預設可讀寫:不設 readonly = true 就是在賭。
  • 密碼存放位置--scope project 會把 DSN 存進 .claude/settings.local.json,這個檔案要加進 .gitignore。密碼推上 Git 不是開玩笑的。
  • H2 不支援:某些 Java 專案會用 H2 做嵌入式資料庫(Quartz 排程常見),DBHub 連不上。
  • 要有 Node.js:走 npx 就需要 Node.js 環境,Docker 方式則不受影響。