Могу ли я восстановить одну таблицу из полного файла MySQL mysqldump?


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

19 156

19 ответов:

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

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

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

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

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

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

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

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

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

mysqladmin-u root-p create restore

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

mysql-u root-p restore

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

mysqldump восстановить mytable > mytable.sql

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

mysql-u root-p database

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

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

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

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

INSERT INTO `the_table_i_want`

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

Edit: хорошо, на этот раз форматирование правильно.

вы должны попробовать команду @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
  1. резервное копирование

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

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

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

этот инструмент может быть то, что вы хотите: 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

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

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

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

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

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

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

вы можете использовать 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 МБ.

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

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

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

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

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

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

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

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

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

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

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

... так далее.

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

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

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

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

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

  • у вас могут быть команды вставки с данными, содержащими: ... СОЗДАНИЕ ТАБЛИЦЫ...(все.)..таблица MyTable...

  • или даже точная строка "создать таблицу' mytable`;" если вы храните команды DML, например!

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

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

избежать ".* "и использовать"^", чтобы убедиться, что мы начинаем в начале линии. И я бы предпочел захватить начальное "падение"

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

sed -n -e '/^DROP TABLE IF EXISTS \`mytable\`;/,/^UNLOCK TABLES;/p' mysql.dump > mytable.dump

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

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