源码编译安装或者解压linux-glibc压缩包安装MySQL,在启动MySQL实例前,都有一步初始化mysqld server的过程,即“ mysql/bin/mysqld --initialize ”,除了“initialize”选项,还可以制定很多其他各种参数,参考https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html,或者在命令行执行mysqld --verbose --help。
在这一步初始化完成后,真正启动MySQL的时候,还可以在命令行指定这些参数,例如“ mysql/bin/mysqld_safe --user=mysql & ”。另外,更常规的做法是使用选项文件,Linux上的全局文件即“ /etc/my.cnf ”,可以将大量的自定义选项配置都写入选项文件,避免启动mysqld服务时命令后面跟一大堆参数。
但其中有两个跟InnoDB存储引擎文件相关的参数,innodb-log-files-in-group和innodb-data-file-path,如果在MySQL运行过程中使用默认值也无所谓,不涉及到自定义修改的情况,那么初始化的时候不做修改也可以;但是如果需要自定义修改,就需要在初始化的过程中就指定修改值,初始化完成后再在选项文件或者命令行启动时修改,就会造成启动失败或者数据库文件损坏。
错误日志里以下ERROR记录说明在MySQL安装已经初始化完成后再修改InnoDB表空间文件配置,故而产生冲突。
The innodb_system data file './ibdata1' is of a different size 768 pages (rounded down to MB) than the 65536 pages specified in the .cnf file!
这种情况下可以选择删掉所有的InnoDB表空间文件(默认一个:ibdata1)再重新启动,但也仅限于数据库还没有运行过,ibdata可以安全地delete。
错误日志里以下ERROR记录说明在MySQL安装已经初始化完成后再修改InnoDB事务日志 / 重做日志文件配置,故而产生冲突。
[ERROR] InnoDB: redo log file './ib_logfile0' exists. Creating system tablespace with existing redo log files is not recommended. Please delete all redo log files before creating new system tablespace.
这种情况下,删除重做日志文件组(默认两个:ib_logfile0和ib_logfile1)虽然也可能启动成功,但对于已经运行中的业务库来说有可能丢失事务而破坏ACID;新安装的数据库则会破坏表结构的完整性,这时错误日志里可能会看到以下ERROR记录。
[ERROR] Can't open the mysql.plugin table. Please run mysql_upgrade to create it.
[ERROR] Can't open and lock privilege tables: Table 'mysql.servers' doesn't exist
因此,best practice是在数据库安装mysqld --initialize这一步时,完成对这两个参数innodb-data-file-path和innodb-log-files-in-group的修改,最好是设计一个面向业务的选项文件,直接初始化。
mysql/bin/mysqld --defaults-file=/etc/my.cnf --initialize