【MySQL】 mysql 日常工单处理脚本 解放你的双手!!!

简介

在工作中经常帮助开发的小伙伴执行些 sql,手动执行效率低不直观,还要单独备份等等,极为麻烦,怎么办?用它!解放时间多摸鱼!!!我的摸鱼小帮手。

流程图:

image-20240416上午104220036

功能:

  • 语法检查: 检查是否 符合脚本正则

  • 数据量检查:检查数据量大小,数据量大时可选择其他时间或工具执行,数据量小时可继续执行

  • 备份数据: alter 备份整个表,带 where 条件的备份符合 where 条件的数据。

  • 执行 SQL: 最后执行 SQL 语句

  • 语法支持类型:

    • delete

    • insert

    • update

    • create table

    • alter table

    • create index

    • drop index

    • backup table :当需要备份某个表时,将需要备份的表名写入 1_sql_info.txt 表即可

需要安装 :

  • mysql 命令
  • mysqldump 命令

文件示例:

├── 1_sql_info.txt           # 1. 将需要执行的 SQL 粘贴到这个文件中。
├── 2_sql_bak_exec.sh        # 2. 执行这个 shell 脚本即可
├── dba
│   ├── bak
│   │   ├── test.table1_240117_144416.sql
│   │   ├── test.table2_240117_144416.sql

脚本内容

