Как удалить таблицу из mysqldump

Как удалить вывод для одной большой таблицы внутри mysqldump с большим количеством таблиц?

У меня есть дамп базы данных размером 6 ГБ, но 90% из нее - только одна таблица журналов "cache_entries", которую мне больше не нужно в моей резервной копии.

Как я могу легко удалить этот бит внутри дампа, который описывает большую таблицу протоколирования?

Я нашел это:   http://gtowey.blogspot.de/2009/11/restore-single-table-from-mysqldump.html

Пример:

grep -n 'Table structure' dump.sql

а затем, например:

sed -n '40,61 p' dump.sql > t2.sql

Но как я могу изменить это для своих нужд?

Ответ 1

Я нашел этот bash script, который разбивает дамп одной базы данных на отдельный файл для каждой таблицы, используя csplit (который разбивает файл на разделы, определенные по линиям контекста):

#!/bin/bash

####
# Split MySQL dump SQL file into one file per table
# based on http://blog.tty.nl/2011/12/28/splitting-a-database-dump
####

if [ $# -ne 1 ] ; then
  echo "USAGE $0 DUMP_FILE"
fi

csplit -s -ftable $1 "/-- Table structure for table/" {*}
mv table00 head

for FILE in `ls -1 table*`; do
      NAME=`head -n1 $FILE | cut -d$'\x60' -f2`
      cat head $FILE > "$NAME.sql"
done

rm head table*

Источник: gist.github.com/1608062

и немного расширен: Как разделить вывод mysqldump на более мелкие файлы?

один раз, у вас есть отдельные файлы для каждой таблицы, вы можете удалить ненужные таблицы и приклеить их вместе, если необходимо, с помощью

cat table* >glued_sqldump.sql

Ответ 2

Вы можете использовать 'n, n d' для удаления определенных строк. Я думаю, в вашем случае вы хотите иметь таблицу, о которой идет речь, но не хотите данных?

Измените команду grep, чтобы включить "Dumping data for table":

grep -n 'Table structure\|Dumping data for table' dump.sql 
19:-- Table structure for table `t1`
37:-- Dumping data for table `t1`
47:-- Table structure for table `t2`
66:-- Dumping data for table `t2`
76:-- Table structure for table `t3`
96:-- Dumping data for table `t3`

Теперь, если вам не нужны данные для t2, вы можете использовать:

sed '66,75 d' dump.sql > cleandump.sql

Ответ 3

вам нужно найти инструкцию create table таблицы и найти следующий оператор create table. говорят, что они n1 и n2.

тогда вы можете просто удалить их с помощью sed, как указано выше. sed 'n1, n2d' dump.sql > new.sql

вы можете просто создать таблицу grep и указать номера строк для вашей предварительной работы.

вот демонстрация.

[email protected]:~$ grep -n [34] a.txt
3:3
4:4
[email protected]:~$ cat a.txt
1
2
3
4
5
6
[email protected]:~$ grep [34] a.txt
3
4
[email protected]:~$ sed '3,4d' a.txt > b.txt
[email protected]:~$ cat b.txt
1
2
5
6
[email protected]:~$