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

164

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

FWIW, вы также можете использоватьmydumper, Это создает логический дамп, такой как mysqldump, но он выводит отдельные файлы для каждой таблицы и может выполнять как дамп, так и загрузку многопоточную, так что это занимает меньше времени. Bill Karwin

Ваш Ответ

19   ответов
1
sed -n -e '/-- Table structure for table `my_table_name`/,/UNLOCK TABLES/p' database_file.sql > table_file.sql

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

Error: User Rate Limit Exceeded
0

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

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

1

vi -o mysql.dump mytable.dump

открыть обе целые свалкиmysql.dump и новый файлmytable.dump. Find the appropriate insert into line by pressing / а затем введите фразу, например: & quot; вставить в `mytable` & quot ;, затем скопируйте эту строку, используяyy, Перейти к следующему файлуctrl+w затемdown arrow key, вставьте скопированную строку сpp, Наконец, сохраните новый файл, набрав:wq и довольно vi редактор:q.

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

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

1

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

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

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

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

245

чтобы извлечь только ту таблицу, которую вы хотите.

Допустим, имя вашего стола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).

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededTable structure for tableError: User Rate Limit Exceeded
4

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

0

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

6

Backup

$ mysqldump -A | gzip > mysqldump-A.gz

Restore single table

$ mysql -e "truncate TABLE_NAME" DB_NAME
$ zgrep ^"INSERT INTO \`TABLE_NAME" mysqldump-A.gz | mysql DB_NAME
44

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

mysqladmin -u root -p create restore

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

mysql -u root -p restore < fulldump.sql

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

mysqldump restore mytable > mytable.sql

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

mysql -u root -p database < mytable.sql

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededthis edit suggestionError: User Rate Limit ExceededoneError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
12

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

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

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

0

так и в базе данных.

`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

my_table& Quot; и & quot; Сброс данных для таблицыmy_table. & Quot;

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

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

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

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

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

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

[4514] - Структура стола для столаsome_other_table

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

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

96

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

sed -n -e '/DROP TABLE.*`mytable`/,/UNLOCK TABLES/p' mydump.sql > tabledump.sql
Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededDROP TABLEError: User Rate Limit Exceededsed -n -e '/-- Table structure for table ``<Table Name>/,/UNLOCK TABLES/p' <SQL File> > table.sqlError: User Rate Limit Exceeded/*!40101 SET @saved_cs_client = @@character_set_client */;Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededsedError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded`mytable`Error: User Rate Limit Exceededmytable2Error: User Rate Limit Exceeded
7

но с разделителем `в противном случае вы также извлечете таблицы с префиксом или суффиксом, это то, что я обычно делаю:

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
2

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

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

Error: User Rate Limit Exceeded
0

но, как уже упоминалось, не на 100% безопасны

You may have INSERT commands with data containing: ... CREATE TABLE...(whatever)...mytable...

or even the exact string "CREATE TABLE `mytable`;" if you are storing DML commands for instance!

(и если таблица огромная, вы не хотите проверять это вручную)

Я бы проверил точный синтаксис используемой версии дампа и провел бы более строгий поиск по шаблону:

Избегайте & quot;. * & Quot; и используйте & quot; ^ & quot; чтобы убедиться, что мы начинаем в начале линии. И я предпочел бы получить начальный «DROP»

В целом, это работает лучше для меня:

sed -n -e '/^DROP TABLE IF EXISTS \`mytable\`;/,/^UNLOCK TABLES;/p' mysql.dump > mytable.dump
8

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

INSERT INTO `the_table_i_want`

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

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

Error: User Rate Limit Exceeded Mobius
Error: User Rate Limit Exceededen.wikipedia.org/wiki/Awk
3

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

Похожие вопросы