Могу ли я восстановить одну таблицу из полного файла MySQL mysqldump?
У меня есть резервная копия mysqldump моей базы данных mysql, состоящей из всех наших таблиц, которая составляет около 440 мегабайт. Я хочу восстановить содержимое только одной из таблиц из mysqldump. Это возможно? Теоретически, я мог бы просто вырезать раздел, который перестраивает таблицу, которую я хочу, но я даже не знаю, как эффективно редактировать текстовый документ такого размера.
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
резервное копирование
$ mysqldump -A | gzip > mysqldump-A.gz
восстановить одну таблицу
$ 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 на свои таблицы за несколько минут:
решения sed, упомянутые ранее, хороши, но, как уже упоминалось, не на 100% безопасны
у вас могут быть команды вставки с данными, содержащими: ... СОЗДАНИЕ ТАБЛИЦЫ...(все.)..таблица MyTable...
или даже точная строка "создать таблицу' mytable`;" если вы храните команды DML, например!
(и если таблица огромна, вы не хотите проверять это вручную)
Я бы проверил точный синтаксис версия дампа используется и имеет более ограничительный поиск шаблонов:
избежать ".* "и использовать"^", чтобы убедиться, что мы начинаем в начале линии. И я бы предпочел захватить начальное "падение"
в целом, это работает лучше для меня:
sed -n -e '/^DROP TABLE IF EXISTS \`mytable\`;/,/^UNLOCK TABLES;/p' mysql.dump > mytable.dump