Вопрос:

Есть ли способ увидеть ход выполнения инструкции ALTER TABLE в MySQL?

mysql

11967 просмотра

8 ответа

9079 Репутация автора

Например, я выполнил инструкцию ALTER TABLE, чтобы создать индекс для поля MEDIUMTEXT в таблице InnoDB, содержащей 134 тыс. Строк, где размер индекса составлял 255 байт, а средний размер данных в поле - 30 тыс. Эта команда выполнялась в течение последних 15 минут или около того (и это единственное, что выполняется в базе данных). Можно ли как-нибудь определить, закончится ли он ближе к 5 минутам, 5 часам или 5 дням?

Автор: John Источник Размещён: 04.09.2008 09:48

Ответы (8)


3 плюса

34780 Репутация автора

Решение

Похоже, что это довольно распространенный запрос - он был запрошен еще в 2005 году на bugs.mysql.com . Он уже существует в Oracle и указан как полезный, но «это непросто сделать, поэтому не ожидайте, что он скоро будет реализован». , Хотя это был 2005 год :)

Тем не менее, парень, который задал оригинальный вопрос, позже выпустил патч для MySQL 5.0, перенесенный на 4.1, который может вам помочь.

Автор: ConroyP Размещён: 04.09.2008 10:13

18 плюса

181 Репутация автора

Я смог выполнить эти 2 запроса и выяснить, сколько строк осталось переместить.

select count(*) from `myoriginalrable`;
select count(*) from `#sql-1e8_11ae5`;

это было ВСЕГДА более полезно, чем сравнение размера файла на диске, потому что переход от myisam к innodb и т. д. изменяет размер строки.

Автор: Jay Binks Размещён: 10.10.2011 01:40

11 плюса

326 Репутация автора

В случае таблиц InnoDB можно использовать, SHOW ENGINE INNODB STATUSчтобы найти транзакцию, выполняющую ALTER TABLE, и проверить, сколько блокировок строк содержит TX. Это количество обработанных строк. Подробно объяснил здесь:

http://gabrielcain.com/blog/2009/08/05/mysql-alter-table-and-how-to-observe-progress/

Также MariaDB 5.3 и более поздние версии имеют возможность сообщать о ходе выполнения некоторых операций (включая ALTER TABLE). Увидеть:

http://kb.askmonty.org/en/progress-reporting/

Автор: Axel Размещён: 21.08.2012 12:53

1 плюс

1490 Репутация автора

pt-online-schema-change от Percona показывает оценку оставшегося времени. По умолчанию он выводит оценку оставшегося времени и процент выполнения каждые 30 секунд.

Он также имеет дополнительные функции по сравнению с простым выполнением команды ALTER.

http://www.percona.com/doc/percona-toolkit/2.1/pt-online-schema-change.html

Автор: Haluk Размещён: 28.10.2012 08:30

3 плюса

2167 Репутация автора

Я сделал запрос, который оценивает время завершения команды alter в таблице innodb. Вы должны запустить его как минимум дважды в одном сеансе, так как он сравнивает статистику от последовательных прогонов для оценки. Не забудьте заменить на правильное имя таблицы в четвертой строке. Это дает вам две оценки. Локальная оценка использует только данные между прогонами, в то время как Глобальная оценка использует все время транзакции.

select 
beginsd, now(), qRuns, qTime, tName, trxStarted, trxTime, `rows`, modified, locked, hoursLeftL, estimatedEndL, modifiedPerSecL, avgRows, estimatedEndG, modifiedPerSecG, hoursLeftG
from (
select 
    (@tname:='<table>') tName,
    @beginsd:=sysdate() beginsd,
    @trxStarted:=(select trx_started from information_schema.innodb_trx where trx_query like concat('alter table %', @tname, '%')) trxStarted, 
    @trxTime:=timediff(@beginsd, @trxStarted) trxTime,
    @rows:=(select table_rows from information_schema.tables where table_name like @tname) `rows`,
    @runs:=(ifnull(@runs, 0)+1) qRuns,
    @rowsSum:=(ifnull(@rowsSum, 0)+@rows),
    round(@avgRows:=(@rowsSum / @runs)) avgRows,
    @modified:=(select trx_rows_modified from information_schema.innodb_trx where trx_query like concat('alter table %', @tname, '%')) modified, 
    @rowsLeftL:=(cast(@rows as signed) - cast(@modified as signed)) rowsLeftL,
    round(@rowsLeftG:=(cast(@avgRows as signed) - cast(@modified as signed)), 2) rowsLeftG,
    @locked:=(select trx_rows_locked from information_schema.innodb_trx where trx_query like concat('alter table %', @tname, '%')) locked,
    @endsd:=sysdate() endsd,
    --
    time_to_sec(timediff(@endsd, @beginsd)) qTime,
    @modifiedInc:=(cast(@modified as signed) - cast(@p_modified as signed)) modifiedInc,
    @timeInc:=time_to_sec(timediff(@beginsd, @p_beginsd)) timeInc,
    round(@modifiedPerSecL:=(@modifiedInc/@timeInc)) modifiedPerSecL,
    round(@modifiedPerSecG:=(@modified/time_to_sec(@trxTime))) modifiedPerSecG,
    round(@minutesLeftL := (@rowsLeftL / @modifiedPerSecL / 60)) minutesLeftL,
    round(@minutesLeftG := (@rowsLeftG / @modifiedPerSecG / 60)) minutesLeftG,
    round(@hoursLeftL := (@minutesLeftL / 60), 2) hoursLeftL,
    round(@hoursLeftG := (@minutesLeftG / 60), 2) hoursLeftG,
    (@beginsd + INTERVAL @minutesLeftL MINUTE) estimatedEndL,
    (@beginsd + INTERVAL @minutesLeftG MINUTE) estimatedEndG,
    --
    @p_rows:=@rows,
    @p_modified:=@modified,
    @p_beginsd:=@beginsd
) sq;
Автор: aalku Размещён: 19.07.2013 08:36

