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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 【MySQL】 mysql 日常工单处理脚本 解放你的双手!!!

简介

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

流程图:

功能:

  • 语法检查: 检查是否 符合脚本正则
  • 数据量检查:检查数据量大小,数据量大时可选择其他时间或工具执行,数据量小时可继续执行
  • 备份数据: 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/bash
MySQL_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_Regular
  if [[  ${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 ]];then
        echo "${MySQL_SqlInfo_file} 文件如下内容,格式错误:"
        echo ' '
        echo "${line}"|fmt
        exit 1
  fi
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/null
            if [[ $? -ne 0 ]];then
                echo "${MySQL_database}.${MySQL_TableName} 库表不存在或mysql无法连接"
                exit 1
            fi
        # 获取备份的行数
        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} ]];then
                echo "${MySQL_TableName} 表备份的数据量为${Sql_Count}"
                read -t 20  -e -p "是否继续(y/n)" Answer
                case $Answer in
                Y | y)
                    echo "确认继续"
                    ;;
                N | n)
                    echo "确认退出"
                    exit 1
                    ;;
                *)
                    echo "输入有误"
                    exit 1
                    ;;
                esac
            fi
# 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/null
            if [[ $? -ne 0 ]];then
                echo "${MySQL_database}.${MySQL_TableName} 库表不存在或mysql无法连接"
                exit 1
            fi
        # 获取备份的行数
        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} ]];then
                echo "${MySQL_TableName} 表备份的数据量为${Sql_Count}"
                read -t 20  -e -p "是否继续(y/n)" Answer
                case $Answer in
                Y | y)
                    echo "确认继续"
                    ;;
                N | n)
                    echo "确认退出"
                    exit 1
                    ;;
                *)
                    echo "输入有误"
                    exit 1
                    ;;
                esac
            fi
            
# insert 语句####################################################################################################################################
    elif [[ ${Insert_Line} -eq 1 ]];then
        MySQL_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/null
            if [[ $? -ne 0 ]];then
                echo "${MySQL_database}.${MySQL_TableName} 库表不存在或mysql无法连接"
                exit 1
            fi
# alter 语句####################################################################################################################################
    # 提取DML语句表名
    elif [[ ${Alter_Line} -eq 1 ]];then
        MySQL_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/null
            if [[ $? -ne 0 ]];then
                echo "${MySQL_database}.${MySQL_TableName} 库表不存在或mysql无法连接"
                exit 1
            fi
        # 获取表的行数
        Sql_Count=$(${MySQL_Connection} -N  -e "select count(1) from ${MySQL_database}.${MySQL_TableName}" 2>/dev/null)
            if [[ ${Sql_Count} -ge ${Rows_Sum} ]];then
                echo "${MySQL_TableName} 表备份的数据量为${Sql_Count}"
                read -t 20  -e -p "是否继续(y/n)" Answer
                case $Answer in
                Y | y)
                    echo "确认继续"
                    ;;
                N | n)
                    echo "确认退出"
                    exit 1
                    ;;
                *)
                    echo "输入有误"
                    exit 1
                    ;;
                esac
            fi
# create index语句支持#############################################################################################################################
    # 提取create index 语句表名
    elif [[ ${Create_index_Line} -eq 1 ]];then
        MySQL_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/null
            if [[ $? -ne 0 ]];then
                echo "${MySQL_database}.${MySQL_TableName} 库表不存在或mysql无法连接"
                exit 1
            fi
        # 检查索引是否存在
        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 ]];then
                echo "${MySQL_database}.${MySQL_TableName} 表的${MySQL_TableIndex} 索引已存在"
                exit 1
            fi
        # 获取表的行数
        Sql_Count=$(${MySQL_Connection} -N  -e "select count(1) from ${MySQL_database}.${MySQL_TableName}" 2>/dev/null)
            if [[ ${Sql_Count} -ge ${Rows_Sum} ]];then
                echo "${MySQL_TableName} 表备份的数据量为${Sql_Count}"
                read -t 20  -e -p "是否继续(y/n)" Answer
                case $Answer in
                Y | y)
                    echo "确认继续"
                    ;;
                N | n)
                    echo "确认退出"
                    exit 1
                    ;;
                *)
                    echo "输入有误"
                    exit 1
                    ;;
                esac
            fi
# drop index  语句支持#############################################################################################################################
    # 提取drop index 语句表名
    elif [[ ${Drop_index_Line} -eq 1 ]];then
        MySQL_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/null
            if [[ $? -ne 0 ]];then
                echo "${MySQL_database}.${MySQL_TableName} 库表不存在或mysql无法连接"
                exit 1
            fi
        # 检查索引是否存在
        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 ]];then
                echo "${MySQL_database}.${MySQL_TableName} 表的${MySQL_TableIndex} 索引不存在"
                exit 1
            fi
        # 获取表的行数
        Sql_Count=$(${MySQL_Connection} -N  -e "select count(1) from ${MySQL_database}.${MySQL_TableName}" 2>/dev/null)
            if [[ ${Sql_Count} -ge ${Rows_Sum} ]];then
                echo "${MySQL_TableName} 表备份的数据量为${Sql_Count}"
                read -t 20  -e -p "是否继续(y/n)" Answer
                case $Answer in
                Y | y)
                    echo "确认继续"
                    ;;
                N | n)
                    echo "确认退出"
                    exit 1
                    ;;
                *)
                    echo "输入有误"
                    exit 1
                    ;;
                esac
            fi
