mysqldump - выберите таблицу, если она содержит определенную строку
У меня довольно большая локальная установка WordPress Multisite, и она отражается на работающем сервере, поэтому я могу разработать сайт локально и загрузить его для просмотра клиентом (на основе субдомена). Я написал собственный сценарий оболочки для загрузки базы данных с локального компьютера на работающий сервер, который использует sed
изменить все экземпляры локального доменного имени на действительное доменное имя. Затем он передает и толкает его git
и живой сервер автоматически вытягивает его, берет резервную копию и применяет новый файл.
Тем не менее, это стало проблематичным в прошлом месяце или около того. Поскольку у меня больше работы с клиентами, и они редактируют свои сайты в режиме реального времени на сервере, и я отправляю на сервер новую работу для других клиентов, чтобы посмотреть, я перезаписываю изменения на живых база данных.
Что мне нужно, чтобы иметь возможность добавить флаг или что-то, когда я вызываю файл сценария оболочки (sh push.sh
), который указывает, какие таблицы в базе данных должны быть запущены. Каждый сайт в базе данных WordPress Multisite имеет номер, например network_17_posts
, Так что, если бы я мог указать номер таблицы при вызове сценария оболочки, например sh push.sh --table=17
и это будет только загружать данные сайта 17, а не перезаписывать что-либо еще, это было бы здорово. В качестве бонуса, если бы я мог указать несколько номеров, чтобы я мог загружать несколько сайтов одновременно, это было бы удивительно!
В качестве примера, вот мой текущий сценарий оболочки для запуска базы данных в живую (вероятно, он может быть в 10 раз лучше, но я в основном разработчик внешнего интерфейса /PHP, а не сценарий оболочки!):
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
1 ответ
Смотрите дамп таблицы с использованием 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 для получения дополнительной информации об обработке аргументов командной строки, если вы хотите усложнить. Вот краткий пример получения нескольких аргументов в массиве:
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