У меня есть резервная копия mysqldump моей базы данных mysql, состоящая из всех наших таблиц, которая составляет около 440 мегабайт. Я хочу восстановить содержимое только одной из таблиц из mysqldump. Это возможно? Теоретически, я мог бы просто вырезать раздел, который перестраивает таблицу, которую я хочу, но я даже не знаю, как эффективно редактировать текстовый документ такого размера.
Можно ли восстановить одну таблицу из полного mysqlump файла mysql?
Ответ 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
Ответ 19
Я попробовал несколько вариантов, которые были невероятно медленными. Это разделило 360-гигабайтную дамп в свои таблицы за несколько минут:
Ответ 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'