cat /root/2_sql_bak_exec.sh
#!/bin/bashMySQL_user='root'
MySQL_host='127.0.0.1'
MySQL_password='123456'
MySQL_port=3306
MySQL_database='test'                      # 备份表所在库
MySQL_bak_dir='/root/dba/bak'              # 保存备份文件的地址
MySQL_SqlInfo_file='/root/1_sql_info.txt'  # 需要执行的 SQL 文件#格式化后SQL保存文件
MySQL_Read_SqlFile='/root/.mysql_sql_tmp.txt'
# 获取时间
Date=$(date +%y%m%d_%H%M%S)
# 获取mysqldump命令路径
MysqlDump_Command=$(/usr/bin/which mysqldump)
# 获取mysql命令路径
Mysql_Command=$(/usr/bin/which mysql)
# 拼接MySQL连接参数
MySQL_Connection="${Mysql_Command} -u"${MySQL_user}" -p"${MySQL_password}" -h${MySQL_host} -P${MySQL_port}"
# 总行数大于这个值就进行提示
Rows_Sum=10# 过滤语法##########################################################################################################################################
function Match_Regular() {
Delete_Line=$(echo ${line}|egrep -ci '^delete\s+from\s+(`)?(\w+)?(`)?(.)?(`)?\w+(`)?\s+where\s+.*;')
Create_index_Line=$(echo ${line}|egrep -ci '^CREATE\s+(UNIQUE|FULLTEXT|SPATIAL)?\s*INDEX\s+\w+\s+ON\s+(`)?(\w+)?(`)?(.)?(`)?\w+(`)?\s*\(\w+\)\s*;')
Drop_index_Line=$(echo ${line}|egrep -ci '^drop\s+INDEX\s+\w+\s+ON\s+(`)?(\w+)?(`)?(.)?(`)?\w+(`)?\s*;')
Insert_Line=$(echo ${line}|egrep -ci '^insert\s+into\s+(`)?(\w+)?(`)?(.)?(`)?\w+(`)?\s*(\(.*\))?\s+values\s*(.*)\s*;')
Create_table_Line=$(echo ${line}|egrep  -ic '^create\s+table\s+(\`)?(\w+)?(\`)?(.)?(\`)?\w+(\`)?\s*(.*).*;')
Alter_Line=$(echo ${line} | grep -iPc  '^alter\s+table\s+(`)?(\w+)?(`)?(.)?(`)?\w+(`)?\s+(ADD|MODIFY|DROP|RENAME|ENGINE|CHARSET|AUTO_INCREMENT|COMMENT)?.*;')
Update_Line=$(echo ${line}|egrep  -ic '^update\s+(`?[a-zA-Z0-9_]+`?\.)?(`?[a-zA-Z0-9_]+`?)\s+(join\s+(`?[a-zA-Z0-9_]+`?\.)?(`?[a-zA-Z0-9_]+`?)\s+on\s+.+\s+)?set\s+(.*)\s+where\s+(`)?\w+(`)?.*;')
Bak_table_Line=$(echo ${line}|egrep -ic '^(`)?[a-zA-Z0-9_]*(`)?$')
}
Bak_table_Line_Format=$(egrep -v '^$|^#|^\s+#' ${MySQL_SqlInfo_file}|egrep -ic '^(`)?[a-zA-Z0-9_]*(`)?$')# 2、检查语法
function Check_Syntax() {
while read line
do
# 调用正则配置语法
Match_Regularif [[  ${Insert_Line} != 1  &&  ${Delete_Line} != 1 && ${Update_Line} != 1 && ${Alter_Line} != 1  && ${Create_index_Line} != 1 && ${Drop_index_Line} != 1   && ${Create_table_Line} != 1   && ${Bak_table_Line_Format} = 0 ]];thenecho "${MySQL_SqlInfo_file} 文件如下内容,格式错误:"echo ' 'echo "${line}"|fmtexit 1fi
done < ${MySQL_Read_SqlFile}
}# 检查库表行数 
function Check_database_table_rows() {
while read  -u 3 line
do
# 调用正则配置语法
Match_Regular# delete 语句####################################################################################################################################if [[ ${Delete_Line} -eq 1 ]];then# 获取where条件Where_Info=$(echo "${line}"|sed -n 's/^delete\s\+from\s\+\([`a-zA-Z0-9_.]*\)\s\+WHERE\s\+\(.*\);/\2/Ip')# 获取表名MySQL_TableName=$(echo "${line}"|sed -n 's/^delete\s\+from\s\+\([`a-zA-Z0-9_.]*\)\s\+WHERE\s\+\(.*\);/\1/Ip'|sed  's#`##g'|awk -F'.' '{print $NF}')# 获取库表是否存在${MySQL_Connection} -N -e "desc ${MySQL_database}.${MySQL_TableName}" &>/dev/nullif [[ $? -ne 0 ]];thenecho "${MySQL_database}.${MySQL_TableName} 库表不存在或mysql无法连接"exit 1fi# 获取备份的行数Sql_Count=$(${MySQL_Connection} -N  -e "select count(1) from ${MySQL_database}.${MySQL_TableName} where ${Where_Info}" 2>/dev/null)if [[ ${Sql_Count} -ge ${Rows_Sum} ]];thenecho "${MySQL_TableName} 表备份的数据量为${Sql_Count}"read -t 20  -e -p "是否继续(y/n)" Answercase $Answer inY | y)echo "确认继续";;N | n)echo "确认退出"exit 1;;*)echo "输入有误"exit 1;;esacfi# update 语句####################################################################################################################################elif [[ ${Update_Line} -eq 1 ]];then# 获取where条件Where_Info=$(echo "${line}"|sed -E -n 's/^update\s+(`?[a-zA-Z0-9_]+`?\.)?(`?[a-zA-Z0-9_]+`?)\s+(join\s+(`?[a-zA-Z0-9_]+`?\.)?(`?[a-zA-Z0-9_]+`?)\s+on\s+.+\s+)?set\s+(.*)\s+where\s+(.*);/\7/Ip')# 获取表名MySQL_TableName=$(echo "${line}"|sed -E -n 's/^update\s+(`?[a-zA-Z0-9_]+`?\.)?(`?[a-zA-Z0-9_]+`?)\s+(join\s+(`?[a-zA-Z0-9_]+`?\.)?(`?[a-zA-Z0-9_]+`?)\s+on\s+.+\s+)?set\s+(.*)\s+where\s+(.*);/\2/Ip'|sed 's/`//g')# 获取库表是否存在${MySQL_Connection} -N -e "desc ${MySQL_database}.${MySQL_TableName}" &>/dev/nullif [[ $? -ne 0 ]];thenecho "${MySQL_database}.${MySQL_TableName} 库表不存在或mysql无法连接"exit 1fi# 获取备份的行数Sql_Count=$(${MySQL_Connection} -N  -e "select count(1) from ${MySQL_database}.${MySQL_TableName} where ${Where_Info}" 2>/dev/null)if [[ ${Sql_Count} -ge ${Rows_Sum} ]];thenecho "${MySQL_TableName} 表备份的数据量为${Sql_Count}"read -t 20  -e -p "是否继续(y/n)" Answercase $Answer inY | y)echo "确认继续";;N | n)echo "确认退出"exit 1;;*)echo "输入有误"exit 1;;esacfi# insert 语句####################################################################################################################################elif [[ ${Insert_Line} -eq 1 ]];thenMySQL_TableName=$(echo "${line}"|egrep -i 'INSERT\s+INTO\s+.*\s+VALUES.*;'|sed -n 's/insert\s\+into\s\+\([^ ]*\).*values\s*(.*)\s*;/\1/Ip'|awk -F'(' '{print $1}'|awk -F'.' '{print $NF}'|sed  's#`##g')# 获取库表是否存在${MySQL_Connection} -N -e "desc ${MySQL_database}.${MySQL_TableName}" &>/dev/nullif [[ $? -ne 0 ]];thenecho "${MySQL_database}.${MySQL_TableName} 库表不存在或mysql无法连接"exit 1fi
# alter 语句##################################################################################################################################### 提取DML语句表名elif [[ ${Alter_Line} -eq 1 ]];thenMySQL_TableName=$(echo "${line}"|sed -En 's/^alter\s+table\s+(`?[a-zA-Z0-9_]+`?\.)?(`?[a-zA-Z0-9_]+`?)\s+(ADD|MODIFY|DROP|RENAME|ENGINE|CHARSET|AUTO_INCREMENT|COMMENT)?.*;/\2/Ip'|sed 's/`//g')# 获取库表是否存在${MySQL_Connection} -N -e "desc ${MySQL_database}.${MySQL_TableName}" &>/dev/nullif [[ $? -ne 0 ]];thenecho "${MySQL_database}.${MySQL_TableName} 库表不存在或mysql无法连接"exit 1fi# 获取表的行数Sql_Count=$(${MySQL_Connection} -N  -e "select count(1) from ${MySQL_database}.${MySQL_TableName}" 2>/dev/null)if [[ ${Sql_Count} -ge ${Rows_Sum} ]];thenecho "${MySQL_TableName} 表备份的数据量为${Sql_Count}"read -t 20  -e -p "是否继续(y/n)" Answercase $Answer inY | y)echo "确认继续";;N | n)echo "确认退出"exit 1;;*)echo "输入有误"exit 1;;esacfi
# create index语句支持############################################################################################################################## 提取create index 语句表名elif [[ ${Create_index_Line} -eq 1 ]];thenMySQL_TableName=$(echo "${line}"|egrep -i 'CREATE\s+(UNIQUE|FULLTEXT|SPATIAL)?\s*INDEX\s+.*\s+ON*\(*\)*'|sed -n "s/create\s\+.*\s*index\s\+.*\s\+ON\s\+\([^ ]*\)\s*(.*).*/\1/Ip"|awk -F. '{print $NF}'|sed 's/`//g')MySQL_TableIndex=$(echo "${line}"|egrep -i 'CREATE\s+(UNIQUE|FULLTEXT|SPATIAL)?\s*INDEX\s+.*\s+ON*\(*\)*'|sed -n "s/create\s\+.*\s*index\s\+\([^ ]*\)\s\+ON\s\+\([^ ]*\)\s*(.*).*/\1/Ip"|sed 's/`//g')# 获取库表是否存在${MySQL_Connection} -N -e "desc ${MySQL_database}.${MySQL_TableName}" &>/dev/nullif [[ $? -ne 0 ]];thenecho "${MySQL_database}.${MySQL_TableName} 库表不存在或mysql无法连接"exit 1fi# 检查索引是否存在Index_exists=$(${MySQL_Connection} -N -e "use ${MySQL_database};show index from ${MySQL_database}.${MySQL_TableName} where key_name=\"${MySQL_TableIndex}\";" 2>/dev/null | grep -ci  "${MySQL_TableIndex}")if [[ Index_exists -ne 0 ]];thenecho "${MySQL_database}.${MySQL_TableName} 表的${MySQL_TableIndex} 索引已存在"exit 1fi# 获取表的行数Sql_Count=$(${MySQL_Connection} -N  -e "select count(1) from ${MySQL_database}.${MySQL_TableName}" 2>/dev/null)if [[ ${Sql_Count} -ge ${Rows_Sum} ]];thenecho "${MySQL_TableName} 表备份的数据量为${Sql_Count}"read -t 20  -e -p "是否继续(y/n)" Answercase $Answer inY | y)echo "确认继续";;N | n)echo "确认退出"exit 1;;*)echo "输入有误"exit 1;;esacfi
# drop index  语句支持############################################################################################################################## 提取drop index 语句表名elif [[ ${Drop_index_Line} -eq 1 ]];thenMySQL_TableName=$(echo "${line}"|egrep -i '^drop\s+INDEX\s+\w+\s+ON\s+(`)?(\w+)?(`)?(.)?(`)?\w+(`)?\s*;'|sed -En 's/^drop\s+index\s+\w+\s+ON\s+(`?[a-zA-Z0-9_]+`?\.)?(`?[a-zA-Z0-9_]+`?).*;/\2/Ip'|sed 's/`//g')MySQL_TableIndex=$(echo "${line}"|egrep -i '^drop\s+INDEX\s+(`?[a-zA-Z0-9_]+`?)\s+ON\s+(`)?(\w+)?(`)?(.)?(`)?\w+(`)?\s*;'|sed -En 's/^drop\s+index\s+`?(\w+)`?\s+ON\s+(`)?(\w+)?(`)?(.)?(`)?\w+(`)?\s*;/\1/Ip')# 获取库表是否存在${MySQL_Connection} -N -e "desc ${MySQL_database}.${MySQL_TableName}" &>/dev/nullif [[ $? -ne 0 ]];thenecho "${MySQL_database}.${MySQL_TableName} 库表不存在或mysql无法连接"exit 1fi# 检查索引是否存在Index_exists=$(${MySQL_Connection} -N -e "use ${MySQL_database};show index from ${MySQL_database}.${MySQL_TableName} where key_name=\"${MySQL_TableIndex}\";" 2>/dev/null | grep -ci  "${MySQL_TableIndex}")if [[ Index_exists -ne 1 ]];thenecho "${MySQL_database}.${MySQL_TableName} 表的${MySQL_TableIndex} 索引不存在"exit 1fi# 获取表的行数Sql_Count=$(${MySQL_Connection} -N  -e "select count(1) from ${MySQL_database}.${MySQL_TableName}" 2>/dev/null)if [[ ${Sql_Count} -ge ${Rows_Sum} ]];thenecho "${MySQL_TableName} 表备份的数据量为${Sql_Count}"read -t 20  -e -p "是否继续(y/n)" Answercase $Answer inY | y)echo "确认继续";;N | n)echo "确认退出"exit 1;;*)echo "输入有误"exit 1;;esacfi# Create  table 语句支持###########################################################################################################################elif [[ ${Create_table_Line} -eq 1 ]];thenMySQL_TableName=$(echo "${line}"|sed -n  's/create\s\+table\s\+\([^ ]*\)\s*(.*).*;/\1/Ip'|sed  's#`##g'|awk -F'.' '{print $NF}')# 获取库表是否存在${MySQL_Connection} -N -e "desc ${MySQL_database}.${MySQL_TableName}" &>/dev/nullif [[ $? -eq 0 ]];thenecho "${MySQL_database}.${MySQL_TableName} 库表已存在"exit 1fielsecontinuefi
done 3< ${MySQL_Read_SqlFile}
echo 'SQL语法检查完成'
}# 4、执行备份
function Execute_backup() {
while read line
do
# 调用正则配置语法
Match_Regular
# delete 语句#####################################################################################################################################if [[ ${Delete_Line} -eq 1 ]];then# 获取where条件Where_Info=$(echo "${line}"|sed -n 's/^delete\s\+from\s\+\([`a-zA-Z0-9_.]*\)\s\+WHERE\s\+\(.*\);/\2/Ip')# 获取表名MySQL_TableName=$(echo "${line}"|sed -n 's/^delete\s\+from\s\+\([`a-zA-Z0-9_.]*\)\s\+WHERE\s\+\(.*\);/\1/Ip'|sed  's#`##g'|awk -F'.' '{print $NF}')# 带where条件备份${MysqlDump_Command} -u${MySQL_user} -p${MySQL_password} -h${MySQL_host} -P${MySQL_port}  --no-create-info --single-transaction   --skip-extended-insert    --where="${Where_Info}" ${MySQL_database} ${MySQL_TableName} 2>/dev/null  >> ${MySQL_bak_dir}/${MySQL_database}.${MySQL_TableName}_${Date}.sql# 判断是否备份成功if [[ ${PIPESTATUS[0]} -eq 0 && ${PIPESTATUS[1]} -eq 0 ]];thenecho "${MySQL_TableName} 表备份完成"elseecho "${MySQL_TableName} 表备份失败"exit 1fi
# update 语句#####################################################################################################################################elif [[ ${Update_Line} -eq 1 ]];then# 获取where条件Where_Info=$(echo "${line}"|sed -E -n 's/^update\s+(`?[a-zA-Z0-9_]+`?\.)?(`?[a-zA-Z0-9_]+`?)\s+(join\s+(`?[a-zA-Z0-9_]+`?\.)?(`?[a-zA-Z0-9_]+`?)\s+on\s+.+\s+)?set\s+(.*)\s+where\s+(.*);/\7/Ip')# 获取表名MySQL_TableName=$(echo "${line}"|sed -E -n 's/^update\s+(`?[a-zA-Z0-9_]+`?\.)?(`?[a-zA-Z0-9_]+`?)\s+(join\s+(`?[a-zA-Z0-9_]+`?\.)?(`?[a-zA-Z0-9_]+`?)\s+on\s+.+\s+)?set\s+(.*)\s+where\s+(.*);/\2/Ip'|sed 's/`//g')# 带where条件备份${MysqlDump_Command} -u${MySQL_user} -p${MySQL_password} -h${MySQL_host} -P${MySQL_port}  --no-create-info --single-transaction   --skip-extended-insert    --where="${Where_Info}" ${MySQL_database} ${MySQL_TableName} 2>/dev/null  >> ${MySQL_bak_dir}/${MySQL_database}.${MySQL_TableName}_${Date}.sql# 判断是否备份成功if [[ ${PIPESTATUS[0]} -eq 0 && ${PIPESTATUS[1]} -eq 0 ]];thenecho "${MySQL_TableName} ���备份完成"elseecho "${MySQL_TableName} 表备份失败"exit 1fi# alter 语句####################################################################################################################################### 提取DML语句表名elif [[ ${Alter_Line} -eq 1 ]];thenMySQL_TableName=$(echo "${line}"|sed -En 's/^alter\s+table\s+(`?[a-zA-Z0-9_]+`?\.)?(`?[a-zA-Z0-9_]+`?)\s+(ADD|MODIFY|DROP|RENAME|ENGINE|CHARSET|AUTO_INCREMENT|COMMENT)?.*;/\2/Ip'|sed 's/`//g')# 备份表${MysqlDump_Command} -u${MySQL_user} -p${MySQL_password} -h${MySQL_host} -P${MySQL_port}   --single-transaction   --skip-extended-insert     ${MySQL_database} ${MySQL_TableName} 2>/dev/null  >> ${MySQL_bak_dir}/${MySQL_database}.${MySQL_TableName}_${Date}.sql# 判断是否备份成功if [[ ${PIPESTATUS[0]} -eq 0 && ${PIPESTATUS[1]} -eq 0 ]];thenecho "${MySQL_TableName} 表备份完成"elseecho "${MySQL_TableName} 表备份失败"exit 1fi
# create index 语句支持############################################################################################################################# 提取DML语句表名elif [[ ${Create_index_Line} -eq 1 ]];thenMySQL_TableName=$(echo "${line}"|egrep -i 'CREATE\s+(UNIQUE|FULLTEXT|SPATIAL)?\s*INDEX\s+.*\s+ON*\(*\)*'|sed -n "s/create\s\+.*\s*index\s\+.*\s\+ON\s\+\([^ ]*\)\s*(.*).*/\1/Ip"|awk -F. '{print $NF}'|sed 's/`//g')# 备份表${MysqlDump_Command} -u${MySQL_user} -p${MySQL_password} -h${MySQL_host} -P${MySQL_port}   --single-transaction   --skip-extended-insert     ${MySQL_database} ${MySQL_TableName} 2>/dev/null  >> ${MySQL_bak_dir}/${MySQL_database}.${MySQL_TableName}_${Date}.sql# 判断是否备份成功if [[ ${PIPESTATUS[0]} -eq 0 && ${PIPESTATUS[1]} -eq 0 ]];thenecho "${MySQL_TableName} 表备份完成"elseecho "${MySQL_TableName} 表备份失败"exit 1fi
# drop index 语句支持############################################################################################################################## 提取DML语句表名elif [[ ${Drop_index_Line} -eq 1 ]];thenMySQL_TableName=$(echo "${line}"|egrep -i '^drop\s+INDEX\s+\w+\s+ON\s+(`)?(\w+)?(`)?(.)?(`)?\w+(`)?\s*;'|sed -En 's/^drop\s+index\s+\w+\s+ON\s+(`?[a-zA-Z0-9_]+`?\.)?(`?[a-zA-Z0-9_]+`?).*;/\2/Ip'|sed 's/`//g')# 备份表${MysqlDump_Command} -u${MySQL_user} -p${MySQL_password} -h${MySQL_host} -P${MySQL_port}   --single-transaction   --skip-extended-insert     ${MySQL_database} ${MySQL_TableName} 2>/dev/null  >> ${MySQL_bak_dir}/${MySQL_database}.${MySQL_TableName}_${Date}.sql# 判断是否备份成功if [[ ${PIPESTATUS[0]} -eq 0 && ${PIPESTATUS[1]} -eq 0 ]];thenecho "${MySQL_TableName} 表备份完成"elseecho "${MySQL_TableName} 表备份失败"exit 1fi# insert 语句支持#################################################################################################################################elif [[ ${Insert_Line} -eq 1 ]];thenMySQL_TableName=$(echo "${line}"|egrep -i 'INSERT\s+INTO\s+.*\s+VALUES.*;'|sed -n 's/insert\s\+into\s\+\([^ ]*\).*values\s*(.*)\s*;/\1/Ip'|awk -F'(' '{print $1}'|awk -F'.' '{print $NF}'|sed  's#`##g')echo "${MySQL_TableName} 表为insert语句跳过备份"continue
# Create table 语句支持###########################################################################################################################elif [[ ${Create_table_Line} -eq 1 ]];thenMySQL_TableName=$(echo "${line}"|sed -nE  's/create\s+table\s+(`?[a-zA-Z0-9_]+`?\.)?(`?[a-zA-Z0-9_]+`?)\s*(.*).*;/\2/Ip'|sed 's/`//g')echo "${MySQL_TableName} 表为create table语句跳过备份"continue# backup table 支持##############################################################################################################################elif [[ ${Bak_table_Line} -eq 1 ]];thenMySQL_TableName=$(echo "${line}"|egrep -i '^(`)?[a-zA-Z0-9_]*(`)?$'|sed 's/`//g')# 备份表${MysqlDump_Command} -u${MySQL_user} -p${MySQL_password} -h${MySQL_host} -P${MySQL_port}   --single-transaction   --skip-extended-insert    ${MySQL_database} ${MySQL_TableName} 2>/dev/null  >> ${MySQL_bak_dir}/${MySQL_database}.${MySQL_TableName}_${Date}.sql# 判断是否备份成功if [[ ${PIPESTATUS[0]} -eq 0 && ${PIPESTATUS[1]} -eq 0 ]];thenecho "${MySQL_TableName} 表备份完成"elseecho "${MySQL_TableName} 表备份失败"exit 1fifi
done < ${MySQL_Read_SqlFile}
}# 5、执行SQL
function Execute_SQL() {
while read line
doif [[ ${Bak_table_Line_Format} -ne 0 ]];thencontinueelse${MySQL_Connection} -N -vv  -e "use ${MySQL_database};${line}" |fmtif [[ ${PIPESTATUS[0]} -ne 0 || ${PIPESTATUS[1]} -ne 0 ]];thenecho "${line} SQL执行失败"fifidone < ${MySQL_Read_SqlFile}
}# 将多行的SQL转化为一行
# 去除文件中的空行和注释行
function Format_SQL() {
if [[ ${Bak_table_Line_Format} -eq 0 ]];thencat ${MySQL_SqlInfo_file}|egrep -v '^$|^#|^\s+#'  |awk -F ';'  BEGIN{RS=EOF}'{gsub(/\n/," ");print}' |awk 'BEGIN{i=1}{gsub(/;/,";""\n");i++;print}'|sed 's/^[[:space:]]*//'|grep -v '^$' >${MySQL_Read_SqlFile}
elsecat ${MySQL_SqlInfo_file}|egrep -v '^$|^#|^\s+#'|sed -n 's/\s*\([a-zA-Z0-9_]*\)\s*/\1/Ip'|sed 's/`//g' >${MySQL_Read_SqlFile}
fi
}# 1、格式化SQL
Format_SQL
# 2、检查语法
Check_Syntax
# 3、检查库表行数
Check_database_table_rows
# 4、执行备份
Execute_backup
# 5、执行SQL
Execute_SQL

