MySQL自動化運維工具Inception
一、Inception簡介
Inception是集審覈、執行、回滾於一體的一個自動化運維繫統,它是根據MySQL代碼修改過來的,用它可以很明確的,詳細的,準確的審覈MySQL的SQL語句,它的工作模式和MySQL完全相同,可以直接使用MySQL客戶端來連接,但不需要驗證權限,它相對應用程序(上層審覈流程系統等)而言,是一個服務器,在連接時需要指定服務器地址及Inception服務器的端口即可,而它相對要審覈或執行的語句所對應的線上MySQL服務器來說,是一個客戶端,它在內部需要實時的連接數據庫服務器來獲取所需要的信息,或者直接在在線上執行相應的語句及獲取binlog等,Inception就是一箇中間性質的服務。圖1.1所示爲Inception的架構。
Inception提供的功能很豐富,首先,它可以對提交的所有語句的語法分析,如果語法有問題,都會將相應的錯誤信息返回給審覈者。 還提供語義分析,當一個表,庫,列等信息不正確或者不符合規範的時候報錯,或者使用了一個不存在的對象時報錯等等。 還提供了很多針對SQL規範性約束的功能,這些DBA都是可以通過系統參數來配置的。 更高級的功能是,可以輔助DBA分析一條查詢語句的性能,如果沒有使用索引或者某些原因導致查詢很慢,都可以檢查。
還提供SQL語句的執行功能,可執行的語句類型包括常用的DML及DDL語句及truncate table等操作。 Inception 在執行 DML 時還提供生成回滾語句的功能,對應的操作記錄及回滾語句會被存儲在備份機器上面,備份機器通過配置Inception參數來指定。
項目地址:https://github.com/mysql-inception/inception
文檔地址:http://mysql-inception.github.io/inception-document/inception
二、Inception安裝
以下安裝是CentOS系統,如果是Ubuntu/Debian請看官方文檔。
2.1 Git下載源碼包
1 | $ git clone https://github.com/mysql-inception/inception.git |
2.2 安裝依賴包
1 | $ yum install gcc gcc-c++ cmake bison openssl-devel ncurses-devel MySQL-python –y |
2.3 開始編譯安裝
首先就是編譯,在源碼根目錄下面有一個文件inception_build.sh,執行命令sh inception_build.sh
,會輸出使用方法。 實際上只需要執行inception_build.sh debug [Xcode]
即可,後面的平臺是可選的,如果不指定就是linux平臺,而如果要指定是Xcode,就後面指定Xcode,而debug是編譯的目錄,編譯之後,所有的生成文件都在這個目錄下面,包括可執行文件Inception。可執行文件在debug/sql/Debug/
目錄下面(不同平臺有可能不相同)。
1 2 | $ cd inception $ bash inception_build.sh debug [Xcode] |
順便強調說一下,實際上編譯Inception,和編譯MySQL源碼是一樣的,如果有不太瞭解的同學,可以先在網上看看關於MySQL源碼的編譯,我想遇到的問題都可以解決。
編譯完成之後,就是使用了,那麼需要一個配置文件(inc.cnf):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | $ cat /etc/inc.cnf [inception] general_log=1 general_log_file=inception.log port=6669 socket=/tmp/inc.socket character-set-client-handshake=0 character-set-server=utf8 inception_remote_system_password=root inception_remote_system_user=wzf1 inception_remote_backup_port=3306 inception_remote_backup_host=127.0.0.1 inception_support_charset=utf8mb4 inception_enable_nullable=0 inception_check_primary_key=1 inception_check_column_comment=1 inception_check_table_comment=1 inception_osc_min_table_size=1 inception_osc_bin_dir=/data/temp inception_osc_chunk_time=0.1 inception_enable_blob_type=1 inception_check_column_default_value=1 |
2.4 啓動Inception程序
啓動方式和MySQL是一樣的。
1 | $ nohup /data/inception/debug/mysql/bin/Inception --defaults-file=/etc/inc.cnf & |
注意:因爲Inception支持OSC執行的功能,是通過調用pt-online-schema-change工具來做的,但如果Inception後臺啓動(&)的話,可能會導致pt-online-schema-change在執行完成之後,長時間不返回,進而導致Inception卡死的問題,這個問題官方後面會解決,但現階段請儘量不要使用後臺啓動的方式,或者可以使用nohup Inception &的方式來啓動。
啓動如果不報錯的話,說明已經啓動成功了,實際上很難讓它報錯,因爲非常輕量級。
啓動成功之後,可以簡單試一下看,通過MySQL客戶端
1 | $ mysql -uroot -h127.0.0.1 -P6669 |
登錄上去之後,再執行一個命令:
1 | mysql> inception get variables; |
輸出了所有的變量,恭喜你,已經啓動成功了,都說了非常簡單。
三、Inception使用
Inception實際上是一個服務程序,那麼它應該有自己的一套友好的使用方式,必須要具備簡單、高效、易用等特性。那麼爲了讓Inception具有這些特點,在設計之初,就規定了它的使用方式,如下所述。
通過Inception對語句進行審覈時,必須要告訴Inception這些語句對應的數據庫地址、數據庫端口以及Inception連接數據庫時使用的用戶名、密碼等信息,而不能簡單的只是執行一條sql語句,所以必須要通過某種方式將這些信息傳達給Inception。而我們選擇的方式是,爲了不影響語句的意義,將這些必要信息都以註釋的方式放在語句最前面,也就是說所有這些信息都是被 /**/括起來的,每一個參數都是通過分號來分隔,類似的方式爲:
1 | /*--user=username;--password=xxxx;--host=127.0.0.1;--port=3306;*/ |
當然支持的參數不止是這幾個,後面還會介紹一些其它的參數。 Inception要做的是一個語句塊的審覈,需要引入一個規則,將要執行的語句包圍起來,Inception規定,在語句的最開始位置,要加上inception_magic_start;
語句,在執行語句塊的最後加上inception_magic_commit;
語句,這2個語句在 Inception 中都是合法的、具有標記性質的可被正確解析的 SQL 語句。被包圍起來的所有需要審覈或者執行的語句都必須要在每條之後加上分號,其實就是批量執行SQL語句。(包括 use database
語句之後也要加分號,這點與 MySQL 客戶端不同),不然存在語法錯誤。
在具體執行時,在沒有解析到inception_magic_start之前如果發現要執行其它的語句,則直接報錯,因爲規則中inception_magic_start是強制的。而如果在執行的語句塊最後沒有出現inception_magic_commit,則直接報錯,不會做任何操作。 在前面註釋部分,需要指定一些操作的選項,包括線上用戶名、密碼、數據庫地址、檢查/執行等。下面是一個簡單的例子:
1 2 3 4 5 6 | /*--user=zhufeng;--password=xxxxxxxxxxx;--host=xxxxxxxxxx; --enable-check;--port=3456;*/ inception_magic_start; use mysql; CREATE TABLE adaptive_office(id int); inception_magic_commit; |
那麼上面這一段就是一批正常可以執行的SQL語句,目前執行只支持通過C/C++接口、Python接口來對Inception訪問,這一段必須是一次性的通過執行接口提交給Inception,那麼在處理完成之後,Inception會返回一個結果集,來告訴我們這些語句中存在什麼錯誤,或者是完全正常等等。
請不要將下面的SQL語句塊,放到MySQL客戶端中執行,因爲這是一個自動化運維工具,如果使用交互式的命令行來使用的話沒有意義,只能是通過寫程序來訪問Inception服務器。
而可以通過MySQL客戶端來執行的,只有是Inception命令,請參考<<inception命令集語句>>一節。
下面是一段執行上面語句的Python程序的例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | #!/usr/bin/python #-\*-coding: utf-8-\*- import MySQLdb sql='/*--user=root;--password=123456;--host=172.17.0.2;--execute=1;--port=3306;*/\ inception_magic_start;\ create database if not exists test charset utf8mb4;\ use test;\ CREATE TABLE adaptive_office(id int);\ inception_magic_commit;' try: conn=MySQLdb.connect(host='127.0.0.1',user='',passwd='',db='',port=6669) cur=conn.cursor() ret=cur.execute(sql) result=cur.fetchall() num_fields = len(cur.description) field_names = [i[0] for i in cur.description] print field_names for row in result: print row[0], "|",row[1],"|",row[2],"|",row[3],"|",row[4],"|", row[5],"|",row[6],"|",row[7],"|",row[8],"|",row[9],"|",row[10] cur.close() conn.close() except MySQLdb.Error,e: print "Mysql Error %d: %s" % (e.args[0], e.args[1]) |
執行這段程序之後,返回的結果如下:
1 2 3 4 5 6 7 8 | ['ID', 'stage', 'errlevel', 'stagestatus', 'errormessage', 'SQL', 'Affected_rows', 'sequence', 'backup_dbname', 'execute_time', 'sqlsha1'] 1 | CHECKED | 0 | Audit completed | None | 2 | CHECKED | 0 | Audit completed | None | 3 | CHECKED | 1 | Audit completed | Set engine to innodb for table 'adaptive_office'. Set charset to one of 'utf8mb4' for table 'adaptive_office'. Set comments for table 'adaptive_office'. Column 'id' in table 'adaptive_office' have no comments. Column 'id' in table 'adaptive_office' is not allowed to been nullable. Set Default value for column 'id' in table 'adaptive_office' Set a primary key for table 'adaptive_office'. | |
從返回結果可以看到,每一行語句的審覈及執行信息,最前面打印的是field_names,表示Inception的返回結果集的列名信息,總共包括十個列,下面是每個列對應的結果,因爲只有兩個語句,則只有兩行,從結果集第一個列看到只有序號爲1和2的兩行,而對於每一個列的具體含義,這會在<<Inception結果集>>這一章中講到,這裏只看清楚是什麼內容即可。
另外,Inception支持審覈以及執行語句,可以自行開啓或關閉,具體要看<<Inception選項>>。
更詳細內容請看官網,最後說一句,在這裏感謝inception作者。
四、Yearning介紹
基於Inception的可視化web端sql審覈平臺,Yearning SQL審計平臺基於Vue.js與Django的整套sql審覈平臺解決方案,提供基於Inception的SQL檢測及執行。
源碼地址:https://github.com/cookieY/Yearning
注意:
1,要做數據庫初始化 否則500
python3 manage.py makemigrations && python3 manage.py migrate 初始化數據庫 echo "from core.models import Account;Account.objects.create_user(username='admin', password='Yearning_admin', group='admin',is_staff=1)" | python3 manage.py shell 添加初始化用戶
2,要修改配置文件支持pymysql
由於Inception並不支持pymysql,所以需要更改pymysql相關源碼 修改$ PYTHON_HOME / lib / python3.6 / site-packages / pymysql下 connections.py和cursors.py兩個文件 找到connections.py 1108行 if int(self.server_version.split('.', 1)[0]) >= 5: self.client_flag |= CLIENT.MULTI_RESULTS 更改爲 try: if int(self.server_version.split('.', 1)[0]) >= 5: self.client_flag |= CLIENT.MULTI_RESULTS except: if self.server_version.split('.', 1)[0] >= 'Inception2': self.client_flag |= CLIENT.MULTI_RESULTS 找到cursors.py 345行 if self._result and (self._result.has_next or not self._result.warning_count): return 更改爲 if self._result: return 注:在安裝文件夾下有已經修改的connections.py和cursors.py直接替換即可
這個項目在2018年1月份一出來就很快進入大家的視線,目前有QQ官方羣,並且作者會持續更新,更多內容看官網。