linux – 与版本字段相比,使用编号脚本升级MySQL数据库

linux – 与版本字段相比,使用编号脚本升级MySQL数据库,第1张

概述我已经完成了使用顺序脚本目录升级 MySQL 5.7 DB并将它们与DB中的版本字段进行比较的任务. 您应查询数据库,然后将返回的表编号与目录中的脚本进行比较,如果编号低于最高编写的脚本,则执行所有导致最高编写的脚本.脚本的编号也可能存在差距 这个问题也在这里概述; https://dba.stackexchange.com/questions/214087/how-to-upgrade-a-my 我已经完成了使用顺序脚本目录升级 MySQL 5.7 DB并将它们与DB中的版本字段进行比较的任务.

您应查询数据库,然后将返回的表编号与目录中的脚本进行比较,如果编号低于最高编写的脚本,则执行所有导致最高编写的脚本.脚本的编号也可能存在差距

这个问题也在这里概述;
https://dba.stackexchange.com/questions/214087/how-to-upgrade-a-mysql-database-using-numbered-scripts-based-on-a-version-field

但是我已经创建了一个问题的解决方案 – 除了我无法让脚本按顺序执行.如果编号中存在间隙,我的grep会拉出另一个共享相同编号的脚本 – 我怎么能避免这种情况?

即grep为6但它执行66.update.sql而不是6.update.sql

注意;我也知道if语句$CURRENT_DB_VERSION -lt 9可能是多余的 – 但是我尝试解决任何脚本都有一个前面带有0的单个整数的问题.

我确实创建了一个脚本版本,我只使用sort -n | head -1函数按顺序执行脚本并在执行后删除它们 – 但是我无法让脚本在数据库版本上开始执行.sql脚本.

#!/bin/bash####### Usage check [[ $# -ne 5 ]] && echo -e "Please provIDe the sql scripts directory,username,hostname,database and password \nUSAGE: ./sql_upgrade.sh /directory username hostname dbname password" && exit####### access / store db informationcd user=host=database=pass=######## DB Version storeMysqL -u $user -h $host -p$pass -D $database -e "SELECT version FROM versiontable" > dbvers.outCURRENT_DB_VERSION=`cat dbvers.out | grep -o '[0-9]\+'`highest_upgrade_version=`ls $(pwd) | grep -Eo '[0-9]+' | sort -rn | head -n 1 | awk 'NR' |  sed 's/^0*//'`######### create List of scripts and order themls $(pwd) | grep .sql | sort -n >> scripts_List.txtwhile [[ $CURRENT_DB_VERSION -lt $highest_upgrade_version || $CURRENT_DB_VERSION -eq $highest_upgrade_version ]]do    next_script_to_execute=`grep -Eo $CURRENT_DB_VERSION scripts_List.txt | sort -n | head -n 1`            if [[ $next_script_to_execute -gt $CURRENT_DB_VERSION || -z $next_script_to_execute ]]            then        ((CURRENT_DB_VERSION++))    elif [[ $CURRENT_DB_VERSION -lt 9 ]]            then        for i in $(ls $(pwd) | sort -n| grep -E "^[0]" | grep $CURRENT_DB_VERSION| head -1);                     do MysqL -u $user -h $host -p$pass -D $database < $i        echo $i "is currently being executed"        ((CURRENT_DB_VERSION++))                    done    else        for i in $(ls $(pwd) | sed 's/^[1-9]*\+ //' | grep -E $CURRENT_DB_VERSION | sort -n | head -n 1); do MysqL -u $user -h $host -p$pass -D $database < $i        ((CURRENT_DB_VERSION++))                    echo $i "is currently being executed"        done            fidone((CURRENT_DB_VERSION--))echo "Current version of the Database is: "$CURRENT_DB_VERSIONMysqL -u $user -h $host -p$pass -D $database -e "UPDATE versiontable SET version = $CURRENT_DB_VERSION"### cleanup temp filesrm -rf scripts_List.txtrm -rf dbvers.out
解决方法 我觉得你过于复杂了.

这里的最小示例是您需要的逻辑:

CURRENT_DB_VERSION=5for file in `ls -1 |sort -n`do  FILeverSION=$(echo $file | sed -e 's:^0*::' | sed -e 's/[^0-9]*//g')  echo "filename: $file Version: $FILeverSION"  if (( $FILeverSION > $CURRENT_DB_VERSION )); then    echo "file $FILeverSION is newer version than database $CURRENT_DB_VERSION"    # execute the file here   else    echo "file $FILeverSION is older or same version as database version $CURRENT_DB_VERSION"  fidone
总结

以上是内存溢出为你收集整理的linux – 与版本字段相比,使用编号脚本升级MySQL数据库全部内容,希望文章能够帮你解决linux – 与版本字段相比,使用编号脚本升级MySQL数据库所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/1034848.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-24
下一篇 2022-05-24

发表评论

登录后才能评论

评论列表(0条)

保存