Bug #67283 confusing records in innodb_cmp_per_index while a table was dropped
Description:
innodb_cmp_per_index was introduced in MySQL5.6.7 to desplay compress information of every index using compression.
but if the table was dropped, then the database_name and table_name was set to 'unknown'
I think it's better to delete the record from page_zip_stat_per_index rather than output some confusing information
How to repeat:
mysql> set global innodb_cmp_per_index_enabled=ON;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from information_schema.innodb_cmp_per_index;
Empty set (0.00 sec)
mysql> create table t1 (a int primary key ,b int ) row_format=compressed key_block_size=4;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from information_schema.innodb_cmp_per_index;
+---------------+------------+------------+--------------+-----------------+---------------+----------------+-----------------+
| database_name | table_name | index_name | compress_ops | compress_ops_ok | compress_time | uncompress_ops | uncompress_time |
+---------------+------------+------------+--------------+-----------------+---------------+----------------+-----------------+
| test | t1 | PRIMARY | 1 | 1 | 0 | 0 | 0 |
+---------------+------------+------------+--------------+-----------------+---------------+----------------+-----------------+
1 row in set (0.00 sec)
mysql> drop table t1;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from information_schema.innodb_cmp_per_index;
+---------------+------------+-------------+--------------+-----------------+---------------+----------------+-----------------+
| database_name | table_name | index_name | compress_ops | compress_ops_ok | compress_time | uncompress_ops | uncompress_time |
+---------------+------------+-------------+--------------+-----------------+---------------+----------------+-----------------+
| unknown | unknown | index_id:27 | 1 | 1 | 0 | 0 | 0 |
+---------------+------------+-------------+--------------+-----------------+---------------+----------------+-----------------+
1 row in set (0.00 sec)
Suggested fix:
a rough patch
--- a/storage/innobase/handler/i_s.cc 2012-09-19 07:06:30.000000000 +0800
+++ b/storage/innobase/handler/i_s.cc 2012-10-18 15:38:35.728683184 +0800
@@ -1746,15 +1746,17 @@
field_store_string(fields[IDX_INDEX_NAME],
index->name);
} else {
- /* index not found */
- ut_snprintf(name, sizeof(name),
- "index_id:" IB_ID_FMT, iter->first);
- field_store_string(fields[IDX_DATABASE_NAME],
- "unknown");
- field_store_string(fields[IDX_TABLE_NAME],
- "unknown");
- field_store_string(fields[IDX_INDEX_NAME],
- name);
+ /*delete the record from page_zip_stat_per_index*/
+ mutex_exit(&dict_sys->mutex);
+
+ mutex_enter(&page_zip_stat_per_index_mutex);
+ page_zip_stat_per_index_t::iterator tmp_iter;
+ tmp_iter = page_zip_stat_per_index.find(iter->first);
+ page_zip_stat_per_index.erase(tmp_iter);
+ mutex_exit(&page_zip_stat_per_index_mutex);
+
+ mutex_enter(&dict_sys->mutex);
+ continue;
}
fields[IDX_COMPRESS_OPS]->store(
Portions of this website are copyright © 2001, 2002 The PHP Group
Page generated in 0.051 sec. using MySQL 8.4.7-u6-cloud
Timestamp references displayed by the system are UTC.
Content reproduced on this site is the property of the
respective copyright holders.
It is not reviewed in advance
by Oracle and does not necessarily represent the opinion of
Oracle or any other party.
Description: innodb_cmp_per_index was introduced in MySQL5.6.7 to desplay compress information of every index using compression. but if the table was dropped, then the database_name and table_name was set to 'unknown' I think it's better to delete the record from page_zip_stat_per_index rather than output some confusing information How to repeat: mysql> set global innodb_cmp_per_index_enabled=ON; Query OK, 0 rows affected (0.00 sec) mysql> select * from information_schema.innodb_cmp_per_index; Empty set (0.00 sec) mysql> create table t1 (a int primary key ,b int ) row_format=compressed key_block_size=4; Query OK, 0 rows affected (0.00 sec) mysql> select * from information_schema.innodb_cmp_per_index; +---------------+------------+------------+--------------+-----------------+---------------+----------------+-----------------+ | database_name | table_name | index_name | compress_ops | compress_ops_ok | compress_time | uncompress_ops | uncompress_time | +---------------+------------+------------+--------------+-----------------+---------------+----------------+-----------------+ | test | t1 | PRIMARY | 1 | 1 | 0 | 0 | 0 | +---------------+------------+------------+--------------+-----------------+---------------+----------------+-----------------+ 1 row in set (0.00 sec) mysql> drop table t1; Query OK, 0 rows affected (0.00 sec) mysql> select * from information_schema.innodb_cmp_per_index; +---------------+------------+-------------+--------------+-----------------+---------------+----------------+-----------------+ | database_name | table_name | index_name | compress_ops | compress_ops_ok | compress_time | uncompress_ops | uncompress_time | +---------------+------------+-------------+--------------+-----------------+---------------+----------------+-----------------+ | unknown | unknown | index_id:27 | 1 | 1 | 0 | 0 | 0 | +---------------+------------+-------------+--------------+-----------------+---------------+----------------+-----------------+ 1 row in set (0.00 sec) Suggested fix: a rough patch --- a/storage/innobase/handler/i_s.cc 2012-09-19 07:06:30.000000000 +0800 +++ b/storage/innobase/handler/i_s.cc 2012-10-18 15:38:35.728683184 +0800 @@ -1746,15 +1746,17 @@ field_store_string(fields[IDX_INDEX_NAME], index->name); } else { - /* index not found */ - ut_snprintf(name, sizeof(name), - "index_id:" IB_ID_FMT, iter->first); - field_store_string(fields[IDX_DATABASE_NAME], - "unknown"); - field_store_string(fields[IDX_TABLE_NAME], - "unknown"); - field_store_string(fields[IDX_INDEX_NAME], - name); + /*delete the record from page_zip_stat_per_index*/ + mutex_exit(&dict_sys->mutex); + + mutex_enter(&page_zip_stat_per_index_mutex); + page_zip_stat_per_index_t::iterator tmp_iter; + tmp_iter = page_zip_stat_per_index.find(iter->first); + page_zip_stat_per_index.erase(tmp_iter); + mutex_exit(&page_zip_stat_per_index_mutex); + + mutex_enter(&dict_sys->mutex); + continue; } fields[IDX_COMPRESS_OPS]->store(