做者:赵黎明
爱可生 MySQL DBA 团队成员,Oracle 10g OCM,MySQL 5.7 OCP,擅长数据库性能问题诊断、事务与锁问题的分析等,负责处理客户 MySQL 及我司自研 DMP 平台平常运维中的问题,对开源数据库相关技术很是感兴趣。
本文来源:原创投稿
*爱可生开源社区出品,原创内容未经受权不得随意使用,转载请联系小编并注明来源。
本文关键字:升级、Windows、帐号管理
最近有去某客户那里支持 MySQL 实例升级,他们的实例版本比较多,有 5.五、5.六、5.7,外加各类小版本,平台也不少,有 Linux、Windows。对于 Unix/Linux 平台的 MySQL 版本升级,你们可能再熟悉不过了,但对于 windows 平台的,可能接触地较少。因为项目上有需求,本身也在 Windows 环境上测试了一把,有了些心得,想跟你们分享一些经验,因而有了本文。这里主要是针对比较常见的 5.6 到 5.7 的升级。html
虽然是在讲升级,这里也稍微提一下 Windows 上安装实例的方法。首先,准备一台 Windows 主机(我这里用的是 Windows 10),去官网下载好 5.6.x,5.7.x for Windows 的 zip 包,我选择了社区版的 5.6.30 和 5.7.30(最新 GA)的包。
解压完的 zip包 是这样的,有点像 Linux 上的二进制包:mysql
安装很简单,最小化配置只须要把 my-default 参数中示例的几个参数前的注释符号去掉,并配置上相应的值,就能够启动了,固然,若是是生产环境,确定会自定义一堆参数,此处略过。 redis
改完后以下,而后就能够用这个参数文件去初始化实例了: sql
初始化实例后,再启动实例,接着建立并配置 Windows 服务,之后就能够经过启停服务对 MySQL 实例进行管理。升级 5.6 至 5.7这里不讨论详细的升级步骤,与安装实例其实差很少,主要说一下升级时要注意的点(本次测试采用 IN-PLACE 方式)。数据库
参考连接:
https://www.groovypost.com/ho...
https://answers.microsoft.com...
各个 dll 文件对应的 Visual C++ 版本: windows
安装完之后,能够查看 dll 动态库连接文件与对应 Visual C++ 版本之间的关系: 安全
个人环境中要正常运行 5.7.30 实例,须要安装 Visual C++ 20十二、Visual C++ 2013,以后就能够正常建立服务。服务器
安装完 5.7.30 实例后,建立并启动 windows 服务: session
经过 SC 启动服务后却当即中止了:运维
用 NET 命令也没法启动,error 日志也没有输出:
尝试删除服务再从新添加:
此时服务尚未被建立:
经过 SC 再次启动后,服务有了,但仍然是已中止状态:
再次删除服务后直接启动 mysqld,在登陆客户端后发现了端倪,原来是用 5.6.30 的 mysqld 命令启动了:
当即检查 my.ini 参数,发现参数中果真是用了 5.6.30 的路径:
中止进程,修改参数并从新启动 5.7.30 进程和服务:
msyql5730 服务恢复正常,不会再自动中止了:
服务端(mysqld)和客户端(mysql)进程也运行正常:
检查数据库(注意,此时仍然是没有 sys 库的,由于是把 5.6 的 data 目录直接拿来启动实例的):
执行 mysql_upgrade,重建系统库:
至此,完成 5.6.30 to 5.7.30 的升级(是否是 so easy?)。
要注意,执行完 mysql_upgrade 后须要重启实例,不然会报如下错误:
重启实例后,能够正常使用了:
mysql> select user,host from mysql.user; +---------------+-------------+ | user | host | +---------------+-------------+ | root | 10.186.64.% | | root | 127.0.0.1 | | root | ::1 | | mysql.session | localhost | | mysql.sys | localhost | | root | localhost | +---------------+-------------+ 6 rows in set (0.00 sec) mysql> exit Bye
C:\Users\Administrator>mysql ERROR 1045 (28000): Access denied for user 'ODBC'@'localhost' (using password: NO) C:\Users\Administrator>mysql -uroot ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO) C:\Users\Administrator>mysql -uroot -p Enter password: ******** Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 7 Server version: 5.7.30-log MySQL Community Server (GPL) Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> select current_user(),user(); +----------------+----------------+ | current_user() | user() | +----------------+----------------+ | root@::1 | root@localhost | +----------------+----------------+ 1 row in set (0.00 sec) mysql> drop user root@'::1'; Query OK, 0 rows affected (0.06 sec) mysql> exit Bye
C:\Users\Administrator>mysql -uroot -p Enter password: ******** Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 8 Server version: 5.7.30-log MySQL Community Server (GPL) Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> select current_user(),user(); +----------------+----------------+ | current_user() | user() | +----------------+----------------+ | root@localhost | root@localhost | +----------------+----------------+ 1 row in set (0.02 sec) mysql> drop user root@localhost; Query OK, 0 rows affected (0.03 sec) mysql> exit Bye
C:\Users\Administrator>mysql -uroot -p Enter password: ******** ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES) C:\Users\Administrator>mysql -uroot -p -h127.0.0.1 Enter password: ******** Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 10 Server version: 5.7.30-log MySQL Community Server (GPL) Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> select current_user(),user(); +----------------+----------------+ | current_user() | user() | +----------------+----------------+ | root@127.0.0.1 | root@localhost | +----------------+----------------+ 1 row in set (0.00 sec) mysql> \s -------------- mysql Ver 14.14 Distrib 5.7.30, for Win64 (x86_64) Connection id: 10 Current database: Current user: root@localhost SSL: Cipher in use is ECDHE-RSA-AES128-GCM-SHA256 Using delimiter: ; Server version: 5.7.30-log MySQL Community Server (GPL) Protocol version: 10 Connection: 127.0.0.1 via TCP/IP Server characterset: latin1 Db characterset: latin1 Client characterset: gbk Conn. characterset: gbk TCP port: 3306 Uptime: 6 hours 41 min 40 sec Threads: 1 Questions: 26 Slow queries: 0 Opens: 123 Flush tables: 1 Open tables: 116 Queries per second avg: 0.001 -------------- mysql> show variables like 'socket'; +-----------------------------------------+-------+ | Variable_name | Value | +-----------------------------------------+-------+ | socket | MySQL | +-----------------------------------------+-------+ 3 rows in set, 1 warning (0.01 sec) mysql> exit Bye
C:\Users\Administrator>mysql -uroot -p -S MySQL Enter password: ******** Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 16 Server version: 5.7.30-log MySQL Community Server (GPL) Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> \s -------------- mysql Ver 14.14 Distrib 5.7.30, for Win64 (x86_64) Connection id: 16 Current database: Current user: root@localhost SSL: Cipher in use is ECDHE-RSA-AES128-GCM-SHA256 Using delimiter: ; Server version: 5.7.30-log MySQL Community Server (GPL) Protocol version: 10 Connection: localhost via TCP/IP Server characterset: latin1 Db characterset: latin1 Client characterset: gbk Conn. characterset: gbk TCP port: 3306 Uptime: 7 hours 6 min 23 sec Threads: 1 Questions: 63 Slow queries: 0 Opens: 137 Flush tables: 1 Open tables: 130 Queries per second avg: 0.002 --------------
最后,再把升级的各个步骤罗列一遍:
1. 下载 5.7.30 的 zip 包并解压到新的目录。
2. 安装 Visual C++ 2012/2013(或更多版本)。
3. 停应用,中止 5.6 实例(能够经过停服务来操做,中止服务前建议记录一下 GTID 或 binlog file 和 position 位置),删除服务。
4. 备份一份 5.6 实例的 datadir,包括 binlog(整个目录 copy 到别的目录存放)。
5. 拷贝 5.6 实例的 datadir 和 my.ini 到 5.7 实例 basedir 目录,调整并优化参数值(注意要确保路径一致,确认已开启 5.7 新特性相关参数,如加强半同步、MTS 等)。
6. 修改系统环境变量,把可执行路径指向 5.7 实例的 basedir/bin。
7. 启动 5.7 实例,建立服务并启动。
8. 验证服务端、客户端版本是否正确。
9. 确认无误后,执行 mysql_upgrade 升级数据字典(会升级系统库:mysql,ps,sys,没有会重建)。
10. 重启实例。
11. 再次校验 5.7 的参数,尽可能保持与 5.6 的兼容,尤为要注意 sql_mode 的默认值对业务的影响。
12. 清理 5.6 实例的 basedir 和 datadir 目录(可选)。
13. 若是是主从环境,还要考虑 slave_net_timeout 参数默认值改变带来的影响(主库 error 日志中出现 “ER_RPL_ZOMBIE_ENCOUNTERED” 的报错)。在 5.7.7 之前,该参数默认是 3600s,以后改成了 60s,须要从新执行 change master to 语句,而且显式指定 master_heartbeat_period=xx,由于从 5.7.4 开始,只有执行 reset slave 才能将其重置为默认值(slave_net_timeout 值的一半)。另外提一句,也是从 5.7.4 开始,执行 change master to 语句时,能够不用先中止复制线程了。
参考连接:
https://dev.mysql.com/doc/ref...
https://dev.mysql.com/doc/ref...
https://dev.mysql.com/doc/ref...
本文主要阐述了如何优雅地经过 ZIP&IN-PLACE 方式在 Windows 服务器上将 MySQL 5.6 实例升级到 5.7。对 MySQL 官方提供的一些升级方式和相关限制作了说明。经过一个实际的升级案例来展现如何在升级过程当中排查错误。演示了一个关于帐号登录的小测试,要注意区分帐号的来源部分、current_user(),user() 之间的差异,前者是 mysql.user 表中建立的帐号,后者是当前操做系统的登陆用户。最后对整个升级步骤作了总结,罗列了一些升级时的注意点。
参考连接:
https://dev.mysql.com/doc/ref...
https://dev.mysql.com/doc/ref...