执行脚本

# 创建备份保存目录
mkdir -p /root/dba/bak# 粘贴过来需要执行的 SQL
vim /root/1_sql_info.txt  
delete from t1 where id = 12;
delete from t1 where id = 13;
delete from t1 where id in (1,2,3);
update t2 set name='tom' where id=9;
alter table t3 add index idx_name_age(name,age);
create index idx_name_age on t4 (name,age);# 执行脚本
sh -x /root/2_sql_bak_exec.sh

本内容仅供参考,如需在生产环境使用,请自行验证。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/310985.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PHP学习(二)

一、php 数据类型之查看和判断数据类型 查看数据类型 1.gettype(传入一个变量) 能够获得变量的类型 2.var_dump(传入一个变量) 输出变量类型和值 <?php //声明一个变量 88.8 $f 88.8; $type gettype($f); echo $type; ?> <?php //多换几个类型试试 $str 你…

MySQL 实例employee表综合查询

目录 表关系图&#xff1a; 例题&#xff1a; 1.查出至少有一个员工的部门。显示部门编号、部门名称、部门位置、部门人数。 2.列出所有员工的姓名及其直接上级的姓名。 3.列出受雇日期早于直接上级的所有员工的编号、姓名、部门名称。 4.列出部门名称和这些部门的员工信…

