У меня большой файл SQL с одной базой данных и около 150 таблиц. Я хотел бы использовать mysqlimport
для импорта этой базы данных, однако мне хотелось бы, чтобы процесс импорта игнорировал или пропускал несколько таблиц. Каков правильный синтаксис для импорта всех таблиц, но игнорировать некоторые из них? Спасибо.
MySQL импортирует базу данных, но игнорирует определенную таблицу
Ответ 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
Или вы можете передать в файл или любой другой инструмент перед импортом в БД.