Давайте сначала проанализируем вашу программу. В вашей программе ваш первый метод main()
, и помните, что это статический метод ... Затем вы объявляете локальную переменную для этого метода (compareCount, low, high , и т.д..). Область действия этой переменной - это только объявленный метод, независимо от того, что это статический или нестационарный метод. Таким образом, вы не можете использовать эти переменные вне этого метода. Это основная ошибка u.
Затем мы переходим к следующей точке. Вы сказали, что статичность убивает вас. (Это может убить вас, но это дает жизнь вашей программе!) Сначала вы должны понять основную вещь. * Статический метод вызывает только статический метод и использует только статическую переменную. * Статическая переменная или статический метод не зависят от какого-либо экземпляра этого класса. (т. е. если вы измените какое-либо состояние статической переменной, оно будет отражено во всех объектах класса). Из-за этого вы называете это переменной класса или методом класса. И многое другое о «статическом» ключевом слове. Надеюсь, теперь у вас есть идея. Сначала измените область действия переменной и объявите ее как статическую (чтобы использовать ее в статических методах).
И совет для вас: вы неправильно поняли идею сферы переменных и статические функции. Получите ясное представление об этом.
Простое решение - просто создать дамп только таблицы, которую вы хотите восстановить отдельно. Вы можете использовать команду 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
Table structure for table
вместо сопоставления CREATE TABLE. Это гарантирует, что следующая таблица не будет удалена, если вы забудете удалить свой оператор DROP TABLE и разрешите создание протокола для восстановления таблицы с одной командой (gzip | sed | mysql). Однако это решение зависит от синтаксиса комментария mysqldump (я не знаю, насколько это стандартно).
– Olexa
26 February 2013 в 11:55
`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
. Это будет работать всевозможные свалки.