table_id是什么
table_id是一个内部使用的标识符,用于标识数据库中的表,一个表对应一个唯一table_id;如果表结构发生变化,table_id也会发生变化,以确保当前缓存中,table_id和表名对应
table_id有什么特性
- table_id 并不是固定的,它是当表被载入内存(table_definition_cache)时,临时分配的,是一个不断增长的变量。
- 当有新的table变更时,在cache中没有,就会触发一次load table def的操作,此时就会在原先最后一次table_id基础上+1,做为新的table def的id。
- flush tables,之后对表的更新操作也会触发table_id 的增长。
- 如果table def cache过小,就会出现频繁的换入换出,从而导致table_id增长比较快。
查看table_id
show binlog events in 'mysql-bin.xx';
里面可以看到执行的table_id
mysql> show binary log events in 'mysql-bin.000161';
| mysql-bin.000161 | 3339 | Query | 45170 | 3411 | BEGIN |
| mysql-bin.000161 | 3411 | Table_map | 45170 | 3471 | table_id: 4278 (wang.hero3) |
| mysql-bin.000161 | 3471 | Delete_rows | 45170 | 3526 | table_id: 4278 flags: STMT_END_F |
| mysql-bin.000161 | 3526 | Xid | 45170 | 3557 | COMMIT /* xid=6967 */ |
| mysql-bin.000161 | 3557 | Anonymous_Gtid | 45170 | 3622 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'
table_id有什么风险
table_id是uint,最大值42亿;部分系统中如果频繁flush table或者表数量太多,频繁load table def的时候,可能会导致tablet_id溢出的情况,此时将无法CREATE表或者修改表结构;
决方法:
- 重启数据库使table_id 归0。
- 加大 table_definition_cache 的大小。增加table_open_cache大小来调整;
- 修改MySQL源码,将 RPL_TABLE_LIST结构中的uint型的table_id修改为ulong型 ,一劳永逸。