-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathrunsql
More file actions
294 lines (267 loc) · 7.93 KB
/
Copy pathrunsql
File metadata and controls
294 lines (267 loc) · 7.93 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
#!/bin/sh
tmpFile="./tmp_runsql_$$"
script_abs=$(readlink -f "$0")
script_dir=$(dirname $script_abs)
log_path=$(dirname $script_abs)/runsql.log
DB="mysql"
output="/dev/null"
is_show_cost_time="no"
high_perf_mode="false"
today=""
yesterday=""
nowTime=""
cost_time="-1"
timeStamp=""
#默认分表
tableStart=0
#默认分表
tableEnd=15
#是否显示字段名
NN=""
#是否查询所有分表
isRange="false"
#文件地址
filepath=""
#数据库主机地址
hostAdress=""
#数据库主机端口
hostPort=""
#数据库主机用户名
hostUser=""
#数据库密码
hostPassword=""
#数据库
#数据库别名默认default
hostAlias="default"
#默认文件分隔符
ifs=","
justshowsql=""
#数据库配置文件地址
databaseConfigPath=${script_dir}/runsql_config
#加载数据库配置
loadDBConfig(){
hostAdress=`sed '/^'$hostAlias'_hostAdress=/!d;s/.*=//' $databaseConfigPath`
hostPort=`sed '/^'$hostAlias'_hostPort=/!d;s/.*=//' $databaseConfigPath`
hostUser=`sed '/^'$hostAlias'_hostUser=/!d;s/.*=//' $databaseConfigPath`
hostPassword=`sed '/^'$hostAlias'_hostPassword=/!d;s/.*=//' $databaseConfigPath`
hostDatabase=`sed '/^'$hostAlias'_hostDatabase=/!d;s/.*=//' $databaseConfigPath`
tableStart=`sed '/^'$hostAlias'_tableStart=/!d;s/.*=//' $databaseConfigPath`
tableEnd=`sed '/^'$hostAlias'_tableEnd=/!d;s/.*=//' $databaseConfigPath`
}
execSql(){
func_sql="$1"
if [ "$isRange" == "true" ];then
for loop in $(seq $tableStart 1 $tableEnd);
do
realSql=${func_sql//IX/$loop}
if [ "$justshowsql" == "true" ];then
echo "mysql -h$hostAdress -P$hostPort -u$hostUser -p$hostPassword --default-character-set=utf8 $NN -e \"use $hostDatabase; $realSql ;\""
else
result=`mysql -h$hostAdress -P$hostPort -u$hostUser -p$hostPassword --default-character-set=utf8 $NN -e "use $hostDatabase; $realSql ;"`
if [ -n "$result" ];then
echo "$result"
if [ "$high_perf_mode" == "true" ];then
break;
fi
fi
fi
done
else
if [ "$justshowsql" == "true" ];then
echo "mysql -h$hostAdress -P$hostPort -u$hostUser -p$hostPassword --default-character-set=utf8 $NN -e \"use $hostDatabase; $func_sql ;\""
else
mysql -h$hostAdress -P$hostPort -u$hostUser -p$hostPassword --default-character-set=utf8 $NN -e "use $hostDatabase; $func_sql ; "
fi
fi
}
keyReplace() {
getTodayDate
getYesterday
setNowTime
sql=${sql//TODAY/$today}
sql=${sql//YESTERDAY/$yesterday}
sql=${sql//NOW/$nowTime}
}
getTodayDate() {
today=`date '+%Y-%m-%d'`
}
getYesterday() {
yesterday=`date '+%Y-%m-%d' -d '-1days'`
}
setNowTime(){
nowTime=`date '+%Y-%m-%d %H:%M:%S'`
}
setTimeStamp(){
timeStamp=`date +%s%N`
#timeStamp=`date -d "$1" +%s`
}
caculateTime(){
startTime=$(date --date="$anchorTime" +%s);
thisTime=`date '+%Y-%m-%d %H:%M:%S'`
endTime=$(date --date="$thisTime" +%s);
cost_time=$((endTime-startTime))
if [ "$is_show_cost_time" == "true" ];then
echo "本次运行时间: "$cost_time"s"
fi
}
show_keys(){
getTodayDate
getYesterday
setNowTime
echo -e "\033[32m IX \033[0m" 代表分表索引
echo -e "\033[32m NOW \033[0m" 代表 当天时间 例 $nowTime
echo -e "\033[32m TODAY \033[0m" TODAY 代表 今天 例 $today
echo -e "\033[32m YESTERDAY \033[0m" 代表 昨天 例 $yesterday
echo -e "\033[32m FDATA \033[0m" 代表从文件获取的数据 FDATA0代表第一列 FDATA1代表第二列以此类推 其中列的分隔符默认为逗号, 可以通过-t选项来自定义分隔符
}
show_log(){
cat $log_path
}
log_to_tail(){
uuid="$1"
message="$2"
sed -i "s/${uuid}.*$/& ${message}/" $log_path
}
log_after_uuid(){
uuid="$1"
message="$2"
sed -i "s/${uuid}/& ${message}/" $log_path
}
show_help(){
loadDBConfig
echo -e "\033[32m 使用方式 runsql -:d:fNahkctsm \"sql\" \033[0m"
echo -e "\033[32m -d database 传入数据库名 默认为 $hostDatabase \033[0m"
echo -e "\033[32m "" \033[0m"
echo -e "\033[32m -f file 代表从文件读取数据 必须配合关键字 FDATA使用 示例 runsql -rf ~/leichengbiao/filedata \"select * from teacher_IX where name = 'FDATA0' \" \033[0m"
echo -e "\033[32m 其中FDATA0代表第一列 FDATA1代表第二列 依次类推 \033[0m"
echo -e "\033[32m "" \033[0m"
echo -e "\033[32m -r range 是否遍历所有分表 不传代表否 \033[0m"
echo -e "\033[32m "" \033[0m"
echo -e "\033[32m -N name 是否显示字段名 不传代表是 \033[0m"
echo -e "\033[32m "" \033[0m"
echo -e "\033[32m -h help 显示帮助 \033[0m"
echo -e "\033[32m "" \033[0m"
echo -e "\033[32m -k key 显示所有关键字 \033[0m"
echo -e "\033[32m "" \033[0m"
echo -e "\033[32m -c config 显示配置文件详情 \033[0m"
echo -e "\033[32m "" \033[0m"
echo -e "\033[32m -w config 编辑config \033[0m"
echo -e "\033[32m "" \033[0m"
echo -e "\033[32m -t 指定分隔符 从文件批量获取数据时使用的分隔符 默认为 ,\033[0m"
echo -e "\033[32m "" \033[0m"
echo -e "\033[32m -s debug 模式展示完整sql \033[0m"
echo -e "\033[32m -s 显示日志 \033[0m"
echo -e "\033[32m "" \033[0m"
echo -e "\033[32m -m 显示耗时 单位s \033[0m"
echo -e "\033[32m "" \033[0m"
echo -e "\033[32m -p 查到结果立刻返回,如果需要提高查询速度[速度提升2倍以上]可以选择开启,如果需要查询所有分表中数据则请关闭 \033[0m"
echo -e "\033[32m "" \033[0m"
echo -e "\033[32m 表索引使用 IX 代替 \033[0m"
echo -e "\033[32m 使用示例:runsql -r \"select T.name from teacher_IX T inner join course C on T.id = C.teacher_id where C.id =12\\G\" \033[0m"
echo -e "\033[32m log_path: $log_path \033[0m"
echo -e "\033[32m by leichengbiao \033[0m"
}
args=$#
while getopts ":d:f:Nrhkwct:smpo:l" opt; do
case $opt in
d)
hostAlias=$OPTARG
;;
f)
filepath=$OPTARG
;;
N)
NN="-N"
;;
r)
isRange="true"
;;
h)
show_help
exit 0
;;
k)
show_keys
exit 0
;;
w)
vim $databaseConfigPath
exit 0
;;
c)
echo $databaseConfigPath
cat $databaseConfigPath
echo $databaseConfigPath
exit 0
;;
t)
ifs=$OPTARG
;;
s)
justshowsql="true"
;;
m)
is_show_cost_time="true"
;;
p)
#如果需要展示所有查询结果,则需要关闭高性能模式
high_perf_mode="true"
;;
o)
#指定文件输出(文件可以是模板形式)
output=$OPTARG
;;
l)
#show log
show_log
exit 0
;;
:)
echo "necessary option -$OPTARG"
exit 1
;;
?)
echo "invalid option -$OPTARG"
exit 1
;;
esac
done
if [ $# -eq 0 ];then
show_help
exit 0
fi
originParams="$@"
shift $(($OPTIND - 1))
sql=$1
if [[ -z "$sql" ]]; then
echo -e "\033[31m 致命错误:必须传入以\" \"包围的sql语句 当前传入sql为空 \033[0m"
exit 1
fi
setNowTime
setTimeStamp
exec_uuid=${timeStamp}_$$
echo "$nowTime" "$exec_uuid" "runsql" "$originParams" >> $log_path
keyReplace
loadDBConfig
anchorTime=`date '+%Y-%m-%d %H:%M:%S'`
# 如果从文件获取数据源,需要按行执行sql
if [ -n "$filepath" ];
then
while read line
do
tmp_sql=$sql
fdataArray=(${line//$ifs/ })
fdataNum=0
for var in ${fdataArray[@]}
do
tmp_sql=${tmp_sql//FDATA$fdataNum/$var}
: $(( fdataNum++ ))
done
execSql "$tmp_sql"
done < $filepath
else
execSql "$sql"
fi
caculateTime
setNowTime
log_after_uuid $exec_uuid "$nowTime ${cost_time}s"