MySQL 高性能数据库中间件服务


从研发工程师的角度:

作为研发工程师, MySQL是我们常用的关系型数据库管理系统之一。它具有以下特点和功能.

从运维工程师的角度:

作为运维工程师, MySQL是我们日常工作中必须管理和维护的数据库系统。以下是MySQL的一些关键方面.

  1. 安装和配置.运维工程师需要熟悉MySQL的安装和配置过程, 包括选择合适的版本、设置数据库参数、配置存储引擎等。合理的配置可以提供更好的性能和可靠性。

  2. 数据备份和恢复.运维工程师负责制定和执行数据备份和恢复策略, 确保数据库的数据可靠性和持久性。这包括选择合适的备份方法、定期备份数据、恢复测试等。

  3. 高可用性和故障恢复.运维工程师需要确保MySQL数据库的高可用性。通过设置主从复制、故障切换、数据库集群等技术, 实现故障自动切换和容灾能力, 减少业务中断时间。

  4. 性能监控和调优.运维工程师需要监控数据库的性能指标, 如CPU、内存、磁盘和网络等资源的利用率, 以及查询响应时间、连接数等。他们需要使用性能监控工具和日志分析技术, 识别并解决性能瓶颈和故障问题。

总而言之, 作为研发工程师和运维工程师, 我们对MySQL有广泛的应用和深入的理解。我们可以利用MySQL的强大功能和灵活性, 开发和维护高性能、可靠、安全的数据库系统, 以满足业务需求和用户期望。

截屏2023-07-13 17.38.40

⚠️WARNNING: MySQL只是用于将数据 合理且有逻辑 (关系型) 的将数据存储到磁盘上的工具(中间件)


快速跳转:


 

第一章 MySQL服务部署及配置

MySQL 5.7和MySQL 8.0是MySQL数据库的两个重要版本,在功能、性能和安全性等方面存在区别的。以下是它们之间的一些主要区别:

  1. JSON支持:

    • MySQL 5.7引入了对JSON数据类型的支持,允许存储和查询JSON格式的数据,并提供了相应的JSON函数和操作符。

    • MySQL 8.0在JSON支持方面进一步增强,包括新增的JSON函数、操作符和JSON路径表达式,以及更高效的JSON存储格式。

  2. Common Table Expressions(公共表达式):

    • MySQL 8.0支持公共表达式,允许在查询中创建临时的命名子查询,简化了复杂查询的编写和理解。MySQL 5.7不支持此功能。

  3. 更强的密码策略:

    • MySQL 8.0改进了密码策略,引入了更强的密码验证插件和默认密码策略。这有助于提高账户的安全性。

  4. InnoDB引擎改进:

    • MySQL 8.0对InnoDB存储引擎进行了一系列的改进,包括更好的并发控制、表空间管理和数据压缩等方面的优化。这些改进有助于提升性能和存储效率。

  5. Group Replication(组复制):

    • MySQL 5.7引入了Group Replication,这是一种基于原生MySQL复制的多主复制解决方案,提供了高可用性和故障切换的能力。

    • MySQL 8.0对Group Replication进行了改进,增加了更多功能和灵活性,如自动成员加入、自动扩展、多主模式等。

  6. 安全性改进:

    • MySQL 8.0引入了一些新的安全功能,如密码策略的改进、角色管理、数据加密、基于角色的访问控制(RBAC)等。这有助于提高数据库的安全性。

这些是MySQL 5.7和MySQL 8.0之间的一些主要区别。根据你的具体需求和项目情况,选择适合的版本是很重要的。对于新的项目或需要较新功能的项目,通常推荐选择MySQL 8.0版本。对于现有项目,需要评估升级的风险和成本,并确保应用程序的兼容性和稳定性。

⚠️WARNNING: 选择哪个版本不是运维说了算的, 而是研发说了算的

 

1.1 Yum方式安装mysql服务

yum方式安装mysql数据库仅仅适用于测试环境或者快速验证时才会采用, 生产环境中yum方式安装的mysql数据库是不具备源码编译的稳定性的, 虽然提供的功能基本都是一样的, 但是缺少了自定义性。

首先,执行一下命令将安装mysql服务的repo仓库安装在本地机器中

