CentOS7安装

下载RPM安装包

下载: mysql download

将四个包下载后移动到opt文件夹下
image-20210314104200636.png

检查是否已安装MySQL

如果没有信息显示则表示未安装MySQL

  1. $ rpm -qa | grep -i mysql

安装MySQL

-i:显示套件的文件列表

-v:显示指令执行过程

-h:套件安装时列出标记

  1. $ rpm -ivh <包名>

安装顺序:

  1. common
  2. libs
  3. client
  4. server

依赖冲突:

直接卸载mariadb

详情如下:

  1. [root@parak opt]# rpm -ivh mysql-community-common-8.0.20-1.el7.x86_64.rpm
  2. 警告:mysql-community-common-8.0.20-1.el7.x86_64.rpm: V3 DSA/SHA1 Signature, 密钥 ID 5072e1f5: NOKEY
  3. 准备中... ################################# [100%]
  4. 正在升级/安装...
  5. 1:mysql-community-common-8.0.20-1.e################################# [100%]
  6. [root@parak opt]# rpm -ivh mysql-community-libs-8.0.20-1.el7.x86_64.rpm
  7. 警告:mysql-community-libs-8.0.20-1.el7.x86_64.rpm: V3 DSA/SHA1 Signature, 密钥 ID 5072e1f5: NOKEY
  8. 错误:依赖检测失败:
  9. mariadb-libs mysql-community-libs-8.0.20-1.el7.x86_64 取代
  10. [root@parak opt]# rpm -qa | grep mariadb
  11. mariadb-libs-5.5.68-1.el7.x86_64
  12. [root@parak opt]# rpm -e mariadb-libs-5.5.68-1.el7.x86_64
  13. 错误:依赖检测失败:
  14. libmysqlclient.so.18()(64bit) (已安裝) postfix-2:2.10.1-9.el7.x86_64 需要
  15. libmysqlclient.so.18(libmysqlclient_18)(64bit) (已安裝) postfix-2:2.10.1-9.el7.x86_64 需要
  16. [root@parak opt]# rpm -e --nodeps mariadb-libs-5.5.68-1.el7.x86_64
  17. [root@parak opt]# rpm -ivh mysql-community-libs-8.0.20-1.el7.x86_64.rpm
  18. 警告:mysql-community-libs-8.0.20-1.el7.x86_64.rpm: V3 DSA/SHA1 Signature, 密钥 ID 5072e1f5: NOKEY
  19. 准备中... ################################# [100%]
  20. 正在升级/安装...
  21. 1:mysql-community-libs-8.0.20-1.el7################################# [100%]
  22. [root@parak opt]# rpm -ivh mysql-community-client-8.0.20-1.el7.x86_64.rpm
  23. 警告:mysql-community-client-8.0.20-1.el7.x86_64.rpm: V3 DSA/SHA1 Signature, 密钥 ID 5072e1f5: NOKEY
  24. 准备中... ################################# [100%]
  25. 正在升级/安装...
  26. 1:mysql-community-client-8.0.20-1.e################################# [100%]
  27. [root@parak opt]# rpm -ivh mysql-community-server-8.0.20-1.el7.x86_64.rpm
  28. 警告:mysql-community-server-8.0.20-1.el7.x86_64.rpm: V3 DSA/SHA1 Signature, 密钥 ID 5072e1f5: NOKEY
  29. 准备中... ################################# [100%]
  30. 正在升级/安装...
  31. 1:mysql-community-server-8.0.20-1.e################################# [100%]

查看是否安装成功

  • 方式一:查看mysql版本号mysqladmin --version
  • 方式二:查看是否创建了mysql用户(组)cat /etc/passwd | grep mysql
  1. [root@parak opt]# mysqladmin --version
  2. mysqladmin Ver 8.0.20 for Linux on x86_64 (MySQL Community Server - GPL)
  3. [root@parak opt]# cat /etc/passwd | grep mysql
  4. mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/false

启动MySQL服务

  • 启动MySQL:systemctl start mysqld
  • 停止MySQL:systemctl stop mysqld

登录MySQL

两种方式:

  • 方式一:查看MySQL初始密码cat /var/log/mysqld.log | grep password
  • 方式二:修改my.cnf配置文件用于跳过密码,在[mysqld]下添加skip-grant-tables

