Подтвердить что ты не робот

MySQL импортирует базу данных, но игнорирует определенную таблицу

У меня большой файл SQL с одной базой данных и около 150 таблиц. Я хотел бы использовать mysqlimport для импорта этой базы данных, однако мне хотелось бы, чтобы процесс импорта игнорировал или пропускал несколько таблиц. Каков правильный синтаксис для импорта всех таблиц, но игнорировать некоторые из них? Спасибо.

4b9b3361

Ответ 1

mysqlimport не подходит для импорта операторов SQL. Этот инструмент предназначен для импорта форматированных текстовых файлов, таких как CSV. То, что вы хотите сделать, это передать свой дамп sql напрямую клиенту mysql с помощью команды, подобной этой:

bash > mysql -D your_database < your_sql_dump.sql

Ни mysql ни mysqlimport предоставляют mysqlimport вам функцию. Ваш лучший шанс - импортировать весь дамп, а затем отбросить ненужные таблицы.

Если у вас есть доступ к серверу, с которого поступает дамп, вы можете создать новый дамп с помощью mysqldump --ignore-table=database.table_you_dont_want1 --ignore-table=database.table_you_dont_want2...


Проверьте этот ответ для обходного пути, чтобы пропустить импорт некоторой таблицы

Ответ 2

Принятый ответ RandomSeed может занять много времени! Импорт таблицы (просто для ее удаления позже) может быть очень расточительным в зависимости от размера.

Для файла, созданного с помощью

mysqldump -u user -ppasswd --opt --routines DBname > DBdump.sql

В настоящее время я получаю файл размером около 7 ГБ, 6 ГБ которого является данными для таблицы журналов, которые мне "не нужны"; перезагрузка этого файла занимает пару часов. Если мне нужно перезагрузить (для целей разработки или когда-либо потребовалось для восстановления в реальном времени), я просматриваю файл таким образом:

sed '/INSERT INTO `TABLE_TO_SKIP`/d' DBdump.sql > reduced.sql

И перезагрузите:

mysql -u user -ppasswd DBname < reduced.sql

Это дает мне полную базу данных, при этом "нежелательная" таблица создается, но пуста. Если вам действительно не нужны таблицы, просто оставьте пустые таблицы после завершения загрузки.

Для нескольких таблиц вы можете сделать что-то вроде этого:

sed '/INSERT INTO `TABLE1_TO_SKIP`/d' DBdump.sql | \
sed '/INSERT INTO `TABLE2_TO_SKIP`/d' | \
sed '/INSERT INTO `TABLE3_TO_SKIP`/d' > reduced.sql

Здесь есть "getcha" - следите за процедурами на вашем дампе, которые могут содержать "INSERT INTO TABLE_TO_SKIP".

Ответ 3

При желании вы можете сделать эту таблицу за раз:

mysqldump -p sourceDatabase tableName > tableName.sql
mysql -p -D targetDatabase < tableName.sql

Ответ 4

Вот мой сценарий для исключения некоторых таблиц из дампа MySQL. Я использую его для восстановления БД, когда необходимо сохранить данные о заказах и платежах.

exclude_tables_from_dump.sh

#!/bin/bash

if [ ! -f "$1" ];
then
    echo "Usage: $0 mysql_dump.sql"
    exit
fi

declare -a TABLES=(
user
order
order_product
order_status
payments
)

CMD="cat $1"
for TBL in "${TABLES[@]}";do
    CMD+="|sed 's/DROP TABLE IF EXISTS \'${TBL}\'/# DROP TABLE IF EXIST \'${TBL}\'/g'"
    CMD+="|sed 's/CREATE TABLE \'${TBL}\'/CREATE TABLE IF NOT EXISTS \'${TBL}\'/g'"
    CMD+="|sed -r '/INSERT INTO \'${TBL}\'/d'"
    CMD+="|sed '/DELIMITER\ \;\;/,/DELIMITER\ \;/d'"
