Могу ли я восстановить одну таблицу из полного файла mysql mysqldump? - PullRequest
169 голосов
/ 18 июня 2009

У меня есть резервная копия mysqldump моей базы данных mysql, состоящая из всех наших таблиц, которая составляет около 440 мегабайт. Я хочу восстановить содержимое только одной из таблиц формы mysqldump. Это возможно? Теоретически, я мог бы просто вырезать раздел, который перестраивает таблицу, которую я хочу, но я даже не знаю, как эффективно редактировать текстовый документ такого размера.

Ответы [ 19 ]

1 голос
/ 21 сентября 2018

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

`zgrep -a ^"INSERT INTO \`table_name" DbDump-backup.sql.tar.gz | mysql -u<user> -p<password> database_name`

или

`zgrep -a ^"INSERT INTO \`table_name" DbDump-backup.sql | mysql -u<user> -p<password> database_name`
1 голос
/ 12 июля 2016
sed -n -e '/-- Table structure for table `my_table_name`/,/UNLOCK TABLES/p' database_file.sql > table_file.sql

Это лучшее решение, чем некоторые другие, описанные выше, потому что не все дампы SQL содержат оператор DROP TABLE. Этот будет работать на всех видах свалок.

1 голос
/ 02 февраля 2015

Вы можете использовать редактор vi. Тип:

vi -o mysql.dump mytable.dump

, чтобы открыть как весь дамп mysql.dump, так и новый файл mytable.dump. Найдите соответствующую вставку в строке, нажав /, а затем введите фразу, например: «вставить в` mytable` ", затем скопируйте эту строку, используя yy. Перейдите к следующему файлу с помощью ctrl+w, затем down arrow key, вставьте скопированную строку с помощью pp. Наконец, сохраните новый файл, набрав :wq и достаточно редактора vi :q.

Обратите внимание, что если вы выгрузили данные, используя несколько вставок, вы можете скопировать (восстановить) все из них одновременно, используя Nyy, где N - это количество строк, которые нужно скопировать.

Я сделал это с файлом размером 920 МБ.

1 голос
/ 18 июня 2009

Большинство современных текстовых редакторов должны иметь возможность обрабатывать текстовый файл такого размера, если ваша система соответствует ему.

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

Затем я импортировал эту таблицу в основную базу данных.

Это было утомительно, но довольно легко. Удачи.

0 голосов
/ 22 апреля 2016

Я попробовал несколько вариантов, которые были невероятно медленными. Это разделило дамп на 360 ГБ на его таблицы за несколько минут:

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

0 голосов
/ 31 июля 2014

Решения 'sed', упомянутые ранее, хороши, но, как уже упоминалось, не на 100% безопасны

  • У вас могут быть команды INSERT с данными, содержащими: ... CREATE TABLE ... (что угодно) ... mytable ...

  • или даже точная строка "CREATE TABLE` mytable`; " например, если вы храните команды DML!

(и если таблица огромная, вы не хотите проверять это вручную)

Я бы проверил точный синтаксис используемой версии дампа и сделал бы более строгий поиск по шаблону:

Избегайте ". *" И используйте "^", чтобы убедиться, что мы начинаем с начала строки. И я бы предпочел взять начальный «DROP»

В целом, это работает лучше для меня:

sed -n -e '/^DROP TABLE IF EXISTS \`mytable\`;/,/^UNLOCK TABLES;/p' mysql.dump > mytable.dump
0 голосов
/ 18 июня 2009

Получите достойный текстовый редактор, такой как Notepad ++ или Vim (если вы уже владеете им). Найдите имя таблицы, и вы сможете выделить только команды CREATE, ALTER и INSERT для этой таблицы. Навигация может быть проще с помощью клавиатуры, а не мыши. И я бы позаботился о том, чтобы у вас было достаточно памяти или ОЗУ, чтобы не было проблем с загрузкой всего файла сразу. Как только вы выделите и скопируете нужные вам строки, было бы неплохо сделать резервную копию только скопированной части в свой собственный файл резервной копии, а затем импортировать ее в MySQL.

0 голосов
/ 09 ноября 2012

Еще в '08 мне тоже нужно было это сделать. Я написал Perl-скрипт, который это сделает, и теперь это мой метод выбора. Также кратко изложено, как сделать это в awk или как восстановить в другом месте и извлечь. Недавно я добавил этот метод sed в список. Вы можете найти скрипт и другие методы здесь: http://blog.tsheets.com/2008/tips-tricks/extract-a-single-table-from-a-mysqldump-file.html

0 голосов
/ 18 июня 2009

Блоки SQL блокируются с помощью «Структура таблицы для таблицы my_table» и «Сброс данных для таблицы my_table

Вы можете использовать командную строку Windows следующим образом, чтобы получить номера строк для различных разделов. При необходимости измените искомую строку.

find / n "для таблицы` "sql.txt

Будет возвращено следующее:

---------- SQL.TXT

[4384] - Структура таблицы для таблицы my_table

[4500] - Сброс данных для таблицы my_table

[4514] - Структура таблицы для таблицы some_other_table

... и т. Д.

Это дает вам номера строк, которые вам нужны ... сейчас, если бы я только знал, как их использовать ... расследование.

...