技术头条 - 一个快速在微博传播文章的方式     搜索本站
您现在的位置首页 --> 系统运维 --> 线上替换Percona版本和SSIS不兼容问题分析及解决办法

线上替换Percona版本和SSIS不兼容问题分析及解决办法

浏览:1500次  出处信息

     线上替换Percona版本和SSIS不兼容问题分析及解决办法

    现象:

     利用SSIS(SQL Server Intelligence Services)访问Percona-Server 5.1 原来的SQL取不到数据。

     如果加上limit后就能取到数据。但原来的MySQL版本(MySQL-5.1.43sp1)就可以取到数据。

     MySQL版本:Percona-Server-5.1.55 or MySQL-5.1.55后

     SSIS 从MySQL中取不到数据。

    分析:

     从WireShark抓包分SSIS执行SQL的流程:

     1. PING 包

     2. INIT_DB连接上数据库

     3. 发送:set sql_select_limit=0;

     4. 执行SSIS中定义的SQL;

     5. 发送: set sql_select_limit=-1;

     6. 再执行SSIS中定义的SQL;

    问题发生在哪呢?

    第一次set sql_select_limit=0 是因为在早期的数据库交互中,因为mysql没有SQL编译的及SQL正确否的校验,

     所以很多程序员会用set sql_select_limit=0这个然后再执行SQL看有返回的错误不。

     从协义上看第一次set sql_select_limit=0在Percona-Server-5.1.55及后面的SQL执行都是正确执行的。

     然后第二次调用:set sql_select_limit=-1; 目的是把环境变量sql_select_limit还原成default值。

     然后再执行SSIS中的SQL.读取读取不到信息。

    猜测:

      在执行set sql_select_limit=-1没能执行成功造成后面SSIS再次执行SQL没返回。

    有了以上的信息去验证一下:

mysql> select @@version_comment, @@version;
+--------------------------------------------------------------+--------------------+
| @@version_comment | @@version |
+--------------------------------------------------------------+--------------------+
| Percona Server with XtraDB (GPL), Release 12.6, Revision 200 | 5.1.55-rel12.6-log |
+--------------------------------------------------------------+--------------------+
1 row in set (0.00 sec)
mysql>  select user from mysql.user where user="root";
+------+
| user |
+------+
| root |
| root |
+------+
2 rows in set (0.00 sec)
mysql>  set sql_select_limit=0;
Query OK, 0 rows affected (0.00 sec)
mysql>  select user from mysql.user where user="root";
Empty set (0.00 sec)
mysql> set sql_select_limit=-1;
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql>  select user from mysql.user where user="root";
Empty set (0.00 sec)
mysql> set sql_select_limit=default;
Query OK, 0 rows affected (0.00 sec)
mysql> select user from mysql.user where user="root";
+------+
| user |
+------+
| root |
| root |
+------+
2 rows in set (0.00 sec)
mysql>  set sql_select_limit=-1;
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> show warnings;
+---------+------+--------------------------------------------------+
| Level | Code | Message |
+---------+------+--------------------------------------------------+
| Warning | 1292 | Truncated incorrect sql_select_limit value: \'-1\' |
+---------+------+--------------------------------------------------+
1 row in set (0.00 sec)

    可见在执行:set sql_select_limit=-1; 这个负1是不支持的。从手册上来看,也只是说了一个可以给的最大值,也没说最少值。该参数还是挺鬼疑的。

     有兴趣的可以试一下mysql-5.1.54及以下版本或是MySQL-5.1.55以后的版本。

     我试了MySQL-5.1.56一样对:set sql_select_limit=-1是不支持。

     现在在来看为什么加上limit都可以显示数据呢?

     手册里描述:If a SELECT has a LIMIT clause, the LIMIT takes precedence over the value of sql_select_limit.

     可见SELECT中的limit运算优先于sql_select_limit。

    验证:

mysql>  set sql_select_limit=0;
Query OK, 0 rows affected (0.00 sec)
mysql>  select user from mysql.user where user="root" limit 10;
+------+
| user |
+------+
| root |
| root |
+------+
2 rows in set (0.00 sec)
mysql> select user from mysql.user where user="root";
Empty set (0.00 sec)

    如何解决这个问题:

     原因是set sql_select_limit=-1没正确执行。

     可以在SSIS中的SQL前添加set sql_selct_limit=default;该解决方法存在性能问题,但能正确执行了。

     最彻底的解决办法:反溃给那MS支持方,SQL调用中的set sql_select_limit=-1改成 set sql_select_limit=default。

    影响:

     如果该问题不修正,目前这个SSIS只能使用MySQL-5.1.54前的版本了。

     参考:

    http://dev.mysql.com/doc/refman/5.1/en/server-system-variables.html#sysvar_sql_select_limit

    感想:

     不是开源的东西,你知道为什么,知道怎么改,也无语啊。

建议继续学习:

  1. 在 Percona 中配置主从的 MY SQL    (阅读:1634)
  2. 使用percona的mysql补丁统计Mysql使用情况    (阅读:1501)
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
© 2009 - 2024 by blogread.cn 微博:@IT技术博客大学习

京ICP备15002552号-1