YOLOv8 测试 5-2:Linux 中 Dockerfile 部署 YOLOv8 项目一键运行,Python 封装 API 接口测试

一、前言 记录时间 [2024-4-15] 系列文章简摘&#xff1a; Docker 学习笔记&#xff08;二&#xff09;&#xff1a;在 Linux 中部署 Docker&#xff08;Centos7 下安装 docker、环境配置&#xff0c;以及镜像简单使用&#xff09; API 接口简单使用&#xff08;二&#xff09;…

第十五届蓝桥杯复盘 pythonA组——试题A 拼正方形

思路 先把22的正方形放进去&#xff0c;剩余的地方用11的正方形填充 情况一&#xff1a; 假设所有的22 和11恰好拼成一个大正方形 但是上图的代码是不符合现实情况的 比如两个22和1个11 面积为9&#xff0c;是平方数&#xff0c;但是拼不成正方形&#xff0c; 因此要换思路&…

从零自制docker-9-【管道实现run进程和init进程传参】

文章目录 命令行中输入参数长度过长匿名管道从父进程到子进程传参[]*os.File{}os.NewFile和io.ReadAllexe.LookPathsyscall.Execstrings.Split(msgStr, " ")/bin/ls: cannot access : No such file or directory代码 命令行中输入参数长度过长 用户输入参数过长或包…

