Centos7下Mysql8.0安装手册 以及 一些坑点总结

MySQL 8 正式版 8.0.11 已发布,官方表示 MySQL 8 要比 MySQL 5.7 快 2 倍,还带来了大量的改进和更快的性能!

一.  Mysql8.0版本相比之前版本的一些特性

1) 默认编码utf8
默认编码使用utf8mb4, utf8mb4编码是utf8编码的超集,兼容utf8,并且能存储4字节的表情字符历史,MySQL数据库的 "utf8"并不是真正概念里的 UTF-8。MySQL中的"utf8"编码只支持最大3字节每字符。真正的大家正在使用的UTF-8编码是应该能支持4字节每个字符。MySQL的开发者没有修复这个bug。他们在2010年增加了一个变通的方法:一个新的字符集"utf8mb4"另外,utf-32编码固定使用4字节,32bit存储相比utf8浪费空间。

2) 降序索引
在之前的版本中可以创建,但是实际创建的还是升序索引

mysql> create table t1(id1 int,id2 int,key(id1,id2 desc));
Query OK, 0 rows affected (0.10 sec)

mysql> show create table t1 \G;
*************************** 1. row ***************************
       Table: t1
Create Table: CREATE TABLE `t1` (
  `id1` int(11) DEFAULT NULL,
  `id2` int(11) DEFAULT NULL,
  KEY `id1` (`id1`,`id2` DESC)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)

ERROR:
No query specified

另外,由于降序索引的引入,MySQL 8.0再也不会对group by操作进行隐式排序

3) 隐藏索引
隐藏索引的特性对于性能调试非常有用。当一个索引隐藏时,它不会被查询优化器所使用。也就是说,我们可以隐藏一个索引,然后观察对数据库的影响。如果数据库性能有所下降,就说明这个索引是有用的,于是将其“恢复显示”即可;如果数据库性能看不出变化,说明这个索引是多余的,可以删掉了.

mysql> create index idx2 on t1(id1);
Query OK, 0 rows affected (0.35 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> alter table t1 alter index idx2 invisible;
Query OK, 0 rows affected (0.09 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> show index from t1 where key_name=‘idx2‘ \G;
*************************** 1. row ***************************
        Table: t1
   Non_unique: 1
     Key_name: idx2
 Seq_in_index: 1
  Column_name: id1
    Collation: A
  Cardinality: 0
     Sub_part: NULL
       Packed: NULL
         Null: YES
   Index_type: BTREE
      Comment:
Index_comment:
      Visible: NO
1 row in set (0.01 sec)

ERROR:
No query specified

当索引被隐藏时,它的内容仍然是和正常索引一样实时更新的,此特性是专门为优化调试使用。如果长期隐藏一个索引,那还不如干脆删掉,因为毕竟索引存在会影响插入、更新和删除的性能.

4) 设置持久化
在oracle中可以使用scope设置参数确定是否到spfile, 现在mysql8.0也可以放在文件中了,使用方法:

mysql> show variables like ‘max_connects‘;
Empty set (0.07 sec)

mysql> show variables like ‘max_connections‘;
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| max_connections | 500   |
+-----------------+-------+
1 row in set (0.01 sec)

mysql> set persist max_connections=1000;
Query OK, 0 rows affected (0.00 sec)

mysql> show variables like ‘max_connections‘;
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| max_connections | 1000  |
+-----------------+-------+
1 row in set (0.01 sec)

可以查看在数据目录datadir中的一个mysqld-auto.cnf文件中保存了设置,下次启动时候将用此配置覆盖默认配置参数
{ "Version" : 1 , "mysql_server" : { "max_connections" : { "Value" : "1000" , "Metadata" : { "Timestamp" : 1540437420567571 , "User" : "root" , "Host" : "" } } } }

5) 通用表表达式(Common Table Expressions)
也可以称为虚拟视图,大大简化复杂查询

mysql> WITH
    ->  t1 AS (SELECT * FROM t1),
    ->  t2 AS (SELECT * FROM t1)
    -> SELECT t1.*, t2.*
    -> FROM t1, t2;
+------+------+------+------+
| id1  | id2  | id1  | id2  |
+------+------+------+------+
|    1 |    2 |    1 |    2 |
+------+------+------+------+
1 row in set (0.00 sec)

6) 窗口函数(Window Functions)
MySQL 被吐槽最多的特性之一就是缺少 rank() 函数,当需要在查询当中实现排名时,必须手写 @ 变量。但是从 8.0 开始,MySQL 新增了一个叫窗口函数的概念,它可以用来实现若干新的查询方式
说明,窗口可以单独创建。

mysql> create table tbl2(name varchar(10),amount int);
Query OK, 0 rows affected (0.16 sec)

