Inception相關功能學習

jx_yu發表於2016-06-17

開源地址      文件地址      http://mysql-inception.github.io/inception-document/

Inception安裝

下載解壓

]$wget

]$pwd

/inception

]$unzip inception-master.zip

安裝Inception

]$ cd /inception/inception-master/

#執行如下命令,可以看到安裝幫助

]$ sh inception_build.sh

Usage: inception_build.sh builddir [platform(linux:Xcode)]

EXAPMLE: inception_build.sh debug [Xcode]

#安裝到./yk目錄

]$ sh inception_build.sh yk

#說明:

1.inception_build.sh實際上封裝了cmake && make && make install編譯安裝的步驟

2.buliddir是安裝目錄,platform是所在平臺(預設linux

3.每次如果出錯之後,需要把編譯目錄刪除掉,重新執行,不然會執行出錯。

4.編譯過程沒有err那說明安裝成功了

配置Inception

#MySQL型別,可以指定一個cnf配置檔案

]$ vim /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服務,更多的配置選項請參考文件

啟動Inception

]$ cd /inception/inception-master/yk/mysql/bin

]$ nohup /Inception --defaults-file=/etc/inc.cnf &

]$ netstat -antpl|grep 6669

tcp        0      0 0.0.0.0:6669       0.0.0.0:*          LISTEN      4598/Inception   

至此,可以看到inception6669埠已經執行

連線Inception

]$ mysql -h127.0.0.1 -P6669

Welcome to the MySQL monitor.  Commands end with ; or \g.

Your MySQL connection id is 2

Server version: Inception2.1.23 1

……………………..

mysql>  inception get variables; #獲取inception所有的變數和值

+------------------------------------------+----------------------------------------------------------+

| Variable_name             | Value                               |

+------------------------------------------+----------------------------------------------------------+

| autocommit               | OFF                                 |

| bind_address              | *                                   |

| character_set_system       | utf8                                 |

………………..

Inception簡單使用

1、  Inception規定,在語句的最開始位置,要加上inception_magic_start;語句,在執行語句塊的最後加上inception_magic_commit;語句,這2個語句在 Inception 中都是合法的、具有標記性質的可被正確解析的 SQL 語句。被包圍起來的所有需要稽核或者執行的語句都必須要在每條之後加上分號,其實就是批次執行SQL語句。(包括use database語句之後也要加分號,這點與 MySQL 客戶端不同),不然存在語法錯誤

2、  目前執行只支援透過C/C++介面、Python介面來對Inception訪問,這一段必須是一次性的透過執行介面提交給Inception,那麼在處理完成之後,Inception會返回一個結果集,來告訴我們這些語句中存在什麼錯誤,或者是完全正常等等

 

如下

/*--user=yujx;--password=xxxxxxxxxxx;--host=127.0.0.1;--enable-check;--port=3306;*/ 

inception_magic_start; 

use test; 

CREATE TABLE yujx(id int); 

inception_magic_commit;

下面是一段執行上面語句的Python程式的例子:

]$ cat inc-mysql.py

#!/usr/bin/env python

#coding=utf8

import MySQLdb

sql='''/*--user=yujx;--password=yujx;--host=127.0.0.1;--execute=1;--port=3306;*/\

    inception_magic_start;\

    use test;\

    CREATE TABLE yujx(id int comment 'test' primary key) engine=innodb DEFAULT CHARSET=utf8mb4 comment '測試';\

    inception_magic_commit;'''

#print sql

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])

當建立表語句為

CREATE TABLE yujx(id int)

]$ python inc-mysql.py

['ID', 'stage', 'errlevel', 'stagestatus', 'errormessage', 'SQL', 'Affected_rows', 'sequence', 'backup_dbname', 'execute_time', 'sqlsha1']

1 | CHECKED | 0 | Audit completed | None | use test | 0 | '0_0_0' | None | 0 |

2 | CHECKED | 1 | Audit completed | Set engine to innodb for table 'yujx'.

Set charset to one of 'utf8mb4' for table 'yujx'.

Set comments for table 'yujx'.

Column 'id' in table 'yujx' have no comments.

Column 'id' in table 'yujx' is not allowed to been nullable.

Set Default value for column 'id' in table 'yujx'

