SQL稽核 | SQLE 相容 MySQL 8.0 測評

愛可生雲資料庫發表於2022-04-22

作者:任仲禹

愛可生 DBA 團隊成員,擅長故障分析和效能優化,文章相關技術問題,歡迎大家一起討論。

本文來源:原創投稿

*愛可生開源社群出品,原創內容未經授權不得隨意使用,轉載請聯絡小編並註明來源。


目錄

  • 前⾔
  • DDL語句稽核
  • DCL語句稽核
  • DML語句稽核
  • DDL與DML上下⽂關聯
  • 結論

前⾔

SQLE是由愛可⽣開發並開源、⽀持SQL稽核、標準化上線流程等豐富功能的可擴充套件 SQL 稽核⼯具(https://github.com/actiontech...);⽬前⼤部分 MySQL 業務使⽤場景以5.7版本為主,今天本⽂來驗證下 SQLE 對 MySQL 8.0 的⽀持程度。

  • SQLE版本:sqle-ce-1.2203.0
  • MySQL版本:MySQL 8.0.28
  • 環境安裝過程:略

DDL語句稽核

1. 測試create table建表語句⼀

稽核結果如下圖。

  • ⼩結

    • 稽核結果基本沒啥問題,不符合建表規則和命名規範的問題SQLE將正常甩出錯誤。

2. 測試create table 建表語句⼆

  • 下⾯2條SQL示例,⼀條為語法⽆誤、⼀條為語法錯誤(含MySQL保留關鍵字)。


如下圖稽核結果,第⼆條 rank 表 其實與預期結果不符合,SQLE應該甩出報錯。

正常的稽核結果應該跟下圖⼀樣甩出錯誤。

  • ⼩結

    • 上述稽核結果不⼀樣的原因在於,order、rank 雖然同屬於MySQL 8.0的保留關鍵字,但 rank 是8.0版本新增的,當前SQLE的稽核規則中關鍵字型檔估計需要更新。
    • 注意:該rank建表語句雖能通過稽核,但上線仍然會失敗。

3. 測試alter table建立/修改索引或列。

稽核結果如下圖。

  • ⼩結

    • 稽核結果基本沒啥問題,不符合索引、欄位建立規則的問題SQLE將正常甩出錯誤。

4. 測試alter table禁⽤索引

  • 下⾯2條SQL示例,⼀條為建立索引,⼀條為將索引修改為不可⻅(禁⽤)狀態。

如下圖稽核結果,其實不符合預期。

正常的的稽核結果應該為 ⽆問題 ,該語句 MySQL 中執⾏如下圖所示。

  • ⼩結
    稽核結果不符合預期的原因,應該是該 ALTER TABLE ... ALTER INDEX ... 語法為8.0新增,⽬前SQLE暫時還未加⼊解析器。

DCL語句稽核

DCL語句⼀般很少線上上環境中進⾏稽核或上線,但SQLE依然可以⽀持。

1. 測試set命令示例語句如下。

但是也有可能會有⽆法稽核的命令,如下圖所示。

稽核結果如下圖,第2條語句稽核結果不符合預期。

正常的稽核結果應為 ⽆問題 ,該語句MySQL中執⾏如下圖所示。

  • ⼩結

    • 稽核結果不符合預期的原因,應該是該 set persist ... 語法為8.0新增,⽬前SQLE暫時還未加⼊解析器。

2. 測試GRANT等⽤戶/⻆⾊授權語句。

稽核結果如下圖。

  • ⼩結

    • 稽核結果基本沒啥問題,⽤戶和⻆⾊建立與授權語句能被SQLE正確識別。

DML語句稽核

1. 測試INSERT/UPDATE/DELETE 語句如下。


稽核結果如下圖。

  • ⼩結

    • 稽核結果基本沒啥問題,不符合DML規範的問題SQLE將正常甩出錯誤。

      2.測試select語句如下。


      稽核結果如下圖。

  • ⼩結

    • 稽核結果基本沒啥問題,SQLE將不符合SQL開發規範的問題正常甩出。

DDL與DML上下⽂關聯

DDL與DML上下⽂關聯常⻅於發版上線場景,實際⽣產環境中該場景還是⽐較多。

1. 測試語句⼀。

稽核結果如下圖。

  • ⼩結

    • 稽核結果符合預期,SQLE能夠識別新加的列與⽂中的資料插⼊語句相關聯。

2. 測試語句⼆(反例)

稽核結果如下圖。

  • ⼩結

    • 稽核結果符合預期,不相關聯的DML語句,SQLE能夠識別出並刷出報錯。

3. 測試語句三

驗證MySQL 8.0 JSON相關特性

稽核結果如下圖。

語句在MySQL正常執⾏如下圖。

  • ⼩結

    • 除了MySQL 8.0 JSON新特性(如 JSON_TABLE⽅法),其它JSON語法和MySQL 5.7⼀樣,SQLE仍然⽀持。

結論

  • 本⽂測試了SQLE對MySQL 8.0.28的⽀持程度,根據測試結果,⼤部分DDL、DML和DCL語句與MySQL 5.7版本⼀樣,都能正常進⾏稽核,DML和DDL上下⽂關聯能夠正確識別。
  • 少數MySQL8.0 新特性涉及的SQL⽬前SQLE可能還不能相容,例如

    • 建表時存在 MySQL 8.0 新的保留字,如窗⼝函式相關的RANK、ROW_NUMBER等。
    • ALTER TABLE ... ALTER INDEX ... 語法
    • set persist ... 語法
    • JSON_TABLE函式等
  • 總之,瑕不掩瑜,不相容的點畢竟⽇常SQL開發稽核上線中極少使⽤,相信後續SQLE版本將進⾏優化。

相關文章