Импортировать одну таблицу из файла .sql в базу данных? [Дубликат]

Представьтесь для объяснения первого примера:

Области JavaScript являются функциональными, а не блочными, а создание закрытия просто означает, что охватывающая область добавляется в лексическую среду закрытая функция. После того, как цикл завершается, переменная i уровня функции имеет значение 5, и это то, что внутренняя функция «видит».

Во втором примере на каждом этапе итерации внешний литерал функции будет оценивать новый объект функции с его собственной областью и локальной переменной num, значение которой установлено на текущее значение i , Поскольку параметр num никогда не изменяется, он будет оставаться постоянным в течение срока действия замыкания. Следующий шаг итерации не перезаписывает старое значение, поскольку объекты функции являются независимыми.

Имейте в виду, что этот подход является довольно неэффективным, поскольку для каждой ссылки необходимо создать два новых функциональных объекта. Это необязательно, поскольку их можно легко обменивать, если вы используете узел DOM для хранения информации:

function linkListener() { alert(this.i); } function addLinks () { for(var i = 0; i < 5; ++i) { var link = document.createElement('a'); link.appendChild(document.createTextNode('Link ' + i)); link.i = i; link.onclick = linkListener; document.body.appendChild(link); } }
159
задан Mobius 18 June 2009 в 17:50
поделиться

19 ответов

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

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

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

12
ответ дан Brom558 22 August 2018 в 14:32
поделиться

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

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

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

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

1
ответ дан Bryan Migliorisi 22 August 2018 в 14:32
поделиться

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

0
ответ дан Cameron 22 August 2018 в 14:32
поделиться
  • 1
    На самом деле это действительно легко сделать и понять даже новичкам. Я не знаю, почему за это проголосовали. – Karl Johan Vallner 4 October 2017 в 11:58

Это можно сделать более легко? Вот как я это сделал:

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

mysqladmin -u root -p create restore

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

mysql -u root -p restore & lt; fulldump.sql

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

mysqldump restore mytable> mytable.sql

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

mysql -u root -p database & lt; mytable.sql

39
ответ дан Chris Forrence 22 August 2018 в 14:32
поделиться
  • 1
    Это то, что нужно большинству людей. – sjas 23 April 2015 в 08:08
  • 2
    Согласно этому предложению по редактированию , вы должны добавить & quot; - one-database & quot; чтобы убедиться, что вы восстанавливаете только одну базу данных и не уничтожаете все остальное. – S.L. Barth 5 September 2015 в 08:33
  • 3
    Для действительно огромного db это может быть очень странно - восстановить 150 ГБ данных за одну таблицу в 100 МБ. – Enyby 7 July 2016 в 21:02
  • 4
    Я просто запускал это без "- одна база данных" и он все равно слил таблицы просто отлично. Он не удалял мои существующие таблицы. – Qasim 26 July 2016 в 07:05
  • 5
    Очень плохая практика! У меня было несколько БД в дампе, и мы пытались восстановить только один, удалили все остальные. – AndreyP 1 December 2016 в 21:01

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

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

0
ответ дан Community 22 August 2018 в 14:32
поделиться

Решения «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
0
ответ дан Jad Chahine 22 August 2018 в 14:32
поделиться

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

0
ответ дан JaredC 22 August 2018 в 14:32
поделиться

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

INSERT INTO `the_table_i_want`

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

Edit: OK, на этот раз получил форматирование.

8
ответ дан JCCyC 22 August 2018 в 14:32
поделиться
  • 1
    Я тупой, потому что не задумываюсь о том, как это сделать. Кажется, Греп спасает мой бекон каждый день. Другие два предложения были также перегружены и полностью, что я сделал бы без чудес grep. Спасибо вам всем! – Mobius 18 June 2009 в 18:06
  • 2
    Если вы считаете, что любите grep, когда вы узнаете awk, вы станете его счастливым секс-рабыней: ru.wikipedia.org/wiki/Awk – JCCyC 18 June 2009 в 18:10

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

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

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

Возвращается следующее:

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

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

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

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

... и т. д.

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

