У меня есть резервная копия mysqldump моей базы данных mysql, состоящая из всех наших таблиц, которая составляет около 440 мегабайт. Я хочу восстановить содержимое только одной из таблиц из mysqldump. Это возможно? Теоретически я мог бы просто вырезать раздел, который восстанавливает нужную мне таблицу, но я даже не знаю, как эффективно редактировать текстовый документ такого размера.
Могу ли я восстановить одну таблицу из полного файла mysql mysqldump?
Ответы (21)
Вы можете попробовать использовать sed, чтобы извлечь только нужную вам таблицу.
Допустим, имя вашей таблицы mytable
, а файл mysql.dump
- это файл, содержащий ваш огромный дамп:
$ sed -n -e '/CREATE TABLE.*`mytable`/,/Table structure for table/p' mysql.dump > mytable.dump
Это скопирует в файл mytable.dump
то, что находится между CREATE TABLE mytable
и следующим CREATE TABLE
, соответствующим следующей таблице.
Затем вы можете настроить файл mytable.dump
, который содержит структуру таблицы mytable
и данные (список INSERT
).
Table structure for table
, а не по CREATE TABLE. Это гарантирует, что следующая таблица не будет удалена, если кто-то забудет удалить ее оператор DROP TABLE, и разрешит конвейер для восстановления таблицы с помощью одной команды (gzip | sed | mysql). Однако это решение зависит от синтаксиса комментариев mysqldump (я не знаю, насколько это стандартно).
- person Olexa; 26.02.2013
$ sed -n -e '/COPY.*mytable/,/COPY/p' pg.dump > mytable.dump
- Спасибо!
- person gunzapper; 30.03.2016
Я использовал модифицированную версию команды sed uloBasEI. Он включает в себя предыдущую команду DROP и читает, пока mysql не завершит сброс данных в вашу таблицу (UNLOCK). Работал для меня (повторно), импортировав wp_users на несколько сайтов Wordpress.
sed -n -e '/DROP TABLE.*`mytable`/,/UNLOCK TABLES/p' mydump.sql > tabledump.sql
`mytable`
, чтобы избежать сопоставления таблиц mytable2
и так далее, как это было в моем случае.
- person bartekbrak; 19.02.2014
sed
не должно мешать кодированию ...
- person bryn; 17.12.2014
DROP TABLE
(в моем дампе MySQL этого не было), может потребоваться использовать: sed -n -e '/-- Table structure for table ``<Table Name>/,/UNLOCK TABLES/p' <SQL File> > table.sql
Это использует комментарии таблицы, предоставленные перед каждой таблицей в дампе MySQl, и обеспечивает включение таких строк, как /*!40101 SET @saved_cs_client = @@character_set_client */;
.
- person hamx0r; 16.02.2016
sed -n -e '/-- Table structure for table `<Table Name>`/,/UNLOCK TABLES/p' <SQL File> > table.sql
- person hamx0r; 14.07.2016
Это можно сделать проще? Вот как я это сделал:
Создайте временную базу данных (например, восстановите):
mysqladmin -u root -p создать восстановление
Восстановите полный дамп в базе temp:
mysql -u root -p restore ‹fulldump.sql
Выгрузите таблицу, которую вы хотите восстановить:
mysqldump восстановить mytable> mytable.sql
Импортируйте таблицу в другую базу данных:
mysql -u root -p database ‹mytable.sql
use restore;
и show tables;
в клиенте командной строки MySQL.
- person Hari; 29.12.2020
Простым решением было бы просто создать дамп только той таблицы, которую вы хотите восстановить отдельно. Для этого можно использовать команду mysqldump со следующим синтаксисом:
mysqldump -u [user] -p[password] [database] [table] > [output_file_name].sql
Затем импортируйте его как обычно, и он будет импортировать только выгруженную таблицу.
Так или иначе, любой процесс, который делает это, должен будет пройти весь текст дампа и каким-то образом его проанализировать. Я просто ищу
INSERT INTO `the_table_i_want`
и направьте вывод в mysql. Взгляните на первую таблицу в дампе, чтобы убедиться, что вы правильно понимаете INSERT.
Изменить: ОК, на этот раз форматирование получилось правильно.
Вам следует попробовать команду @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
Один из возможных способов справиться с этим - восстановить временную базу данных и выгрузить только эту таблицу из временной базы данных. Затем используйте новый скрипт.
sed -n -e '/-- Table structure for table `my_table_name`/,/UNLOCK TABLES/p' database_file.sql > table_file.sql
Это лучшее решение, чем некоторые из других вышеперечисленных, потому что не все дампы SQL содержат оператор DROP TABLE
. Этот будет работать со всеми видами свалок.
Этот инструмент может быть тем, что вам нужно: tbdba-restore-mysqldump.pl
https://github.com/orczhou/dba-tool/blob/master/tbdba-restore-mysqldump.pl
например Восстановить таблицу из файла дампа базы данных:
tbdba-restore-mysqldump.pl -t ваша таблица -s yourdb -f backup.sql
Таблица должна иметь одинаковую структуру как в дампе, так и в базе данных.
`zgrep -a ^"INSERT INTO \`table_name" DbDump-backup.sql.tar.gz | mysql -u<user> -p<password> database_name`
or
`zgrep -a ^"INSERT INTO \`table_name" DbDump-backup.sql | mysql -u<user> -p<password> database_name`
Это тоже может помочь.
# 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 МБ.
Я попробовал несколько вариантов, которые были невероятно медленными. Это разделило дамп размером 360 ГБ на таблицы за несколько минут:
Как разделить вывод из mysqldump в файлы меньшего размера?
Упомянутые ранее решения 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
Получите приличный текстовый редактор, например Notepad ++ или Vim (если вы уже разбираетесь в нем). Найдите имя таблицы, и вы сможете выделить только команды CREATE, ALTER и INSERT для этой таблицы. Возможно, будет проще ориентироваться с помощью клавиатуры, чем с помощью мыши. И я хотел бы убедиться, что вы находитесь на машине с большим количеством оперативной памяти, чтобы не было проблем с загрузкой всего файла сразу. После того, как вы выделили и скопировали нужные строки, было бы неплохо создать резервную копию только скопированной части в собственный файл резервной копии, а затем импортировать ее в MySQL.
Фрагменты SQL блокируются с помощью «Структура таблицы для таблицы my_table
» и «Выгрузка данных для таблицы my_table
».
Вы можете использовать командную строку Windows, как показано ниже, чтобы получить номера строк для различных разделов. При необходимости скорректируйте искомую строку.
find / n "для таблицы" "sql.txt
Будет возвращено следующее:
---------- SQL.TXT
[4384] - Структура таблицы для таблицы my_table
[4500] - Выгрузка данных для таблицы my_table
[4514] - Структура таблицы для таблицы some_other_table
... так далее.
Это даст вам номера строк, которые вам нужны ... теперь, если бы я только знал, как их использовать ... расследование.
Еще в 2008 году мне тоже пришлось это сделать. Я написал сценарий Perl, который сделает это, и теперь это мой метод. Также резюмировано, как это сделать в awk или как восстановить в другом месте и распаковать. Недавно я добавил в список и этот метод sed. Вы можете найти сценарий и другие методы здесь: http://blog.tsheets.com/2008/tips-tricks/extract-a-single-table-from-a-mysqldump-file.html
Вы можете импортировать отдельную таблицу, используя строку терминала, как показано ниже. Здесь импортируйте отдельную пользовательскую таблицу в определенную базу данных.
mysql -u root -p -D my_database_name < var/www/html/myproject/tbl_user.sql
Я восхищаюсь некоторой изобретательностью здесь, но буквально нет причин использовать sed
для ответа на вопрос OP.
Использование комментария --one-database - правильный ответ, встроенный в MySQL / MariaDB. Нет необходимости в сторонних взломах.
mysql -u root -p databasename --one-database < localhost.sql
просто импортирует нужную базу данных.
Я также обнаружил, что в некоторых случаях при использовании этого для импорта серии баз данных он создавал для меня следующую базу данных в списке (но ничего в нее не помещал). Не уверен, почему это произошло, но это упростило восстановление.
С помощью этой команды введите пароль в интерактивном режиме, и он импортирует запрошенную базу данных.