Set a primary key for table 'yujx'. | CREATE TABLE yujx(id int) | 0 | '0_0_1' | 127_0_0_1_3306_test | 0 |

CREATE TABLE yujx(id int) engine=innodb;

]$ python inc-mysql.py

['ID', 'stage', 'errlevel', 'stagestatus', 'errormessage', 'SQL', 'Affected_rows', 'sequence', 'backup_dbname', 'execute_time', 'sqlsha1']

1 | CHECKED | 0 | Audit completed | None | use test | 0 | '0_0_0' | None | 0 |

2 | CHECKED | 1 | Audit completed | Set charset to one of 'utf8mb4' for table 'yujx'.

Set comments for table 'yujx'.

Column 'id' in table 'yujx' have no comments.

Column 'id' in table 'yujx' is not allowed to been nullable.

Set Default value for column 'id' in table 'yujx'

Set a primary key for table 'yujx'. | CREATE TABLE yujx(id int) engine=innodb | 0 | '0_0_1' | 127_0_0_1_3306_test | 0 |

以此類推,直到如下完整的建立語句時,終於成功

CREATE TABLE yujx(id int comment 'test' primary key) engine=innodb DEFAULT CHARSET=utf8mb4 comment '測試'

]$ python inc-mysql.py

['ID', 'stage', 'errlevel', 'stagestatus', 'errormessage', 'SQL', 'Affected_rows', 'sequence', 'backup_dbname', 'execute_time', 'sqlsha1']

1 | RERUN | 0 | Execute Successfully | None | use test | 0 | '1464252128_35_0' | None | 0.000 |

2 | EXECUTED | 0 | Execute Successfully | None | CREATE TABLE yujx(id int comment 'test' primary key) engine=innodb DEFAULT CHARSET=utf8mb4 comment '測試' | 0 | '1464252128_35_1' | 127_0_0_1_3306_test | 0.010 |

如上,是預設的inception稽核規則,使用者可以根據自己的實際情況來自定義某些規則

Inception操作LOG

]$ tail -f /inception/inception-master/yk/mysql/bin/inception.log     

                   24 Query     /*--user=yujx;--password=yujx;--host=127.0.0.1;--execute=1;--port=3306;*/    inception_magic_start;    use test;    CREATE TABLE yujx(id int) engine=innodb;    inception_magic_commit

 

160526 16:42:08    25 Query     set autocommit=0

 

                   25 Query     /*--user=yujx;--password=yujx;--host=127.0.0.1;--execute=1;--port=3306;*/    inception_magic_start;    use test;    CREATE TABLE yujx(id int comment 'test' primary key) engine=innodb DEFAULT CHARSET=utf8mb4 comment '測試';    inception_magic_commit

 

160526 17:13:50    26 Query     select @@version_comment limit 1

 

160526 17:13:54    26 Query     inception get variables

Inception所支援的引數變數

參考:http://mysql-inception.github.io/inception-document/variables/

Inception備份功能

相關說明

Inception在做DML操作時,具有備份功能,它會將所有當前語句修改的行備份下來,儲存到一個指定的庫中,這些庫的指定需要透過幾個引數,它們分別是:

inception_remote_backup_host //遠端備份庫的host

inception_remote_backup_port //遠端備份庫的port

inception_remote_system_user //遠端備份庫的一個使用者

inception_remote_system_password //上面使用者的密碼

1.這些引數可以直接在命令列中指定,也可以在inc.cnf配置檔案中指定。修改這些引數需要重啟inception服務。

2.Inception預設是開啟備份功能的,可以使用引數--disable-remote-backup=1來關閉備份功能

3.被影響的表如果沒有主鍵的話,就不會做備份

4.Inception備份使用者必須要具備CREATEINSERTCREATE許可權用於建立表或者庫的,INSERT許可權用於插入備份資料的,其它的許可權不需要(也許是暫時的)

5.備份資料在備份機器的儲存,是與線上被修改庫一對一的。但因為機器的多(線上機器有很多)對一(備份機器只有一臺),所以為了防止庫名的衝突,備份機器的庫名組成是由線上機器的 IP 地址的點換成下劃線,再加上埠號,再加上庫名三部分,這三部分也是透過下劃線連線起來的,如:10_103_11_242_3306_test

6.對線上配置需求

