linux - 如何在 bash 脚本中创建对 db 的并行连接和查询
问题描述
我的 Linux 机器上有一个 oracle 数据库。通过 bash 的单个 sql 查询(1 个连接)如下:
su - oracle
sqlplus <dbuser>/<dbpass>
select * from cat;
exit
我正在尝试通过 bash 运行并行查询,以下脚本用于并行运行 10000 个连接(如果我错了,请纠正我):
for i in $(seq 1 10000); do echo "select * from <tableName>;" | sqlplus <dbuser>/<dbpass>&done
我想让这段代码更加健壮和灵活,例如,我想在以下每个命令之间添加一个睡眠:
- 创建连接
- 创建一个表(此连接独有,例如 i 作为索引)
- 从表中选择数据
- 关闭连接
以下代码是我这样做的尝试:(不工作)
for i in $(seq 1 10000);
do
echo "CREATE TABLE test+i (id NUMBER NOT NULL);"
sleep 2
echo "select * from test+i"
sleep 2
echo "DROP TABLE test+i" | sqlplus <dbuser>/<dbpass>&
done
1) 从句法上讲,我应该怎么写?
2) 我怎么知道有多少查询/连接成功,有多少失败?
3) 我如何知道实际并行运行的连接数
解决方案
1)您可以使用(
and)
将命令分组到子shell中,并将它们发送到后台:
for i in $(seq 1 10000);
do
echo "CREATE TABLE test_$i (id NUMBER NOT NULL);
!sleep 2
select * from test_$i;
!sleep 2
DROP TABLE test_$i;" | sqlplus <dbuser>/<dbpass> &
done
2)您可以在每次 sqlplus 调用后设置错误处理(检查输出或退出值)
echo "CREATE TABLE test_$i (id NUMBER NOT NULL);" | sqlplus <dbuser>/<dbpass> 2>&1 | grep -i error
3)您可以使用该jobs
命令来检查有多少作业在后台运行:
> sleep 100 &
[1] 31642
> jobs
[1]+ Running sleep 100 &
推荐阅读
- sql - 如何解决缺少括号错误
- python - 分配有关我的字典索引的决策变量
- python - 我想使用 python 在正确位置的列表中添加“,”
- python - fit_generator 在第一个 epoch 后没有运行
- python - 一次使用列表中的列表搜索值
- azure - 如何使用 AzureAD 模块获取 Azure AD 用户 MFA 状态?
- react-query - 在 React-Query 中登录后将状态分配给不同的组件
- c# - 将 c# NULL 合并运算符与 NOT NULL 场景一起使用
- sql-server - 来自 MS-SQL-Server 2019 的奇怪“缺少索引”建议
- php - 为 Steam OpenID 添加 cookie