mysql> insert into tbl2 values(‘usa‘,100),(‘china‘,101),(‘japan‘,103),(‘russian‘,99);
Query OK, 4 rows affected (0.13 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> select t1.*,rank() over w as ‘rank‘ from tbl2 as t1 window w as (order by amount);
+---------+--------+------+
| name    | amount | rank |
+---------+--------+------+
| russian |     99 |    1 |
| usa     |    100 |    2 |
| china   |    101 |    3 |
| japan   |    103 |    4 |
+---------+--------+------+
4 rows in set (0.00 sec)

mysql> select t1.*,rank() over() as ‘rank‘ from tbl2 as t1;
+---------+--------+------+
| name    | amount | rank |
+---------+--------+------+
| usa     |    100 |    1 |
| china   |    101 |    1 |
| japan   |    103 |    1 |
| russian |     99 |    1 |
+---------+--------+------+
4 rows in set (0.00 sec)

mysql> select t1.*,rank() over(order by amount) as ‘rank‘ from tbl2 as t1;
+---------+--------+------+
| name    | amount | rank |
+---------+--------+------+
| russian |     99 |    1 |
| usa     |    100 |    2 |
| china   |    101 |    3 |
| japan   |    103 |    4 |
+---------+--------+------+
4 rows in set (0.00 sec)

mysql> select t1.*,sum() over() as ‘rank‘ from tbl2 as t1;
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 ‘) over() as ‘rank‘ from tbl2 as t1‘ at line 1
mysql> select t1.*,sum(amount) over() as ‘sum‘ from tbl2 as t1;
+---------+--------+------+
| name    | amount | sum  |
+---------+--------+------+
| usa     |    100 |  403 |
| china   |    101 |  403 |
| japan   |    103 |  403 |
| russian |     99 |  403 |
+---------+--------+------+
4 rows in set (0.00 sec)

7) 安全性
对 OpenSSL 的改进、新的默认身份验证、SQL 角色、密码强度、授权。MySQL现在维护关于密码历史的信息,允许对以前密码的重用进行限制
比如常见的一个连接错误,参考:https://blog.csdn.net/jc_benben/article/details/80652897

8) 增加JSON (json enhancements)AND OpenGIS spatial types
mysql提供了很多json相关的函数和API接口,添加了基于路径查询参数从 JSON 字段中抽取数据的 JSON_EXTRACT() 函数,以及用于将数据分别组合到 JSON 数组和对象中的 JSON_ARRAYAGG() 和 JSON_OBJECTAGG() 聚合函数

9) 原子数据定义语句(原子DDL)(Atomic Data Definition Statements (Atomic DDL))

10) 资源管理(Resource management)
MySQL现在支持资源组的创建和管理,并允许将服务器内运行的线程分配给特定组,以便线程根据组可用的资源执行。组属性可以控制其资源,以启用或限制组中线程的资源消耗

11) Data dictionary
MySQL现在包含一个事务数据字典,用于存储有关数据库对象的信息,In previous MySQL releases, dictionary data was stored in metadata files and nontransactional tables
比如myisam和innodb表定义frm文件等.

12) innodb的增强
1->  每次值更改时,当前最大自动增量计数器值将写入重做日志,并保存到每个检查点上的引擎专用系统表中。这些更改使当前最大自动增量计数器值在服务器重新启动时保持不变。
2-> 遇到索引树损坏时, InnoDB将损坏标志写入重做日志,这会使损坏标志崩溃安全。InnoDB还将内存中损坏标志数据写入每个检查点上的引擎专用系统表。在恢复期间, InnoDB从两个位置读取损坏标志并在将内存表和索引对象标记为损坏之前合并结果。
3-> InnoDB 分布式缓存插件支持多个get操作(读取在一个单一的多键/值对分布式缓存查询)和范围查询;
4-> 新的动态配置选项 innodb_deadlock_detect可用于禁用死锁检测。在高并发系统上,当许多线程等待同一个锁时,死锁检测会导致速度减慢。有时,禁用死锁检测可能更有效,并且在innodb_lock_wait_timeout发生死锁时依赖于事务回滚的设置。
5-> INFORMATION_SCHEMA.INNODB_CACHED_INDEXES 表报告InnoDB每个索引缓冲池中缓存的索引页数 。
6-> InnoDB现在,在共享临时表空间中创建临时表ibtmp1。
7-> InnoDB 表空间加密功能支持重做日志的加密和撤消日志数据;
8-> InnoDB支持 NOWAIT和SKIP LOCKED选项SELECT ... FOR SHARE以及SELECT ... FOR UPDATE锁定读取语句。 NOWAIT如果请求的行被另一个事务锁定,则会立即返回该语句。SKIP LOCKED从结果集中删除锁定的行SELECT ... FOR SHARE替换 SELECT ... LOCK IN SHARE MODE,但LOCK IN SHARE MODE仍可用于向后兼容;
9-> 支持ADD PARTITION,DROP PARTITION,COALESCE PARTITION,REORGANIZE PARTITION,和REBUILD PARTITION ALTER TABLE选项;
10-> InnoDB存储引擎现在使用MySQL的数据字典,而不是它自己的存储引擎特定的数据字典;
11-> mysql系统表和数据字典表现在在MySQL数据目录中InnoDB命名的单个表空间文件创建mysql.ibd。以前,这些表是InnoDB在mysql数据库目录中的各个表空间文件中创建的;

二.  Mysql8.0安装手册

1) 采用yum方式

1) 首先删除系统默认或之前可能安装的其他版本的mysql
[root@DB-node01 ~]# for i in $(rpm -qa|grep mysql);do rpm -e $i --nodeps;done
[root@DB-node01 ~]# rm -rf /var/lib/mysql && rm -rf /etc/my.cnf

2) 安装Mysql8.0 的yum资源库
[root@DB-node01 ~]# yum localinstall https://repo.mysql.com//mysql80-community-release-el7-1.noarch.rpm

3) 安装Mysql8.0
[root@DB-node01 ~]# yum install mysql-community-server

启动MySQL服务器和MySQL的自动启动
[root@DB-node01 ~]# systemctl start mysqld
[root@DB-node01 ~]# systemctl enable mysqld

4) 使用默认密码初次登录后, 必须要重置密码

查看默认密码, 如下默认密码为"e53xDalx.*dE"
[root@DB-node01 ~]# grep ‘temporary password‘ /var/log/mysqld.log
2019-03-06T01:53:19.897262Z 5 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: e53xDalx.*dE

[root@DB-node01 ~]# mysql -pe53xDalx.*dE
............
mysql> select version();
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.

报错提示必须要重置初始密码, 下面开始重置mysql登录密码(注意要切换到mysql数据库,使用use mysql)
mysql> use mysql;
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.

mysql> ALTER USER ‘root‘@‘localhost‘ IDENTIFIED BY ‘123456‘;
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements

这个其实与validate_password_policy的值有关, mysql8.0更改了validate_password_policy相关的配置名称, 这跟Mysql5.7有点不一样了.
mysql> set global validate_password.policy=0;
Query OK, 0 rows affected (0.00 sec)

mysql> set global validate_password.length=1;
Query OK, 0 rows affected (0.00 sec)

接着再修改密码
mysql> ALTER USER ‘root‘@‘localhost‘ IDENTIFIED BY ‘123456‘;
Query OK, 0 rows affected (0.05 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.03 sec)

退出, 重新使用新密码登录mysql
[root@DB-node01 ~]# mysql -p123456
...........
mysql> select version();
+-----------+
| version() |
+-----------+
| 8.0.15    |
+-----------+
1 row in set (0.00 sec)

查看服务端口
mysql> show global variables like ‘port‘;
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| port          | 3306  |
+---------------+-------+
1 row in set (0.01 sec)

查看mysql连接的授权信息
mysql> select host,user,password from mysql.user;
ERROR 1054 (42S22): Unknown column ‘password‘ in ‘field list‘

上面这是mysql5.6及以下版本的查看命令,
mysql5.7之后的数据库里mysql.user表里已经没有password这个字段了,password字段改成了authentication_string。
mysql> select host,user,authentication_string from mysql.user;
+-----------+------------------+------------------------------------------------------------------------+
| host      | user             | authentication_string                                                  |
+-----------+------------------+------------------------------------------------------------------------+
| localhost | mysql.infoschema | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED |
| localhost | mysql.session    | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED |
| localhost | mysql.sys        | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED |
| localhost | root             | $A$005${7J0=4Dc7Jym8eI/FU4jimKWFvkD9XmoAkF1ca5.Un0bc6zgmPtU.0 |
+-----------+------------------+------------------------------------------------------------------------+
4 rows in set (0.00 sec)

=============================mysql8.0修改用户密码命令================================
mysql> use mysql;
mysql> ALTER USER ‘root‘@‘localhost‘ IDENTIFIED BY ‘123456‘;
mysql> flush privileges;

2) 采用编译安装方式

3) centos7下mysql8.0多实例安装

 

三.  Mysql8.0使用过程中踩过的一些坑

原文地址:https://www.cnblogs.com/kevingrace/p/10482469.html

时间: 2024-10-11 00:50:44

Centos7下Mysql8.0安装手册 以及 一些坑点总结的相关文章

centos7下zabbix2.0安装

一二三部分为介绍,此处略过.转载请注明出处http://15074813712.blog.51cto.com/addblog.php 安装环境的准备 4  系统环境 [[email protected] ~]# cat /etc/centos-release CentOS Linux release 7.0.1406 (Core) [[email protected] ~]# uname -r 3.10.0-123.el7.x86_64 5  关闭防火墙与selinux [[email prot

