小米-DBA開(kāi)源Soar
soar加載數(shù)據(jù)庫(kù)配置文件
默認(rèn)文件會(huì)按照/etc/soar.yaml, ./etc/soar.yaml, ./soar.yaml順序加載扰藕,找到第一個(gè)后不再繼續(xù)加載后面的配置文件
常用命令
基本用法
echo "select title from sakila.film" | ./soar -log-output=soar.log
指定輸入源
# 從文件讀取SQL
./soar -query file.sql
# 從管道讀取SQL
cat file.sql | ./soar
指定配置文件
vi soar.yaml
# yaml format config file
online-dsn:
addr: 127.0.0.1:3306
schema: sakila
user: root
password: "1t'sB1g3rt"
disable: false
test-dsn:
addr: 127.0.0.1:3306
schema: sakila
user: root
password: "1t'sB1g3rt"
disable: false
echo "select title from sakila.film" | ./soar -test-dsn="root:1t'sB1g3rt@127.0.0.1:3306/sakila" -allow-online-as-test -log-output=soar.log
打印所有的啟發(fā)式規(guī)則
./soar -list-heuristic-rules
語(yǔ)法檢查工具
echo "select * from tb" | soar -only-syntax-check
echo $?
0
echo "select * frm tb" | soar -only-syntax-check
At SQL 1 : syntax error at position 13 near 'frm'
echo $?
1
慢日志進(jìn)行分析示例
pt-query-digest slow.log > slow.log.digest
# parse pt-query-digest's output which example script
python2.7 doc/example/digest_pt.py slow.log.digest > slow.md
SQL指紋
echo "select * from film where col='abc'" | soar -report-type=fingerprint
輸出
select * from film where col=?
將 UPDATE/DELETE/INSERT 語(yǔ)法轉(zhuǎn)為 SELECT
echo "update film set title = 'abc'" | soar -rewrite-rules dml2select,delimiter -report-type rewrite
輸出
select * from film;
合并多條ALTER語(yǔ)句
echo "alter table tb add column a int; alter table tb add column b int;" | soar -report-type rewrite -rewrite-rules mergealter
輸出
ALTER TABLE `tb` add column a int, add column b int ;
SQL美化
echo "select * from tbl where col = 'val'" | ./soar -report-type=pretty
輸出
SELECT
*
FROM
tbl
WHERE
col = 'val';
EXPLAIN信息分析報(bào)告
soar -report-type explain-digest << EOF
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
| 1 | SIMPLE | film | ALL | NULL | NULL | NULL | NULL | 1131 | |
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
EOF
## Explain信息
| id | select\_type | table | partitions | type | possible_keys | key | key\_len | ref | rows | filtered | scalability | Extra |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | SIMPLE | *film* | NULL | ALL | NULL | NULL | NULL | NULL | 0 | 0.00% | ?? **O(n)** | |
### Explain信息解讀
#### SelectType信息解讀
* **SIMPLE**: 簡(jiǎn)單SELECT(不使用UNION或子查詢(xún)等).
#### Type信息解讀
* ?? **ALL**: 最壞的情況, 從頭到尾全表掃描.
markdown 轉(zhuǎn) HTML
通過(guò)指定-report-css, -report-javascript, -markdown-extensions, -markdown-html-flags這些參數(shù),你還可以控制HTML的顯示格式甩栈。
cat test.md | soar -report-type md2html > test.html
清理測(cè)試環(huán)境殘余的臨時(shí)庫(kù)表
如配置了-drop-test-temporary=false
或soar
異常中止隘弊,-test-dsn
中會(huì)殘余以optimizer_
為前綴的臨時(shí)庫(kù)表。手工清理這些庫(kù)表可以使用如下命令送悔。
注意:為了不影響正在進(jìn)行的其他SQL評(píng)審慢显,-cleanup-test-database
中會(huì)刪除1小時(shí)前生成的臨時(shí)庫(kù)表爪模。
./soar -cleanup-test-database
SQL評(píng)分規(guī)則
不同類(lèi)型的建議指定的Severity不同,嚴(yán)重程度數(shù)字由低到高依次排序荚藻。滿(mǎn)分100分屋灌,扣到0分為止。
L0不扣分只給出建議应狱,L1扣5分共郭,L2扣10分,每級(jí)多扣5分以此類(lèi)推侦香。當(dāng)由時(shí)給出L1, L2兩要建議時(shí)
扣分疊加落塑,即扣15分。
注意:目前只有markdown和html兩種-report-type支持評(píng)分輸出顯示罐韩,其他輸出格式如有評(píng)分需求
可以按上述規(guī)則自行計(jì)算憾赁。