一、工具概述
SQL自動審核-自助上線平台,可以讓開發自上線,開發提交SQL后就會自動返回優化建議,無需DBA的再次審核,從而提升上線效率,有利於建立數據庫開發規范,讓DBA從日常繁瑣的工作中解放出來。
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\"}。
注:審核規則是根據我公司的情況制定而成,非Inception審核規則(只借鑒思路),使用時請注意!
其內部的原理,主要用正則表達式匹配規則實現。
二、功能實現
SELECT審核
-
開發人員可以直接將SQL語句提交到平台進行風險評估
-
平台對SQL語句進行分析,自動給出其不符合開發規范的改進意見
-
適用場景:應用開發階段
檢查項:
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'
14、之后會調用美團網SQLAdvisor進行索引檢查
INSERT審核
檢查項:
-
警告:insert 表1 select 表2,會造成鎖表。
UPDATE審核規則
1、警告!沒有where條件,update會全表更新,禁止執行!!!
2、更新的行數小於1000行,可以由開發自助執行。否則請聯系DBA執行!!!
3、防止where 1=1 繞過審核規則
4、檢查更新字段有無索引
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、支持刪除索引,但不支持刪除字段
具體演示,請移步
http://blog.51cto.com/hcymysql/2053798
三、安裝部署
環境安裝
1、PHP環境安裝
# yum install httpd php mysql php-mysql php-devel php-pear libssh2 libssh2-devel -y
2、安裝PHP SSH2擴展
pecl install -f ssh2
3、修改/etc/php.ini
在最后一行添加
extension=ssh2.so
4、關閉selinux
# vim /etc/selinux/config
SELINUX=disabled
5、美團網SQLAdvisor安裝
請移步
https://github.com/Meituan-Dianping/SQLAdvisor/blob/master/doc/QUICK_START.md
部署
將php-sqlreview.zip解壓縮到/var/www/html/目錄下
1、導入dbinfo.sql(DB配置信息表)和operation.sql(SQL工單記錄表)
2、修改db_config.php(DB配置信息的IP、端口、用戶名、密碼、庫名)
3、修改sqladvisor_config.php(訪問SQLAdvisor服務器的IP、SSH端口、SSH用戶名、SSH密碼)
4、修改sql_submit.php(記錄工單表的IP、端口、用戶名、密碼)和(調用mysql客戶端的IP、SSH端口、SSH用戶名、SSH密碼)
腳本解釋
1、index.html(SQL傳參入口)
2、sql_review.php(過審核規則)
3、sql_submit.php(通過后,SQL上線提交)
4、order.php(工單查詢-只記錄成功入庫的SQL)
5、order_result1.php(按照用戶名分頁搜索)
6、order_result2.php(按照時間范圍分頁搜索)
點擊此處【下載工具腳本】或登錄鏈接
https://pan.baidu.com/s/1eUct4Bo即可下載工具腳本
現通過DBAplus社群免費為大家提供SQL自動審核-自助上線平台的下載使用。若使用過程中有任何問題或建議可隨時與我們聯系,歡迎大家試用!