提醒:本文最后更新于 2019-04-29 15:10,文中所关联的信息可能已发生改变,请知悉!
经过一番努力下载 mysql 文件,我们可以开始 Mysql8.0 的安装了。
解压文件
// 解压文件生成两个 xz 格式的压缩文件
$ tar -xvf mysql-8.0.13-linux-glibc2.12-x86_64.tar
mysql-router-8.0.13-linux-glibc2.12-x86_64.tar.xz
mysql-test-8.0.13-linux-glibc2.12-x86_64.tar.xz
// 我们需要先删掉 / 移除原有文件,才可以继续解压,因为解压出来的.tar 文件和.tar.xz 文件重名
mv mysql-8.0.13-linux-glibc2.12-x86_64.tar ../
xz -d mysql-router-8.0.13-linux-glibc2.12-x86_64.tar.xz
tar -xvf mysql-8.0.13-linux-glibc2.12-x86_64.tar
// 为了方便查找,改个名字
mv mysql-8.0.13-linux-glibc2.12-x86_64.tar mysql8
环境配置
我们需要专门的 mysql 进程启动用户和权限管理:
// 创建 mysql 系统用户和用户组
useradd -r mysql
// 给予安装目录 mysql 权限
chown mysql:mysql -R mysql8
配置自己的 mysql 配置文件,因为我有多个 Mysql 库,我手动指定很多参数:
[client]
socket=/home/work/lnmp/mysql8/tmp/mysql.sock
default-character-set=utf8
[mysql]
basedir=/home/work/lnmp/mysql8/
datadir=/home/work/lnmp/mysql8/data/
socket=/home/work/lnmp/mysql8/tmp/mysql.sock
port=3306
user=mysql
# 指定日志时间为系统时间
log_timestamps=SYSTEM
log-error=/home/work/lnmp/mysql8/log/mysql.err
# 指定字符集为 utf8,因为 mysql8.0 中的默认字符集为 utfmb4,会和其他程序引起兼容性问题
default-character-set=utf8
[mysqld]
basedir=/home/work/lnmp/mysql8/
datadir=/home/work/lnmp/mysql8/data/
socket=/home/work/lnmp/mysql8/tmp/mysql.sock
port=3306
user=mysql
log_timestamps=SYSTEM
collation-server = utf8_unicode_ci
character-set-server = utf8
# 指定默认认证的加密方式,mysql8.0 中默认方式为 caching_sha2_password,引起老版本兼容性问题
default_authentication_plugin= mysql_native_password
[mysqld_safe]
log-error=/home/work/lnmp/mysql8/log/mysqld_safe.err
pid-file=/home/work/lnmp/mysql8/tmp/mysqld.pid
socket=/home/work/lnmp/mysql8/tmp/mysql.sock
[mysql.server]
basedir=/home/work/lnmp/mysql8
socket=/home/work/lnmp/mysql8/tmp/mysql.sock
[mysqladmin]
socket=/home/work/lnmp/mysql8/tmp/mysql.sock
这个里面我指定了错误日志的路径,在接下来的操作中,如果出现错误,除了查看终端显示的错误,还要记得去错误日志里查看详细的信息。
因为我指定了一些文件,所以需要提前创建:
mkdir log
touch log/mysql.err
touch log/mysqld_safe.err
mkdir tmp
chown mysql:mysql -R ../*
数据库初始化
如果我们不初始化,直接使用 bin/mysqld_safe 启动会报错,因为我们需要初始化 mysql 环境,此时参考文章:
$ bin/mysqld --initialize --user=mysql --basedir=/home/work/lnmp/mysql8/ --datadir=/home/work/lnmp/mysql8/data/
2018-12-13T06:15:03.159123Z 0 [System] [MY-013169] [Server] /home/work/lnmp/mysql8/bin/mysqld (mysqld 8.0.13) initializing of server in progress as process 1190
2018-12-13T06:15:05.255817Z 5 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: !/7oy-u%(XfZ
2018-12-13T06:15:06.135143Z 0 [System] [MY-013170] [Server] /home/work/lnmp/mysql8/bin/mysqld (mysqld 8.0.13) initializing of server has completed
提示中提示我们已经创建了 root 的用户和一个临时密码,同时初始化成功。
启动数据库
这时根据 官方文档 我们使用 mysqld_safe 命令来启动:
$ bin/mysqld_safe
2018-12-13T06:16:58.604154Z mysqld_safe Logging to '/home/work/lnmp/mysql8/log/mysql.err'.
2018-12-13T06:16:58.629249Z mysqld_safe Starting mysqld daemon with databases from /home/work/lnmp/mysql8/data
打开数据库
数据库进程已经启动,我们可以在新终端正常使用 mysql 数据库了:
$ ps aux | grep mysql
root 2141 0.0 0.0 815844 5328 pts/0 S+ 14:16 0:00 /bin/sh bin/mysqld_safe
mysql 2319 1.0 0.5 1997492 374448 pts/0 Sl+ 14:16 0:00 /home/work/lnmp/mysql8/bin/mysqld --basedir=/home/work/lnmp/mysql8/ --datadir=/home/work/lnmp/mysql8/data --plugin-dir=/home/work/lnmp/mysql8//lib/plugin --user=mysql --log-error=/home/work/lnmp/mysql8/log/mysql.err --pid-file=/home/work/lnmp/mysql8/tmp/mysqld.pid --socket=/home/work/lnmp/mysql8/tmp/mysql.sock --port=3306
work 25258 0.0 0.0 105356 824 pts/1 S+ 14:18 0:00 grep mysql
但是直接使用 mysql 命令报错:
$ bin/mysql -uroot
ERROR 2002 (HY000): Can't connect to local MySQL server through socket'/tmp/mysql.sock' (2)
根据 mysql.sock 的作用的说明,我们指定 mysql.sock 路径即可:
bin/mysql -S /home/work/lnmp/mysql8/tmp/mysql.sock -h localhost -uroot -p
Enter password:
修改初始密码
我们打开数据库后使用任何命令会提示我们修改初始的临时密码:
mysql> show databases;
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
修改密码:
mysql> ALTER USER'root'@'localhost'IDENTIFIED BY'123456';
Query OK, 0 rows affected (0.05 sec)
重新连接,新密码生效。
链接全局命令
此时,我们调用 mysql 只能用路径 /home/work/lnmp/mysql8/bin/mysql 或相对路径,需要链接为全局命令:
$ ln -s /home/work/lnmp/mysql8/bin/mysql /usr/bin/
$ ln -s /home/work/lnmp/mysql8/bin/mysql_safe /usr/bin/
指定 socket 文件
在 8.0 这个版本,我尝试了很多方法试图在 my.cnf 中修改 mysql 命令查询的默认 socket 路径,依然不成功,所以只好在默认路径里面链接 socket 文件了:
ln -s /home/work/lnmp/mysql8/tmp/mysql.sock /tmp/
然后我们再调用 mysql 命令就不会报错了。
重启数据库
在过程中我们调试参数可能需要重启数据库:
// 杀死进程,相当于停止
cat tmp/mysqld.pid | xargs kill
// 正常启动 mysql
bin/mysqld_safe --defaults-file=/home/work/lnmp/mysql8/my.cnf
新增用户 & 赋予权限
在 mysql8 里,我创建用户并赋值,结果报错:
mysql > grant all privileges on *.* to root@localhost indentified by'123456';
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'indentified by'123456'' at line 1
根据网上资料,是由于 Mysql8 将创建账户和赋予权限的操作分开了:
// 创建账户
create user '用户名'@'访问主机' identified by '密码';
// 赋予权限(修改权限时在后面加 with grant option)
grant 权限列表 on 数据库 to '用户名'@'访问主机' ;
// 刷新权限
flush privileges;
注意事项
当我安装好后连接我其他的数据库时:
$ mysql -h 10.92.143.15 -uroot -p
Enter password:
ERROR 1043 (08S01): Bad handshake
这个错误是由于远程数据库版本过低(版本:5.1.30
)的问题,在 mysql8.0 的文档 上,有标明支持的数据库版本需要 >=5.5
才行,因此他们建议升级其余的数据库为 5.6
版本。
总结
经过解压文件,创建 mysql 用户和用户组,配置 my.cnf 配置文件,修改权限,数据库初始化、启动,打开数据库,修改初始密码,链接全局命令和指定 socket 文件路径,所有的安装工作都已经完成了。