Linux

與版本欄位相比,使用編號腳本升級 MySQL 數據庫

  • August 10, 2018

我的任務是使用序列腳本目錄升級 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 for 6 但它執行 66.update.sql 而不是 6.update.sql

筆記; 我也知道 if 語句 $CURRENT_DB_VERSION -lt 9 可能是多餘的 - 但這是我嘗試解決任何腳本的問題,即任何腳本的單個整數前面為 0。

我確實創建了一個腳本版本,我只使用 sort -n | head -1 函式按順序執行腳本並在執行後將其刪除 - 但我無法讓腳本在 DB 版本中開始執行 .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 information
cd $1
user=$2
host=$3
database=$4
pass=$5

######## DB Version store
mysql -u $user -h $host -p$pass -D $database -e "SELECT version FROM versionTable" > dbvers.out
CURRENT_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 them
ls $(pwd) | grep .sql | sort -n >> scripts_list.txt

while [[ $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
           fi
done

((CURRENT_DB_VERSION--))
echo "Current version of the Database is: "$CURRENT_DB_VERSION
mysql -u $user -h $host -p$pass -D $database -e "UPDATE versionTable SET version = $CURRENT_DB_VERSION"

### cleanup temp files
rm -rf scripts_list.txt
rm -rf dbvers.out

我認為你把事情複雜化了。

您需要的邏輯的最小範例:

CURRENT_DB_VERSION=5

for 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"
 fi

done

引用自:https://serverfault.com/questions/925600