Skip to content

sqlautoreview setup

taobao-zhaolin edited this page Feb 21, 2012 · 1 revision
  1. 安装jdk 1.6 网上有很多资料,google一下

  2. 配置环境变量 环境变量只需要配置JAVA_HOME,PATH两个环境变量,示例如下: $cat .bash_profile # .bash_profile

Get the aliases and functions

if [ -f ~/.bashrc ]; then . ~/.bashrc fi

User specific environment and startup programs

export JAVA_HOME= /opt/install/jdk-1.6.0_26 export PATH=$JAVA_HOME/bin:$HOME/bin:$PATH 3. sqlautoreview程序上传,以及解压 将程序sqlautoreview-0.0.1-SNAPSHOT-sqlautoreview.tar.gz文件上传到linux服务器上,执行如下的解压命令:

+ $tar -xzvf sqlautoreview-0.0.1-SNAPSHOT-sqlautoreview.tar.gz sqlautoreview-0.0.1-SNAPSHOT/lib/dom4j-1.6.1.jar sqlautoreview-0.0.1-SNAPSHOT/lib/xml-apis-1.0.b2.jar sqlautoreview-0.0.1-SNAPSHOT/lib/mysql-connector-java-5.1.18.jar sqlautoreview-0.0.1-SNAPSHOT/lib/log4j-1.2.15.jar sqlautoreview-0.0.1-SNAPSHOT/lib/mail-1.4.jar sqlautoreview-0.0.1-SNAPSHOT/lib/activation-1.1.jar sqlautoreview-0.0.1-SNAPSHOT/lib/jms-1.1.jar sqlautoreview-0.0.1-SNAPSHOT/lib/jmxtools-1.2.1.jar sqlautoreview-0.0.1-SNAPSHOT/lib/jmxri-1.2.1.jar sqlautoreview-0.0.1-SNAPSHOT/lib/sqlautoreview-0.0.1-SNAPSHOT.jar sqlautoreview-0.0.1-SNAPSHOT/bin/log4j.xml sqlautoreview-0.0.1-SNAPSHOT/bin/start_createindex.sh sqlautoreview-0.0.1-SNAPSHOT/bin/start_xmltosql.sh sqlautoreview-0.0.1-SNAPSHOT/bin/tools-run-class.sh sqlautoreview-0.0.1-SNAPSHOT/conf/productdb.xml sqlautoreview-0.0.1-SNAPSHOT/conf/sqlmapfile.xml sqlautoreview-0.0.1-SNAPSHOT/conf/sqlreviewdb.xml

+ 4. 创建存放日志的目录 进入sqlautoreview解压过后的目录,创建logs目录,程序运行的所有的日志文件都放在这个地方. $cd sqlautoreview-0.0.1-SNAPSHOT

$ls bin conf lib

$mkdir logs

$ls bin conf lib logs

$pwd /home/danchen/ sqlautoreview-0.0.1-SNAPSHOT /logs

修改/home/danchen/ sqlautoreview-0.0.1-SNAPSHOT /bin目录下的log4j.xml日志输出配置文件,将路径改成/home/danchen/ sqlautoreview-0.0.1-SNAPSHOT /logs,你可以根据自己的系统设置日志的输出路径.

  1. 配置sqlautoreview程序的配置文件 进入conf目录,下面会出现三个配置文件

    $cd conf

    $ls productdb.xml sqlmapfile.xml sqlreviewdb.xml

productdb.xml是这些SQL即将在哪个数据库上运行,即目标数据库的配置信息,会包括ip,port,dbname,user,password. 下面是配置文件的示例内容: <?xml version="1.0" encoding="UTF-8"?> <database> <ip>192.168.168.100</ip> <port>3306</port> <dbname>testdb</dbname> <user>test</user> <password>test</password> </database>

Sqlmapfile.xml配置文件主要是配置java sqlmapfile的两个信息,一个file_id字段,你可以随意指定一个数字,最好不要与以前的指定相同; 另外一个字段为sqlmap的filename,这个必须要包含绝对路径,以下是一个linux下此路径的范例: <?xml version="1.0" encoding="UTF-8"?> <sqlmapfile> <file_id>-500</file_id> <file_name>/home/danchen/itemonlinedetail_sqlmap.xml</file_name> </sqlmapfile>

如果在windows下,此路径需要写成如下的形式,即路径中的\,要变成\\ <?xml version="1.0" encoding="UTF-8"?> <sqlmapfile> <file_id>-20</file_id> <file_name>D:\\itemonlinedetail_sqlmap.xml</file_name> </sqlmapfile>