其次,根据需要决定repo中的 5.7版本 or 8.0版本是否开启, 然后,使用以下命令将mysql服务安装在本地机器上

之后,在 /var/log/mysqld.log 中获取 mysql的初始密码

最后,使用初始密码登陆到mysql中,修改初始密码(大写、小写、数字、特殊字符[.!?,;'])

 

1.2 源码编译安装mysql服务

在实际的生产项目中通常都是指定版本进行安装mysql的, 往往此时通过源码安装mysql无疑是最好的选择. 而且通过源码安装,也可以更方便我们自定义安装环境.

首先,将系统支撑mysql运行的软件包安装好

其次,在系统中创建好mysql的相关目录

然后,创建运行mysql进程的用户mysql用户

最后,将mysql源代码进行解压,并开始安装

接下来,进入配置mysql服务阶段: 增加mysql命令目录环境变量

修改mysql服务相关目录的所属权限

编辑配置文件,将日志、数据目录位置、启动用户等设置好

初始化数据库

拷贝mysql的配置文件到service中进行管理

启动mysqld服务

数据库基本设置:

 

 

第二章 SQL语句

数据库SQL语句(Structured Query Language)是用于管理和操作关系型数据库的标准化语言。SQL语句由不同的命令组成,用于执行各种操作,例如查询数据、插入新数据、更新现有数据、删除数据以及定义和修改数据库结构。SQL语句是通用的,几乎所有关系型数据库管理系统(如MySQL、Oracle、SQL Server等)都支持SQL语法,尽管不同的数据库系统可能会有一些特定的语法和功能差异。学习和理解SQL语句对于数据库管理和开发非常重要,它们提供了强大的功能来管理和操作数据库中的数据。

 

2.1 DDL 语句

DDL(数据定义语言)是数据库中用于定义和管理数据库对象(如库、表、索引等)的语句。DDL语句通常用于创建、修改和删除数据库对象的结构,而不是操作实际的数据。

  1. CREATE:用于创建数据库对象

    • CREATE DATABASE:创建新的数据库

    • CREATE TABLE:创建新的数据表

     

  2. ALTER:用于修改数据库对象的结构

    • ALTER TABLE:修改数据表的结构,如添加、修改或删除列、修改数据类型等

     

  3. DROP:用于删除数据库对象。

    • DROP DATABASE:删除数据库及其相关的对象

    • DROP TABLE:删除数据表

     

  4. TRUNCATE:用于快速删除表中的所有数据,但保留表的结构

    • TRUNCATE TABLE:删除表中的所有数据,但保留表的结构和定义,数据一旦被清空将无法恢复。

 

DDL语句在执行时会直接影响数据库的结构,因此在使用时需要谨慎。一些DDL操作可能会导致数据丢失或造成数据库对象的不一致。因此,建议在执行DDL语句之前进行备份,并确保对数据库结构变更的影响有适当的计划和测试。

总之,DDL语句是用于定义和管理数据库对象结构的语句,包括创建、修改和删除数据库对象。它们对于数据库的设计和维护起着重要的作用,允许管理员和开发人员对数据库进行结构上的变更。

 

2.2 DML 语句

DML(数据操作语言)是数据库中用于操作和管理实际数据的语句。DML语句用于执行数据的插入、更新、删除和查询等操作。下面是一些常见的DML语句及其功能:

  1. SELECT:用于从数据库中查询数据

    • SELECT * FROM table_name:查询表中的所有数据

    • SELECT column1, column2 FROM table_name:查询指定列的数据

    • SELECT column1, column2 FROM table_name WHERE condition:根据条件查询数据

     

  2. INSERT:用于向数据库表中插入新的数据

    • INSERT INTO table_name (column1, column2) VALUES (value1, value2):插入一行新数据

    • INSERT INTO table_name (column1, column2) SELECT column1, column2 FROM another_table:从另一个表中插入数据

     

  3. UPDATE:用于修改数据库表中的现有数据

    • UPDATE table_name SET column1 = value1, column2 = value2 WHERE condition:根据条件更新数据

     

  4. DELETE:用于从数据库表中删除数据

    • DELETE FROM table_name WHERE condition:根据条件删除数据

     

DML语句允许用户对数据库中的数据进行操作,可以执行单个操作或批量操作。这些语句可以根据条件过滤数据、插入新数据、更新现有数据或删除不需要的数据。在执行DML语句时,需要小心处理事务(Transaction)和数据完整性的问题。事务可以用来保证DML操作的一致性和可靠性,确保多个操作要么全部成功,要么全部失败回滚。此外,还应该注意数据的一致性和完整性,避免意外删除或修改重要数据。

总之,DML语句是用于操作和管理数据库中实际数据的语句。它们允许用户进行数据的插入、更新、删除和查询等操作,以满足不同的数据处理需求

 

2.3 DCL 语句

DCL(数据控制语言)是数据库中用于管理用户访问权限和控制数据库安全性的语句。DCL语句用于授权或收回用户对数据库对象的权限,以及管理数据库用户和角色。下面是一些常见的DCL语句及其功能:

全局权限(Global privileges)

权限分类描述
ALL PRIVILEGES全局授予用户在整个MySQL服务器上执行所有操作的权限。
CREATE USER全局授予用户创建和管理其他用户的权限。
SUPER全局授予用户超级权限,允许执行特殊操作,如修改全局系统变量、关闭线程、绕过权限等。
REPLICATION SLAVE全局授予用户作为复制从服务器的权限,用于配置和管理复制从服务器。
REPLICATION CLIENT全局授予用户作为复制客户端的权限,用于连接和监控复制主服务器和从服务器之间的复制进程。

数据库级权限(Database privileges)

权限分类描述
CREATE数据库授予用户创建新表或数据库的权限
ALTER数据库授予用户修改已存在表结构的权限
DROP数据库授予用户删除表或数据库的权限
SELECT数据库授予用户查询数据的权限
INSERT数据库授予用户插入数据的权限
DELETE数据库授予用户删除数据的权限
UPDATE数据库授予用户更新数据的权限
INDEX数据库授予用户创建和管理索引的权限

表级权限(Table privileges)

权限分类描述
SELECT授予用户查询表数据的权限
INSERT授予用户向表中插入数据的权限
UPDATE授予用户更新表数据的权限
DELETE授予用户删除表数据的权限
ALTER授予用户修改表结构的权限
DROP授予用户删除表的权限
INDEX授予用户创建和管理索引的权限
  1. GRANT:用于授予用户或用户组特定的数据库访问权限

    • GRANT privilege ON object TO user:授予用户对特定对象的权限

    • GRANT privilege1, privilege2 ON object TO user:同时授予用户多个权限

    • GRANT ALL PRIVILEGES ON object TO user:授予用户对特定对象的所有权限

     

  2. REVOKE:用于收回用户或用户组的数据库访问权限

    • REVOKE privilege ON object FROM user:收回用户对特定对象的权限

    • REVOKE privilege1, privilege2 ON object FROM user:同时收回用户多个权限

    • REVOKE ALL PRIVILEGES ON object FROM user:收回用户对特定对象的所有权限

     

  3. CREATE USER:用于创建新的数据库用户

    • CREATE USER username IDENTIFIED BY password:创建一个新的数据库用户并设置密码

     

  4. DROP USER:用于删除数据库用户

    • DROP USER username:删除指定的数据库用户

     

DCL语句用于确保数据库的安全性和访问控制,通过授权和收回权限,可以限制用户对数据库对象的访问和操作。角色的使用可以简化权限管理,将权限授予角色,然后将角色分配给用户,减少了直接授权给每个用户的工作量。需要注意的是,执行DCL语句通常需要具备管理员或具有特定权限的用户身份。对于敏感的数据库操作和权限管理,应谨慎处理,以防止未经授权的访问和数据泄露。总之,DCL语句用于管理用户访问权限和控制数据库安全性。通过授权和收回权限,以及管理用户和角色,可以确保数据库的安全访问和操作。

 

2.4 DQL 语句

DQL(数据查询语言)是数据库中用于从数据库中查询和检索数据的语句。DQL语句主要用于执行各种查询操作,以获取所需的数据结果集。下面是一些常见的DQL语句及其功能:

 

  1. SELECT:用于从数据库中查询数据

    • SELECT * FROM table_name:查询表中的所有数据

    • SELECT column1, column2 FROM table_name:查询指定列的数据

    • SELECT column1, column2 FROM table_name WHERE condition:根据条件查询数据

     

  2. FROM:用于指定要查询的数据表

    • SELECT * FROM table_name:从指定表中查询所有数据

     

  3. WHERE:用于指定查询条件,对数据进行过滤

    • SELECT * FROM table_name WHERE condition:根据指定条件查询数据

    • 运算符:等于(=)、不等于(<>)、大于(>)、小于(<)、大于等于(>=)、小于等于(<=)

    • 逻辑运算符: and并且、or或者、not非(取反)

     

  4. ORDER BY:用于对查询结果进行排序。

    • SELECT * FROM table_name ORDER BY column1 ASC:按照指定列进行升序排序

    • SELECT * FROM table_name ORDER BY column1 DESC:按照指定列进行降序排序

     

  5. 函数: 可以对数据进行基本的运算

    • sum(fields_name) 求和

    • avg(fields_name) 求平均值

    • min(fields_name) 求最小值

    • max(fields_name) 求最大值

    • count(fields_name) 求出现的个数

    • Example: select Student.Sname, avg(SC.Grade) as '平均分' from Student, SC where Student.Sno=SC.Sno and Student.Sname='潘瑞';

     

  6. JOIN:用于将多个表根据关联列进行连接操作

    • SELECT * FROM table1 LEFT JOIN table2 ON table1.column1 = table2.column2:根据指定的关联列将两个表连接起来

     

  7. group by ... having .....

    • SELECT SC.Sno, sum(SC.Grade) as '总分' from SC group by

     

  8. limit: 限制数据条目数

    • SELECT * FROM table1 WHERE LIMIT 10;

     

  9. like % : 范围查找,模糊查询;like 像。。。

    • SELECT * FROM table1 WHERE fields_name LIKE '%keyword%';

     

  10. Between: 在。。。。之间 (不推荐使用)

 

查询所有学生各科目得分(要显示学生姓名、课程名称、成绩、对所有学生按某个课程的成绩倒序排序)

查询平均成绩大于70分的学生姓名、学号以及平均分数(需要用到临时表)

查询出所有学生的总分并进行排名,从大到小,并过滤出总分超过四百分的学生

 

DQL语句允许用户灵活地查询数据库中的数据,并可以使用多种操作符、函数和聚合函数来处理数据。通过使用DQL语句,可以实现复杂的数据检索和分析,以满足不同的数据需求。需要注意的是,DQL语句只用于查询和检索数据,不会对数据库中的数据进行修改。如果需要对数据进行插入、更新或删除操作,应使用DML(数据操作语言)中的INSERT、UPDATE和DELETE语句。

总之,DQL语句用于从数据库中查询和检索数据。通过SELECT语句及其相关子句,可以指定要查询的数据表、条件、排序方式等,以获取所需的数据结果集。

 

第三章 数据库备份及恢复

3.1 逻辑备份及恢复

MySQL的逻辑备份是通过将数据库的结构和数据以逻辑形式导出为SQL语句的方式进行备份。逻辑备份可以使用mysqldump工具来完成,而恢复过程则是将备份文件中的SQL语句重新执行以还原数据库。

输入以下命令,使用mysqldump进行逻辑备份,并将备份保存到指定文件中:

输入以下命令,使用mysql命令执行备份文件中的SQL语句来恢复数据库:

下面是一个备份的shell脚本,该脚本应该放在计划任务中进行周期执行

可以将脚本添加到计划任务(例如使用cron)中,以在指定的时间间隔自动执行备份操作。例如,将脚本设置为每天凌晨执行备份:

 

3.2 物理备份及恢复

二进制日志备份和恢复是MySQL的物理备份方法,它通过记录和重放数据库操作的二进制日志来实现。这种备份方法具有以下优势:

  1. 实时增量备份:只备份自上次备份以来的更改部分。这意味着可以更快地备份数据,并且可以在任意时间点进行恢复

  2. 高效性:二进制日志备份是基于物理级别的备份,直接备份和恢复数据库的原始二进制数据文件,因此备份和恢复的过程非常高效

  3. 精确恢复:通过重放二进制日志,可以精确还原数据库中的操作,包括插入、删除等。这使得在特定时间点进行数据恢复成为可能

  4. 跨版本兼容性:二进制日志备份和恢复方法通常在不同的MySQL版本之间兼容性较好,这意味着可以将备份文件从一个版本的MySQL服务器迁移到另一个版本的MySQL服务器

⚠️ 确保MySQL服务器的二进制日志启用并处于活动状态。可以通过修改MySQL配置文件来启用二进制日志

 

Xtrabackup 物理备份

Percona XtraBackup(简称PXB) 是 Percona公司开发的一个用于MySQL数据库物理热备份的备份工具,支持MySQL、Percona server和MariaDB,开源免费,是目前较为受欢迎的主流备份工具。xtrabackup只能备份innoDB和xtraDB两种数据引擎的表,而不能备份MyISAM数据表。

MySQL冷备、mysqldump、MySQL热拷贝都无法实现对数据库进行增量备份, 在实际生产环境中增量备份是非常实用的,如果数据大于50G或100G,存储空间足够的情况下,可以每天进行完整备份,如果每天产生的数据量较大,需要定制数据备份策略。例如每周日用完整备份,周一到周六实用增量备份。而Percona-Xtrabackup就是为了实现增量备份而出现的一款主流备份工具,xtrabakackup有2个工具,分别是xtrabakup、innobackupex。以下是它的优点:

 

第四章 数据库高可用架构

主从复制(Master-Slave Replication)是一种常见的数据库复制技术,用于将一个MySQL数据库服务器(主服务器)的数据和操作复制到其他MySQL服务器(从服务器)上。主从复制提供了数据的冗余备份、读写分离以及分布式数据处理等功能。

MySQL的高可用架构无论是社区还是官方,一直在技术上进行探索,这么多年提出了多种解决方案,比如 MMM, MHA, NDB Cluster, Galera Cluster, InnoDB Cluster, 腾讯的PhxSQL, MySQL Fabric., aliSQL。MySQL官方在2017年4月推出了一套完整的、高可用的Mysql解决方案 - MySQL InnoDB Cluster, 即一组MySQL服务器可以配置为一个MySQL集群。在默认的单主节点模式下,集群服务器具有一个读写主节点和多个只读辅节点。辅助服务器是主服务器的副本。客户端应用程序通过MySQL Router连接到主服务程序。如果主服务连接失败,则次要的节点自动提升为主节点,MySQL Router请求到新的主节点。

4.1 主从复制架构

⚠️ 原理: 主库开启二进制日志, 通过mysqldumpthread进程与从库的IO线程进行数据共享, 从库IO线程将读取到的数据写入到本地中继日志中, 从库的SQL线程将中继日志中的数据回放到从库中, 以此完成数据同步

截屏2023-07-17 20.35.28

这里准备出三台 2c2G 的机器即可, 以此来完成 一主两从 的结构; MySQL服务器的安装参考第一章中的源码安装方式, 这里就不多赘述了。主从复制的目的是为了保证数据的高可用性以及数据安全性, 这在生产架构中起到至关重要的作用, 对于原理和搭建逻辑一定要了熟于心

对于主库(master)而言, 将其配置文件增加下面的内容即可:

对于主库(master)而言, 开启让从库读取数据的权限也是必要的

对于从库(slave)而言, 配置也是需要进行修改的

在修改完配置文件后, 即可开始连接主库

 

4.2 MySQL高可用复制架构 (MySQL InnoDB Cluster)

MySQL InnoDB集群提供了一个集成的,本地的,HA解决方案。Mysq Innodb Cluster是利用组复制的 pxos 协议,保障数据一致性,组复制支持单主模式和多主模式。MySQL InnoDB 集群由以下几部分组成:

截屏2023-07-18 15.00.12

组复制提供了内置的组成员管理、数据一致性保证、冲突检测和处理、节点故障检测和数据库故障转移相关操作的本地高可用性,无需人工干预或自定义工具。组复制同时实现了带自动选主的单主模式及任意更新的多主模式。通过使用一个强大的新的组通信系统,它提供了流行的Pxos算法的内部实现,来自动协调数据复制、一致性、membership。这提供了使MySQL数据库高度可用所需的所有内置机制。

通过组复制,一组服务器协调在一起形成一个组。组成员是动态的,服务器可以自愿或强制的地离开及随时加入。组将根据需要自动重新配置自己,并确保任何加入成员与组同步。这样就可以方便地在需要时快速地调整数据库的总容量。

 

安装步骤: