起因
使用MySQL-8.0.18版本的mysqldump备份了MySQL-5.7.26的表,出现警告
mysqldump: Couldn’t execute ‘SELECT COLUMN_NAME, JSON_EXTRACT(HISTOGRAM, ‘$.“number-of-buckets-specified”’) FROM information_schema.COLUMN_STATISTICS WHERE SCHEMA_NAME = ‘xxx’ AND TABLE_NAME = ‘xxx’;’: Unknown table ‘COLUMN_STATISTICS’ in information_schema (1109)
警告内容是说MySQL-5.7.26的实例中,information_schema 库下没有COLUMN_STATISTICS表。
通过show tables对比两个实例,确实,5.7版本中没有该表。
#mysql5.7版本
#mysql8版本
一探究竟
一、关于COLUMN_STATISTICS
该表是MySQL8新增的系统表,用于存储列值的直方图统计信息。
The COLUMN_STATISTICS table provides access to histogram statistics for column values.
该 COLUMN_STATISTICS 表提供对列值的直方图统计信息的访问。
For information about histogram statistics, see Section 10.9.6, “Optimizer Statistics”, and Section 15.7.3.1, “ANALYZE TABLE Statement”.
有关直方图统计信息的信息,请参见第 10.9.6 节 “优化器统计信息”和第 15.7.3.1 节 “ANALYZE TABLE 语句”。
You can see information only for columns for which you have some privilege.
您只能查看您具有某些权限的列的信息。
The COLUMN_STATISTICS table has these columns:
该 COLUMN_STATISTICS 表包含以下列:
SCHEMA_NAME
The names of the schema for which the statistics apply.
应用统计信息的架构的名称。
TABLE_NAME
The names of the column for which the statistics apply.
应用统计信息的列的名称。
COLUMN_NAME
The names of the column for which the statistics apply.
应用统计信息的列的名称。
HISTOGRAM
A JSON object describing the column statistics, stored as a histogram.
描述 JSON 列统计信息的对象,存储为直方图。
二、为什么在mysqldump的时候会报警告
来测试一下
1、建立一张测试表并插入数据(MySQL8.x版本)
略
2、对该表的某个字段建立直方图(MySQL8.x版本)
略
3、使用一条平平无奇的mysqldump命令备份该表(MySQL8.x版本)
mysqldump -uxxx -pxxx -hxxx test ttt --set-gtid-purged=OFF > /tmp/t.sql
4、查看备份出来的t.sql
MySQL8.0实现了统计直方图。利用直方图,用户可以对一张表的一列做数据分布的统计,特别是针对没有索引的字段。这可以帮助查询优化器找到更优的执行计划。统计直方图的主要使用场景是用来计算字段选择性,即过滤效率。
可以看到,在备份的时候创建的直方图信息默认会被备份出来。
说明,MySQL8.x以后的版本在mysqldump的时候默认会通过information_schema.COLUMN_STATISTICS备份表的直方图信息。
而MySQL8.x之前的版本是没有直方图和COLUMN_STATISTICS表的,因此报了警告。
三、如何解决该问题
1、使用参数–column-statistics=0
例如
mysqldump -uxxx -pxxx -hxxx test ttt --column-statistics=0 --set-gtid-purged=OFF > /tmp/t.sql
该参数用于关闭存储引擎收集和存储表列统计信息的功能。
2、使用对应版本的mysqldump备份数据
彩蛋
使用MySQL8.x版本备份MySQL5.x版本,即使出现该警告依旧会备份成功,也不会影响恢复。