sqlreviewdb.xml配置文件的结构与productdb.xml相同,这个是sqlautoreview自己的数据库,所有审核的SQL,以及审核结果都会放在这个数据库里.此配置文件的示例如下: <?xml version="1.0" encoding="UTF-8"?> <database> <ip>192.168.168.200</ip> <port>3306</port> <dbname>sqlreview</dbname> <user>danchen</user> <password>hellodanchen</password> </database> 在示例的192.168.168.200 mysql上创建sqlreviewdb, `create database sqlreviewdb character set GBK;

grant select,update,delete,insert on sqlreviewdb.* to danchen@"%" identified by "sqlautoreview"; Query OK, 0 rows affected (0.00 sec)`

以及xmltosql, mergeresult表,xmltosql, mergeresult的表结构如下: ` CREATE TABLE xmltosql ( id int(11) NOT NULL AUTO_INCREMENT, sqlmap_file_id int(11) NOT NULL, java_class_id varchar(200) NOT NULL, sql_xml varchar(4000) NOT NULL, sql_comment varchar(200) DEFAULT NULL, real_sql varchar(4000) NOT NULL, real_sql_hash varchar(32) DEFAULT NULL, table_name varchar(100) DEFAULT NULL, status int(11) DEFAULT NULL, auto_review_err varchar(200) DEFAULT NULL, auto_review_tip varchar(200) DEFAULT NULL, auto_review_time datetime DEFAULT NULL, sql_auto_index varchar(200) DEFAULT NULL, dba_review_time datetime DEFAULT NULL, sql_dba_index varchar(200) DEFAULT NULL, dba_advice varchar(200) DEFAULT NULL, gmt_create datetime NOT NULL, gmt_modified datetime NOT NULL, PRIMARY KEY (id), KEY idx_java_class_id (java_class_id) ) ENGINE=InnoDB DEFAULT CHARSET=gbk

CREATE TABLE mergeresult ( id int(11) NOT NULL AUTO_INCREMENT, sqlmap_file_id int(11) NOT NULL, tablename varchar(30) DEFAULT NULL, real_tablename varchar(30) DEFAULT NULL, exist_indexes varchar(4000) DEFAULT NULL, new_indexes varchar(4000) DEFAULT NULL, merge_result varchar(4000) DEFAULT NULL, gmt_create datetime NOT NULL, gmt_modified datetime NOT NULL, PRIMARY KEY (id), KEY idx_result_sqlmap_file_id (sqlmap_file_id) ) ENGINE=InnoDB DEFAULT CHARSET=gbk ` 6. 运行sqlautoreview程序 进入到bin目录下,对三个shell脚本,加上可执行+x的权限

$chmod +x *.sh

$ls -l total 20 -rw-r—​r-- 1 danchen users 1900 Jan 9 09:36 log4j.xml -rwxr-xr-x 1 danchen users 85 Jan 9 09:36 start_createindex.sh -rwxr-xr-x 1 danchen users 84 Feb 15 11:39 start_mergeindex.sh -rwxr-xr-x 1 danchen users 82 Jan 9 09:36 start_xmltosql.sh -rwxr-xr-x 1 danchen users 422 Jan 9 09:36 tools-run-class.sh 在上面三个.cnf文件配置好的情况下,首先需要执行start_xmltosql.sh脚本,这个脚本完成的功能是把sqlmapfile.xml中配置的sqlmapfile从XML文件中解析出来,放入到sqlreviewdb数据库中。

$./start_xmltosql.sh 如果log4j.xml配置的log4j log level为info,你会看到解析出来的SQL语句.

第二步执行创建索引的脚本,这个会读取sqlreviewdb中待审核的SQL语句,解析SQL,根据规则生成创建索引的脚本,并保存到sqlreviewdb中,整个审核结束。

$./start_createindex.sh 如果log4j.xml配置的log4j log level为info,你会看到审核的一些细节,如果为debug会看到更多的细节。

Tips: 1. 支持MySQL,不支持Oracle 2. 不支持含有子查询的SQL 3. 支持普通的单表查询 4. 支持单表使用别名的查询 5. 支持单表的标准的分页 6. 支持多表的join

第三步是执行索引merge的脚本,

$./start_mergeindex.sh 这个会读取sqlreviewdb中的生成的索引,以及这次审核所涉及的表上原有的索引,应用一些规则,进行索引的自动合并,生成最后的变更脚本.