今天搞MySQL5.7,被坑了俩小时,心里好不爽╭(╯^╰)╮
故事背景
新搞的项目,部署线上环境,阿里云ECS主机,换了阿里的yum源,默认安装的MySQL版本是5.1
之前开发环境的MySQL版本是5.7
故事起因
之所以要换是因为5.7版本里,每张表可以有多个timestamp类型字段DEFAULT CURRENT_TIMESTAMP,5.1却不行会报错:1
ERROR 1293 (HY000): Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause
所以上线正式环境,要么改表结构然后改代码,要么升级数据库,一言不合老子就升库!
故事经过
简单查了一下,用MySQL官方的yum源升级最靠谱,说干就干!
我去MySQL官网查到了一份教程,A Quick Guide to Using the MySQL Yum Repository
本来就是空数据库,觉得可以easy搞定,结果证明我还是天真!
先安装MySQL Yum Repository的rpm包
1
$ rpm -Uvh mysql57-community-release-el6-8.noarch.rpm
确认安装成功之后,yum update了一下,一切顺利,重启MySQL,Failed,日志报错:
1
2
3
42016-06-23T04:12:47.220773Z 0 [ERROR] InnoDB: Plugin initialization aborted with error Generic error
2016-06-23T04:12:47.821398Z 0 [ERROR] Plugin 'InnoDB' init function returned error.
2016-06-23T04:12:47.821453Z 0 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
2016-06-23T04:12:47.821462Z 0 [ERROR] Failed to initialize plugins.这个也难不倒我,无非是删几个ib_logfile文件,删了再重启,还是报错,宝宝心想,卸载重装一次吧。
1
$ yum remove mysql-devel.x86_64 mysql-server.x86_64
再重新安装
1
2$ # 似乎是安了mysql-community-devel MySQL一套就都有了,不需要再装 mysql-community-server
$ yum install mysql-community-devel.x86_64再启动MySQL,日志还是报错,宝宝有点儿方了。。。
1
22016-06-23T04:17:34.318298Z 0 [Warning] Failed to open optimizer cost constant tables
2016-06-23T04:17:34.318893Z 0 [ERROR] Fatal error: mysql.user table is damaged. Please run mysql_upgrade.凭借一枚资深的服务端(大误)过硬的作战素养,我冷静的去rm -rf了/var/lib64/mysql/
接着yum list installed | grep ^mysql,列出来的都remove掉,又重装了一遍,启动成功!啧,咱还是有两下子的~- 顺其自然的mysql -u root -p,两次回车,丫竟然告诉我Access denied!你丫不看看我是谁!我是你大爷!(╯‵□′)╯︵┻━┻
难不成这个还有初始密码,我试了试了几个常用的弱密码都没进去,又试了试
mysqladmin -uroot password xxxxxx 还是不行
故事高潮
不管了,my.cnf中加一句skip-grant-tables,重启进去,到mysql.user表,看到丫的5.1、5.7的user表结构都不一样了,等等,那个授权字段里写了什么?!
1
2
3
4
5
6
7
8
9
10THIS IS NOT AVAILID PASSWORD THAT CAN BE USED HERE
IS NOT AVAILID PASSWORD THAT CAN BE USED HERE
NOT AVAILID PASSWORD THAT CAN BE USED HERE
AVAILID PASSWORD THAT CAN BE USED HERE
PASSWORD THAT CAN BE USED HERE
THAT CAN BE USED HERE
CAN BE USED HERE
BE USED HERE
USED HERE
HERE
凸(艹皿艹 )凸(艹皿艹 )凸(艹皿艹 )凸(艹皿艹 )凸(艹皿艹 )凸(艹皿艹 )凸(艹皿艹 )凸(艹皿艹 )凸(艹皿艹 )
宝宝强压暴脾气,改了密码,去建库建表,竟然又提示:1
You must reset your password using ALTER USER statement before executing this statement.
在网上搜了一下,三步解决:
step 1: SET PASSWORD = PASSWORD(‘your new password’); # 密码还有强度要求,也是醉了。。。
step 2: ALTER USER ‘root’@’localhost’ PASSWORD EXPIRE NEVER;
step 3: flush privileges;
退出重新登陆,搞定!
补充反思(2016-07-05)
今天又搞了一次线上库的升级,也是从MySQL5.1升到5.7,停服务升级,整个过程比上一次顺利的多,之前是我错怪了MySQL,是我旧版本MySQL文件没删干净,这里再简单记录一下升级过程
先备份现有业务库
1
$ mysqldump -u xxx -h xxx -P 3306 -p business_database > business_database.sql
这里有一个细节需要注意,如果数据库本身授权不复杂,那就不用导出mysql库;授权复杂呢,需要导出mysql库,但是MySQL5.1和5.7 mysql.user表数据结结构不一样,直接导入也是不行的,例如5.1中的Password字段在5.7中名字叫authentication_string,就还有额外的工作量。
另外,如果之前有修改过my.cnf,比如优化配置,加了slow_query,开了binlog配了主从啥的,也建议备份一下。虽然到5.7有些配置项名字也有改,但总比从头配强。。。停止MySQL服务
1
$ service mysqld stop
卸载旧版MySQL,并清除全部残留文件
我是yum装的,所以也是yum卸1
$ yum remove mysql*
查找残留文件
1
$ find / -name mysql
发现的文件一律rm -rf 掉
安装MySQL新版本
1
2$ rpm -Uvh mysql57-community-release-el6-8.noarch.rpm
$ yum install mysql-community-devel.x86_64启动MySQL
这后面就不细讲了,按照前面的步骤做,后面应该不会遇到什么问题
后来我查到,之前困扰我的初始密码问题是因为MySQL 5.7以后,系统会自动生成随机的密码,哈哈。。。