CentOS7 下源码安装MySQL 8.0.11

CentOS7 下源码安装MySQL 8.0.11 系统环境:CentOS7, 内核:Linux 3.10.0-862.el7.x86_64 如果有旧版本的MySQL,先卸载,用下面命令来查询出系统有哪些相关的MySQL包. rpm -qa | grep mysql 如果上述命令查询出有相关的MySQL包,就卸载 rpm -e 包名 卸载MariaDB包 yum remove mariadb-libs.x86_64 从MySQL官网下载源码包,并将该文件拷贝到系统中. https://dev.m

Centos7下Apache详细安装配置及证书申请SSL配置介绍

首先说到Centos大家都已经非常熟悉了,所以我们也就不多介绍关于Centos具体发展了,我们首先知道在Centos7之前版本命令和ReadHat的命令完全一样的,可Centos从6.0版本升级到Centos7版本之后,命令及功能上有了很大的变化,最明显的差别就是从安装的操作界面及操作命令上已经有很大变化了,更不用说功能上的变化了,比如centos6.x版本的iptalbes到centos7的firewall的变化,当然,变化了很多,我也就不多说了,今天呢,主要给大家介绍一下再Centos7下A

linux CentOS7下快速静默安装Oracle11GR2数据库并创建实例

linux CentOS7下快速静默安装Oracle11GR2数据库并创建实例本文章适合已经熟悉安装过程,需要快速部署使用初学者建议分步学习:https://edu.51cto.com/course/15530.html linux.x64_11gR2_database_1of2.zip (oracle官网下载)linux.x64_11gR2_database_2of2.zip (oracle官网下载)rlwrap-0.42.tar.gz (51CTO下载里搜)三个安装包: 一.上传安装包 mk

mysql8.0安装好后无法启动后的一顿猛如虎操作

mysql8.0安装好后可以正常与navicat通信,也可以可以通过密码进入,在任务管理器中能看到mysqld字样 那么问题来了,用net start mysql 命令竟然无法启动 按照网上正常的步骤来操作: 以管理员身份在mysql的bin目录下        1.mysqld --initialize:作用初始化 2.mysqld -install:作用安装mysql服务 3.net start mysql:启动mysql服务      得到如下结果 4.net start mysql80 

LINUX5+ASM+ORACLE11.2.0.3.0安装手册

 一.安装需知: 1.数据库版本和grid版本号要一致 2.grid版本比oracle版本低,需要升级grid版本,否则dbca失败. 3.本实验采用oracle11.2.0.3.0 4.本实验最先采用grid[11.2.0.1.0],最后又升级到grid[11.2.0.3.0] 5.系统采用linux RED5,linux6就不要用了,6不支持asmlib内核. 第2.4.5点需要注意. 二.系统环境: 操作系统版本: [[email protected] ~]# uname -r 2.6

CentOS7下MySQL8的二进制基本安装配置

前言 基于本地Centos7.6虚拟机Mysql8的配置 一.安装前的准备 1.到官网下载mysql-8.0.16-linux-glibc2.12-x86_64.tar.xz 2.通过Xshell或者Xftp.PSPC.PSFTP等工具把安装包上传到CentOS服务器. PSftp示范 (1)先在虚拟机上命令(ip addr)查看虚拟机的ip,没有ip自己网上找配置方法 (2)打开psftp,连接虚拟机 open ip (3)账号密码登录(注意:要回复y or n时,要照提示输入,不能直接回车)

阿里云轻量应用服务器Linux-Centos7下MySQL8.0.19的安装

初始环境:阿里云轻量应用服务器已经重置系统为CentOS7.3-64位具体目标:安装MySQL 8.0.19 第一步:检查Linux系统版本 1.执行命令 lsb_release -a 查看系统版本可以看到,目前我的系统版本为CentOS7.3-64位.2.为了确保一切正常,我准备升级自己的系统到当前最新.3.用yum更新升级执行命令 yum -y clean all执行命令 yum -y update最后看见"Complete!"就是更新完成了.4.更新完成后,执行命令 lsb_re

Windows下MySQL8.0.13解压版安装教程

下载 MySQL8.0.13-64位下载地址 在下载页面的底部,有三种安装包,第一种是MySQL的安装程序,下载完点击安装即可. 第二种是普通的压缩版,体积较小. 第三种是自带debug和测试的压缩版,体积较大.这种压缩包在网上暂时没有找到对应的安装文档说明,所以建议下载第二种压缩包,也就是普通版本的MySQL压缩包. 配置环境变量 新建环境变量如下: 变量名:MYSQL_HOME 变量值:D:\software\mysql-8.0.13-winx64(这里填写MySQL的安装路径) 在path