mysqldump: игнорирование данных в определённых таблицах

mysqldump

(картинку увёл с adw0rd.ru)

Итак, хотим мы, значит, сделать дамп какой-то 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

Мои познания в баше не позволили мне вынести список таблиц в отдельную переменную, но и так работает.

8 комментариев »

  • В моем «клоняторе» юзаются такие опции:

    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

Leave a comment