前言
由于没有真实环境,阿里云的太贵,我们先用虚拟机试试水,据官方介绍,MySQL 8.x GA之后,对json的支持更加友好,性能上比5.7大幅度的增加2 倍,都已经GA了,哪个公司有mysql性能上的瓶颈,还等啥呢,准备升级吧~。mysql低版本的,时间、服务器空间充足,个人建议还是走逻辑备份~。
或者有个稳定的升级方案,不影响业务的访问。在线升级过程: mysql5.6.40-->mysql5.7.22-->mysql8.0.12.
按照官网和网上的步骤,就没有成功过好么~。还是自己安装一遍,该走的坑都走到,心理就踏实了~。
注意:如果公司还用着MHA的话,还是使用5.7吧,mha版本社区介绍只支持到5.7,或者pxc 也是到5.7 对8.0肯定是不行搭 ~。如果使用8.x版本高可用方案只能用MRG了。
对于MySQ8.0新特性:(就问你每秒180万个查询谁不动心,高出5.7的2倍性能,爽歪歪~)
MySQL 8.0包括显着的性能,安全性和开发人员生产力改进,支持下一代Web,移动,嵌入式和云应用程序。
MySQL 8.0提供:
-
新! 文档存储使用单个数据库开发SQL和NoSQL文档应用程序。
-
新! 事务数据字典实现为一组存储在单个InnoDB表空间中的SQL表。
-
新! SQL角色用于授予和拒绝用户组的权限,大大减少了安全工作量。
-
新! 对于更丰富的移动应用程序和国际字符集,默认为utf8mb4字符集。
-
新! MySQL 8.0中添加了通用表表达式,也称为WITH查询。
-
新! 窗口函数可降低代码复杂性并帮助开发人员提高工作效率。
-
新! 隐形索引,可以更好地管理全天候运行的应用程序的软件升级和数据库更改。
-
新! 降序索引以消除对结果进行排序的需要并导致性能改进。
-
改进! JSON支持包含许多新增功能,包括接受JSON数据并将其作为关系表返回的JSON_TABLE()函数。
-
改进! 速度提高2倍,并创建新的基准测试记录,每秒最多 180万个查询。
-
改进! OpenSSL 作为MySQL中的默认TLS / SSL库。
-
改进! 性能架构,查询速度提高了30倍。
-
改进! 信息架构,查询速度提高了100倍。
-
改进! GIS得到了增强,可支持地理和空间参考系统(SRS)。
-
改进! 复制和InnoDB集群可以更好地扩展大批量应用程序。
来我们先尝个鲜,环境准备:
1、准备一个干净的centos 7mini服务器
2、下载个linux下通用二进制版本的mysql8.0.12 (为什么用介个,后期迁移保证不出问题,可以兼容各大主流linux内核的系统等等。)
由于小编粗心,安装时没有设置网络连接,cenos 7 最新版本网卡默认是不激活的
所以我们要执行
cd etc/sysconfig/network-scripts/ vi ifcfg-ens33 (把这个文件结尾的ONBOOT=no 改成yes,是自动启用网络连接) systemctl restart network ping www.baidu.com
3、因为我们是全新最小化的Centos 7mini 服务器,已经从根本上保证了,系统没有安装乱七八糟的插件和有mysql的身影。如果有用其他linux系统,要完全删除之后在搞,不然会出问题,
完全删除mysql可以参;考https://www.ztloo.com/2018/05/17/linux下mysql卸载总结/
4、建议安装到 /usr/local/mysql / 下,解压之后这些目录的介绍
5、安装MySQL依赖
yum search libaio yum install libaio
6、创建一个mysql用户和组
shell> groupadd mysql shell> useradd -r -g mysql mysql
7、用迅雷下载mysql8.0.12用winscp上传到centos7 的usr/local/ 下并解压,如果后期做成自动化的,那就把它放到本地的某个地方,写个分发的脚本,到各个机器的制定目录。
精简版的centos 7 tar 不支持bzipd的需要单独装。
yum -y install bzip2 tar xvf mysql-8.0.12-linux-glibc2.12-x86_64.tar -C /usr/local/ tar xvf mysql-8.0.12-linux-glibc2.12-x86_64.tar.xz -C /usr/local/ mv /usr/local/mysql-8.0.12-linux-glibc2.12-x86_64/ /usr/local/mysql
8、 创建一个指向tar创建的安装目录的符号链接(如果是直接解压到usr/local 目录下并用mv 改名了,就不用做软连接了)
shell> ln -s /usr/local/mysql mysql
9、创建path,让mysql的命令全局生效
echo "export PATH=$PATH:/usr/local/mysql/bin" >> /etc/profile source /etc/profile
10、 创建一个目录,其位置可以提供给 secure_file_priv系统变量,从而将导入/导出操作限制到该特定目录
cd /usr/local/mysql shell> mkdir mysql-files
将目录的所有权授予 mysql用户,并将组的所有权授予 mysql组,并为目录设置正确的权限:
shell> chown mysql:mysql mysql-files shell> chmod 750 mysql-files
11、创建mysql 存放数据的目录,为啥在这创建error 日志,因为初始化的时候,官方的一个bug并不会根据 配置文件创建errorlog。导致报错,所以我们这里手工建立一个。
cd /usr/local/mysql shell> mkdir data shell>echo "" > /usr/local/mysql/error.log
12、设置目录权限
chown -R mysql . chgrp -R mysql .
13、初始化数据库,并生成root用户密码
配置etc下的my.cnf文件,并指定它为默认配置文件
mysql --help | grep my.cnf vi /etc/my.cnf [mysqld] basedir=/usr/local/mysql datadir=/usr/local/mysql/data socket=/usr/local/mysql/mysql.sock symbolic-links=0 default_authentication_plugin=mysql_native_password [mysqld_safe] log-error=/usr/local/mysql/error.log pid-file=/usr/local/mysql/mysql.pid [client] socket=/usr/local/mysql/mysql.sock !includedir /etc/my.cnf.d
配置/usr/local/mysql/support-files/mysql.server
mysqld_pid_file_path=/usr/local/mysql/mysql.pid basedir=/usr/local/mysql datadir=/usr/local/mysql/data
shell>mysqld --defaults-file=/etc/my.cnf --initialize --user=mysql
生成的密码:S%6cr:rHv;E7
然后data目录下会生成好多文件:就代表我们初始化成功了!
14、首次需要安全启动
/usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf &
然后我们在打开另一个窗口登陆一下需要使用的密码:S%6cr:rHv;E7
15、 为了方便,我们把server添加到启动命令
cp -v /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql chmod 755 /etc/init.d/mysql /etc/init.d/mysql start 开启 /etc/init.d/mysql stop 停止
16、如果要操作数据库,必须要重置密码:
root用户的密码,也可以直接修改成root. ALTER user 'root'@'localhost' IDENTIFIED BY 'root'; FLUSH PRIVILEGES;
注意2:如果密码忘了怎么办,登陆不上数据库怎么办,在my.cnf中的mysqld 下配置: skip-grant-tables (// 重启mysql :mysql -uroot 即可。修改完密码,并注释掉这个,然后在重启数据库)
17:允许用root用户进行远程客户端连接
如果需要远程客户端链接,需要在my.cnf的mysqld下加这个(default_authentication_plugin=mysql_native_password )参数,
可以兼容之前版本的链接方式。(正常做法是把数据库开放端口注册到防火墙中就可以了,为了方便,我们先临时关闭防火墙,。)
//临时关闭 systemctl stop firewalld //禁止开机启动 systemctl disable firewalld
update user set host='%' where user='root'; GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'; FLUSH PRIVILEGES
这时候通过Navicat 链接竟然报错了,小伙伴不要慌,是因为8.x的版本加密方式变了。不仅要在配置文件里面加*(default_authentication_plugin=mysql_native_password )这个参数,还得在用户表里设置root账户的加密方式。修改成native的。下面会教大家怎么改:往下看,
我们先看看默认的加密方式,这种方式,官方解释说,绝对安全。直接不兼容一些客户端连接工具,让你知道密码都链接不上,果然很安全。但是为了方便使用,我们还得让他兼容老的链接方式。
mysql> select host,user, plugin from user where user='root'; +------+------+-----------------------+ | host | user | plugin | +------+------+-----------------------+ | % | root | caching_sha2_password | +------+------+-----------------------+
18.修改native加密规则
ALTER USER 'root'@'%' IDENTIFIED BY 'root' PASSWORD EXPIRE NEVER;
19.更新 root 用户密码为native模式
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'root'; FLUSH PRIVILEGES;
如果还连不上,那就是防火墙的原因了,先禁掉吧。