Inception安裝測試文檔

一、Inception介紹

  • Inception是由去哪兒團隊開發的一個集審覈、執行、備份及生成回滾語句於一身的MySQL自動化運維工具
  • MySQL語句的審覈,在業界都已經基本被認同了,實際上也是對MySQL語句寫法的統一化,標準化,而之前的人工審覈,針對標準這個問題其實是很吃力的,標準越多,DBA越累,開發也越累。那麼,在這個都追求自動化運維的時代,審覈也必須要跟上步伐,因此Inception誕生了。而Inception可以做的工作遠不止是一個自動化審覈工具,同時還具備執行,生成對影響數據的回滾語句(類似閃回的功能),這樣一條龍服務的工具,將會給DBA的工作帶來翻天覆地的變化,DBA從此就從繁重的審覈、登上去執行,出錯了很難回滾(如果提前沒有備份的話)的被動局面解放了出來,突然發現,做DBA原來可以這麼輕鬆,工作可以不飽和了,那就有更多的自由時間學習、進一步向自動化運維平臺的實現等更智能化的方向去發展,是具有里程碑意義的。


二、Inception安裝

安裝環境

  • CentOS release 6.5 (Final) 64位
  • 4核
  • 2G內存
  • 安裝了MySQL5.7.17

安裝前準備

準備好 安裝包依賴包
1
$ yum install gcc gcc-c++ cmake bison openssl-devel ncurses-devel

安裝步驟

1、解壓到安裝目錄
2、進入安裝目錄,執行安裝腳本
1
$ cd /usr/local/inception-master/
2
$ sh inception_build.sh  debug [linux]
或手動編譯安裝:
3、編輯配置文件
1
$ vim /etc/inc.cnf
2
3
[inception]
4
general_log=1
5
general_log_file=inc.log  //該文件在解壓文件目錄下
6
port=6669
7
socket=/tmp/inc.socket 
8
character-set-client-handshake=0
9
character-set-server=utf8 
10
inception_remote_system_password=123456
11
inception_remote_system_user=root
12
inception_remote_backup_port=3306
13
inception_remote_backup_host=127.0.0.1
14
inception_support_charset=utf8
15
inception_enable_nullable=0
16
inception_check_primary_key=1
17
inception_check_column_comment=1
18
inception_check_table_comment=1
19
inception_osc_min_table_size=1
20
inception_osc_bin_dir=/usr/bin
21
inception_osc_chunk_time=0.1
22
inception_ddl_support=1
23
inception_enable_blob_type=1
24
inception_check_column_default_value=1
4、啓動服務
5、登錄inception測試
1
$ mysql -uroot -h127.0.0.1 -P6669
2
mysql> inception get variables;
輸出變量則表明安裝成功

常見報錯

報錯1
解決辦法
1
$ make -j6 && make install
或手動編譯安裝


三、Inception測試

測試前準備

創建測試用戶inc
創建測試庫inception_test
1
mysql> create database inception_test;

Inception SQL審覈測試

1、建表語句

建表語句檢查項
  • 表屬性的檢查項
    • 這個表不存在
    • 對於create table like,會檢查like的老表是不是存在。
    • 對於create table db.table,會檢查db這個數據庫是不是存在
    • 表名、列名、索引名的長度不大於64個字節
    • 如果建立的是臨時表,則必須要以tmp爲前綴
    • 必須要指定建立innodb的存儲引擎(可配置)
    • 必須要指定utf8的字符集(字符串可配置,指定支持哪些字符集)
    • 表必須要有註釋(可配置)
    • 表不能建立爲分區表(可配置)
    • 只能有一個自增列
    • 索引名字不能是Primay
    • 不支持Foreign key(可配置)
    • 建表時,如果指定auto_increment的值不爲1,報錯(可配置)
    • 如果自增列的名字不爲id,說明有可能是有意義的,MySQL這樣使用比較危險,所以報警(可配置)
  • 列屬性的檢查項
    • 不能設置列的字符集(可配置)
    • 列的類型不能使用集合、枚舉、位圖類型。(可配置)
    • 列必須要有註釋(可配置)
    • char長度大於20的時候需要改爲varchar(長度可配置)
    • 列的類型不能是BLOB/TEXT。(可配置)
    • 每個列都使用not null(可配置)
    • 如果列爲BLOB/TEXT類型的,則這個列不能設置爲NOT NULL。
    • 如何是自增列,則使用無符號類型(可配置)
    • 如果自增列,則長度必須要大於等於4個字節(可配置)
    • 如果是timestamp類型的,則要必須指定默認值。
    • 對於MySQL5.5版本(包含)以下的數據庫,不能同時有兩個TIMESTAMP類型的列,如果是DATETIME類型,則不能定義成DATETIME DEFAULT CURRENT_TIMESTAMP及ON UPDATE CURRENT_TIMESTAMP等語句。
    • 每個列都需要定義默認值,除了自增列、主鍵列及大字段列之外(可配置)
    • 不能有重複的列名
  • 索引屬性檢查項
    • 索引必須要有名字
    • 不能有外鍵(可配置)
    • Unique索引必須要以uniq_爲前綴(可配置)
    • 普通索引必須要以idx_爲前綴(可配置)
    • 索引的列數不能超過5個(數目可以配置)
    • 表必須要有一個主鍵(可配置)
    • 最多有5個索引(數目可配置)
    • 建索引時,指定的列必須存在。
    • 索引中的列,不能重複
    • BLOB列不能建做KEY
    • 索引長度不能超過766
    • 不能有重複的索引,名字及內容
  • 默認值檢查項
    • BLOB/TEXT類型的列,不能有非NULL的默認值
    • MySQL5.5以下(含)的版本,對於DATETIME類型的列,不能有函數NOW()的默認值。
    • 如果設置默認值爲函數,則只能是NOW()。
    • 如果默認值爲NULL,但列類型爲NOT NULL,或者是主鍵列,或者定義爲自增列,則報錯。
    • 自增列不能設置默認值。
