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

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

Ответы [ 19 ]

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

Вы можете попробовать использовать 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).

99 голосов
/ 07 апреля 2013

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

sed -n -e '/DROP TABLE.*`mytable`/,/UNLOCK TABLES/p' mydump.sql > tabledump.sql
45 голосов
/ 25 апреля 2013

Это можно сделать проще? Вот как я это сделал:

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

mysqladmin -u root -p create restore

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

mysql -u root -p restore

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

mysqldump restore mytable> mytable.sql

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

mysql -u root -p database

12 голосов
/ 08 августа 2013

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

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

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

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

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

INSERT INTO `the_table_i_want`

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

Редактировать: ОК, на этот раз правильное форматирование.

7 голосов
/ 18 сентября 2013

Вы должны попробовать команду @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
6 голосов
/ 23 февраля 2015
  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
    
4 голосов
/ 18 июня 2009

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

3 голосов
/ 14 декабря 2011

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

2 голосов
/ 02 января 2014

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

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