面對幾百張表、缺乏文件的舊系統,人工繪製 ER 圖不僅耗時還極易過時。SchemaSpy 這款 Java 開源工具,能直接讀取資料庫中繼資料,自動生成可互動的 HTML 文件與 Graphviz 關係圖,並支援納入 Crontab 實現「模型變更、文件自動同步」。
# 1. Java JRE 8+
# 2. Graphviz (提供 dot 指令)
# 3. MySQL Connector/J (mysql-connector-java-x.x.x.jar)
# 4. SchemaSpy 最新版 (schemaSpy_x.x.x.jar)
mysql.propertiesdescription=Production MySQL
driver=com.mysql.cj.jdbc.Driver
connectionSpec=jdbc:mysql://127.0.0.1:3306/target_db?useSSL=false&serverTimezone=UTC
driverPath=/opt/jdbc/mysql-connector-java-8.0.33.jar
許多老系統未建立 FK,SchemaSpy 預設只能識別同名欄位(如 parent_id 對 parent_id)。若父表主鍵叫 id、子表外鍵叫 parent_id,需提供 schemaspy.meta.xml:
<?xml version="1.0" encoding="UTF-8"?>
<schemaMeta xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="https://schemaspy.sourceforge.net/xmlschema/2011/02/05/schemaspy.meta.xsd">
<tables>
<table name="parent" comments="父表">
<column name="id" primaryKey="true"/>
</table>
<table name="child" comments="子表,隱性關聯 parent">
<column name="id" primaryKey="true"/>
<column name="parent_id">
<foreignKey table="parent" column="id"/>
</column>
</table>
</tables>
</schemaMeta>
java -jar schemaSpy_6.2.1.jar \
-t mysql \
-db target_db \
-u readonly_user -p '******' \
-host 127.0.0.1 -port 3306 \
-meta schemaspy.meta.xml \
-o /var/www/html/schemaspy \
-dp /opt/jdbc/mysql-connector-java-8.0.33.jar
-o 指定輸出目錄,需可被 Nginx/Apache 直接服務。
# /etc/cron.d/schemaspy
0 3 * * * www-data /usr/bin/java -jar /opt/tools/schemaSpy_6.2.1.jar \
-t mysql -db target_db -u ro_user -p '******' \
-host 127.0.0.1 -o /var/www/html/schemaspy \
-meta /opt/tools/schemaspy.meta.xml > /var/log/schemaspy.log 2>&1
每天凌晨 3 點重建,文件永遠與最新結構同步。
| 分頁 | 用途 |
|---|---|
| Tables | 表清單、行數、欄位數、註解、父子表計數,支援搜尋過濾 |
| Constraints | 顯式 FK 列表(不含 meta 補充) |
| Anomalies | 潛在問題:無索引表、可為 NULL 的唯一鍵、單列表、自增欄位命名不一、空字串 vs NULL 混用 |
| Columns | 全庫欄位彙總,快速發現漏建 FK 的候選欄位 |
結語:SchemaSpy 不是銀彈,但它把「文件維護」從人工負擔轉為自動化流程一環。配合 Meta XML 補齊隱性關係,再納入 CI 夜ly 建置,團隊即擁有永不落伍的資料庫地圖——這對新人上手、重構評估、架構溝通都是高價值資產。