0 плюса

378814 Репутация автора

Percona Server , который является разветвленной версией MySQL с некоторыми улучшениями, имеет эту функцию.

Вы можете наблюдать дополнительные столбцы в SHOW PROCESSLIST для ROWS_SENT и ROWS_EXAMINED. Например, если в вашей таблице 1000000 строк, и вы видите ROWS_EXAMINED, равный 650000, то она завершена на 65%.

См. Http://www.percona.com/doc/percona-server/5.6/diagnostics/process_list.html.

Автор: Bill Karwin Размещён: 19.07.2013 09:26

0 плюса

22973 Репутация автора

Запустите, ls -laShr /var/lib/mysql | sort -hи вы увидите файлы в папке mysql примерно так: "

-rw-r----- 1 mysql mysql 3.3G Feb  9 13:21 sql-#2088_10fa.ibd
-rw-r----- 1 mysql mysql 10.2G Feb  9 13:21 posts.ibd

Вы можете увидеть исходный файл таблицы и временный файл целевой таблицы в том виде, как он создается, с удобочитаемыми размерами. Обычно он будет расти линейно со временем, поэтому, если он вдвое меньше оригинальной таблицы, он будет на полпути. Команда lsотсортирует файлы по размеру, поэтому оба файла будут в нижней части списка файлов, если это большая таблица и вы долго ждали.

Автор: mahemoff Размещён: 10.02.2019 12:59

0 плюса

2684 Репутация автора

если кто-то хочет решения Bash: (SQL не работал для меня)

cd /var/lib/mysql/mydb
TABLEFILE="MYTABLE.ibd"
TEMPFILE="\#*ibd"

ls -lah $TABLEFILE;
ls -lah $TEMPFILE; # make sure you have only one temp file or modify the above TEMPFILE

SIZE_TOTAL=$(stat -c %s $TABLEFILE);

# other ways to get 1st size and time
#SIZE1=1550781106; TIME1=1550781106;
#SIZE1=$(stat -c %s $TEMPFILE); TIME1=$(stat -c %Z $TEMPFILE);  sleep 10;

SIZE1=0; TIME1=$(stat -c %X $TEMPFILE); # use file create time
SIZE2=$(stat -c %s $TEMPFILE); TIME2=$(stat -c %Z $TEMPFILE);

echo "SIZE1=$TIME1; TIME1=$TIME1";

DELTA_SIZE=$(( $SIZE2 - $SIZE1 ))
DELTA_TIME=$(( $TIME2 - $TIME1 ))

# debug last numbers should not be zero:

echo $SIZE1  $SIZE2  $SIZE_TOTAL  $DELTA_SIZE;
echo $TIME1  $TIME2  $DELTA_TIME;

SIZE_PER_SECOND=$( awk "BEGIN {print $DELTA_SIZE  / $DELTA_TIME }" );
SIZE_LEFT=$(($SIZE_TOTAL - $SIZE2));
TIME_LEFT_SECONDS=$( awk "BEGIN { print  ( $SIZE_LEFT  / $SIZE_PER_SECOND) }" );
TIME_LEFT_MINUTES=$( awk "BEGIN { print  $TIME_LEFT_SECONDS /60 }" );
TIME_LEFT=$( awk "BEGIN { printf \"%d:%02d:%2d\", int($TIME_LEFT_MINUTES /60), int($TIME_LEFT_MINUTES % 60), int($TIME_LEFT_SECONDS % 60 )  }" );

echo $TIME_LEFT;

free -h # check free memory, sometimes it is full and it makes it slow
Автор: Shimon Doodkin Размещён: 21.02.2019 09:37
Вопросы из категории :
32x32