it-swarm.com.ru

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

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

163
Mobius

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

243
uloBasEI

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

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

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

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

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

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

mysql -u root -p restore <fulldump.sql

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

mysqldump restore mytable> mytable.sql

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

mysql -u root -p база данных <mytable.sql

44
Martijn Kools

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

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

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

12
Brom558

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

INSERT INTO `the_table_i_want`

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

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

8
JCCyC

Вы должны попробовать команду @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
Maxime Biette
  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
    
6
y.tk

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

4
Tim Hoolihan

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

3
user1097790

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

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

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

vi -o mysql.dump mytable.dump

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

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

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

1
mtoloo

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

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

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

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

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

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

1
Weston Ganger

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

  • У вас могут быть команды 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
phil_w

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

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

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

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

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

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

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

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

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

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

0
Kuyenda

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

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

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

0
Cameron

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

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

0
Kohjah Breese

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

0
JaredC