線上伺服器必須要開啟 binlog,在啟動時需要設定引數log_binlog_bin_index等關於 binlog 的引數。不然不會備份及生成回滾語句。

引數binlog_format必須要設定為 mixed 或者 row 模式,透過語句: set global binlog_format=mixed/row 來設定,如果是 statement 模式,則不做備份及回滾語句的生成。

引數 server_id 必須要設定為非0及非1,透過語句:set global server_id=server_id;來設定,不然在備份時會報錯。

線上伺服器一定要有指定使用者名稱的許可權,這個是在語句前面的註釋中指定的,做什麼操作就要有什麼許可權,否則還是會報錯,如果需要執行的功能,則要有線上執行語句的許可權,比如DDLDML,同時如果要執行inception show 等遠端命令的話,有些語句是需要特殊許可權的,這些許可權也是需要授予的,關於許可權這個問題,因為一般Inception是執行在一臺固定機器上面的,那麼在選項中指定的使用者名稱密碼,實際上是Inception機器對線上資料庫訪問的許可權,所以建議在使用過程中,使用專門固定的帳號來讓Inception使用,最好是一個只讀一個可寫的即可,這樣在執行時用可寫,稽核或者檢視線上狀態或者表庫結果時用只讀即可,這樣更安全。

需要額外注意的點

在執行時,不能將 DML 語句及 DDL 語句放在一起執行,否則會因為備份解析binlog時由於表結構的變化出現不可預知的錯誤,如果要有同時執行 DML DDL,則請分開多個語句塊兒來執行,如果真的這樣做了,Inception 會報錯,不會去執行。

備份功能試驗

備份伺服器建立bakcup賬號並且grant許可權

#由於測試環境就開all許可權了

mysql> grant all on *.* to 'backup'@'%' identified by 'backup';

mysql> flush privileges;

指定備份伺服器資訊

]$ grep remote /etc/inc.cnf

inception_remote_system_password=backup

inception_remote_system_user=backup

inception_remote_backup_port=3306

inception_remote_backup_host=10.10.69.241

重啟inception

]$Kill -9 inception_pid

]$ nohup /Inception --defaults-file=/etc/inc.cnf &

確保線上目標庫binlog開啟&&binlog_format

mysql> show variables like 'log_bin';        

+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| log_bin       | ON    |

+---------------+-------+

1 row in set (0.00 sec)

 

mysql> show variables like 'binlog_format';       

+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| binlog_format | ROW   |

+---------------+-------+

1 row in set (0.00 sec)

呼叫inception操作目標庫

]$ python inc-mysql.py

['ID', 'stage', 'errlevel', 'stagestatus', 'errormessage', 'SQL', 'Affected_rows', 'sequence', 'backup_dbname', 'execute_time', 'sqlsha1']

1 | RERUN | 0 | Execute Successfully | None | use test | 0 | '1464320865_11_0' | None | 0.000 |

2 | EXECUTED | 0 | Execute Successfully

Backup successfully | None | CREATE TABLE yujx(id int comment 'test' primary key) engine=innodb DEFAULT CHARSET=utf8mb4 comment '測試' | 0 | '1464320865_11_1' | 127_0_0_1_3306_test | 0.010 |

檢視備份庫

#如下,備份庫多出了2db:inceptionIP_PORT_DBNAME

mysql> show databases;

+---------------------+

| Database            |

+---------------------+

| information_schema  |

| 127_0_0_1_3306_test |

| inception           |

| mysql               |

| performance_schema  |

| test                |

+---------------------+

#inception.statistic表儲存的就是SQL執行數目的統計資料

參考http://mysql-inception.github.io/inception-document/statistic/

clip_image002

#IP_PORT_dbname庫下表中記錄了對應的rollback操作

clip_image004

除了與原庫中的表一一對應之外,每個備份庫中還有另外一個表:$_$Inception_backup_information$_$,這就是表名,非常難看,主要是為了防止與原線上庫中的表名發生衝突。這個表是用來儲存所有對當前庫操作的操作記錄的,它是公用的,對線上這個庫的所有表操作記錄都儲存在這裡面

參考連結http://mysql-inception.github.io/inception-document/backup/

Inception OSC功能

參考:http://mysql-inception.github.io/inception-document/osc/

配置PT-osc的路徑

]$ which pt-online-schema-change

