您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關如何使用Inception進行MySQL自動化運維平臺建設,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
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
以下安裝是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 -h227.0.0.1 -P6669 |
登錄上去之后,再執行一個命令:
1 | mysql> inception get variables; |
輸出了所有的變量,恭喜你,已經啟動成功了,都說了非常簡單。
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作者。
基于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直接替換即可
以上就是如何使用Inception進行MySQL自動化運維平臺建設,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。