done

eval $CMD

Это позволяет избежать DROP и воссоздания таблиц и вставки данных в эти таблицы. Также он удаляет все ФУНКЦИИ и ПРОЦЕДУРЫ, которые хранятся между DELIMITER ;; и РАЗДЕЛИТЕЛЬ;

Ответ 5

Для тех, кто работает с файлами .sql.gz; Я нашел следующее решение очень полезным. Наша база данных была 25GB+, и мне пришлось удалить журнальные таблицы.

gzip -cd "./mydb.sql.gz" | sed -r '/INSERT INTO '(log_table_1|log_table_2|log_table_3|log_table_4)'/d' | gzip > "./mydb2.sql.gz"

Благодаря ответу Дона и комментарию Xosofox и этому связанному посту: используйте zcat и sed или awk для редактирования сжатого текстового файла .gz

Ответ 6

Я бы не стал использовать его на производстве, но если бы мне пришлось быстро импортировать некоторую резервную копию, которая содержит множество небольших таблиц и одну большую таблицу монстров, на импорт которых может потребоваться несколько часов, я бы, скорее всего, "grep -v unwanted_table_name original.sql> redu.sql

а затем mysql -f <redu.sql

Ответ 7

Немного стар, но думаю, что это может пригодиться...

Мне понравился ответ @Don (fooobar.com/questions/275385/...), но мне было очень неприятно, что сначала нужно написать в другой файл...
В моем конкретном случае это заняло бы слишком много времени и места на диске

Поэтому я написал небольшой скрипт на bash:

#!/bin/bash

tables=(table1_to_skip table2_to_skip ... tableN_to_skip)


tableString=$(printf "|%s" "${tables[@]}")
trimmed=${tableString:1}
grepExp="INSERT INTO \'($trimmed)\'"

zcat $1 | grep -vE "$grepExp" | mysql -uroot -p

это не генерирует новый сценарий sql, но передает его напрямую в базу данных
Кроме того, он создает таблицы, просто не импортирует данные (что было проблемой, с которой я столкнулся с огромными журнальными таблицами).

Ответ 8

Если вы не проигнорировали таблицы во время дампа с помощью mysqldump --ignore-table=database.unwanted_table, вам придется использовать какой-либо сценарий или инструмент для фильтрации данных, которые вы не хотите импортировать из файла дампа, перед передачей их в mysql клиент.

Вот функция bash/sh, которая исключает нежелательные таблицы из дампа SQL на лету (через канал):

# Accepts one argument, the list of tables to exclude (case-insensitive).
# Eg. filt_exclude '%session% action_log %_cache'
filt_exclude() {
    local excl_tns;
    if [ -n "$1" ]; then
        # trim & replace /[,;\s]+/ with '|' & replace '%' with '[^']*'
        excl_tns=$(echo "$1" | sed -r 's/^[[:space:]]*//g; s/[[:space:]]*$//g; s/[[:space:]]+/|/g; s/[,;]+/|/g; s/%/[^\']\*/g');

        grep -viE "(^INSERT INTO \'($excl_tns)\')|(^DROP TABLE (IF EXISTS )?\'($excl_tns)\')|^LOCK TABLES \'($excl_tns)\' WRITE" | \
        sed 's/^CREATE TABLE '/CREATE TABLE IF NOT EXISTS '/g'        
    else
        cat
    fi
}

Предположим, у вас есть дамп, созданный так:

MYSQL_PWD="my-pass" mysqldump -u user --hex-blob db_name | \
pigz -9 > dump.sql.gz

И хотите исключить некоторые нежелательные таблицы перед импортом:

pigz -dckq dump.sql.gz | \
filt_exclude '%session% action_log %_cache' | \
MYSQL_PWD="my-pass" mysql -u user db_name

Или вы можете передать в файл или любой другой инструмент перед импортом в БД.