/usr/bin/pt-online-schema-change

]$ grep bin_dir /etc/inc.cnf   

inception_osc_bin_dir=/usr/bin/pt-online-schema-change

設定osc相關選項

]$ grep osc inc-mysql-osc.py

inception set session inception_osc_recursion_method=none;

inception set session inception_osc_alter_foreign_keys_method=0;

inception set session inception_osc_min_table_size=1; #設定表大小超過此引數的值時,inception呼叫osc工具alter

執行inception呼叫pt-osc

]$ python inc-mysql-osc.py

['ID', 'stage', 'errlevel', 'stagestatus', 'errormessage', 'SQL', 'Affected_rows', 'sequence', 'backup_dbname', 'execute_time', 'sqlsha1']

1 | RERUN | 0 | Execute Successfully | None | use test | 0 | '1464335578_270_0' | None | 0.000 |

2 | EXECUTED | 0 | Execute Successfully

Backup successfully | None | alter table test add a int not null default 0 comment 'a欄位' | 1 | '1464335727_270_1' | 127_0_0_1_3306_test | 149.880 | *8388D07BAD14866D80DD45CD1521F4F0D17C20CE

檢視osc的進度

#檢視osc列表

mysql> inception get osc processlist;

#由上面的processlist可以看到正在執行的osc任務對應的SQLSHA1值,然後使用下方命令可以檢視指定的一條osc任務進度

mysql> inception get osc_percent '*8388D07BAD14866D80DD45CD1521F4F0D17C20CE';

+--------+-----------+-------------------------------------------+---------+------------+-----------------------------------

| DBNAME | TABLENAME | SQLSHA1                                   | PERCENT | REMAINTIME | INFOMATION                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      

+--------+-----------+-------------------------------------------+---------+------------+----------------------------------------------------------------------------------------| test   | test      | *8388D07BAD14866D80DD45CD1521F4F0D17C20CE |      92 | 00:11      | Operation, tries, wait:

  copy_rows, 10, 0.25

  create_triggers, 10, 1

  drop_triggers, 10, 1

  swap_tables, 10, 1

  update_foreign_keys, 10, 1

No foreign keys reference `test`.`test`; ignoring --alter-foreign-keys-method.

Altering `test`.`test`...

Creating new table...

CREATE TABLE `test`.`_test_new` (  `x` int(11) DEFAULT NULL,

  `y` int(11) DEFAULT NULL,

  `z` int(11) NOT NULL AUTO_INCREMENT,

  PRIMARY KEY (`z`)

) ENGINE=InnoDB AUTO_INCREMENT=6488605 DEFAULT CHARSET=latin1

Created new table test._test_new OK.

Altering new table...

ALTER TABLE `test`.`_test_new` add a int not null default 0 comment 'a?-???μ'

Altered `test`.`_test_new` OK.

Creating triggers...

CREATE TRIGGER `pt_osc_test_test_del` AFTER DELETE ON `test`.`test` FOR EACH ROW DELETE IGNORE FROM `test`.`_test_new` WHERE `test`.`_test_new`.`z` <=> OLD.`z`

CREATE TRIGGER `pt_osc_test_test_upd` AFTER UPDATE ON `test`.`test` FOR EACH ROW REPLACE INTO `test`.`_test_new` (`x`, `y`, `z`) VALUES (NEW.`x`, NEW.`y`, NEW.`z`)

CREATE TRIGGER `pt_osc_test_test_ins` AFTER INSERT ON `test`.`test` FOR EACH ROW REPLACE INTO `test`.`_test_new` (`x`, `y`, `z`) VALUES (NEW.`x`, NEW.`y`, NEW.`z`)

Created triggers OK.

INSERT LOW_PRIORITY IGNORE INTO `test`.`_test_new` (`x`, `y`, `z`) SELECT `x`, `y`, `z` FROM `test`.`test` FORCE INDEX(`PRIMARY`) WHERE ((`z` >= ?)) AND ((`z` <= ?)) LOCK IN SHARE MODE /*pt-online-schema-change 12934 copy nibble*/

SELECT /*!40001 SQL_NO_CACHE */ `z` FROM `test`.`test` FORCE INDEX(`PRIMARY`) WHERE ((`z` >= ?)) ORDER BY `z` LIMIT ?, 2 /*next chunk boundary*/

檢視目標庫結果

