问题描述:
之前用kill的方法杀掉了一个MySQL的进程,今天想要重启这个进程,启动的过程中,发现
--T19::35.443445+: [Note] InnoDB: Number of pools:
--T19::35.443578+: [Note] InnoDB: Using CPU crc32 instructions
--T19::35.446085+: [Note] InnoDB: Initializing buffer pool, total size = M, instances = , chunk size = M
--T19::35.463097+: [Note] InnoDB: Completed initialization of buffer pool
--T19::35.466798+: [Note] InnoDB: If the mysqld execution user is authorized, page cleaner thread priority can be changed. See the man page of setpriority().
--T19::35.476864+: [ERROR] InnoDB: The Auto-extending innodb_system data file '/data/mysql_4306/data/ibdata1' is of a different size pages (rounded down to MB) than specified in the .cnf file: initial pages, max (relevant if non-zero) pages!
--T19::35.476894+: [ERROR] InnoDB: Plugin initialization aborted with error Generic error
--T19::36.077732+: [ERROR] Plugin 'InnoDB' init function returned error.
2020-03-06T19::36.077818+: [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
--T19::36.077842+: [ERROR] Failed to initialize builtin plugins.
--T19::36.077860+: [ERROR] Aborting
从errlog的信息可以推断,是ibdata1的文件大小和配置文件.cnf的大小不一致导致的,这里需要留意这两个数字,一个是64000,另外一个是65536,但是这个计算的是pages为单位的。
我们看看我们在配置文件my.cnf中设定的文件大小:
innodb_data_file_path = ibdata1:1024M;ibdata2:1G:autoextend
这里写的是ibdata1:1024MB
根据报错信息,说我们数据文件中的内容是65536 pages
也就是说:1024MB=65536 pages 的容量
很容易计算,每64个pages就是1M
这里有必要引入之前的一篇文章:
在这篇文章中我们说过innodb中的区的概念,连续的64个数据页成为一个区,这个概念在下面的解释中会有用。
在Innodb中,我们知道默认的数据页大小是16KB,当数据量小的时候,我们用默认数据页大小来分配存储空间没有问题,但是在表中数据量大的时候,为某个索引分配空间的时候就不再按照页为单位分配了,而是按照区
为单位分配,甚至在表中的数据十分非常特别多的时候,可以一次性分配多个连续的区。虽然可能造成一点点空间的浪费(数据不足填充满整个区),但是从性能角度看,可以消除很多的随机IO操作,如果我们用数据页为最小单位进行存储分配,那么分配的频率会比较高,而且分配的数据页之间可能物理空间位置很远。这样Innodb的性能会急剧下降。
我们通过简单的计算,一个数据页是16K,64个数据页为一个区,那么一个区就是1MB的空间,而我们上面的出错信息中的pages也就是数据页,恰好对应起来。
那么报错信息中心提示当前的ibdata1文件和my.cnf中配置的大小不一样,我们看看当前的ibdata大小:
1000M ibdata1
1.1G ibdata2
也就是说,实际的ibdata大小为1000M,而我们的配置文件的大小是1024M,这就产生了问题,那么解决方案就比较容易了,就是把my.cnf中的配置改为:
ibdata1:1024M;ibdata2:1G:autoextend即可。
由于ibdata2是autoextend的,所以,大小超过1G也是可以理解的。
这样,重新启动mysql,问题得到解决。