Итак, хотим мы, значит, сделать дамп какой-то mysql-базы с рабочего проекта.
Чтобы скачать себе и развернуть у себя локальную копию.
Или просто в целях бэкапа.
Ну и, конечно, для этого у нас есть наша любимая утилита mysqldump.
Но вот незадача, есть в базе штук пять таблиц в которые пишутся различные логи.
И написалось их уже за время работы сайта, аж на 10 гигабайт.
10 гигабайт эти нам совершенно ни к чему, ни в бэкапе их хранить незачем, ни тем более на локалку себе выкачивать не хочется.
Но и удалять тоже жалко, вдруг пригодятся.
Ну ладно, просто воспользуемся опцией --ignore-table-data
, которая, конечно, где-то в обильном списке опций должна быть.
Опа, а нет, оказывается, ничего подобного.
Только заявка на неё и благодарность за заявку.
Какие же другие варианты у нас есть?
--ignore-table
: просто игнорировать таблицы. Не катит, структура нам нужна, в них же всё равно что-то писаться будет.
--where="true limit 100"
: выбрать только сотню записей. Плохо, другие таблицы нам нужны полными.
Придётся сделать в два захода:
1. Сохранить для таблиц с логами только структуру (--no-data
).
2. Сделать дамп всех остальных таблиц.
И в сочетании с моими потугами о области изучения баша, получается следующее (здесь мы ещё заодно архивируем дамп в файл с указанием текущей даты):
#!/bin/sh
DB_NAME="dbname"
DB_USER="username"
DB_PASS="qwerty"
OUTPUT_FILE="$DB_NAME-$(date +%Y-%m-%d).sql.tar.gz"
TMP_SQL_FILE="$DB_NAME.sql"
tables_cmd=""
ignore_cmd=""
for table in "log_table_1" "log_table_2" "log_table_3"
do
tables_cmd="$tables_cmd $table"
ignore_cmd="$ignore_cmd --ignore-table=$DB_NAME.$table"
done
echo "Dump to $TMP_SQL_FILE"
mysqldump \
-u$DB_USER \
-p$DB_PASS \
--databases $DB_NAME \
--no-create-db \
--add-drop-table \
$ignore_cmd \
> $TMP_SQL_FILE;
echo "Append big tables structures to $TMP_SQL_FILE"
mysqldump \
-u$DB_USER \
-p$DB_PASS \
--databases $DB_NAME \
--no-create-db \
--add-drop-table \
--tables $tables_cmd \
--no-data \
>> $TMP_SQL_FILE;
echo "Archiving to $OUTPUT_FILE"
tar -czf $OUTPUT_FILE $TMP_SQL_FILE
echo "Remove $TMP_SQL_FILE"
rm $TMP_SQL_FILE |
#!/bin/sh
DB_NAME="dbname"
DB_USER="username"
DB_PASS="qwerty"
OUTPUT_FILE="$DB_NAME-$(date +%Y-%m-%d).sql.tar.gz"
TMP_SQL_FILE="$DB_NAME.sql"
tables_cmd=""
ignore_cmd=""
for table in "log_table_1" "log_table_2" "log_table_3"
do
tables_cmd="$tables_cmd $table"
ignore_cmd="$ignore_cmd --ignore-table=$DB_NAME.$table"
done
echo "Dump to $TMP_SQL_FILE"
mysqldump \
-u$DB_USER \
-p$DB_PASS \
--databases $DB_NAME \
--no-create-db \
--add-drop-table \
$ignore_cmd \
> $TMP_SQL_FILE;
echo "Append big tables structures to $TMP_SQL_FILE"
mysqldump \
-u$DB_USER \
-p$DB_PASS \
--databases $DB_NAME \
--no-create-db \
--add-drop-table \
--tables $tables_cmd \
--no-data \
>> $TMP_SQL_FILE;
echo "Archiving to $OUTPUT_FILE"
tar -czf $OUTPUT_FILE $TMP_SQL_FILE
echo "Remove $TMP_SQL_FILE"
rm $TMP_SQL_FILE
Мои познания в баше не позволили мне вынести список таблиц в отдельную переменную, но и так работает.