用sysbech压测atlas报错,请问atlas是不支持prepare statement吗
报错信息如下: ALERT: failed to execute mysql_stmt_execute(): Err1243 Unknown prepared statement handler (11) given to mysqld_stmt_execute FATAL: database error, exiting...
测试脚本如下:
sysbench --test=oltp --num-threads=128 --max-requests=8000000 --oltp-test-mode=nontrx --db-driver=mysql --mysql-db=my_db --mysql-host=10.105.45.151 --mysql-port=11811 --mysql-user=xm_dba --mysql-password=123 --oltp-nontrx-mode=select --db-ps-mode=auto run
非常感谢
测试发现有个奇怪现象: 当atlas的线程数设置大于等于sysbench的线程数时,就不会报错。否则就报上面的错误,请帮忙解释下原因。谢谢~
是的。目前Atlas不支持prepare。加入--db-ps-mode=disable
但是官方wiki介绍说是部分支持prepare,这个部分支持该如何理解,我们能在生产环境中使用吗?
9.Atlas支持mysql的prepare特性吗?
目前Atlas部分支持prepare功能,支持java,python,PHP(PDO方式)。
wiki提到的语言中prepare是支持的。没提到的不支持,例如c语言。有50+公司用于线上了。
这个为什么和语言相关呢,我理解是所有语言的mysql操作都会转换mysql 协议发送给atlas啊,只要atlas支持mysql 协议中的prepare statement协议,应该所有语言都支持吧。请指教,非常感谢哈。
实现方式不一样的。
嗯 查阅了相关资料,PDO方式的预处理是在客户端做的,所以atlas就支持了。而sysbench使用的mysql c API,预处理是在服务器端做的,而我们的atlas本身是不支持预处理的,所以会报错。不知道这样理解对不对,望赐教,谢谢~~
嗯,是这样的。其实我们开发版已经实现了mysql c API的prepare,但有些复杂,未加入到正式版中。
现在怎么样了?
PHP如果使用PDO的话, 请把 ATTR_EMULATE_PREPARES 设置为true 如果使用golang的情况 , 请尽量使用纯SQL , 不建议使用带有预处理方式的SQL 特别需要注意的是 golang中使用xorm.Where("status=?" , UserId) 这种绑定容易出现Error:1243 错误 如果一定要使用请使用xorm.Where(fmt.Sprintf("status=%d" , UserId))
http://php.net/manual/en/pdo.setattribute.php PDO::ATTR_EMULATE_PREPARES 配置成true