it-roy-ru.com

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

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

30
DanielAttard

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

bash > mysql -D your_database < your_sql_dump.sql

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

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


прокрутите вниз для лучшего варианта

8
RandomSeed

Принятый ответ 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

Там IS есть «гоча» - следите за процедурами в вашем дампе, которые могут содержать «INSERT INTO TABLE_TO_SKIP».

103
Don

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

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

Для тех, кто работает с файлами .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

1
feskr

Вот мой сценарий для исключения некоторых таблиц из дампа 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 ;; и РАЗДЕЛИТЕЛЬ;

0
Alexey Muravyov

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

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

Поэтому я написал небольшой скрипт на 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-скрипт, а направляет его напрямую в базу данных
Кроме того, он создает таблицы, но не импортирует данные (с этой проблемой у меня были большие таблицы журналов).

0
dGo

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

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

0
Zoran