我有一个相当大的本地 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/