Bug #94187 | Downgrade minor 5.7 version leaves incorrect innodb_table_stats schema | ||
---|---|---|---|
Submitted: | 4 Feb 2019 9:14 | Modified: | 4 Feb 2019 13:12 |
Reporter: | Przemyslaw Malkowski | Email Updates: | |
Status: | Verified | Impact on me: | |
Category: | MySQL Server: Command-line Clients | Severity: | S3 (Non-critical) |
Version: | 5.7.21 | OS: | Any |
Assigned to: | CPU Architecture: | Any |
[4 Feb 2019 9:14]
Przemyslaw Malkowski
[4 Feb 2019 9:58]
MySQL Verification Team
Hello Przemyslaw, Thank you for the report and feedback. Observed with binary tarballs and in-Place downgrade procedure i.e from https://dev.mysql.com/doc/mysql-installation-excerpt/5.7/en/downgrade-binary-package.html#... regards, Umesh
[4 Feb 2019 13:12]
Przemyslaw Malkowski
Interestingly, with tables with long enough names, which are partitioned, there may be a problem with fixing the table manually with an ALTER: mysql> alter table `mysql`.`innodb_table_stats` modify `table_name` varchar(64) COLLATE utf8_bin NOT NULL; ERROR 1406 (22001): Data too long for column 'table_name' at row 5 So, it may be necessary to drop/truncate and re-create/alter both tables `mysql`.`innodb_table_stats` and `mysql`.`innodb_index_stats` later. However, after downgrading, even in 5.7.21 and varchar(64), automatically filled statistics somehow manage to fit for the long name partitioned tables just fine :) mysql> show create table mysql.innodb_table_stats\G *************************** 1. row *************************** Table: innodb_table_stats Create Table: CREATE TABLE `innodb_table_stats` ( `database_name` varchar(64) COLLATE utf8_bin NOT NULL, `table_name` varchar(64) COLLATE utf8_bin NOT NULL, `last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `n_rows` bigint(20) unsigned NOT NULL, `clustered_index_size` bigint(20) unsigned NOT NULL, `sum_of_other_index_sizes` bigint(20) unsigned NOT NULL, PRIMARY KEY (`database_name`,`table_name`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin STATS_PERSISTENT=0 1 row in set (0.00 sec) mysql> select table_name,length(table_name) from mysql.innodb_table_stats; +-----------------------------------------------------------------------+--------------------+ | table_name | length(table_name) | +-----------------------------------------------------------------------+--------------------+ | myverylongnametable_myverylongnametable_myverylongnametable_myv | 63 | | myverylongnametable_myverylongnametable_myverylongnametable_myve#P#p1 | 69 | | myverylongnametable_myverylongnametable_myverylongnametable_myve#P#p2 | 69 | | myverylongnametable_myverylongnametable_myverylongnametable_myve#P#p3 | 69 | | t1 | 2 | +-----------------------------------------------------------------------+--------------------+ 5 rows in set (0.00 sec)