mysql - 用于使用多个文件更新多个数据库的 Bash 脚本

标签 mysql sql database bash

我需要创建一个脚本来更新具有不同文件的多个数据库。 遵循当前进程的描述:

show database;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| Audi               |
| Bmw                |
| Ferrari            |
| mysql              |
| performance_schema |
+--------------------+

对于每个数据库,我都有一个 sql 文件,例如:

update_Audi.sql
update_Bmw.sql
update_Ferrari.sql

我使用这个方法:

mysql -uroot -pxxxxx Audi < /path_to_/update_Audi.sql
mysql -uroot -pxxxxx Bmw < /path_to_/update_Bmw.sql
mysql -uroot -pxxxxx Ferrari < /path_to_/update_Ferrari.sql

这只是一个示例,但我们每个品牌都有 50 多个数据库......

有时我有一个适用于所有数据库的通用文件,例如 all_db.sql。我使用这个程序:

mysql -uroot -pxxxxx Audi < /path_to_/all_db.sql
mysql -uroot -pxxxxx Bmw < /path_to_/all_db.sql
mysql -uroot -pxxxxx Ferrari < /path_to_/all_db.sql

当我想要导入多个文件时,我需要将特定文件“ex audi”关联到正确的数据库:

mysql -uroot -pxxxxx Audi < /path_to_/update_Audi.sql

如何自动选择文件“update_Audi.sql”将其导入到数据库“Audi”中?

现在,我需要将同一个文件导入到多个数据库中,我该怎么做?

我曾尝试这样做,但我已经停止了,因为我不知道如何继续...... 这是不完整的 bash 脚本:

#!/bin/bash 
MyUSER="root"     # USERNAME
MyPASS="xxxxx"       # PASSWORD
MyHOST="localhost"          # Hostname
#Autodetected via which command    
MYSQL="$(which mysql)"
#Gethostname                                          
HOST="$(hostname)"
#Date
NOW="$(date +"%d-%m-%Y")"

# Store list of databases
DBS=""
#I dont know to do it...
SINGLE_FILE="path_to_file"
MULTIPLE_FILE="Multiple file path"

# Exclude these databases
IGGY="mysql information_schema performance_schema"


# Get all database list first
DBS="$($MYSQL -u$MyUSER -p$MyPASS -h$MyHOST -Bse 'show databases')"

for db in $DBS
do
    skipdb=-1
    if [ "$IGGY" != "" ];
    then
        for i in $IGGY
        do
              [ "$db" == "$i" ] && skipdb=1 || :
              done
    fi

    if [ "$skipdb" == "-1" ] ; then

        #For single File to import
        $MYSQL -u $MyUSER -h $MyHOST -p$MyPASS $db < $SINGLE_FILE
        #For multiple file to import
        $MYSQL -u $MyUSER -h $MyHOST -p$MyPASS $db < $MULTIPLE_FILE

    fi
done

最佳答案

您只需要在一个 while 循环中完成即可:

$MYSQL -N -u"$MyUSER" -h"$MyHOST" -p"$MyPASS" -e 'show databases' | \
  grep -v 'mysql\|information_schema\|performance_schema'         | \
while read -r db; do
      single_file="/path_to_/update_$db.sql"
      multiple_file=/path_to_/all_db.sql
      [ -f "$single_file" ] && $MYSQL -u"$MyUSER" -h"$MyHOST" -p"$MyPASS" "$db" <"$single_file"
      [ -f "$multiple_file" ] && $MYSQL -u"$MyUSER" -h"$MyHOST" -p"$MyPASS" "$db" <$multiple_file
done

关于mysql - 用于使用多个文件更新多个数据库的 Bash 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24327755/

相关文章:

mysql - 如何使用数据库中的两个表以至少条件获取结果

python - Django INNER JOIN 使用带有 WHERE 子句的外键

mysql - 根据重复值选择行

php - 从数据库行中选择最低价格并忽略 null 或 0

database - 如何在数据库中有效地维护排序顺序

mysql - 如何通过sql将更多的字符串搜索成更小的字符串

mysql - 分片和索引

mysql - UPDATE LEFT JOIN 在第二个表中获取最后插入的记录

php - PHP 的语言本地化

SQL从临时表插入表,并将输出插入临时表