MySQL 是在软件开发过程中不可或缺的一个部分,但是对于初学者来说搭建环境总是会遇到各种各样的问题,或者是未授权,或者是密码修改未成功,或者是服务无法安装,无法删除等等一系列问题,总要在学习初期遇到各种各样的坑。
为了解决这个问题,笔者总结了 ZIP 版本 MySQL(MySQL 8.0.18 1045 28000)的 24 步安装过程。
其中对于 Flush Privileges 在 MySQL Ref-Manual 中的阐述的描述是相对来说比较提倡的一种学习方法。
下面分别从上述几个方面进行具体描述。
1. 配置系统环境变量,对于这一步骤,可以配置系统环境变量,也可以配置用户环境变量,至于两者的区别,再这就不做赘述了。
对于这一步骤有些用户操作的时候可能会出现如下问题:
环境变量配置完成后,仍然提示“'mysql' 不是内部或外部命令”。这种情况下,不需要重启电脑,重新打开命令提示符窗口即可。
2. 直接在系统路径下进入 MySQL 报错,如下:
ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost' (10061)
3. 尝试启动 MySQL,提示:
发生系统错误 2。
系统找不到指定的文件。
4. 切换到 MySQL 解压文件夹 bin 文件夹所在路径:
5. 执行 mysqld install
命令安装 MySQL 服务,net start mysql
启动服务。
6. 拒绝访问
ERROR 1045 (28000): Access denied for user 'ODBC'@'localhost' (using password: NO)
7. 无密码访问
mysqld --console --skip-grant-tables --shared-memory
提示:
2020-01-06T05:49:30.805343Z 0 [System] [MY-010116] [Server] D:\software\mysql-8.
0.18-winx64\bin\mysqld.exe (mysqld 8.0.18) starting as process 3980
2020-01-06T05:49:31.078781Z 1 [ERROR] [MY-012271] [InnoDB] The innodb_system dat
a file 'ibdata1' must be writable
2020-01-06T05:49:31.107101Z 1 [ERROR] [MY-012278] [InnoDB] The innodb_system dat
a file 'ibdata1' must be writable
2020-01-06T05:49:31.207687Z 1 [ERROR] [MY-010334] [Server] Failed to initialize
DD Storage Engine
2020-01-06T05:49:31.259445Z 0 [ERROR] [MY-010020] [Server] Data Dictionary initi
alization failed.
2020-01-06T05:49:31.285812Z 0 [ERROR] [MY-010119] [Server] Aborting
2020-01-06T05:49:31.428390Z 0 [System] [MY-010910] [Server] D:\software\mysql-8.
0.18-winx64\bin\mysqld.exe: Shutdown complete (mysqld 8.0.18) MySQL Community S
erver - GPL.
针对这个问题,有提供了一种解决方案,删除 data 文件夹下的,ib_logfile0、ib_logfile1 两个日志文件。
但是,由于没有对缘由进行说明,所以放弃这种方案。另外,对于这种不明确缘由直接删除相关文件情况下,实际上也是在为后续工作埋雷,及时当前配置经过折腾正常启动后,依然会导致运行过程中存在不确定因素。
上述这个过程看上去没什么问题,实际上是不对的,在安装过程中环境变量配置完成后直接安装并启动服务,但是缺少一个“初始化”的步骤,所以导致无法正常启动。所以在配置过程中应该,环境变量配置完成后,首先初始化,初始化过程中会生成响应的data文件夹下的文件和配置一些属性。
另一种方案
8. 删除方案一中已经安装的服务,mysqld -remove
:
9. 去下载 ZIP 版本的MYSQL
https://dev.mysql.com/downloads/mysql/
并解压,第一次解压后会发现目录中并没有 data 文件夹。
10. 在解压的目标路径下,创建data文件夹。
11. 在解压目录路径下创建 my.ini 文件,注意右下角,保存 ini 文件的时候,选择 ANSI 编码方式。
12. 初始化 mysqld --initialize --console
(注:是先初始化,再安装启动,而不是先安装服务启动,再初始化,先安装启动的情况下,会在启动时提示,无法启动),可是报编码有歧义。
这个在步骤 3 中已经标注完成了,由原来的 UTF-8,修改为 UTF8MB4。
13. 再次初始化,有些情况下,由于在删除服务后没有删除 data 文件夹,所以文件夹下会有文件,再次初始化的时候,提示 data 文件已经存在了,删除即可。
14. 再初执行 mysqld --initialize --console
,可以看到初始化完成,并且生成了临时密码。
密码:
i%lsDLpT?6J+(这个密码是可以直接复制的)
15. mysqld install
安装 MySQL 服务:
16. net start mysql
启动 MySQL 服务:
17. 使用刚才的密码登录 MySQL(注意:这个密码是可以复制粘贴的),进入 MySQL。
18. 由于刚才的密码不便于记忆,或者由于别的原因,通常需要修改密码,使用如下语句:
mysql>ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123';
mysql>FLUSH PRIVILEGES;
19. 修改完成后 Ctrl+Z,退出 MySQL。
20. 测试新密码成功连接:
21. 有些情况下,需要查看 MySQL 占用的端口:
show global variables like 'port';
需要注意的是,命令号要用分号结尾。
当然,也可以通过之前添加的配置文件中查看使用的端口。
22. 使用客户端连接,报错:
错误号码1130,host ' ' is not allowed to connect to this mysql server
如果使用 navicat 连接的情况下,也有可能报错误:
protocol mismatch; server version=10 client version=11
解决办法:
语句:
use mysql;
select host,user from user;
update user set host='%' where user='root';
flush privileges;
23. 连接成功。
24. 在提示密码过期的情况下,即使重置也没有用,必须在原来的密码输入以后,修改密码,设置不过期才可以,经过测试,在密码过期之后重新初始化 MySQL,生成临时密码后,输入临时密码,依然无效,需要使用过期的旧密码,输入后,进入 MySQL,修改密码,过程如下:
-- 修改密码以能够在客户端登陆:
set password for root@localhost = password('123');
-- 修改root密码永不过期:
ALTER USER 'root'@'localhost' PASSWORD EXPIRE NEVER;
到此经过 24 步骤的尝试,基本上对 MySQL 8.0.19 的 ZIP 版本的安装算是完成。
mysqld -remove
步骤 11 中用到的如下语句:
mysql>ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123';
在密码修改过后使用 Flush Privileges 进行缓存的清除,对权限进行刷新。
mysql>FLUSH PRIVILEGES;
Flush Privileges,顾名思义,对权限进行刷新,很多人不明白这究竟是个什么东西,看一下官方的解释(来自 MySQL 的 refman-5.7-en.pdf)就明白了:
重新从 MySQL 的系统数据库中加载授权表中的权限,Flush Privileges 能够使运行时的权限及时生效。这和其中提及到的 --skip-grant-tables
的参数有关系,也就是说如果在启动的时候禁用了权限系统,使用 Flush Privileges 就能够释放缓存,重新使修改的内容生效。这就从根本上了解了,--skip-grant-tables
,Flush Privileges的作用,而不用每次使用的时候都懵懵懂懂。
通过上面 Flush Privileges 的机制在 Ref-Manual 中的阐述,对于用法的深入了解,实际上是一种很值得提倡的学习方法。
我们会发现,尤其对于初学者,在知识点的学习和查找过程中,对于很多博客无法正确解决心中的疑虑,总是多多少少的令人感到不解。
这种情况下追根溯源,找到它的出处,看最原始的解释,就能很直白,简单的理解问题的症结所在。
通过上面这种方式,我们查看在上文中提到的 ib_logfile0 和 ib_logfile1 是什么?
innodb_log_group_home_dir= /dr3/ibblogs
通过原文的描述知道,放置 InnoDB 的 log files 在不同的物理存储位置,避免发生资源的读写冲突。就是在上述描述的方案中出现的错误提示。在 Ref-Manual 中很明确的提到,只要对路径指向别处,便可以避免权限导致的读写错误,而不是直接选择删除。
通过这种方式,在 MySQL 安装过程中遇到的所有问题,便可以迎刃而解,而不是翻阅各种重复的,不够深入理解的博客方案,导致的各种问题无法正确理解。通过这种方式,一劳永逸,举一反三的解决。
当然不仅仅局限于官方手册,虽然官方手册是比较优秀的选择,但是对于有些同学来说,存在一定难度,那么可以选择比较系统的相关书籍,结合博客深入,全面理解。
提供一个基本的 ini 配置如下:
[mysqld]
# 设置3306端口
port=3306
# 设置mysql的安装目录
basedir=E:\\***\MySQL\\mysql-8.0.19-winx64
# 设置mysql数据库的数据的存放目录
datadir=E:\\***\MySQL\\mysql-8.0.19-winx64\\data
# 允许最大连接数
max_connections=200
# 允许连接失败的次数。这是为了防止有人从该主机试图攻击数据库系统
max_connect_errors=10
# 服务端使用的字符集默认为UTF8
character-set-server=UTF8MB4
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
# 默认使用“mysql_native_password”插件认证
default_authentication_plugin=mysql_native_password
[mysql]
# 设置mysql客户端默认字符集
default-character-set=UTF8MB4
[client]
# 设置mysql客户端连接服务端时默认使用的端口
port=3306
default-character-set=UTF8MB4
使用上面提供的具体方法, 再次愉快的从《refman-5.7-en》的第 996 页中找到答案。如下:
表中展示了,用户名称,主机值,以及允许链接的备注信息,从表中可以看出通配符百分号,以及 IP 地址所对应的含义。具体内容,可以去手册上查找,如果不明确的话,可以留言。
1. 错误输入命令,使用 mysqld -u root -p
会出现如下错误。修改 mysqld 为 mysql 即可。
mysqld: Can not perform keyring migration : Invalid --keyring-migration-source option.
2020-01-20T08:17:51.407930Z 0 [System] [MY-010116] [Server] E:\Tool\MySQL\mysql-8.0.19-winx64\bin\mysqld.exe (mysqld 8.0.19) starting as process 25932
2020-01-20T08:17:51.413918Z 0 [ERROR] [MY-011084] [Server] Keyring migration failed.
2020-01-20T08:17:51.424474Z 0 [ERROR] [MY-010119] [Server] Aborting
2020-01-20T08:17:51.424758Z 0 [System] [MY-010910] [Server] E:\Tool\MySQL\mysql-8.0.19-winx64\bin\mysqld.exe: Shutdown complete (mysqld 8.0.19) MySQL Community Server - GPL.
2. 无法连接 MySQL 服务,原因是没有启动服务导致的:
ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost' (10061)
3. 发生系统错误 2,系统找不到系统文件:
切换到 bin 所在路径安装,才能可执行文件路径才不是默认的系统路径,如下图:
再启动才能够正常启动服务:
如有问题,欢迎交流,后期将逐步更新,Linux 版本下的 MySQL 安装,MySQL 集群的配置与使用。如有不足之处,欢迎指正。