共计 8528 个字符,预计需要花费 22 分钟才能阅读完成。
作者:赵拂晓
爱可生 MySQL DBA 团队成员,Oracle 10g OCM,MySQL 5.7 OCP,善于数据库性能问题诊断、事务与锁问题的剖析等,负责解决客户 MySQL 及我司自研 DMP 平台日常运维中的问题,对开源数据库相干技术十分感兴趣。
本文起源:原创投稿
* 爱可生开源社区出品,原创内容未经受权不得随便应用,转载请分割小编并注明起源。
本文关键字:降级、Windows、账号治理
背景
最近有去某客户那里反对 MySQL 实例降级,他们的实例版本比拟多,有 5.5、5.6、5.7,外加各种小版本,平台也很多,有 Linux、Windows。对于 Unix/Linux 平台的 MySQL 版本升级,大家可能再相熟不过了,但对于 windows 平台的,可能接触地较少。因为我的项目上有需要,本人也在 Windows 环境上测试了一把,有了些心得,想跟大家分享一些教训,于是有了本文。这里次要是针对比拟常见的 5.6 到 5.7 的降级。
限度
- MySQL 官网提供了 2 种介质的降级形式:一种是 MySQL Installer 的形式(须要下载 MSI 可执行程序,进行图形化装置),另一种则是 noinstall zip 包的形式(就是咱们相熟的绿色软件,解压即用的那种,当然 MySQL 作为数据库软件,也没傻瓜到那种水平,还是须要一些额定操作的),举荐应用第 2 种形式,零碎侵入性小,方便快捷。
- 间断大版本的降级(5.6 to 5.7)不能用 MySQL Installer,这种场景只反对 zip 形式。
- 社区版和企业版之间,也不能用 MySQL Installer 降级,须要用 zip 形式。
- 除了介质,降级的办法也有 2 种:一种是 IN-PLACE 形式(实用于数据量较大、小版本或间断版本的降级),另一种是逻辑形式(实用于数据量小、逾越大版本的降级)。
- 对于大数据库,即使是采纳 IN-PLACE 形式降级,也可能会破费较长时间,因为执行 mysql_upgrade 时,默认也会对业务表进行数据转换和修复(这个问题在客户那儿也遇到了,300G 左右的库,有大量 MyISAM 表,最大的单表有 40G。修复过程其实是通过创立长期表进行重建,而他们的磁盘性能又不好,跑了很久都没有完结,起初通过 -s 参数跳过对业务表的修复)。
- 如果是 Milestone 版和 GA 版之间的降级,也只能通过逻辑形式进行。
环境筹备
尽管是在讲降级,这里也略微提一下 Windows 上装置实例的办法。首先,筹备一台 Windows 主机(我这里用的是 Windows 10),去官网下载好 5.6.x,5.7.x for Windows 的 zip 包,我抉择了社区版的 5.6.30 和 5.7.30(最新 GA)的包。
解压完的 zip 包 是这样的,有点像 Linux 上的二进制包:
装置 5.6 环境
装置很简略,最小化配置只须要把 my-default 参数中示例的几个参数前的正文符号去掉,并配置上相应的值,就能够启动了,当然,如果是生产环境,必定会自定义一堆参数,此处略过。
改完后如下,而后就能够用这个参数文件去初始化实例了:
初始化实例后,再启动实例,接着创立并配置 Windows 服务,当前就能够通过启停服务对 MySQL 实例进行治理。降级 5.6 至 5.7这里不探讨具体的降级步骤,与装置实例其实差不多,次要说一下降级时要留神的点(本次测试采纳 IN-PLACE 形式)。
- 首次装置完 5.7(zip 形式)后,出于安全性思考,须要设置 skip-grant-tables 进入实例,批改 root 明码,删除空账号(先执行 flush privileges;)。
- 服务的创立、删除都要用管理员身份运行 cmd 后再执行执行,示例:mysqld install mysql5630 / mysqld remove mysql5630。
- 如果启动实例是用 mysqld –console 执行的,会在屏幕输入实例启动的一些 error 日志,一旦退出这个窗口,实例就会终止(因而,倡议仅在首次测试实例是否失常启动时应用)。
- 5.7 的 zip 包解压后没有 data 目录和 my.ini 配置文件,能够将 5.6 中的 data 目录和 my.ini 拷贝过去(拷 data 前要停实例),如果原本就曾经指定在 basedir 之外的中央,也能够间接用,而后批改 5.7 配置文件的 datadir 与原来 5.6 的地位统一。
- 如果 5.6 是 zip 装置,5.7 也是 zip 装置,并且 5.7 解压到 5.6 的目录之外,倡议批改环境变量后先执行 mysql -V,查看其是否被正确地配置了(官网举荐解压到同一个目录中,这样能够不必批改环境变量)。
- 尽量不要应用旧版的 my.cnf,并且用 mysqld –print-defaults 查看默认参数。
- 降级到 5.7 后,当执行 mysqld install mysql5730 时(增加 5.7 实例的服务),如果报找不到 dll 动静库链接文件 MSVCR120.dll、MSVCP120.dll,则须要下载并装置相应版本的的 Visual C++ 程序)。
参考链接:
https://www.groovypost.com/ho…
https://answers.microsoft.com…
各个 dll 文件对应的 Visual C++ 版本:
装置完当前,能够查看 dll 动静库链接文件与对应 Visual C++ 版本之间的关系:
我的环境中要失常运行 5.7.30 实例,须要装置 Visual C++ 2012、Visual C++ 2013,之后就能够失常创立服务。
降级排错案例
装置完 5.7.30 实例后,创立并启动 windows 服务:
通过 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 后须要重启实例,否则会报以下谬误:
重启实例后,能够失常应用了:
一个乏味的登陆测试
- 配置了 3 个 root 账号,起源别离为 ::1,127.0.0.1’,localhost。
- 在账号密码都不输出的状况下,Windows 默认会用 ODBC@localhost 这个用户连贯。
- 在加上 -uroot 后,会优先应用 root@’::1′ 这个账号来连贯,用户依然应用的是 root@localhost。
- 把 root@’::1′ 账号删除后,会应用 root@localhost 的账号连贯。
- 把 root@localhost 账号也删除后,默认不会应用 root@127.0.0.1 的账号连贯,除非指定了 -h127.0.0.1。
- 在 Windows 中,无论是 ::1、localhost 还是 127.0.0.1,哪怕是应用 -S 进行连贯,也都是 TCP/IP 连贯。
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…