楔子
由于之前电脑上安装的 MySQL 版本是比较老的了,大概是 5.1 的版本,不支持 JSON 字段功能。而最新开发部门开发的的编辑器产品,使用到了 JSON 字段的功能。因此需要升级 MySQL 版本,升级的目标版本是 MySQL 5.7.30(虽然最新版本已经到 8.x,但是 5.7 基本够用了)。发现在升级安装过程中,会有一些坑,所以使用本文记录一下。
卸载老版本
首先需要卸载老的版本,卸载其实也挺简单,只需要移除 MySQL 服务即可,首先打开 CMD,然后 cd 到 MySQL 的 bin 目录,然后输入下面的命令移除 MySQL 服务:
mysqld --remove mysql
// 需要注意的是:“msyql”是服务名称,安装的时候如果没有指定服务名称,// 默认名称是 MySQL(windows 下不区分大小写);// 如果安装的时候指定了名称,上面的名称需要修改为该指定的名称。
需要注意的一点是,我们删除了 MySQL 服务之后,有可能在 windows 的服务的列表里面还有,保留在哪儿也没啥影响,但是如果你又洁癖,一定要删除,就需要去删除注册表中对应键,参考下图。当然对于我们升级来说,后续还需要安装 windows 服务,可以直接覆盖。
注册表的图
然后删除老的 MySQL 相关文件夹,以及删除相关的环境变量的配置。
需要注意的是,如果数据文件和 MySQL 程序在一个文件夹下,需要保留数据
安装 5.7.30 版本
接下来就是安装 5.7.30 版本, 第一步是下载。
下载 MySQL
下载地址是:https://dev.mysql.com/downloads/mysql/
点击上面链接,进入到下载页面,由于最新的版本是 8.x,所以默认是 8.x 的版本。可以通过点击“Looking for the latest GA
version”选择版本,然后下载免安装版本:
解压 MySQL
下载完成后,解压到你想要安装的目录,比如我的目录是:
D:Program Files (x86)mysql-5.7.30-winx64
配置环境变量
在系统变量 path 后面追加 D:Program Files (x86)mysql-5.7.30-winx64bin,如图所示。
创建配置文件 my.ini
5.7.30 版本的安装包默认是不带配置文件 my.ini 的。所以需要创建自己创建一个 my.ini 的文件。手动创建 my.ini 文件,然后输入如下内容:
[mysql]
# 设置 mysql 客户端默认字符集
default-character-set=utf8
[mysqld]
# 设置 3306 端口
port = 3306
# 设置 mysql 安装目录
basedir=D:\Program Files (x86)\mysql-5.7.30-winx64
# 设置 mysql 数据库的数据存放目录
datadir=D:\Program Files (x86)\mysql-5.7.30-winx64\data
# 运行最大连接数
max_connections=200
# 服务端使用的字符集默认为 8 比特编码的 latin1 字符集
character-set-server=utf8
# 参加新表时将使用的默认存储引擎
default-storage-engine=INNODB
此处会有一些坑,需要避免。
my.ini 注意事项一
my.ini 必须保存为 ANSI 格式(配置文件默认就是是 ANSI 编码格式,可能会不小心保存为其他格式,比如 UTF-8),否正会出现后续的服务不能启动的情况。如果你不确定 my.ini 是什么格式,可以另存为:
my.ini 注意事项二
如果是从低版本升级到 5.7 的版本,可能为了保留之前的配置,就直接把之前的配置文件拷贝过来。这个时候就要注意了,因为以前很多低版本的参数,已经不适合高版本的。如果不修改过来,就会导致后续的服务启动失败。
比如笔者遇到的一个导致错误的参数是:
#table_cache=256 // 低版本的
table_open_cache=256 // 高版本的
如果一定要保留老版本的配置,又对于新版本的参数修改不是很熟悉,那么可以再配置文件中把日志功能假设,这样再报错的时候,可以通过查看日志了解详情。如下配置日志路径即可:
log_error=D:/mysql-5.7/error.log
然后启动失败后,可以通过日志查看报错,比如:
更多可能的错误参数:
unknown variable 'key-buffer=256M' // 去掉改项即可。unknown variable 'table-cache=512' // 修改为 table_open_cache 即可。unknown variable 'thread-concurrency=8' // 去掉改项,5.7 已结废弃。
windows 服务启动失败,不会把错误详情标识出来,只会简单说一句服务启动失败。只能通过配置日志文件来查看。
安装 MySQL 服务
最重要的一步就是安装 MySQL 服务。首先进入 cmd 界面,CD 到 MySQL 的 bin 目录(注意此处一定要到 bin 目录下去执行),执行如下命令:
mysqld --install [服务名称,默认是 MySQL]
截图如下:
执行命令后,会提示服务安装成功。
注意事项一
需要注意的是,有可能出现 Install/Remove of the Service Denied! 的提示错误。
原因:普通用户模式权限下的 cmd 安装 mysql 会出现这样的报错提示。通过管理员模式运行 cmd 即可:
其他步骤如果出现没有执行权限的情况,也都请用管理员省份运行即可。
注意事项二
有些电脑会出现找不到 MSVCP120.dll 的错误:
这种错误是由于未安装 vcredist 引起的
下载 vcredist 地址:https://www.microsoft.com/zh-CN/download/details.aspx?id=40784
安装,位置默认即可,安装成功之后,重新安装服务即可。
初始化 MySQL
MySQL5.7 是不带 data 目录的,所以需要初始化 MySQL,生产 data 目录,也比较简单,执行如下命令即可:
mysqld --initialize-insecure --user=mysql
需要注意的是,有的文章介绍的是此处用“mysqld –initialize”,“mysqld –initialize-insecure”和“mysqld –initialize”的区别在于前者会创建一个空密码,而后者会创建一个随机密码。因此用“mysqld –initialize”,最好加上“–console”,可以把随机密码打印出来(注意“–console”仅限于 windows)
–user=msyql 主要用于在 linux 或者 unix 系统下给与把 data 目录授权给 mysql 账号,在 windows 下可以不必使用,带上也无所谓。
数据初始化参考链接:https://dev.mysql.com/doc/mysql-installation-excerpt/5.7/en/data-directory-initialization.html
初始化完成后,会生成 data 目录。
注意事项一
如果初始化出现错误:“–initialize specified but the data directory has files in it. Aborting.”那是因为你可能手动创建了 data 目录,并且里面包含了文件(比如升级可能这样操作),此时要做的就是删除 data 目录即可,至于升级,可以后续考虑。
此时说的 data 目录,是指 my.ini 文件里面 指定的目录,未必是 mysql 安装文件下的目录:
datadir=D:DevelopMySQLmysql-8.0.12-winx64data
启动 MySQL 服务
windows 下启动 MySQL 服务,可以使用如下命令即可:
net start MySQL
设置 MySQL 服务密码
使用 mysqladmin 可以设置密码。启动 MySQL 服务之后,输入如下命令:
输入老的密码(通过前面操作,老密码为空),然后输入新的密码,确认新的密码,即可设置成功。
注意事项一
如果前面初始化的时候未初始化未空密码,又不小心忘记了初始化密码,会出现下面的问题,无法登陆及修改密码:
“Access denied for user ‘root’@’localhost’”
通过如下步骤解决:
添加 skip-grant-tables
再配置文件 my.ini 中添加 skip-grant-tables:
重启 MySQL 服务
先停止 MySQL 服务,然后再启动 MySQL 服务,即可:
修改密码
首先登陆 mysql,此时不需要密码,如下:
通过 sql 语句修改密码,首先 use mysql;然后 update 更新密码:
然后退出 mysql 即可。
删除 skip-grant-tables 重启 MySQL 服务
首先从 my.ini 中删除 skip-grant-tables , 然后 net stop mysql,net start mysql 重启服务。
MySQL 老数据升级到 5.7
要升级老数据,如果是从 5.x 版本升级上来,基本上只需要把相关的数据文件拷贝到 data 文件夹下。需要注意的是,如果使用了 innodb,还需要把“ibdata”等文件拷贝过来。否正会报表不存在的情况:
error: 1146: Table 'a_content' doesn't exist
innodb 是 MYSQL 数据库一种流行的数据库引擎,支持事务(行级),ibdata 用来储存文件的数据,而库名的文件夹里面的那些表文件只是结构而已,由于新版的 mysql 默认试 innodb,所以 ibdata1 文件默认就存在了,少了这个文件有的数据表就会出错。
如果升级过程中,存在数据损坏,可以使用 repair 命令进行修复:
repair table tablename
正常经过上述操作,就可以了,如果还有问题,可以尝试使用升级命令 mysql_upgrade 对数据进行升级(也建议使用改命令升级,不然后续出问题,可能会不好定位)
https://dev.mysql.com/doc/refman/5.7/en/mysql-upgrade.html
// 升级 mysql,mysql_upgrade 检查不兼容的表,更新 grant 表;mysql_upgrade -uroot -p
升级速度具体看 data 目录的大小情况而定。
以上全文。
更多精彩内容,请关注公众号“ITman 彪叔”。