針對常見 MySQL 連接、認證及資料型別問題的解決方案,在 Data API 建構器中。
常見問題
DAB 中 MySQL 支援是什麼?
Data API 建構器支援 MySQL 作為關聯式資料庫後端。 DAB 透過 MySqlConnector 驅動程式連接,並將 REST 和 GraphQL 請求轉換成 SQL 查詢。 同時支援自架 MySQL 實例及像 Azure Database for MySQL 這類託管服務。
MySQL 使用什麼連線字串格式?
DAB 使用標準的 MySQL ADO.NET 連線字串。 典型的字串看起來像 Server=localhost;Port=3306;Database=mydb;Uid=myuser;Pwd=mypassword;。 將連接字串設在 data-source.connection-string 的 dab-config.json 域中,或透過 --connection-string 的 dab init傳遞。
支援哪些 MySQL 版本?
DAB 支援 MySQL 8.0 及更新版本。 MySQL 5.7 可能可行,但官方不支援。 請在 MySQL shell 中使用 SELECT VERSION(); 來確認你的伺服器版本。 如果你使用的是像 MySQL 的 Azure Database 這類託管服務,請使用 Flexible Server tier,該層級支援 MySQL 8.0。
常見問題
無法連接 MySQL 容器
症狀: DAB 無法啟動 Unable to connect to any of the specified MySQL hosts。
原因: MySQL 容器埠未映射、主機名稱錯誤,或容器尚未完成初始化。
解決方案: 確認容器正在運行,並確保docker ps該埠3306已映射到主機。 在連接字串中使用 Server=localhost;Port=3306。 容器啟動後,請稍等幾秒以讓 MySQL 完成初始化,然後再啟動 DAB。
使用者無法存取
症狀: DAB 日誌顯示 Access denied for user 'myuser'@'172.x.x.x' 或類似情況。
原因: MySQL 使用者帳號限制在特定主機上。 當 DAB 在 Docker 中執行時,連線是從容器網路的 IP 開始,而非 localhost。
解決: 透過執行 GRANT ALL PRIVILEGES ON mydb.* TO 'myuser'@'%' IDENTIFIED BY 'mypassword'; FLUSH PRIVILEGES; 來從任何主機授予使用者存取權限。 在生產環境中,請替換 % 成特定的主機或子網路。 請在相同網路環境下執行 mysql -u myuser -p 以驗證密碼是否匹配。
未知資料庫錯誤
症狀: DAB 啟動時返回 Unknown database 'mydb' 。
原因: 連接字串中指定的資料庫尚未在 MySQL 伺服器上建立。
解決: 在啟動 DAB 前,先在 MySQL shell 裡建立 CREATE DATABASE mydb; 資料庫。 如果使用容器,請設定 MYSQL_DATABASE 環境變數,讓 MySQL 在第一次啟動時建立資料庫。
不支援欄位類型警告
症狀: DAB 會記錄一個不支援欄位類型的警告,且該欄位在產生的結構中缺失。
原因: 某些 MySQL 專用型別,如 SET、 ENUM或空間型別,可能無法直接映射在 DAB 的型別系統中。
解決: 檢視DAB日誌以辨識欄位與類型。 考慮將欄位類型變更為由 VARCHAR 所支援的型別,例如用於 ENUM 的欄位,或使用 mappings 配置將該欄位從實體定義中排除,以從公開的結構中省略它。
更新失敗於觀看次數
症狀: 對由 MySQL 視圖支援的實體執行 PUT 或 PATCH 請求會失敗或無效。
原因: Data API 建構器目前不支援 MySQL 視圖的更新操作。 這是 GitHub issue #938 中追蹤的已知限制。
解決辦法: 使用一個基底表實體進行寫入操作。 若檢視設計為唯讀,請在實體權限中設定「update」:false,以明確說明限制。
更新含計算欄位的表格失敗
症狀: 對於包含計算欄位的 MySQL 資料表執行 PUT 或 PATCH 請求,會失敗或回傳錯誤。
原因: Data API 建構器在 MySQL 更新操作時無法正確處理計算出的欄位。 這是 GitHub issue #1001 中追蹤的已知限制。
解決: 目前沒有解決方法。 如果可能,將計算出來的欄位排除在實體的映射中,或在問題解決前避免對受影響實體進行更新操作。
巢狀過濾不被支援
症狀: 在 MySQL 支援實體中,當 REST 或 GraphQL 過濾查詢針對相關實體欄位進行過濾時,會返回錯誤或意外結果。
原因: 資料 API 建構器目前不支援 MySQL 的巢狀過濾。 這是 GitHub issue #1019 中追蹤的已知限制。
解決: 僅對頂層實體欄位套用篩選。 對於巢狀資料,請擷取父資料並在用戶端過濾,或重構查詢以避免巢狀謂詞。
不支援儲存程序
症狀: 將 MySQL 儲存程序設定為實體來源會失敗,或實體行為不符預期。
原因: Data API 建構器目前不支援 MySQL 的儲存程序。 這是 GitHub issue #1024 中追蹤的已知限制。
解決: 可以用表格或檢視作為實體來源。 請關注 GitHub issue 以獲取何時加入 MySQL 儲存程序支援的最新消息。
資料庫策略不會對建立作業強制執行
症狀: 即使資料庫政策應該限制該操作,建立變異或 POST 請求仍會成功。
原因: 目前尚未實作 MySQL 中 Create 動作的資料庫政策支援。 這是 GitHub issue #1329 中追蹤的已知限制。
解決: 使用基於角色的權限限制建立存取,直到 MySQL Create 的資料庫政策支援可用。
PUT 與 PATCH 操作不套用資料庫策略
症狀: 即使資料庫政策應該限制,對 MySQL 實體的 PUT 或 PATCH 請求仍會成功。
原因: MySQL 中 PUT 與 PATCH 操作的資料庫政策支援尚未實作。 這是 GitHub issue #1371 中追蹤的已知限制。
解決: 使用基於角色的權限限制更新存取,直到資料庫對 MySQL 更新操作的政策支援可用。
不支援開啟Behalf-Of(OBO)認證
症狀: 在為 MySQL 支援的 DAB 實例設定 On-Behalf-Of(OBO)認證時失敗,或令牌未如預期轉發至資料庫。
原因: OBO 認證目前僅支援 SQL Server 和 Azure SQL。 MySQL 的支援尚未實現。 這是 GitHub issue #3159 中追蹤的已知限制。
解決: 使用支援的認證方法,例如連接字串認證資訊來進行 MySQL 的連接。 請關注 GitHub 公告,了解何時 OBO 支援擴展至非 SQL Server 資料庫的最新消息。