mysql> desc test;

+-------+---------+------+-----+---------+----------------+

| Field | Type    | Null | Key | Default | Extra          |

+-------+---------+------+-----+---------+----------------+

| x     | int(11) | YES  |     | NULL    |                |

| y     | int(11) | YES  |     | NULL    |                |

| z     | int(11) | NO   | PRI | NULL    | auto_increment |

| a     | int(11) | NO   |     | 0       |                |   #新增成功

+-------+---------+------+-----+---------+----------------+

4 rows in set (0.01 sec)

Inception 稽核規範及原則

參考http://mysql-inception.github.io/inception-document/rules/

下面所列出來的規則,不一定能覆蓋所有Inception當前已經實現的功能,具體包括什麼規則,還需要在使用過程中總結,發現,同時可以結合配置引數來詳細瞭解這些規則。

支援的語句型別

l   use db:此時會檢查這個庫是不是存在,需要連線到線上伺服器來判斷。

l   set option:現在只需要支援set names charset,設定其它變數時都報錯不支援。

l   建立資料庫語句

l   插入語句(包括多值插入)

l   查詢插入語句

l   刪除語句(包括多表刪除)

l   更新語句(包括多表更新)

l   建立表語句

l   刪除表語句

l   修改表語句

l   Truncate表語句

l   inception命令集語句(包括管理命令)

插入語句檢查項

l   表是否存在

l   必須指定插入列表,也就是要對哪幾個列指定插入值,如insert into t (id,id2) values(...),(可配置)

l   必須指定值列表,與上面對應的列,插入的值是什麼,必須要指定。

l   插入列列表與值列表個數相同,上面二者的個數需要相同,如果沒有指定列列表(因為可配置),則值列表長度要與表列數相同。

l   不為null的列,如果插入的值是null,報錯(可配置)

l   插入指定的列名對應的列必須是存在的。

l   插入指定的列列表中,同一個列不能出現多次。

l   插入值列表中的簡單表示式會做檢查,但具體包括什麼不一一指定

更新、刪除語句檢查項

l   表是否存在

l   必須有where條件(可配置)

l   delete語句不能有limit條件(可配置)

l   不能有order by語句(可配置)

l   影響行數大於10000條,則報警(數目可配置)

l   WHERE條件這個表示式做簡單檢查,具體包括什麼不一一指定

l   對更新列的值列表表示式做簡單檢查,具體不一一指定

l   對更新列物件做簡單檢查,主要檢查列是不是存在等

l   多表更新、刪除時,每個表必須要存在

建表語句檢查項

表屬性的檢查項

l   這個表不存在

l   對於create table like,會檢查like的老表是不是存在。

l   對於create table db.table,會檢查db這個資料庫是不是存在

l   表名、列名、索引名的長度不大於64個位元組

l   如果建立的是臨時表,則必須要以tmp為字首

l   必須要指定建立innodb的儲存引擎(可配置)

l   必須要指定utf8的字符集(字串可配置,指定支援哪些字符集)

l   表必須要有註釋(可配置)

l   表不能建立為分割槽表(可配置)

l   只能有一個自增列

l   索引名字不能是Primay

l   不支援Foreign key(可配置)

l   建表時,如果指定auto_increment的值不為1,報錯(可配置)

l   如果自增列的名字不為id,說明有可能是有意義的,MySQL這樣使用比較危險,所以報警(可配置)

列屬性的檢查項

l   不能設定列的字符集(可配置)

l   列的型別不能使用集合、列舉、點陣圖型別。(可配置)

l   列必須要有註釋(可配置)

l   char長度大於20的時候需要改為varchar(長度可配置)

l   列的型別不能是BLOB/TEXT。(可配置)

l   每個列都使用not null(可配置)

l   如果列為BLOB/TEXT型別的,則這個列不能設定為NOT NULL

l   如何是自增列,則使用無符號型別(可配置)

l   如果自增列,則長度必須要大於等於4個位元組(可配置)

l   如果是timestamp型別的,則要必須指定預設值。

l   對於MySQL5.5版本(包含)以下的資料庫,不能同時有兩個TIMESTAMP型別的列,如果是DATETIME型別,則不能定義成DATETIME DEFAULT CURRENT_TIMESTAMPON UPDATE CURRENT_TIMESTAMP等語句。