推荐使用第一种,因为在MySQL8在跳过登录的状态下是不允许修改登录密码的。

  1. # 登录mysql
  2. $ mysql -uroot -p
  3. Enter password:
  4. # 修改校验密码策略等级
  5. $ mysql> set global validate_password.policy=LOW;
  6. # 设置密码最小长度
  7. $ mysql> set global validate_password.length=1;
  8. # 最后设置密码
  9. $ ALTER USER 'root'@'localhost' IDENTIFIED BY <password>;

Navicat连接产生问题

(1)HOST is not allowed to connect to this mysql server

解决:关闭防火墙,更新可连接IP

  1. # 查看防火墙状态
  2. $ systemctl status firewalld.service
  3. # 关闭防火墙
  4. $ systemctl stop firewalld.service
  5. # 禁止自启动
  6. $ systemctl disable firewalld.service
  7. # 让所有IP都可以连接MySQL
  8. $ mysql> update user set host='%' where user='root';
  9. # 刷新权限
  10. $ mysql> flush privileges;

(2)Client does not support authentication protocol requested by server

解决:更改加密规则,更新用户密码

  1. # #更改加密方式
  2. $ mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER;
  3. # 更新用户密码
  4. $ mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '<password>';

设置开机自启动

按照以上安装方式mysql服务是默认开机自启动的,可以通过systemctl list-unit-files查看开机启动项

  1. [root@parak mysql]# systemctl list-unit-files | grep mysql
  2. mysqld.service enabled
  3. mysqld@.service disabled

如果不是开机自启动,可以通过ntsysv启用服务,[]中设置*即可使其开机自启动:

  • 上下键:可以在中间的方框当中,在各个服务之间移动
  • 空格键:可以用来选择你所需要的服务,[*]表示开起启动
  • tab键:可以在方框、OK、Cancel之间移动
  • F1键:可以显示该服务的说明

image-20210314131906998.png

Docker安装

拉取镜像

  1. $ docker pull mysql:8.0.20

创建挂载的数据和配置文件夹

  1. $ mkdir -p /home/mysql/data /home/mysql/conf

先启动MySQL容器

  1. $ docker run --name mysql -d -p 3306:3306 \
  2. -e MYSQL_ROOT_PASSWORD=<password> mysql:8.0.20

进入容器查看配置文件位置

  1. $ docker exec -it mysql bash
  2. $ mysql --help | grep my.cnf
  3. order of preference, my.cnf, $MYSQL_TCP_PORT,
  4. /etc/my.cnf /etc/mysql/my.cnf ~/.my.cnf
  5. $ exit

将配置文件复制到挂载配置文件夹

  1. $ docker cp mysql:/etc/mysql/my.cnf /home/mysql/conf

在配置文件中添加

  1. # 表名称大小写不敏感
  2. lower_case_table_names=1

先停止并删除容器

  1. $ docker stop mysql && docker rm mysql

重新运行MySQL容器

  1. $ docker run --name mysql \
  2. -d -p 3306:3306 \
  3. -e MYSQL_ROOT_PASSWORD=<password> \
  4. --mount type=bind,src=/home/mysql/conf/my.cnf,dst=/etc/mysql/my.cnf \
  5. --mount type=bind,src=/home/mysql/data,dst=/var/lib/mysql \
  6. --restart=always \
  7. mysql:8.0.20

Navicat无法连接

  1. $ docker exec -it mysql bash
  2. $ mysql -u root -p<password>
  3. $ ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '<password>';

配置文件

安装目录

路径 解释
/var/lib/mysql/ 数据库文件的存放位置
/usr/share/mysql-8.0/ 配置文件目录
/usr/bin/ 相关命令目录

查看编码

  1. mysql> show variables like 'character%';
  2. +--------------------------+--------------------------------+
  3. | Variable_name | Value |
  4. +--------------------------+--------------------------------+
  5. | character_set_client | utf8mb4 |
  6. | character_set_connection | utf8mb4 |
  7. | character_set_database | utf8mb4 |
  8. | character_set_filesystem | binary |
  9. | character_set_results | utf8mb4 |
  10. | character_set_server | utf8mb4 |
  11. | character_set_system | utf8 |
  12. | character_sets_dir | /usr/share/mysql-8.0/charsets/ |
  13. +--------------------------+--------------------------------+

可以看到,MySQL 8的默认编码格式除了文件系统是二进制编码以外,已经全部改为utf8和utf8mb4(拥有比utf8更好的兼容性),因此我们不需要再修改。