SOLIDWORKS 2024教育版全套多少钱?

SOLIDWORKS 2024教育版全套是一款专为教育机构和学生设计的3D CAD设计软件套装。它集合了SOLIDWORKS的核心功能和工具&#xff0c;旨在帮助学生在学习和实践过程中掌握先进的工程设计和制造技术。对于教育机构和学生而言&#xff0c;了解SOLIDWORKS 2024教育版全套的价格成为了…

深度探索:Secure Hash Algorithm(SHA)全景解析

title: 深度探索&#xff1a;Secure Hash Algorithm&#xff08;SHA&#xff09;全景解析 date: 2024/4/15 18:33:17 updated: 2024/4/15 18:33:17 tags: SHA安全抗碰撞性算法版本实现细节性能优化发展历史应用案例 密码学中的哈希函数 一、哈希函数的定义 哈希函数是一种数…

快来看!这样的统计地图真的很好绘制的~~

之前有小伙伴再讨论群里提问关于分级统计地图(choropleth maps) 的绘制方法&#xff0c;刚开始看到这个问题的时候觉得比较简单&#xff0c;就给出了几个处理方法&#xff0c;有R的也有基于Python 的&#xff0c;但后来和提问小伙伴一聊&#xff0c;才知道是要绘制一个有 ”三元…