0
ответ дан Kuyenda 22 August 2018 в 14:32
поделиться

Вы должны попробовать команду @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 22 August 2018 в 14:32
поделиться

не было бы намного проще просто создать тестовую базу данных, восстановить всю базу данных, затем выгрузить одну таблицу в файл - затем восстановить данные в вашу «производственную» базу данных?

0
ответ дан mqqn 22 August 2018 в 14:32
поделиться

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

1
ответ дан mtoloo 22 August 2018 в 14:32
поделиться

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

# 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 22 August 2018 в 14:32
поделиться

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

sed -n -e '/DROP TABLE.*`mytable`/,/UNLOCK TABLES/p' mydump.sql > tabledump.sql
92
ответ дан sjas 22 August 2018 в 14:32
поделиться
  • 1
    Это даже лучше, чем мой ответ, поскольку он также заботится о CREATE TABLE, но вы должны выполнять поиск по обратным кавычкам, чтобы не получить другую таблицу с именем "thisismytabletoo". – JCCyC 18 June 2009 в 18:14
  • 2
    Правда. Я не был уверен, что имена таблиц во всех дампах mysql всегда окружены backquote или if & quot; CREATE TABLE mytable & quot; также может быть возможным. Мы можем легко адаптировать первое регулярное выражение, если знаем, как выглядит свалка. Вторая проблема может заключаться в том, что таблица mytable не уникальна (одна в базе данных db1 и другая в базе данных db2). Оба будут экспортированы в файл mytable.dump. Если таблица не уникальна, мы можем использовать ту же команду sed, сначала с CREATE DATABASE, чтобы извлечь только правильную базу данных. Затем используйте команду sed с CREATE TABLE. – uloBasEI 18 June 2009 в 18:47
  • 3
    Милая! Не забудьте добавить DROP TABLE вверху и удалить DROP TABLE [следующая таблица] в нижней части файла. – Nathan 21 May 2010 в 18:55
  • 4
    Если вы не добавляете / удаляете DROP TABLE, более удобно сопоставлять по комментарию [f1], а не по CREATE TABLE. Это гарантирует, что следующая таблица не будет удалена, если кто-то забудет удалить свой оператор DROP TABLE, и позволит использовать конвейер для восстановления таблицы с одной командой (gzip | sed | mysql). Однако это решение зависит от синтаксиса комментариев mysqldump (я не знаю, насколько он стандарт). – Olexa 26 February 2013 в 11:55
  • 5
    С модификацией Olexa это идеально: sed -n -e '/ Структура таблицы для. * `Mytable /, / Структура таблицы для / p' whole.sql & gt; mytable.sql – deeenes 26 May 2013 в 23:28
  • 6
    это на самом деле гораздо лучшее решение, чем тот, который был выбран в качестве ответа выше. Не могу поверить, что он не получил больше очков. – rICh 22 June 2013 в 00:40
  • 7
    Я предлагаю добавить по крайней мере обратные цитаты к имени таблицы: `mytable`, чтобы избежать сопоставления таблиц mytable2 и т. Д., Как это было в моем случае. – bartekbrak 19 February 2014 в 12:16
  • 8
    ты просто спас мою задницу – Gabriel Alack 16 December 2014 в 19:34
  • 9
    @ user706420 Хм, вы уверены, что ваш терминал не виноват? sed не должно мешать кодированию ... – bryn 17 December 2014 в 16:39
  • 10
    Для тех, у которых есть файлы SQL, не содержащие 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 */; включительно. – hamx0r 16 February 2016 в 20:31

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

4
ответ дан Tim Hoolihan 22 August 2018 в 14:32
поделиться

Этот инструмент может быть вам нужен: 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 22 August 2018 в 14:32
поделиться
  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
    
5
ответ дан vicvicvic 22 August 2018 в 14:32
поделиться
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 22 August 2018 в 14:32
поделиться
[g0] Таблица должна иметь одинаковую структуру в дампе и базе данных. [/g0] [f1] [g1] или [/g1] [f2]
0
ответ дан Madhur Bhaiya 5 November 2018 в 12:20
поделиться
Другие вопросы по тегам:

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