-
Notifications
You must be signed in to change notification settings - Fork 1.7k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[ bug ]如果sql语句过长,mongodb 执行sql会不成功,我已经复现 #1552
Comments
因为用的是mongo自己带的shell工具执行,确实会有这个问题。临时处理的办法就是自己写一个脚本执行过长的语句,或者用数据库工具执行,或者把语句切小一点。因为这种情况不是很多,所以一直没有去改进解决。如果你有更好的思路也可以分享一下 |
我想到的版办法是,遇到insertmany,archery自动转为insertone,变成一行一行地执行 |
你说的这种情况只是超过行数的其中一种情况,这种case by case的解决方法,治标不治本 |
那就利用脚本的方法。 mongo --quiet -uroot -p '123456' 192.168.1.xx:27017/admin <<EOF
db=db.getSiblingDB("czx");load('/data/db/a.js')
EOF
load("/data/db/scripts/myjstest.js") 3、这样就可以应对任何类型的sql语句过长的问题了 |
我提交了一个pr,我这边测试可以用,有时间帮我看看 @fancy-lee |
你用你之前报错的语句试了没有问题? |
试了,没问题 |
这样有一个问题就是,执行命令返回结果的看不到了 |
我觉得可以捕获一下这个长度的错误,再去按你这样方法处理会更合理一点 |
我还是不知道怎么做,你有时间改写一下吗,我学习一下 |
也可以提前判断一下行的字符数,超过了就用load的方法 |
这也是个方法,同时治标不治本。 PRIMARY> load('a.js')
true 而直接用命令执行的话,就会有详细的回显信息 PRIMARY>db.t1.insertMany(
[{"optionKey":"HE","value":
执行结果
{
"acknowledged" : true,
"insertedIds" : [
"6cc0ss9ac96cd51d3cc7cb",
"dc48331xxxxxxxxx0f62d34",
"82697d36xxxxxx7e4826d59f55d",
..............................
]
}
...............
|
参考一下这种方式执行:
|
你这个方法可以,但是怎么指定库执行js脚本 |
mongo --quiet host:port/db_name ...... < /tmp/abc.js |
可以了,你这个方法挺不错,我一会改一下脚本试试: cat a.js
use czx;
db.t1.insert({"_id":"1111","name":"aa"}); mongo --quiet -u root -p '123456' 192.168.1.xx:27017/admin < a.js
switched to db czx
WriteResult({ "nInserted" : 1 }) mongo --quiet -u root -p '123456' 192.168.1.xxxx:27017/admin < a.js
switched to db czx
WriteResult({
"nInserted" : 0,
"writeError" : {
"code" : 11000,
"errmsg" : "E11000 duplicate key error collection: czx.t1 index: _id_ dup key: { _id: \"1111\" }"
}
}) |
mongo --quiet -u root -p '123456' 127.0.0.1:27017/root < a.js exception: login failed 这种方法还是会有长度问题 |
是的,我也发现了,但是load方法没事 |
用管道也不行 |
绝绝子 |
mongo --quiet --eval 'db.t1.insertMany({})' 好像这样可以 |
mongo源码写死了shell单命令最大4096 bytes,看来是绕不过了,想想其他办法吧 |
我有了一个方法,你看行吗 cat a.js
var rs = db.t1.insertMany([{"optionKey":"............
printjson(rs); |
结果长没事,可以默认显示一部分,点展开再显示全部 |
好主意,我又提了一下pr,有时间帮忙review一下 |
棒棒的,我试了一个也没有问题,可以输出结果,不过还是建议判断一下长度,超过再执行load,这样也可以减少读写文件操作,然后直接printjson(db.t1.insertMany([{"optionKey":"............)感觉理简洁 |
已改,见PR |
1、问题
2、重现步骤
我看了源码,知道了archery执行mongodb sql的原理:
sql/engines/mongo.py
cmd = "{mongo} --quiet -u {uname} -p '{password}' {host}:{port}/{auth_db} <<\\EOF\ndb=db.getSiblingDB(\"{db_name}\");{slave_ok}printjson({sql})\nEOF".format( mongo=mongo, uname=self.user, password=self.password, host=self.host, port=self.port, db_name=db_name, sql=sql, auth_db=auth_db, slave_ok=slave_ok)
于是,我手工执行命令,进行复现,发现是语句太长,mongo执行sql会报错,如下:
上面的命令执行后就会报如下错误:
如果把上面的sql,去掉一组,比如去掉{"optionKey":"TERM","value":"5","describe":"xxxx","templateId":"xxxxxxx"},就能正常执行了,如下:
执行结果如下,说明执行成功了:
3、请问,对于上面的问题,应该怎么处理好呢。
The text was updated successfully, but these errors were encountered: