【 使用环境 】测试环境
【 OB or 其他组件 】 obclient
【 使用版本 】 社区版 oceanbase-ce-4.2.1.2、 obclient-2.2.3
【问题描述】
想生成一个使用shell脚本调用obclient将指定的sql文件插入到数据库中,并查询这个过程数据库新增的数据数量, 但是发现 文件中数据较少时能有结果回来,但是文件内容在几十万条时,两个查询前后结果都是0, 再使用navicat或者ODB去做同样的查询,却又是有结果的
【复现路径】
编辑shell脚本如下 ImportData.sh:
Host=127.0.0.1
Port=2881
User=root
PW=123456
DataBase=test
OrderDate=2023-11-29
File=/home/data/test.sql
MSG=`obclient -h$Host -u$User -P$Port -p$PW << EOF
use $DataBase;
select count(*) into @num1 from TOrder where FDate='$OrderDate';
source $File;
select count(*) into @num2 from TOrder where FDate='$OrderDate';
select @num2-@num1 Number;
exit
EOF`
echo "Excute $MSG"
秃蛙
2024 年1 月 3 日 19:54
#3
obclient客户端命令替换成mysql客户端命令 看下呢。
不错的建议,我试了更换mysql客户端,结果也是一样的, 脚本中拿不到结果,但是navicat和ODC中都能查到
秃蛙
2024 年1 月 3 日 20:07
#5
好的,这个问题我需要本地测验下,有消息会同步帖子。请稍等。
秃蛙
2024 年1 月 4 日 14:11
#6
相同环境,source 30w+ insert 数据未复现出描述问题现象。正确情况下 source 完成后才会继续后续的sql语句,不存在并发执行问题。
可以脚本中添加更多测试信息,例如,source 后增加select sleep(5); 或者多次查询count() 等。或者增加执行计划,explain EXTENDED select count( ) into @num2 from TOrder where FDate=’$OrderDate’;
分开写呢
num1=`mysql -uroot -Ns -e"select count(*) from TOrder where FDate='$OrderDate'"`
执行source的呢一段
num2=`mysql -uroot -Ns -e"select count(*) from TOrder where FDate='$OrderDate'"`
然后shell计算
OrderDate=2023-11-29
需要调整写法,写成
OrderDate="‘2023-11-29’"
shell脚本中:
select count() into @num1 from TOrder where FDate=’$OrderDate’;
即 : select count( ) into @num1 from TOrder where FDate=2023-11-29
只有写成这样 OrderDate="‘2023-11-29’"
select count() into @num1 from TOrder where FDate=’$OrderDate’;
才会被shell认为是 : select count( ) into @num1 from TOrder where FDate=‘2023-11-29’
也是很不错的方案,感谢,可以用于shell更复杂的脚本中!
经我们排查,主要还是sehll对单引号的解释导致的
shell中:
OrderDate=2023-11-29
需要调整写法,写成
OrderDate="‘2023-11-29’"
但是在ODC和navicat中直接就是单引号,没出现问题