注意:使用Navicat连接MySQL时编码应设置为自动,切勿设置为utf8,否则会中文乱码。

逻辑架构

优势

和其他数据库相比,MySQL有点与众不同,它的架构可以在多种不同场景中应用并发挥良好作用。主要体现在存储引擎的架构上,插件式的存储引擎架构将查询处理和其他的系统任务以及数据的存储提取相分离。这种架构可以根据业务的需求和实际需要选择合适的存储引擎。

图示

image-20210324110838854.png

详解

  • 连接层:最上层是一些客户端和连接服务,包含本地sock通信和大多数基于客户端/服务端工具实现的类似于TCP/IP通信。主要完成一些类似于连接处理、授权认证及相关的安全方案。在该层上引入了线程池的概念,为通过认证安全接入的客户端提供线程。同样在该层上可以实现基于SSL的安全连接。服务器也会为安全接入的每个客户端验证它所具有的操作权限。
  • 服务层:第二层架构主要完成大多数的核心功能,如SQL接口,并完成缓存的查询,SQL的分析和优化及部分内置函数的执行。所有跨存储引擎的功能也在这一层实现,如过程、函数等。在该层,服务器会解析查询并创建相应的内部解析树,并对其完成相应的优化如确定查询表的顺序,是否利用索引等,最后生成相应的执行操作。如果是select语句,服务器还会查询内部的缓存。如果缓存空间足够大,这样在解决大量读操作的环境中能够很好的提升系统的性能。
  • 引擎层:存储引擎层,存储引擎真正的负责了MySQL中数据的存储和提取,服务器通过API与存储引擎进行通信。不同的存储引擎具有的功能不同,这样我们可以根据自己的实际需要进行选取。
  • 存储层:数据存储层,主要是将数据存储在运行于裸设备的文件系统之上,并完成与存储引擎的交互。

存储引擎

查看存储引擎

  1. $ mysql>show engines;

image-20210314164337734.png

MyISAM和InnoDB

对比项 InnoDB MyISAM
存储结构 所有的表保存在同一个数据文件中,大小只受限于操作系统文件的大小 每个MyISAM在磁盘上存储成三个文件,分别是frm(表定义)、myd(表数据)、myi(表索引)
存储空间 需要更多的内存和存储,会在主内存中建立专用的缓冲池用于告诉缓冲数据和索引 可被压缩,存储空间较小,支持三种存储格式:静态表、动态表和压缩表
可移植性 可以使用mysqldump,当数据过大的时候则相对痛苦 文件形式存储,跨平台转移十分方便,在备份和恢复时可单独对某个表进行操作
表的主键 如果没有设定主键或者非空唯一索引,就会自动生成一个6字节的主键(用户不可见) 允许没有任何索引和主键的表存在,索引都是保存行的地址
外键支持 支持 不支持
锁的粒度 行锁,大幅提高了并发量,但是行锁只在WHERE的主键是有效的。 表锁,不适合高并发
事务支持 支持事务,提供事务提交、回滚和崩溃修复能力的事务安全型表 关注性能,查询具有原子性,但是不提供事务支持

说明

MySQL 8.0:不再支持查询缓存。

MySQL团队博客:https://mysqlserverteam.com/mysql-8-0-retiring-support-for-the-query-cache/

  1. 尽管MySQL Query Cache旨在提高性能,但它存在严重的可伸缩性问题,并且很容易成为严重的瓶颈。
  2. MySQL 5.62013)以来,默认情况下已禁用查询缓存,因为众所周知,它不能与多核计算机上在高吞吐量工作负载情况下进行扩展。
  3. 我们考虑了可以对查询缓存进行哪些改进,以及我们可以进行的优化,这些优化可以改善所有工作负载。
  4. 虽然这些选择本身是正交的,但工程资源是有限的。也就是说,我们正在转变战略,投资于更普遍适用于所有工作负载的改进。
  5. 建议把缓存放到客户端。

Alibaba选择

  • Percona为MySQL数据库服务进行了改进,在功能和性能上较MySQL有着很显著的提升。该版本提升了在高负载情况下的InnoDB的性能、为DBA提供了一些非常有用的性能诊断工具;另外有更多的参数和命令来控制服务器行为。
  • 阿里巴巴大部分MySQL数据库其实使用的时percona的原型加以修改。阿里新建了一款存储引擎叫xtradb完全可以替代innodb,并且在性能和并发上做得更好。