SQL自動審覈-自助上線平臺

爲了讓DBA從日常繁瑣的工作中解放出來,通過SQL自助平臺,可以讓開發自上線,開發提交SQL後就會自動返回優化建議,無需DBA的再次審覈,從而提升上線效率,有利於建立數據庫開發規範。


借鑑了去哪網Inception的思路並且把美團網SQLAdvisor(索引優化建議)集成在一起,並結合了之前寫的《DBA的40條軍規》納入了審覈規則裏,用PHP實現。目前在我公司內部使用。


SQL自動審覈主要完成兩方面目的:
1、避免性能太差的SQL進入生產系統,導致整體性能降低。
2、檢查開發設計的索引是否合理,是否需要添加索引。


思路其實很簡單:
1、獲取開發提交的SQL
2、對要執行的SQL做分析,觸碰事先定義好的規則來判斷這個SQL是否可以自動審覈通過,未通過審覈的需要人工處理。


下面是首頁界面:

界面3.png


使用說明:

1、針對select/insert/update/create/alter加了規則,delete需要審批。
2、語句之間要有空格,例where id = 100,沒有空格會影響判斷的準確性。
3、SQL語句後面要加分號; MySQL解析器規定分號纔可以執行SQL。
4、反引號`會造成上線失敗,需要用文本編輯器替換掉。
5、支持多條SQL解析,用一個分號;分割。例如:
     insert into t1 values(1,'a');
     insert into t1 values(2,'b');

6、JSON格式裏的雙引號要用反斜槓進行轉義,例如:{\"dis_text\":\"nba\"}。


  • SELECT審覈

1、開發人員可以直接將SQL語句提交到平臺進行風險評估

2、平臺對SQL語句進行分析,自動給出其不符合開發規範的改進意見

3、適用場景:應用開發階段

檢查項:

1、select * 是否有必要查詢所有的字段?
2、警告!沒有where條件,注意where後面的字段要加上索引
3、沒有limit會查詢更多的數據
4、警告!子查詢性能低下,請轉爲join表關聯
5、提示:in裏面的數值不要超過1000個
6、提示:採用join關聯,注意關聯字段要都加上索引,如on a.id=b.id
7、提示:MySQL對多表join關聯性能低下,建議不要超過3個表以上的關聯
8、警告!like '%%'雙百分號無法用到索引,like 'mysql%'這樣是可以利用到索引的
9、提示:默認情況下,MySQL對所有GROUP BY col1,col2...的字段進行排序。如果查詢包括GROUP BY,
想要避免排序結果的消耗,則可以指定ORDER BY NULL禁止排序。
10、警告!MySQL裏用到order by rand()在數據量比較多的時候是很慢的,因爲會導致MySQL全表掃描,故也不會用到索引
11、提示:是否要加一個having過濾下?
12、警告!禁止不必要的order by排序,因爲前面已經count統計了
13、警告!MySQL裏不支持函數索引,例DATE_FORMAT('create_time','%Y-%m-%d')='2016-01-01'是無法用到索引的,需要改寫爲
create_time>='2016-01-01 00:00:00' and create_time<='2016-01-01 23:59:59'

之後會調用美團網SQLAdvisor進行索引檢查


使用概述:

1.png

1、選中你的數據庫名字
2、在對話框中輸入你要提交的SQL
3、點擊提交審覈按鈕


2.png

提交以後,系統自動返回SQL優化改進意見。



  • insert審覈

檢查項:

1、警告: insert 表1 select 表2,會造成鎖表。

3.png

審覈通過以後,會彈出用戶名和密碼,提示上線:

4.png

點擊我要上線按鈕,會調用MySQL客戶端進行語法校驗和表是否存在等校驗。

5.png



  • update審覈

檢查項:

1、警告!沒有where條件,update會全表更新,禁止執行!!!
2、更新的行數小於10000行,可以由開發自助執行。否則請聯繫DBA執行!!!

6.png

7.png


防止where 1=1 繞過審覈規則

update5.png

必須寫真實的where條件纔可以執行更新操作。

上線成功的SQL會記錄到一張操作日誌表裏,並且會把binlog位置點記錄下來,方便日後的回滾操作。

QQ圖片20171223192835.png



  • create審覈

檢查項:

1、警告!表沒有主鍵
2、警告!表主鍵應該是自增的,缺少AUTO_INCREMENT
3、提示:id自增字段默認值爲1,auto_increment=1
4、警告!表沒有索引
5、警告!表中的索引數已經超過5個,索引是一把雙刃劍,它可以提高查詢效率但也會降低插入和更新的速度並佔用磁盤空間
6、警告!表字段沒有中文註釋,COMMENT應該有默認值,如COMMENT '姓名'
7、警告!表沒有中文註釋
8、警告!表缺少utf8字符集,否則會出現亂碼
9、警告!表存儲引擎應設置爲InnoDB
10、警告!表應該爲timestamp類型加默認系統當前時間

c1.png

c2.png

審覈通過後,就可以上線了

c3.png

上線失敗提示:

c4.png



  • alter審覈

檢查項:

1、警告!不支持create index語法,請更改爲alter table add index語法。
2、警告!更改表結構要減少與數據庫的交互次數,應改爲,例alter table t1 add index IX_uid(uid),add index IX_name(name)
3、表記錄小於100萬行,可以由開發自助執行。否則表太大請聯繫DBA執行!

a1.png

a2.png

4、支持刪除索引,但不支持刪除字段

alter4.png

——————————————————————————————————————

數據庫上線工單查詢(只記錄成功執行的SQL)

工單查詢.png


---------------------------------------------------------------------------------------------------

安裝部署,腳本代碼:

http://dbaplus.cn/news-155-1944-1.html


工具下載更新:
鏈接-https://pan.baidu.com/s/1eUct4Bo
1、修復了一些子查詢的bug。
2、首頁不用手工寫庫了,直接從dbinfo表裏獲取。
3、增加一個導航欄,超鏈接到工單查詢。

--------------------------------------------

增加主鍵字段名必須是id

修改sql_review.php

增加如下代碼:

if(!preg_match('/.*\bid\b.*int.*/',$multi_sql[$x])){
    echo "<big><font color=\"#FF0000\">警告!$parmArr[2]表主鍵字段名必須是id。</font></big></br>";
    $c++;
}


----------------------

2018-03-26更新

1、增加了用戶登錄頁面
2、提交SQL時多了一次確認彈窗

--------------
多增加
1、login_user.sql  用戶登錄驗證表

注:
客戶端版本使用mysql5.5或者mariadb10.X。
5.6會出現Warning: Using a password on the command line interface can be insecure,導致上線失敗。


腳本解釋
1、index.html(用戶登錄入口)
2、login.php(用戶密碼校驗)

https://pan.baidu.com/s/1TPNIEFp5-mpz3a1mGUsawg


-------------------------------------------

2018-04-12更新

1、增加上線統計頁面
2、增加規則
(1、主鍵必須是id
  2、用DECIMAL代替FLOAT和DOUBLE存儲精確浮點數
  3、應使用默認的字符>集覈對utf8_general_ci
  4、避免使用外鍵)

https://pan.baidu.com/s/1KKw9aMWa-9Q_8efaiQndMQ

-------------------------------------------

2018-04-27更新

1、增加人工確認審覈功能
上線流程爲:開發提交SQL,系統自動審覈(sql_review.php),審覈通過後生成我的工單待管理員批覆,管理員人工確認審覈通過後,開發點擊執行完成上線。


1、login_user.sql  用戶登錄驗證表(權限功能)
2、sql_order_wait.sql  工單待審覈生成表
3、dbinfo.sql(DB配置信息表)


腳本解釋
1、index.html(用戶登錄入口)
2、login.php(用戶密碼校驗)
3、main.php(首頁框架欄)
4、header.php(用戶登錄歡迎頁面,和註銷)
5、left.php(導航欄)
6、sql_interface.php(SQL傳參入口)
7、sql_review.php(SQL審覈)
8、my_order.php(查看我的工單,執行,撤銷)
9、wait_order.php(管理員人工批覆:通過,否決)
10、update.php(管理員審批確認)
11、update_status.php(修改審批狀態值)
12、execute.php(開發執行SQL工單)
13、execute_status.php(修改執行工單狀態)
14、cancel.php(開發自行撤銷工單)
15、cancel_status.php(修改撤銷工單狀態)
16、stat/show.html(工單動態統計圖表)
17、db_config.php(DB配置信息的IP、端口、用戶名、密碼、庫名)
18、sqladvisor_config.php(訪問SQLAdvisor服務器的IP、SSH端口、SSH用戶名、SSH密碼)

---------------------
注:
1、客戶端版本使用mysql5.5或者mariadb10.X。
5.6會出現Warning: Using a password on the command line interface can be insecure,導致上線失敗。

2、php文件裏的涉及連接數據庫的用戶名和密碼要修改,這塊沒有做成統一個DB配置文件調用。

https://pan.baidu.com/s/194zXrat-GLJa0AZu2KxebQ


 ---------------------

2018-05-04更新

1、增加發郵件給管理員審覈SQL工單功能
上線流程爲:開發提交SQL,系統自動審覈(sql_review.php),審覈通過後生成我的工單待管理員批覆並且發郵件通知,管理員人工確認審覈通過後,開發點擊執行完成上線。

腳本解釋
1、mail/mail.php(郵件配置信息--修改你自己的郵箱用戶名和密碼)
2、mail/sendEmail(開源郵件perl腳本)
3、sql_review.php(觸發發送郵件-覆蓋掉之前的舊文件)

https://pan.baidu.com/s/1abduiOMV8UguxfHCfBw5sg



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章