У меня странная проблема с 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 больше, чем исходная таблица журналов ... Я чувствую, что сжатие на самом деле несделано на этом новом столе ...