2024五一杯数学建模C题思路分析

文章目录 1 赛题思路2 比赛日期和时间3 组织机构4 建模常见问题类型4.1 分类问题4.2 优化问题4.3 预测问题4.4 评价问题 5 建模资料 1 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 2 比赛日期和时间 报名截止时间&#xff1a;2024…

四.音视频编辑-音频混合-概述

引言 当我们在前两篇博客中成功地构建了一个媒体组合&#xff0c;并且略过了音频部分时&#xff0c;我们意识到了我们需要对这个项目进行更详细的探讨。在本篇博客中&#xff0c;我们将会展示如何创建一个包含视频轨道、配音音频轨道以及背景音频轨道的完整媒体组合。更进一步…

lua 环境安装

下载地址&#xff1a; https://luabinaries.sourceforge.net/download.html 安装环境变量 检查一下是否安装成功&#xff0c;有版本号&#xff0c;打印一句话&#xff0c;如下表示成功 idea 安装插件&#xff0c;方便编写lua脚本 配置一下idea 运行测试 local function m…

经典文献阅读之--Light-LOAM( 基于图匹配的轻量级激光雷达里程计和地图构建)

0. 简介 将SLAM应用于机器人应用中&#xff0c;可靠性和效率是两个最受重视的特性。本文《Light-LOAM: A Lightweight LiDAR Odometry and Mapping based on Graph-Matching》考虑在计算能力有限的平台上实现可靠的基于激光雷达的SLAM功能。首先与大多数选择点云配准的显著特征…

