【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/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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言结构体的使用

C语言结构体的使用 1、先声明在定义 #include<stdio.h> #include<string.h> struct student{ char name[20]; int age; double score; };int main(){ struct student st; struct student *stt&st;strcpy(st.name,"zhangsan"); //通过地址赋值 (&am…

Matroska解封装原理与实践

本期作者 背景 Matroska是一种开放标准、功能强大的多媒体封装格式&#xff0c;可容纳多种不同类型的视频、音频及字幕流&#xff0c;其常见的文件扩展名为.mkv、.mka等。与应用广泛的MP4相比&#xff0c;Matroska更加灵活开放&#xff0c;可以同时容纳多个字幕&#xff0c;甚至…

云计算,如何从IT战略上升为企业核心战略?

ITValue 本文摘自《云栖战略参考》&#xff0c;这本刊物由阿里云与钛媒体联合策划。目的是为了把各个行业先行者的技术探索、业务实践呈现出来&#xff0c;与思考同样问题的“数字先行者”共同探讨、碰撞&#xff0c;希望这些内容能让你有所启发。 首发&#xff5c;钛媒体APP I…

YOLO-World——S(cvpr2024)

文章目录 Abstract成果 MethodPre-training Formulation: Region-Text PairsModel ArchitectureYOLO DetectorText EncoderText Contrastive HeadTraining with Online VocabularyInference with Offline Vocabulary Re-parameterizable Vision-Language PANText-guided CSPLay…

面试算法-174-二叉树的层序遍历

题目 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;[[3],[9,20],[15,7]] 解 class Solut…

消息队列中间件,RabbitMQ的使用,死信队列,延迟队列,利用枚举实现队列,交换机,RountKey的声明

目录 0.交换机种类和区别 1.声明队列和交换机以及RountKey 2.初始化循环绑定 3.声明交换机 4.监听队列 4.1 监听普通队列 4.2监听死信队列 5.削峰填谷的实现 0.交换机种类和区别 Direct Exchange&#xff08;直连交换机&#xff09;&#xff1a; 直连交换机将消息发送到…

武汉星起航:亚马逊跨境引领全球贸易新趋势,展现积极影响力

随着全球化浪潮的持续推进&#xff0c;跨境电商行业正迎来前所未有的发展机遇。亚马逊作为全球领先的电商平台&#xff0c;其在跨境电商领域的发展趋势备受瞩目。亚马逊跨境电商不仅扩大了跨境市场的规模&#xff0c;优化了供应链管理&#xff0c;还积极应用科技创新&#xff0…

【讲解下如何从零基础学习Java】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

pyqt实战-软件通用界面设计模板样例

软件界面 技术点 无边框设计自定义右上角最大化&#xff0c;最小化&#xff0c;关闭按钮界面布局能够自适应界面的放大缩小按住鼠标左键能够拖动整个界面treewidget整体风格设计 代码 import sysfrom PyQt5 import QtCore, QtGui, QtWidgets from PyQt5.Qt import * impor…

c# 服务创建

服务 创建服务 编写服务 可以对server1.cs重新命名&#xff0c;点击你的server按F7进入代码编辑模式&#xff0c;编写脚本 双击你的server.cs右击空白位置&#xff0c;添加安装程序&#xff0c;此时会生成“serviceInstaller1”及“serviceProcessInstaller1” 后续可以点击P…

开源相机管理库Aravis例程学习(一)——单帧采集single-acquisition

开源相机管理库Aravis例程学习&#xff08;一&#xff09;——单帧采集single-acquisition 简介源码函数说明arv_camera_newarv_camera_acquisitionarv_camera_get_model_namearv_buffer_get_image_widtharv_buffer_get_image_height 简介 本文针对官方例程中的第一个例程&…

CSS特效---跳动的文字

1、演示 2、一切尽在代码中 <!--* Author: your name* Date: 2023-10-03 14:42:44* LastEditTime: 2023-10-03 14:56:26* LastEditors: DESKTOP-536UVPC* Description: In User Settings Edit* FilePath: \css-special-effects\跳动的文字.html --> <!DOCTYPE html>…

【Linux】进程的优先级环境变量

个人主页 &#xff1a; zxctscl 如有转载请先通知 文章目录 1. 前言2. 进程的优先级2.1 什么是优先级2.2 为什么要有优先级2.3 优先级的查看方式2.4 对优先级调整 3. 命令行参数4. 环境变量4.1 环境变量与配置文件4.1.1 环境变量初步介绍4.1.2 配置文件 4.2 更多环境变量4.3 整…

Shiro整合EhCache缓存(二)

Shiro整合EhCache缓存 1、授权、角色认证1.1、后端接口服务注解1.2、授权-获取角色1.3、授权-获取权限1.4、授权-异常处理1.5、前端页面授权 2、EhCache2.1、Shiro整合EhCache 1、授权、角色认证 用户登录后&#xff0c;需要验证是否具有指定角色指定权限。Shiro也提供了方便的…

企业网络日益突出的难题与SD-WAN解决方案

随着企业规模的迅速扩张和数字化转型的深入推进&#xff0c;企业在全球范围内需要实现总部、分支机构、门店、数据中心、云等地点的网络互联、数据传输和应用加速。SD-WAN作为当今主流解决方案&#xff0c;在网络效率、传输质量、灵活性和成本等方面远远超越传统的互联网、专线…

归并排序详解(附代码)

归并排序 数据科学家每天都在处理算法。 然而&#xff0c;数据科学学科作为一个整体已经发展成为一个不涉及复杂算法实现的角色。 尽管如此&#xff0c;从业者仍然可以从建立对算法的理解和知识库中受益。 在本文中&#xff0c;对排序算法归并排序进行了介绍、解释、评估和实…

高温超导量子干涉仪更具实用价值 政策推动行业研制能力提升

高温超导量子干涉仪更具实用价值 政策推动行业研制能力提升 高温超导量子干涉仪&#xff0c;一种采用临界温度在77K以上高温超导材料制造而成的可对磁场微小变化进行测量的仪器&#xff0c;需要工作在液氮环境中。 超导量子干涉仪&#xff08;SQUID&#xff09;&#xff0c;一种…

面试官:为什么忘记密码要重置而不是告诉你原密码?

这是一个挺有意思的面试题,挺简单的,不知道大家平时在重置密码的时候有没有想过这个问题。回答这个问题其实就一句话:因为服务端也不知道你的原密码是什么。如果知道的话,那就是严重的安全风险问题了。 我们这里来简单分析一下。 做过开发的应该都知道,服务端在保存密码到…

CPLD可运行的最高频率是多少

CPLD可运行的最高频率是多少 AG32 内置CPLD的可运行最高频率 AG32 内置CPLD的可运行最高频率 AG32 MCU 的运行最高频率是248M。而CPLD中没有标准的最高频率。 最大能跑多少MHz&#xff0c;取决于cpld 里的设计。 如果是逻辑电路&#xff0c;则不存在时钟的概念。 如果是时序电路…

在vue和 js 、ts 数据中使用 vue-i18n,切换语言环境时,标签文本实时变化

我的项目需要显示两种语言(中文和英文)&#xff0c;并且我想要切换语言时&#xff0c;页面语言环境会随之改变&#xff0c;目前发现&#xff0c;只能在vue中使用$t(‘’)的方式使用&#xff0c;但是这种方式只能在vue中使用&#xff0c;而我的菜单文件是定义在js中&#xff0c;…