sql - mysqldump - 选择包含特定字符串的表

标签 sql bash shell mysql

我有一个相当大的本地 WordPress 多站点安装,它镜像在实时服务器上,因此我可以在本地开发一个站点并将其上传给客户端查看(它是基于子域的)。我编写了一个自定义 shell 脚本,将数据库从本地计算机上传到实时服务器,该服务器使用 sed 将本地域名的所有实例更改为实时域名。然后它通过 git 提交并推送它,实时服务器会自动拉取它,进行备份并应用新文件。

但是,这在过去一个月左右的时间里已经成为问题。由于我有更多的客户工作,并且他们一直在服务器上实时编辑他们的网站,并且我一直在将新工作推送到服务器以供其他客户查看,所以我一直在覆盖实时更改数据库。

我需要的是在调用 shell 脚本文件 (sh push.sh) 时能够添加一个标志或其他内容,以指示数据库中的哪些表需要实时推送。 WordPress 多站点数据库中的每个站点都有一个编号,例如 network_17_posts。因此,如果我可以在调用 shell 脚本时显示表号状态,例如 sh push.sh --table=17 并且它只会上传站点 17 的数据,而不会覆盖其他任何内容,那就是惊人的。作为奖励,如果我可以指定多个数字,这样我就可以一次上传多个网站,那就太棒了!

作为引用,这是我当前用于实时推送数据库的 shell 脚本(它可能好 10 倍,但我主要是前端/PHP 开发人员,而不是 shell 脚本!):

rm -rf db_sync.sql
mysqldump -u root -ppassword db_name > db_sync.sql  
sed 's/localdomain.dev/livedomain.com/g' db_sync.sql > new_db_sync.sql
rm -rf db_sync.sql
mv new_db_sync.sql db_sync.sql
git add db_sync.sql
read -p "Enter Commit Message: " commit_message
git commit -m "$commit_message"
git push -u web master

最佳答案

参见dumpting a table使用 mysqldump。假设您有表名或表名列表,您可以使用一个命令或循环将它们全部转储:

: > db_sync.sql
for table in tableNames; do
    mysqldump -u root -ppassword db_name table >> db_sync.sql
done

获取表名称:

number=17
echo "select TABLE_NAME from information_schema.tables where TABLE_NAME like '%\_$number\_%' and TABLE_SCHEMA = 'databasename'" | \
    mysql -udbuser -pdbpassword databasename

所以,如果您有多个号码,例如作为命令行参数,您可以将它们放在一起:

sql="select TABLE_NAME from information_schema.tables where TABLE_NAME like '%\_$number\_%' and TABLE_SCHEMA = 'databasename'"
# truncate/create the dump file
: > db_sync.sql
# loop through the command line arguments
for number in $@; do
    # for each tableName from the sql ...
    while read tableName; do
        # append to the dump file
        mysqldump -u root -ppassword db_name $tableName >> db_sync.sql
    done < <( echo $sql | mysql -udbuser -pdbpassword databasename | tail -n +2)
done

如果您将数字放在命令行上,这将起作用:

./push.sh 17 18 19

请参阅getopts tutorial如果您想变得复杂,请了解有关处理命令行参数的更多信息。以下是在数组中获取多个参数的简短示例:

numbers=()
while getopts ":t:" opt "$@"; do
    case "$opt" in
        t) numbers+=($OPTARG) ;;
    esac
done

for number in ${numbers[@]}; do
    echo $number
done

例如:

$ ./test.sh -t 17 -t 18 -t 19
17
18
19

关于sql - mysqldump - 选择包含特定字符串的表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25485571/

相关文章:

mysql - 使用简单的 NOT IN (SUBQUERY) 时 SQL 查询速度极其慢

bash - 如何使用互联网(即 ntp)从 bash 查找日期?

linux - 无法使用 expect 通过远程服务器中的 sftp 输入所有文件

循环复杂的 ffmpeg 命令时 Bash 参数 HELL。我该如何逃脱它?

bash - 带空格的 Shell 变量,引用单个命令行选项

python - 我应该为我的 sqlalchemy 模型使用代理键(id=1)还是自然主键(标签 ='sqlalchemy')?

mysql - MySQL如何找出连续行中日期的差异并分别更新表列?

mysql - 处理许多列的数据库

bash - 检索子 shell stdout 的第一行/最后一行

linux - sed 或 awk 命令将两行合并为一行