起因是想装gogs,但是一直报错,查github发现MySQL版本要至少5.7.7。用lnmp一键包升级脚本无法成功升级,而且从source编译实在太费劲,所以选择用官方Binary来装。
备份数据库
假设是有数据库root权限,那么用mysqldump来备份:
1
mysqldump -uroot -p --all-databases > database-bak.sql
将备份文件通过SFTP或者移到一个安全的地方,以供稍后恢复使用。
添加MySQL二进制源
首先将原来的/etc/my.cnf改名为my.cnf.bak,因为更新之后直接用这个配置文件会无法启动mysqld。
根据MySQL的官方文档,有以下步骤:
添加二进制源
首先要在https://dev.mysql.com/downloads/repo/yum/下载rpm格式的源,比如CentOS 7就是RHEL 7的社区版,所以下载这个:
放到服务器上之后,用这个命令安装:
1
yum localinstall mysql80-community-release-el7-3.noarch.rpm
启用需要的版本
首先看有哪些选项可以开/关:
1
yum repolist all | grep mysql
大概会有这样的列表:
一般是默认启用了mysql80-community,为了安全我要装mysql57-community,用下面的命令开关就好了:
1
2
yum-config-manager --disable mysql80-community
yum-config-manager --enable mysql57-community
这些命令运行的时候会输出一堆东西,忽略就行。完成之后检查一下:
1
yum repolist enabled | grep mysql
确认无误就可以开始下一步了。
安装MySQL
要把lnmp装的init.d脚本删掉,在/etc/init.d/mysql。
安装MySQL:
1
yum install mysql-community-server
会自动判断依赖而且装上,无脑y就是了。装完先别启动服务,编辑/etc/my.cnf,在[mysqld]添加一行skip-grant-tables,再加一行default_password_lifetime = 0
,然后启动服务并检查是不是成功启动:
1
2
service mysqld start
service mysqld status
然后直接mysql进入mysql的命令行,改密码:
1
ALTER USER `root`@`localhost` IDENTIFIED BY 'new_password', `root`@`localhost` PASSWORD EXPIRE NEVER;
比起官方文档里多出来的这PASSWORD EXPIRE NEVER
是为了避免莫名其妙的密码过期导致服务器爆炸,参见:https://stackoverflow.com/a/44475051。
如果提示因为开了skip-grant-tables没办法ALTER,那就改用这个命令:
1
update mysql.user set authentication_string=password('xxx') where user='root' ;
update这个命令是可选的,ALTER命令是必须要执行的。如果首先尝试alter但是报错,那就执行update命令,然后改my.cnf注释掉skip-grant-tables,重启mysqld服务,再执行alter。
恢复数据库
修改my.cnf重新打开domain socket,为了适应lnmp默认的配置,my.cnf里需要有下面几行:
1
2
3
4
5
6
[client]
port = 3306
socket = /tmp/mysql.sock
[mysqld]
port = 3306
socket = /tmp/mysql.sock
用phpmyadmin导入备份文件,还要执行mysql_upgrade -u root -p
来完成数据升级。