一、mysqld --initialize --console命令介绍
mysqld --initialize --console命令用于生成一个全新的MySQL数据目录,并且创建root账户的默认密码,该密码将会在日志中输出。
二、mysqld --initialize --console命令使用
1、生成全新的MySQL数据目录
使用mysqld --initialize --console命令生成全新的MySQL数据目录,示例如下:
$ mysqld --initialize --console 2020-04-05T01:25:29.822188Z 0 [System] [MY-013169] [Server] /usr/sbin/mysqld (mysqld 8.0.19) initializing of server in progress as process 3342 2020-04-05T01:25:29.824964Z 0 [ERROR] [MY-010457] [Server] --initialize specified but the data directory has files in it. Aborting. 2020-04-05T01:25:29.826628Z 0 [ERROR] [MY-013236] [Server] Newly created data directory /var/lib/mysql/ is unusable. You can safely remove it.
如果全新的MySQL数据目录已经存在,将会输出以上错误信息。
如果全新的MySQL数据目录不存在,将会输出以下类似的信息:
$ mysqld --initialize --console 2020-04-05T01:08:33.765043Z 0 [System] [MY-013169] [Server] /usr/sbin/mysqld (mysqld 8.0.19) initializing of server in progress as process 3037 2020-04-05T01:08:33.853206Z 5 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: GCPsO1G[s4&6 2020-04-05T01:08:38.226778Z 0 [System] [MY-013170] [Server] /usr/sbin/mysqld (mysqld 8.0.19) initialization completed successfully (log sequence number 0).
以上信息表示MySQL数据目录初始化成功,并生成了root账户的默认密码:GCPsO1G[s4&6。
2、修改MySQL数据目录位置
使用mysqld --initialize --console命令时,默认MySQL数据目录为/var/lib/mysql,可以通过--datadir参数来指定MySQL数据目录位置,示例如下:
$ mysqld --initialize --console --datadir=/data/mysql
以上命令将会在/data/mysql目录下生成全新的MySQL数据目录。
三、mysqld --initialize --console命令原理
mysqld --initialize --console命令执行原理如下:
1、生成临时密码
执行命令时,MySQL服务器会生成一串随机的临时密码,平时我们不可见,密码会被输出在日志中,如以下信息:
2020-04-05T01:08:33.853206Z 5 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: GCPsO1G[s4&6
2、初始化数据目录
执行mysqld --initialize --console命令时,MySQL 会检查指定数据目录是否存在,如果不存在,MySQL就会按照默认的存储引擎创建必要的文件和子目录。
当 MySQL 执行成功时,表示数据库初始化完成并且数据库可以正常工作了。
3、启动MySQL服务器实例
执行mysqld --initialize --console命令并不会启动 MySQL服务器实例。需要执行mysqld_safe启动 MySQL服务器实例。
四、mysqld --initialize --console命令注意事项
1、MySQL数据目录不为空
如果MySQL数据目录不为空时,执行mysqld --initialize --console命令将会输出以下信息,初始化中止:
mysqld: Can't create directory '/var/lib/mysql/' (Errcode: 17 - File exists) 2020-04-05T01:03:30.171566Z 0 [ERROR] [MY-010119] [Server] Aborting 2020-04-05T01:03:30.172188Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.19) MySQL Community Server - GPL.
2、MySQL版本不同
MySQL的版本不同,执行mysqld --initialize --console命令时的日志信息可能会略有不同。
3、MySQL数据目录权限问题
如果MySQL数据目录的权限不正确,执行mysqld --initialize --console命令可能会失败。我们需要使用chmod 命令修改 MySQL 数据目录权限(默认权限为700),示例如下:
$ sudo chmod 700 /var/lib/mysql/
4、生成的密码强度
mysqld --initialize --console命令生成的密码强度并不高,我们需要在MySQL服务启动后,修改root账户的密码:
$ mysql -u root -p Enter password: ********* mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password';
总结
mysqld --initialize --console命令是MySQL服务初始化必不可少的命令之一,不仅会生成全新的MySQL数据目录,还会生成root账户的临时密码,需要注意的是,生成的密码强度并不高,需要及时修改密码。