国税发票查验接口、电子增值税发票查验接口、数电票查验接口

翔云发票查验接口支持增值税发票管理系统开具发票的真伪&#xff0c;通过发票代码、号码、日期、金额、校验码四要素信息进行真伪的查验&#xff0c;支持返回全票面信息&#xff0c;API接口便于集成&#xff0c;可适用于多种应用场景。 发票查验接口python调用示例&#xff1a;…

正则表达式(Regular Expression)

正则表达式很重要&#xff0c;是一个合格攻城狮的必备利器&#xff0c;必须要学会&#xff01;&#xff01;&#xff01; &#xff08;参考视频&#xff09;10分钟快速掌握正则表达式&#xff08;奇乐编程学院&#xff09;https://www.bilibili.com/video/BV1da4y1p7iZ在线测试…

分布式监控平台---Zabbix

一、Zabbix概述 作为一个运维&#xff0c;需要会使用监控系统查看服务器状态以及网站流量指标&#xff0c;利用监控系统的数据去了解上线发布的结果&#xff0c;和网站的健康状态。 利用一个优秀的监控软件&#xff0c;我们可以&#xff1a; 通过一个友好的界面进行浏览整个…

CSRF漏洞详解

目录 什么是同源策略 什么是csrf CSRF 攻击会产生什么影响&#xff1f; CSRF漏洞low等级复现 什么是同源策略 协议相同 域名相同 端口相同 什么是csrf 跨站请求伪造&#xff08;也称为 CSRF&#xff09;是一种 Web 安全漏洞&#xff0c;允许攻击者诱导用户执行他们不打…

