行格式不一致的mysql innodb表

6ss1mwsb  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(290)

我对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\u file\u per\u 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语句)
现在,我有两张table:
原木(原木)
__新日志新日志(优化)
但它们在结构上并不相同:

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',

为什么表\uu new \u logs被标记为“compact”而不是compressed,但是“create options”仍然设置为 row_format=COMPRESSED KEY_BLOCK_SIZE=8 \u new\u logs表的show create表显示:

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

所以它仍然被标记为压缩。
最后一件奇怪的事,新的日志表比原来的日志表大。。。我觉得在这张新table上没有做压缩。。。

nwsw7zdq

nwsw7zdq1#

我想我找到了解决办法。。。
https://www.percona.com/blog/2014/01/14/innodb-file-formats-here-is-one-pitfall-to-avoid/ SHOW VARIABLES LIKE 'innodb_file_format' =>羚羊。
压缩只适用于梭鱼。
所以我的表日志已经被压缩了,一定是用innodb\u file\u format=barracuda压缩的,但是变量肯定被还原为antelope。。。
是的,我需要重建这个table。。。但这次用的是好的文件格式。

相关问题