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
Другие вопросы по тегам