华为各级OD薪资曝光。。

华为 OD 薪资 之前写过几篇华为 OD 的算法题&#xff0c;后来有不少同学问起&#xff0c;华为 OD 薪资到底怎么样。 华为 OD 的薪资待遇&#xff0c;网上信息不多&#xff0c;只找到一篇相对靠谱的爆料&#xff1a; 上述是月 base 的爆料&#xff0c;然后通常 OD 是 15-16 薪。…

如何连通私有子网中的 MSK / Kafka 集群?

MSK 集群通常都是建在私有子网中的&#xff0c;这给本地访问带来了很多麻烦&#xff0c;特别是需要在本地使用 Kafka GUI 客户端管理和读写 MSK 数据的时候。本文会给出一套解决方案。 我们这里讨论的问题有一点特殊性&#xff0c;那就是&#xff1a;由于 MSK 是托管服务&…

标准版uni-app移动端页面添加/开发操作流程

页面简介 uni-app项目中&#xff0c;一个页面就是一个符合Vue SFC规范的.vue文件或.nvue文件。 .vue页面和.nvue页面&#xff0c;均全平台支持&#xff0c;差异在于当uni-app发行到App平台时&#xff0c;.vue文件会使用webview进行渲染&#xff0c;.nvue会使用原生进行渲染。…

单元测试四大过程

单元测试四大过程&#xff08;蓝桥课学习笔记&#xff09; 单元测试过程 单元测试是软件测试过程中的一个关键环节&#xff0c;它与集成测试、系统测试一样&#xff0c;分为测试策划、测试设计、测试执行和测试总结几个阶段。 单元测试过程中每个阶段需要完成的主要工作如下&…