Итак, хотим мы, значит, сделать дамп какой-то 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 |
Мои познания в баше не позволили мне вынести список таблиц в отдельную переменную, но и так работает.
В моем «клоняторе» юзаются такие опции:
MYSQLDUMP_STRUCTURE_ARGS = (
'--skip-opt',
'--skip-comments',
'--add-drop-table', # for add DROP TABLE before CREATE TABLE (p.s. NOT USE --compact!)
'--create-options', # add current AUTO_INCREMENT and other options
'--no-autocommit', # for acceleration
'--routines', # add stored procedures
'--triggers', # add triggers
)
MYSQLDUMP_DATA_ARGS = (
'--skip-opt',
'--skip-comments',
'--disable-keys', # creating indexes after load data (for acceleration)
'--extended-insert', # for acceleration
'--insert-ignore', # for ignoring double rows
'--no-autocommit', # for acceleration
'--skip-triggers',
'--default-character-set=utf8',
'--set-charset',
)
adw0rd, 18.02.2012, 14:54
Ну а ниже было нечто вроде:
"""
Command for structure
"""
mysqldump_structure_filename = '/path/to/structure.sql'
mysqldump_structure_command = [MYSQLDUMP, '--no-data', '--result-file={}'.format(mysqldump_structure_filename)]
for mysqldump_arg in MYSQLDUMP_STRUCTURE_ARGS:
mysqldump_structure_command.append(mysqldump_arg)
for table_name in IGNORE_TABLES:
mysqldump_structure_command.append('--ignore-table={}.{}'.format(DATABASE_FROM, table_name)
"""
Command for data
"""
mysqldump_data_filename = '/path/to/data.sql'
mysqldump_data_command = [MYSQLDUMP, '--no-create-info', '--result-file={}'.format(mysqldump_data_filename)]
for mysqldump_arg in MYSQLDUMP_DATA_ARGS:
mysqldump_data_command.append(mysqldump_arg)
for table_name in IGNORE_TABLES + IGNORE_DATA_TABLES:
mysqldump_data_command.append('--ignore-table={}.{}'.format(DATABASE_FROM, table_name))
adw0rd, 18.02.2012, 15:01
так как для command и data делается одно и тоже, то можно вынести в отдельную функцию потом, ага
adw0rd, 18.02.2012, 15:04
Клонятор, блин )
У тебя вьюхи нормально сохраняются?
vasa_c, 18.02.2012, 15:36
MYSQLDUMP_DATA_ARGS — а это структуру вместе с данными сохранять не будет?
vasa_c, 18.02.2012, 15:38
> У тебя вьюхи нормально сохраняются?
да, было все хорошо
adw0rd, 18.02.2012, 19:30
> MYSQLDUMP_DATA_ARGS – а это структуру вместе с данными сохранять не будет?
это только для дампа данных
adw0rd, 18.02.2012, 19:31
Полезно!
artoodetoo, 19.02.2012, 9:43