Можно ли восстановить одну таблицу из полного mysqlump файла mysql?

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

Ответ 1

Вы можете попробовать использовать sed, чтобы извлечь только нужную таблицу.

Скажем, имя вашей таблицы mytable, а файл mysql.dump - это файл, содержащий ваш огромный дамп:

$ sed -n -e '/CREATE TABLE.*`mytable`/,/CREATE TABLE/p' mysql.dump > mytable.dump

Это скопирует в файл mytable.dump то, что находится между CREATE TABLE mytable и следующей CREATE TABLE, соответствующей следующей таблице.

Затем вы можете настроить файл mytable.dump, который содержит структуру таблицы mytable, и данные (список INSERT).

Ответ 2

Я использовал модифицированную версию команды uloBasEI sed. Он включает в себя предыдущую команду DROP и читает до тех пор, пока mysql не сделает демпинг данных в вашу таблицу (UNLOCK). Работал для меня (повторно), импортируя wp_users в кучу сайтов Wordpress.

sed -n -e '/DROP TABLE.*`mytable`/,/UNLOCK TABLES/p' mydump.sql > tabledump.sql

Ответ 3

Это можно сделать более легко? Вот как я это сделал:

Создайте временную базу данных (например, восстановление):

mysqladmin -u root -p создать восстановление

Восстановить полный дамп в базе данных temp:

mysql -u root -p restore < fulldump.sql

Дамп таблицы, которую вы хотите восстановить:

mysqldump restore mytable > mytable.sql

Импортировать таблицу в другую базу данных:

mysql -u root -p database < mytable.sql

Ответ 4

Простое решение - просто создать дамп только таблицы, которую вы хотите восстановить отдельно. Вы можете использовать команду mysqldump для этого со следующим синтаксисом:

mysqldump -u [user] -p[password] [database] [table] > [output_file_name].sql

Затем импортируйте его как обычно, и он будет импортировать только загруженную таблицу.

Ответ 5

Так или иначе, любой процесс, выполняющий это, должен пройти весь текст дампа и каким-то образом разобрать его. Я просто grep для

INSERT INTO `the_table_i_want`

и вывести вывод в mysql. Взгляните на первую таблицу на дампе раньше, чтобы убедиться, что вы правильно вставляете INSERT.

Изменить: OK, на этот раз набрал форматирование.

Ответ 6

Вам следует попробовать команду @bryn, но с разделителем в противном случае вы также извлечете таблицы, имеющие префикс или суффикс, это то, что я обычно делаю:

sed -n -e '/DROP TABLE.*`mytable`/,/UNLOCK TABLES/p' dump.sql > mytable.sql

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

sed -n -e 's/`mytable`/`mytable_restored`/g' mytable.sql > mytable_restored.sql

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

mysql -u root -p'password' mydatabase < mytable_restore.sql

Ответ 7

  • Резервное копирование

    $ mysqldump -A | gzip > mysqldump-A.gz
    
  • Восстановить отдельную таблицу

    $ mysql -e "truncate TABLE_NAME" DB_NAME
    $ zgrep ^"INSERT INTO \`TABLE_NAME" mysqldump-A.gz | mysql DB_NAME
    

Ответ 8

Один из возможных способов решения этой проблемы - восстановить временную базу данных и выгрузить только эту таблицу из временной базы данных. Затем используйте новый script.

Ответ 9

Этот инструмент может быть тем, что вы хотите: tbdba-restore-mysqldump.pl

https://github.com/orczhou/dba-tool/blob/master/tbdba-restore-mysqldump.pl

например. Восстановить таблицу из файла дампа базы данных:

tbdba-restore-mysqldump.pl -t yourtable -s yourdb -f backup.sql

Ответ 10

Это тоже может помочь.

# mysqldump -u root -p database0 > /tmp/database0.sql
# mysql -u root -p -e 'create database database0_bkp'
# mysql -u root -p database0_bkp < /tmp/database0.sql
# mysql -u root -p database0 -e 'insert into database0.table_you_want select * from database0_bkp.table_you_want'

Ответ 11

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

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

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

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

Ответ 12

было бы намного проще просто создать тестовую базу данных, восстановить всю базу данных, а затем выгрузить одну таблицу в файл - затем восстановить данные в вашу "производственную" базу данных?

Ответ 13

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

vi -o mysql.dump mytable.dump

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

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

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

Ответ 14

sed -n -e '/-- Table structure for table `my_table_name`/,/UNLOCK TABLES/p' database_file.sql > table_file.sql

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

Ответ 15

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

Ответ 16

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

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

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

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

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

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

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

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

... и т.д.

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

Ответ 17

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

Ответ 18

Решения "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

Ответ 20

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

'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'