Как я могу получить сообщения о статусе во время большой операции повторного индексации с MySQL 5.5?

dba.stackexchange https://dba.stackexchange.com/questions/3200

  •  16-10-2019
  •  | 
  •  

Вопрос

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

К сожалению, я не могу понять, как получить сообщения о статусе, которые дадут мне обновления прогресса о том, как работает операция. Я нашел старую ветку 2001 года на форуме MySQL, которая в основном говорит, что вы не можете получить обновления прогресса.

Я надеялся, что это уже не так. Я запускаю MySQL Server 5.5 и MySQL Workbench 5.2, оба сообщества. Возможно, есть что -то, что я могу сделать с Workbench?

Побочный вопрос: В настоящее время я делаю свои обновления из программы Windows, которая последовательно анализирует файл передачи данных в операторы SQL INSERT, которые я сразу же отправляю клиенту MySQL по гнездам. Было бы быстрее сгенерировать все операторы вставки в файл, а затем сделать массовый импорт, выполнив сценарий SQL из Workbench?

- Рошлер

Это было полезно?

Решение

Вам нужно отслеживать этот прогресс за пределами всех клиентских программ MySQL.

Для этого примера скажем, ваша таблица Myisam назван на рабочем месте в базе данных MyData, а DataDir - это по умолчанию,/var/lib/mysql

Sidenote: Если вы используете Windows, запустите эту команду SQL, чтобы получить Datadir

SHOW VARIABLES LIKE 'datadir';

У вас будет три файла, представляющие таблицу

/var/lib/mysql/mydata/workingset.frm
/var/lib/mysql/mydata/workingset.MYD
/var/lib/mysql/mydata/workingset.MYI

Попробуйте подход Temp Table для загрузки таблицы

use mydata
DROP TABLE IF EXIST workingsetload;
CREATE TABLE workingsetload LIKE workingset;
ALTER TABLE workingsetload DISABLE KEYS;
Perform 7 million row insert into workingsetload here, preferably LOAD DATA INFILE
ALTER TABLE workingsetload ENABLE KEYS;
ALTER TABLE workingset RENAME workingsetold;
ALTER TABLE workingsetload RENAME workingset;
DROP TABLE workingsetold;

Во время загрузки нагрузки на рабочую нагрузку на таблицу будет таблица температуры, первые пять (5) символов,#SQL- ». Вы можете визуально отслеживать в ОС Linux. Прогресс загрузки рабочей загрузки, как это:

cd /var/lib/mysql/mydata
watch -n 1 "ls -l workingsetload.MY[ID] *sql-*.MY[ID] | awk '{print $5,$9}'"

Вы можете скрепить это в Linux, как это:

cd /var/lib/mysql/mydata
ls -l workingsetload.MY[ID] *sql-*.MY[ID] | awk '{print $5,$9}' > /tmp/IndexRebuild.txt

Затем вы можете проанализировать столбцы соответственно и вычесть размеры .myd, чтобы узнать, когда завершается часть данных таблицы Myisam. Впоследствии вы можете затем проанализировать столбцы соответственно и вычесть размеры .myi, чтобы узнать, когда завершается часть индекса таблицы Myisam.

Для Windows вы можете скрепить это, используя Perl (ActivePerl для Windows) или просто иметь петлю DOS снова и снова.

Независимо от ОС, однажды «ls -l #sql-*. My [id]» или «если не существует #sql-*. My*» возвращается с чем-то, перезагрузка и индексация завершены.

Попробуй !!!

Обновление 2011-07-20 16:55 EDT

Монти успешно реализовал эту функцию в MariaDB. Проверьте это !!!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с dba.stackexchange
scroll top