Представьтесь для объяснения первого примера:
Области 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);
}
}
Простое решение - просто создать дамп только таблицы, которую вы хотите восстановить отдельно. Вы можете использовать команду mysqldump для этого со следующим синтаксисом:
mysqldump -u [user] -p[password] [database] [table] > [output_file_name].sql
Затем импортируйте его как обычно, и он будет импортировать только таблицу сбрасывания.
Большинство современных текстовых редакторов должны иметь возможность обрабатывать текстовый файл такого размера, если ваша система подходит к нему.
В любом случае, я должен был сделать это очень быстро, и у меня не было времени найти любые инструменты. Я установил новый экземпляр MySQL, импортировал всю резервную копию, а затем выплюнул только ту таблицу, которую я хотел.
Затем я импортировал эту таблицу в основную базу данных.
Было утомительно, но довольно легко. Удачи.
Получите достойный текстовый редактор, например Notepad ++ или Vim (если вы уже овладели этим). Найдите имя таблицы, и вы сможете выделить только команды CREATE, ALTER и INSERT для этой таблицы. Возможно, вам будет проще перемещаться с помощью клавиатуры, а не мыши. И я бы удостоверился, что вы на машине с большим количеством или оперативной памяти, так что у него не будет проблемы с загрузкой всего файла сразу. После того, как вы выделили и скопировали нужные вам строки, было бы неплохо создать резервную копию только скопированной части в собственный файл резервной копии, а затем импортировать его в MySQL.
Это можно сделать более легко? Вот как я это сделал:
Создайте временную базу данных (например, восстановление):
mysqladmin -u root -p create restore
blockquote>Восстановить полный дамп в базе данных temp:
mysql -u root -p restore & lt; fulldump.sql
blockquote>Дамп таблицы, которую вы хотите восстановить:
mysqldump restore mytable> mytable.sql
blockquote>Импортируйте таблицу в другую базу данных:
mysql -u root -p database & lt; mytable.sql
blockquote>
Я попробовал несколько вариантов, которые были невероятно медленными. Это разделит 360-гигабайтный дамп в его таблицы за несколько минут:
Решения «sed», упомянутые ранее, хороши, но, как уже упоминалось, не на 100% защищены
(и если таблица огромна, вы не хотите проверять это вручную)
Я бы проверил точный синтаксис используемой версии дампа и более строгий поиск шаблонов:
Избегайте «. *» и используйте «^», чтобы мы начали с начала строки. И я бы предпочел захватить начальную «DROP»
. В целом это работает лучше для меня:
sed -n -e '/^DROP TABLE IF EXISTS \`mytable\`;/,/^UNLOCK TABLES;/p' mysql.dump > mytable.dump
Еще в 2008 году мне тоже нужно было это сделать. Я написал скрипт Perl, который сделает это, и теперь это мой метод выбора. Также кратко описано, как это сделать в awk или как восстановить в другом месте и извлечь. Недавно я добавил этот метод sed в список. Вы можете найти скрипт и другие методы здесь: http://blog.tsheets.com/2008/tips-tricks/extract-a-single-table-from-a-mysqldump-file.html
Так или иначе, любой процесс, выполняющий это, должен пройти весь текст дампа и каким-то образом разобрать его. Я бы просто grep для
INSERT INTO `the_table_i_want`
и вывел вывод в mysql. Посмотрите на первую таблицу в дампе раньше, чтобы убедиться, что вы правильно вставляете INSERT.
Edit: OK, на этот раз получил форматирование.
Блоки SQL блокируются «Структура таблицы для таблицы my_table
» и «Сбрасывание данных для таблицы my_table
».
Вы можете использовать командную строку Windows следующим образом, чтобы получить номера строк для различных разделов. При необходимости отредактируйте искомую строку.
find / n "для таблицы` "sql.txt
Возвращается следующее:
----- ----- SQL.TXT
[4384] - Структура таблицы для таблицы my_table
[4500] - Данные сброса для таблицы my_table
[4514] - Структура таблицы для таблицы some_other_table
... и т. д.
Это дает вам номера строк, которые вам нужны ... теперь, если я только знал, как их использовать ... исследование.
Вы должны попробовать команду @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
не было бы намного проще просто создать тестовую базу данных, восстановить всю базу данных, затем выгрузить одну таблицу в файл - затем восстановить данные в вашу «производственную» базу данных?
Вы можете использовать редактор 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 МБ.
Это тоже может помочь.
# 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'
Я использовал модифицированную версию sed команды uloBasEI. Он включает в себя предыдущую команду DROP и читает до тех пор, пока mysql не сделает демпинг данных в вашу таблицу (UNLOCK). Работал для меня (повторно), импортировав wp_users в кучу сайтов Wordpress.
sed -n -e '/DROP TABLE.*`mytable`/,/UNLOCK TABLES/p' mydump.sql > tabledump.sql
`mytable`
, чтобы избежать сопоставления таблиц mytable2
и т. Д., Как это было в моем случае.
– bartekbrak
19 February 2014 в 12:16
sed
не должно мешать кодированию ...
– bryn
17 December 2014 в 16:39
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
Один из возможных способов решения этой проблемы - восстановить временную базу данных и выгрузить только эту таблицу из временной базы данных. Затем используйте новый скрипт.
Этот инструмент может быть вам нужен: 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 -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
. Это будет работать всевозможные свалки.