# Create  table 语句支持###########################################################################################################################
    elif [[ ${Create_table_Line} -eq 1 ]];then
        MySQL_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/null
            if [[ $? -eq 0 ]];then
                echo "${MySQL_database}.${MySQL_TableName} 库表已存在"
                exit 1
            fi
    else
        continue
    fi
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 ]];then
                echo "${MySQL_TableName} 表备份完成"
        else
                echo "${MySQL_TableName} 表备份失败"
                exit 1
        fi
# 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 ]];then
                echo "${MySQL_TableName} ���备份完成"
        else
                echo "${MySQL_TableName} 表备份失败"
                exit 1
        fi
# alter 语句######################################################################################################################################
    # 提取DML语句表名
    elif [[ ${Alter_Line} -eq 1 ]];then
        MySQL_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 ]];then
                echo "${MySQL_TableName} 表备份完成"
        else
                echo "${MySQL_TableName} 表备份失败"
                exit 1
        fi
# create index 语句支持############################################################################################################################
    # 提取DML语句表名
    elif [[ ${Create_index_Line} -eq 1 ]];then
         MySQL_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 ]];then
                echo "${MySQL_TableName} 表备份完成"
        else
                echo "${MySQL_TableName} 表备份失败"
                exit 1
        fi
# drop index 语句支持#############################################################################################################################
    # 提取DML语句表名
    elif [[ ${Drop_index_Line} -eq 1 ]];then
        MySQL_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 ]];then
                echo "${MySQL_TableName} 表备份完成"
        else
                echo "${MySQL_TableName} 表备份失败"
                exit 1
        fi
# insert 语句支持#################################################################################################################################
    elif [[ ${Insert_Line} -eq 1 ]];then
        MySQL_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 ]];then
        MySQL_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 ]];then
        MySQL_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 ]];then
                echo "${MySQL_TableName} 表备份完成"
        else
                echo "${MySQL_TableName} 表备份失败"
                exit 1
        fi
    fi
done < ${MySQL_Read_SqlFile}
}
# 5、执行SQL
function Execute_SQL() {
while read line
do
    if [[ ${Bak_table_Line_Format} -ne 0 ]];then
        continue
    else
    ${MySQL_Connection} -N -vv  -e "use ${MySQL_database};${line}" |fmt
        if [[ ${PIPESTATUS[0]} -ne 0 || ${PIPESTATUS[1]} -ne 0 ]];then
            echo "${line} SQL执行失败"
        fi
    fi
done < ${MySQL_Read_SqlFile}
}
# 将多行的SQL转化为一行
# 去除文件中的空行和注释行
function Format_SQL() {
if [[ ${Bak_table_Line_Format} -eq 0 ]];then
    cat ${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}
else
    cat ${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

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


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
23天前
|
SQL 监控 关系型数据库
MySQL优化: CPU高 处理脚本 pt-kill脚本
MySQL优化: CPU高 处理脚本 pt-kill脚本
|
3月前
|
关系型数据库 MySQL 数据库
数据迁移脚本优化过程:从 MySQL 到 Django 模型表
在大规模的数据迁移过程中,性能问题往往是开发者面临的主要挑战之一。本文将分析一个数据迁移脚本的优化过程,展示如何从 MySQL 数据库迁移数据到 Django 模型表,并探讨优化前后的性能差异。
|
3月前
|
DataWorks 关系型数据库 MySQL
DataWorks产品使用合集之用脚本的方式同步数据到MySQL,怎么指定列作为目标表为唯一行
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
|
19天前
|
存储 关系型数据库 MySQL
实战!MySQL主从复制一键搭建脚本分享
实战!MySQL主从复制一键搭建脚本分享
26 2
|
19天前
|
关系型数据库 MySQL Shell
MySQL数据库一键安装脚本,适合任何版本
MySQL数据库一键安装脚本,适合任何版本
27 2
|
19天前
|
关系型数据库 MySQL 网络安全
全网首例!MySQL8 MGR多主一键搭建脚本分享
全网首例!MySQL8 MGR多主一键搭建脚本分享
19 1
|
23天前
|
关系型数据库 MySQL Shell
MySQL回滚脚本: 误操作delete binlog回滚shell脚本
MySQL回滚脚本: 误操作delete binlog回滚shell脚本
|
19天前
|
缓存 关系型数据库 MySQL
分享一个实用的MySQL一键巡检脚本
分享一个实用的MySQL一键巡检脚本
14 0
|
19天前
|
关系型数据库 MySQL Shell
分享一篇mysql数据库备份脚本
分享一篇mysql数据库备份脚本
19 0
|
23天前
|
关系型数据库 MySQL 机器人
【MySQL】两个脚本自动化搞定 MySQL 备份恢复--XtraBackup
【MySQL】两个脚本自动化搞定 MySQL 备份恢复--XtraBackup

热门文章

最新文章