MySQL таблица innodb с несовместимым форматом строки - PullRequest
0 голосов
/ 15 мая 2018

У меня странная проблема с MySQL (5.5.59):

У меня есть база данных журналов (где я храню необработанные данные запросов поставщиков).Эта таблица сжата:

CREATE TABLE `logs` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `idLogType` tinyint(3) unsigned NOT NULL,
  `idAccount` mediumint(8) unsigned NOT NULL,
  (...)
  `message` text NOT NULL,
  `date` datetime NOT NULL,
  PRIMARY KEY (`id`),
  KEY `LOGTYPE` (`idLogType`),
  KEY `ACCOUNT` (`idAccount`),
) ENGINE=InnoDB AUTO_INCREMENT=(...) DEFAULT CHARSET=utf8 ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8

Моя цель состояла в том, чтобы очистить эту таблицу, удалив старые записи и перестроив таблицу.Так как это большая таблица, я использовал pt-online-schema-change и oak-chunk-update для выполнения этой работы.

Я удалил все старые записи прошлых лет с https://shlomi -noach.github.io/openarkkit/oak-chunk-update.html

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

pt-online-schema-change 
    --alter "ENGINE=InnoDB" 
    --nocheck-replication-filters --execute --statistics --progress=percentage,1 
    --set-vars='lock_wait_timeout=60' --check-alter 
    --no-swap-tables --no-drop-triggers --no-drop-old-table --no-drop-new-table 
    --chunk-time=1 --chunk-size=20 --new-table-name='__new_logs'         
    h=**HOST_#########**,D=DB_#########,t=logs,u=root --ask-pass

(важныйточка - оператор --alter)

Итак, теперь у меня есть 2 таблицы:

  • logs (оригинал)
  • __ new_logs новый (оптимизированный)

но они не являются идентичными по структуре:

SELECT TABLE_NAME, ENGINE, ROW_FORMAT, CREATE_OPTIONS
FROM information_schema.tables  
WHERE 
    ENGINE = 'innodb' AND TABLE_NAME LIKE '%logs'

возвращает этот результат:

'TABLE_NAME'         'ENGINE'         'ROW_FORMAT'         'CREATE_OPTIONS',
'__new_logs'         'InnoDB'         'Compact'         'row_format=COMPRESSED KEY_BLOCK_SIZE=8',
'logs'         'InnoDB'         'Compressed'         'row_format=COMPRESSED KEY_BLOCK_SIZE=8',

Почему таблица __new_logs помечена как "компактная", а несжат, но все еще имеет «параметры создания», установленные на row_format=COMPRESSED KEY_BLOCK_SIZE=8

В таблице show create таблицы __new_logs показано:

CREATE TABLE `__new_logs` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `idLogType` tinyint(3) unsigned NOT NULL,
  `idAccount` mediumint(8) unsigned NOT NULL,
  (...)
  `message` text NOT NULL,
  `date` datetime NOT NULL,
  PRIMARY KEY (`id`),
  KEY `LOGTYPE` (`idLogType`),
  KEY `ACCOUNT` (`idAccount`),
) ENGINE=InnoDB AUTO_INCREMENT=(...) DEFAULT CHARSET=utf8 ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8

Таким образом, он все еще помечен как сжатый.

Последняя странная вещь, таблица __new_logs больше, чем исходная таблица журналов ... Я чувствую, что сжатие на самом деле несделано на этом новом столе ...

1 Ответ

0 голосов
/ 15 мая 2018

Я думаю, что нашел решение ...

https://www.percona.com/blog/2014/01/14/innodb-file-formats-here-is-one-pitfall-to-avoid/

SHOW VARIABLES LIKE 'innodb_file_format'

=> Антилопа.

Сжатие доступно только с барракудой.

Так что мои журналы таблиц, которые уже сжаты, должны были быть сжаты с помощью innodb_file_format = Barracuda, но переменная, безусловно, была возвращена к Антилопе ...

Si Мне нужно пересоздать таблицу ... но на этот раз с хорошим форматом файла.

...