l   每個列都需要定義預設值,除了自增列、主鍵列及大欄位列之外(可配置)

l   不能有重複的列名

索引屬性檢查項

l   索引必須要有名字

l   不能有外來鍵(可配置)

l   Unique索引必須要以uniq_為字首(可配置)

l   普通索引必須要以idx_為字首(可配置)

l   索引的列數不能超過5個(數目可以配置)

l   表必須要有一個主鍵(可配置)

l   最多有5個索引(數目可配置)

l   建索引時,指定的列必須存在。

l   索引中的列,不能重複

l   BLOB列不能建做KEY

l   索引長度不能超過766

l   不能有重複的索引,名字及內容

預設值檢查項

l   BLOB/TEXT型別的列,不能有非NULL的預設值

l   MySQL5.5以下(含)的版本,對於DATETIME型別的列,不能有函式NOW()的預設值。

l   如果設定預設值為函式,則只能是NOW()

l   如果預設值為NULL,但列型別為NOT NULL,或者是主鍵列,或者定義為自增列,則報錯。

l   自增列不能設定預設值。

l   修改表語句檢查項

l   表是不是存在

建立索引檢查項

l   同上面建立表中的索引檢查項

加列檢查項

l   同上面建立表中的列檢查項

修改表檢查項

l   表是不是存在

l   如果語句塊中存在多條對同一個表的修改語句,則建議合併成一個ALTER語句

l   列是否存在

l   剩下的同上面建立表,建立索引,建立列,預設值等檢查項一樣

刪除索引檢查項

l   表是不是存在

l   檢查索引是不是存在

修改列的預設值檢查項

l   同預設值檢查項

修改表屬性

l   表屬性只支援對儲存引擎、表註釋、自增值及預設字符集的修改操作。

l   修改儲存引擎時檢查是不是Innodb(可配置)。

l   字符集修改檢查是不是屬於設定引數的值(支援字符集可配置)。

轉換表字符集

l   字符集修改檢查是不是屬於設定引數的值(支援字符集可配置)。

宣告

針對線上MySQL伺服器是不是5.6以上(包含)版本,有不同的處理策略,比如在預估影響行數時,5.6可以直接對任何DML語句做EXPLAIN操作,而在5.5版本中,只支援對SELECT語句執行EXPLAIN操作,而在5.5版本中,有些DML語句是不容易直接轉換為SELECT語句去做EXPLAIN,這樣導致預估行數為0

還是針對5.6以上版本與5.5版本的不同,DATETIMETIMESTAMP系列型別在執行時,5.5的限制比較多,而5.6基本通用,所以這上面的處理可能在5.65.5版本上,相同語句返回的結果集是不同的(規則是在5.5中以在執行時報的錯誤資訊為準),這與線上版本有關係。

附:執行的三個指令碼

建立表

]$ cat inc-mysql.py    

#!/usr/bin/env python

#coding=utf8

import MySQLdb

sql='''/*--user=yujx;--password=yujx;--host=127.0.0.1;--execute=1;--port=3306;*/\

    inception_magic_start;\

    use test;\

    CREATE TABLE yujx(id int comment 'test' primary key) engine=innodb DEFAULT CHARSET=utf8mb4 comment '測試';\

    inception_magic_commit;'''

#print sql

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])

Insert

]$ cat inc-mysql-insert.py

#!/usr/bin/env python

#coding=utf8

import MySQLdb

sql='''/*--user=yujx;--password=yujx;--host=127.0.0.1;--execute=1;--port=3306;*/\

    inception_magic_start;\

    use test;\

    insert into yujx(id) value(1);\

    inception_magic_commit;'''

#print sql

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])

OSC

]$ cat inc-mysql-osc.py

#!/usr/bin/env python

#coding=utf8

import MySQLdb

sql='''

        inception set session inception_osc_recursion_method=none;

        inception set session inception_osc_alter_foreign_keys_method=0;

        inception set session inception_osc_min_table_size=1;

 

  /*--user=yujx;--password=yujx;--host=127.0.0.1;--execute=1;--port=3306;*/\

    inception_magic_start;\

    use test;\

    alter table test add b int not null default 0 comment 'b欄位';\

    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])

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/27000195/viewspace-2120332/,如需轉載,請註明出處,否則將追究法律責任。

相關文章