您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關(guān)如何使用Inception進(jìn)行MySQL自動化運維平臺建設(shè),小編覺得挺實用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
Inception是集審核、執(zhí)行、回滾于一體的一個自動化運維系統(tǒng),它是根據(jù)MySQL代碼修改過來的,用它可以很明確的,詳細(xì)的,準(zhǔn)確的審核MySQL的SQL語句,它的工作模式和MySQL完全相同,可以直接使用MySQL客戶端來連接,但不需要驗證權(quán)限,它相對應(yīng)用程序(上層審核流程系統(tǒng)等)而言,是一個服務(wù)器,在連接時需要指定服務(wù)器地址及Inception服務(wù)器的端口即可,而它相對要審核或執(zhí)行的語句所對應(yīng)的線上MySQL服務(wù)器來說,是一個客戶端,它在內(nèi)部需要實時的連接數(shù)據(jù)庫服務(wù)器來獲取所需要的信息,或者直接在在線上執(zhí)行相應(yīng)的語句及獲取binlog等,Inception就是一個中間性質(zhì)的服務(wù)。圖1.1所示為Inception的架構(gòu)。
Inception提供的功能很豐富,首先,它可以對提交的所有語句的語法分析,如果語法有問題,都會將相應(yīng)的錯誤信息返回給審核者。 還提供語義分析,當(dāng)一個表,庫,列等信息不正確或者不符合規(guī)范的時候報錯,或者使用了一個不存在的對象時報錯等等。 還提供了很多針對SQL規(guī)范性約束的功能,這些DBA都是可以通過系統(tǒng)參數(shù)來配置的。 更高級的功能是,可以輔助DBA分析一條查詢語句的性能,如果沒有使用索引或者某些原因?qū)е虏樵兒苈?,都可以檢查。
還提供SQL語句的執(zhí)行功能,可執(zhí)行的語句類型包括常用的DML及DDL語句及truncate table等操作。 Inception 在執(zhí)行 DML 時還提供生成回滾語句的功能,對應(yīng)的操作記錄及回滾語句會被存儲在備份機器上面,備份機器通過配置Inception參數(shù)來指定。
項目地址:https://github.com/mysql-inception/inception
文檔地址:http://mysql-inception.github.io/inception-document/inception
以下安裝是CentOS系統(tǒng),如果是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,執(zhí)行命令sh inception_build.sh
,會輸出使用方法。 實際上只需要執(zhí)行inception_build.sh debug [Xcode]
即可,后面的平臺是可選的,如果不指定就是linux平臺,而如果要指定是Xcode,就后面指定Xcode,而debug是編譯的目錄,編譯之后,所有的生成文件都在這個目錄下面,包括可執(zhí)行文件Inception??蓤?zhí)行文件在debug/sql/Debug/
目錄下面(不同平臺有可能不相同)。
1 2 | $ cd inception $ bash inception_build.sh debug [Xcode] |
順便強調(diào)說一下,實際上編譯Inception,和編譯MySQL源碼是一樣的,如果有不太了解的同學(xué),可以先在網(wǎng)上看看關(guān)于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執(zhí)行的功能,是通過調(diào)用pt-online-schema-change工具來做的,但如果Inception后臺啟動(&)的話,可能會導(dǎo)致pt-online-schema-change在執(zhí)行完成之后,長時間不返回,進(jìn)而導(dǎo)致Inception卡死的問題,這個問題官方后面會解決,但現(xiàn)階段請盡量不要使用后臺啟動的方式,或者可以使用nohup Inception &的方式來啟動。
啟動如果不報錯的話,說明已經(jīng)啟動成功了,實際上很難讓它報錯,因為非常輕量級。
啟動成功之后,可以簡單試一下看,通過MySQL客戶端
1 | $ mysql -uroot -h227.0.0.1 -P6669 |
登錄上去之后,再執(zhí)行一個命令:
1 | mysql> inception get variables; |
輸出了所有的變量,恭喜你,已經(jīng)啟動成功了,都說了非常簡單。
Inception實際上是一個服務(wù)程序,那么它應(yīng)該有自己的一套友好的使用方式,必須要具備簡單、高效、易用等特性。那么為了讓Inception具有這些特點,在設(shè)計之初,就規(guī)定了它的使用方式,如下所述。
通過Inception對語句進(jìn)行審核時,必須要告訴Inception這些語句對應(yīng)的數(shù)據(jù)庫地址、數(shù)據(jù)庫端口以及Inception連接數(shù)據(jù)庫時使用的用戶名、密碼等信息,而不能簡單的只是執(zhí)行一條sql語句,所以必須要通過某種方式將這些信息傳達(dá)給Inception。而我們選擇的方式是,為了不影響語句的意義,將這些必要信息都以注釋的方式放在語句最前面,也就是說所有這些信息都是被 /**/括起來的,每一個參數(shù)都是通過分號來分隔,類似的方式為:
1 | /*--user=username;--password=xxxx;--host=127.0.0.1;--port=3306;*/ |
當(dāng)然支持的參數(shù)不止是這幾個,后面還會介紹一些其它的參數(shù)。 Inception要做的是一個語句塊的審核,需要引入一個規(guī)則,將要執(zhí)行的語句包圍起來,Inception規(guī)定,在語句的最開始位置,要加上inception_magic_start;
語句,在執(zhí)行語句塊的最后加上inception_magic_commit;
語句,這2個語句在 Inception 中都是合法的、具有標(biāo)記性質(zhì)的可被正確解析的 SQL 語句。被包圍起來的所有需要審核或者執(zhí)行的語句都必須要在每條之后加上分號,其實就是批量執(zhí)行SQL語句。(包括 use database
語句之后也要加分號,這點與 MySQL 客戶端不同),不然存在語法錯誤。
在具體執(zhí)行時,在沒有解析到inception_magic_start之前如果發(fā)現(xiàn)要執(zhí)行其它的語句,則直接報錯,因為規(guī)則中inception_magic_start是強制的。而如果在執(zhí)行的語句塊最后沒有出現(xiàn)inception_magic_commit,則直接報錯,不會做任何操作。 在前面注釋部分,需要指定一些操作的選項,包括線上用戶名、密碼、數(shù)據(jù)庫地址、檢查/執(zhí)行等。下面是一個簡單的例子:
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; |
那么上面這一段就是一批正常可以執(zhí)行的SQL語句,目前執(zhí)行只支持通過C/C++接口、Python接口來對Inception訪問,這一段必須是一次性的通過執(zhí)行接口提交給Inception,那么在處理完成之后,Inception會返回一個結(jié)果集,來告訴我們這些語句中存在什么錯誤,或者是完全正常等等。
請不要將下面的SQL語句塊,放到MySQL客戶端中執(zhí)行,因為這是一個自動化運維工具,如果使用交互式的命令行來使用的話沒有意義,只能是通過寫程序來訪問Inception服務(wù)器。
而可以通過MySQL客戶端來執(zhí)行的,只有是Inception命令,請參考<<inception命令集語句>>一節(jié)。
下面是一段執(zhí)行上面語句的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]) |
執(zhí)行這段程序之后,返回的結(jié)果如下:
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'. | |
從返回結(jié)果可以看到,每一行語句的審核及執(zhí)行信息,最前面打印的是field_names,表示Inception的返回結(jié)果集的列名信息,總共包括十個列,下面是每個列對應(yīng)的結(jié)果,因為只有兩個語句,則只有兩行,從結(jié)果集第一個列看到只有序號為1和2的兩行,而對于每一個列的具體含義,這會在<<Inception結(jié)果集>>這一章中講到,這里只看清楚是什么內(nèi)容即可。
另外,Inception支持審核以及執(zhí)行語句,可以自行開啟或關(guān)閉,具體要看<<Inception選項>>。
更詳細(xì)內(nèi)容請看官網(wǎng),最后說一句,在這里感謝inception作者。
基于Inception的可視化web端sql審核平臺,Yearning SQL審計平臺基于Vue.js與Django的整套sql審核平臺解決方案,提供基于Inception的SQL檢測及執(zhí)行。
源碼地址:https://github.com/cookieY/Yearning
注意:
1,要做數(shù)據(jù)庫初始化 否則500
python3 manage.py makemigrations && python3 manage.py migrate 初始化數(shù)據(jù)庫 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相關(guān)源碼 修改$ 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 注:在安裝文件夾下有已經(jīng)修改的connections.py和cursors.py直接替換即可
以上就是如何使用Inception進(jìn)行MySQL自動化運維平臺建設(shè),小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降?。希望你能通過這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。