爲了讓DBA從日常繁瑣的工作中解放出來,通過SQL自助平臺,可以讓開發自上線,開發提交SQL後就會自動返回優化建議,無需DBA的再次審覈,從而提升上線效率,有利於建立數據庫開發規範。
借鑑了去哪網Inception的思路並且把美團網SQLAdvisor(索引優化建議)集成在一起,並結合了之前寫的《DBA的40條軍規》納入了審覈規則裏,用PHP實現。目前在我公司內部使用。
SQL自動審覈主要完成兩方面目的:
1、避免性能太差的SQL進入生產系統,導致整體性能降低。
2、檢查開發設計的索引是否合理,是否需要添加索引。
思路其實很簡單:
1、獲取開發提交的SQL
2、對要執行的SQL做分析,觸碰事先定義好的規則來判斷這個SQL是否可以自動審覈通過,未通過審覈的需要人工處理。
下面是首頁界面:
使用說明:
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、選中你的數據庫名字
2、在對話框中輸入你要提交的SQL
3、點擊提交審覈按鈕
提交以後,系統自動返回SQL優化改進意見。
insert審覈
檢查項:
1、警告: insert 表1 select 表2,會造成鎖表。
審覈通過以後,會彈出用戶名和密碼,提示上線:
點擊我要上線按鈕,會調用MySQL客戶端進行語法校驗和表是否存在等校驗。
update審覈
檢查項:
1、警告!沒有where條件,update會全表更新,禁止執行!!! 2、更新的行數小於10000行,可以由開發自助執行。否則請聯繫DBA執行!!!
防止where 1=1 繞過審覈規則
必須寫真實的where條件纔可以執行更新操作。
上線成功的SQL會記錄到一張操作日誌表裏,並且會把binlog位置點記錄下來,方便日後的回滾操作。
create審覈
檢查項:
1、警告!表沒有主鍵 2、警告!表主鍵應該是自增的,缺少AUTO_INCREMENT 3、提示:id自增字段默認值爲1,auto_increment=1 4、警告!表沒有索引 5、警告!表中的索引數已經超過5個,索引是一把雙刃劍,它可以提高查詢效率但也會降低插入和更新的速度並佔用磁盤空間 6、警告!表字段沒有中文註釋,COMMENT應該有默認值,如COMMENT '姓名' 7、警告!表沒有中文註釋 8、警告!表缺少utf8字符集,否則會出現亂碼 9、警告!表存儲引擎應設置爲InnoDB 10、警告!表應該爲timestamp類型加默認系統當前時間
審覈通過後,就可以上線了
上線失敗提示:
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執行!
4、支持刪除索引,但不支持刪除字段
——————————————————————————————————————
數據庫上線工單查詢(只記錄成功執行的SQL)
---------------------------------------------------------------------------------------------------
安裝部署,腳本代碼:
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