建表語句審覈測試
Python腳本 testa.py

審覈未通過
1
$ python testa.py 
2
['ID', 'stage', 'errlevel', 'stagestatus', 'errormessage', 'SQL', 'Affected_rows', 'sequence', 'backup_dbname', 'execute_time', 'sqlsha1']
3
1 | CHECKED | 0 | Audit completed | None | 2 | CHECKED | 1 | Audit completed | Set engine to innodb for table 'test1'.
4
Set charset to one of 'utf8mb4' for table 'test1'.
5
Set comments for table 'test1'.
6
Column 'id' in table 'test1' have no comments.
7
Column 'id' in table 'test1' is not allowed to been nullable.
8
Set Default value for column 'id' in table 'test1'
9
Set a primary key for table 'test1'. |

審覈通過


2、插入語句

插入語句檢查項
  • 表是否存在
  • 必須指定插入列表,也就是要對哪幾個列指定插入值,如insert into t (id,id2) values(...),(可配置)
  • 必須指定值列表,與上面對應的列,插入的值是什麼,必須要指定。
  • 插入列列表與值列表個數相同,上面二者的個數需要相同,如果沒有指定列列表(因爲可配置),則值列表長度要與表列數相同。
  • 不爲null的列,如果插入的值是null,報錯(可配置)
  • 插入指定的列名對應的列必須是存在的。
  • 插入指定的列列表中,同一個列不能出現多次。
  • 插入值列表中的簡單表達式會做檢查,但具體包括什麼不一一指定

插入語句審覈測試
Python腳本 testb.py
1
#/usr/bin/python
2
#-\*-coding: utf-8-\*-
3
import MySQLdb
4
sql='/*--user=inc;--password=;--host=192.168.127.128;--execute=1;--port=3306;*/\
5
inception_magic_start;\
6
use inception_test;\
7
insert into test2 values(1);\
8
inception_magic_commit;'
9
try:
10
    conn=MySQLdb.connect(host='192.168.127.129',user='test',passwd='123456',db='mysql',port=6669)
11
    cur=conn.cursor()
12
    ret=cur.execute(sql)
13
    result=cur.fetchall()
14
    num_fields = len(cur.description)
15
    field_names = [i[0] for i in cur.description]
16
    print field_names
17
    for row in result:
18
        print row[0], "|",row[1],"|",row[2],"|",row[3],"|",row[4],"|",
19
        row[5],"|",row[6],"|",row[7],"|",row[8],"|",row[9],"|",row[10]
20
    cur.close()
21
    conn.close()
22
except MySQLdb.Error,e:
23
     print "Mysql Error %d: %s" % (e.args[0], e.args[1])

審覈未通過

審覈通過
1
['ID', 'stage', 'errlevel', 'stagestatus', 'errormessage', 'SQL', 'Affected_rows', 'sequence', 'backup_dbname', 'execute_time', 'sqlsha1']
2
1 | RERUN | 0 | Execute Successfully | None | 2 | EXECUTED | 2 | Execute Successfully
3
Backup failed | Backup: Access denied for user 'wzf1'@'localhost' (using password: YES)
4
Backup: Access denied for user 'wzf1'@'localhost' (using password: YES) |

3、更新、刪除語句

更新、刪除語句檢查項
  • 表是否存在
  • 必須有where條件(可配置)
  • delete語句不能有limit條件(可配置)
  • 不能有order by語句(可配置)
  • 影響行數大於10000條,則報警(數目可配置)
  • 對WHERE條件這個表達式做簡單檢查,具體包括什麼不一一指定
  • 對更新列的值列表表達式做簡單檢查,具體不一一指定
  • 對更新列對象做簡單檢查,主要檢查列是不是存在等
  • 多表更新、刪除時,每個表必須要存在

更新語句審覈測試
Python腳本 testc.py
相關文章
相關標籤/搜索