初识 MySQL
文章目录
- 初识 MySQL
- 引言
- 一、数据库基础
- 1.1 什么是数据库
- 1.2 表
- 1.3 数据类型
- 1.4 主键
- 二、数据库技术构成
- 2.1 数据库系统
- 2.2 SQL 语言
- 2.2.1 数据定义语言(DDL)
- 2.2.2 数据操作语言(DML)
- 2.2.3 数据查询语言(DQL)
- 2.2.4 数据控制语言(DCL)
- 2.3 数据库访问技术
- 三、什么是 MySQL
- 3.1 客户机 - 服务器软件(C/S 架构)
- 3.2 MySQL 版本
- 3.3 MySQL 的优势
- 3.3.1 速度与性能
- 3.3.2 成本优势
- 3.3.3 易用性
- 3.3.4 可移植性
- 3.3.5 丰富接口
- 3.3.6 安全性与连接性
- 四、MySQL 的安装
- 4.1 MySQL 的编译安装
- 4.1.1 准备工作
- 4.1.1.1 卸载 MariaDB 并安装依赖包
- 4.1.1.2 关闭 SELinux 和防火墙
- 4.1.1.3 安装 cmake 编译工具
- 4.1.1.4 安装 Boost 库
- 4.1.2 源码编译及安装
- 4.1.2.1 创建运行用户
- 4.1.2.2 解包源码
- 4.1.2.3 配置编译参数
- 4.1.2.4 编译安装
- 4.1.3 安装后的调整
- 4.1.3.1 建立配置文件
- 4.1.3.2 初始化数据库
- 4.1.3.3 设置环境变量
- 4.1.4 添加系统服务
- 4.1.4.1 复制服务脚本
- 4.1.4.2 创建 systemd 服务配置
- 4.1.4.3 验证服务启动
- 4.2 MySQL 的二进制安装
- 4.2.1 基础环境准备
- 4.2.1.1 安装基础工具和依赖包
- 4.2.1.2 创建运行用户并关闭安全限制
- 4.2.2 二进制安装
- 4.2.2.1 解压安装包并配置
- 4.2.3 设定配置文件
- 4.2.4 配置 systemctl 启动
- 总结
引言
在当今这个数字化飞速发展的时代,数据已经成为了各个行业最为宝贵的资产之一,如同工业时代的石油一样,驱动着企业的决策、创新和发展。而数据库作为存储和管理这些海量数据的核心工具,其重要性不言而喻。它能够将无序的数据进行结构化组织,使得数据的存储、查询、更新和删除等操作变得高效且可靠。MySQL 作为一款开源的关系型数据库管理系统,凭借其高性能、易用性和可扩展性等显著优势,在众多领域得到了广泛的应用。无论是小型企业的业务系统,如小型电商平台的订单管理、客户信息存储,还是大型互联网公司的海量数据存储,像社交媒体平台的用户动态、交易记录等,MySQL 都能发挥出强大的作用。本文将全面且深入地介绍 MySQL 的基础知识、技术构成、安装方法以及相关工具的使用,旨在帮助读者全面了解和掌握 MySQL,为后续的学习和实践打下坚实的基础。
一、数据库基础
1.1 什么是数据库
数据库,简单来说,就是按照特定规则组织起来的数据集合。它的本质是对现实世界数据进行抽象建模,将现实中的各种信息以一种结构化的方式存储起来,以便于管理和使用。从发展历程来看,数据库技术经历了三个重要阶段。
在 20 世纪 60 - 70 年代,数据库技术处于层次与网状数据库阶段。这一阶段的数据库以树形或网络结构来存储数据,例如 IBM 的 IMS 系统。这种结构适合处理具有固定层级关系的数据,数据之间的关系就像一棵树,每个节点有特定的父节点和子节点。然而,它的灵活性较差,当数据关系发生变化时,修改数据库结构会比较困难。比如,如果要在一个树形结构的数据库中添加一个新的分支,可能需要对整个树的结构进行调整,这会带来很大的工作量和风险。
到了 20 世纪 80 年代至今,数据库技术进入了关系型数据库阶段。基于关系模型,关系型数据库将数据组织成表的形式,表由行和列组成。通过 SQL(结构化查询语言)可以方便地对数据进行操作。MySQL、Oracle 等都是这一阶段的代表产品。关系型数据库的优势在于具备标准化的查询方式和数据完整性保障机制,能够有效地处理各种复杂的业务逻辑。例如,在一个电商系统中,可以通过 SQL 语句方便地查询某个用户的所有订单信息,同时通过主键、外键等约束条件确保订单数据的准确性和一致性。
21 世纪初至今,随着互联网的发展,出现了海量的非结构化数据,传统的关系型数据库在处理这些数据时面临挑战。于是,NoSQL 数据库应运而生,如 MongoDB 等。同时,像 MySQL 也引入了分布式架构,如 MySQL Cluster,以应对大规模数据存储和高并发访问的需求。数据库具有以下核心特点:
结构化存储方面,数据按照表结构进行组织,每个表有固定的列和数据类型。这种结构便于对数据进行索引和查询。例如,电商订单可以按照表的形式存储,每一行代表一个订单,每一列代表订单的一个属性,如订单 ID、客户姓名、订单金额等。通过对订单 ID 建立索引,可以快速地查询某个特定订单的信息。
数据共享支持多个用户同时访问数据库。不同的部门或系统可以同时调用数据库中的数据。比如,客服系统和物流系统可以同时访问订单数据库,获取订单的相关信息,提高工作效率。客服人员可以根据订单信息为客户提供服务,物流人员可以根据订单信息安排发货和配送。
完整性控制通过主键、外键等约束条件确保数据的准确性和一致性。例如,在订单表中,订单商品 ID 必须关联商品表中存在的记录,这样可以避免出现无效的商品 ID,保证数据的完整性。如果没有这种约束,可能会出现订单中记录的商品 ID 在商品表中不存在的情况,导致数据混乱。
安全控制支持用户权限管理,不同的用户或用户组具有不同的访问权限。例如,仅财务部门的用户可以查看订单金额字段,其他部门的用户只能查看订单的基本信息,从而保护数据的安全性。通过这种方式,可以防止敏感数据被不相关的人员访问和泄露。
1.2 表
数据库表是关系型数据库的核心存储单元,它呈现为二维数组结构,由行(记录)和列(字段)组成。以电商订单表为例,列(字段)定义了数据的属性。例如,order_id
(订单 ID)用于唯一标识一个订单,customer_name
(客户姓名)记录下单的客户姓名。每一列都需要指定数据类型和约束条件,数据类型决定了该列可以存储的数据格式,约束条件则对数据的取值范围和规则进行限制。比如,order_id
通常定义为整数类型,并且设置为唯一且非空,以确保每个订单都有一个唯一的标识。
行(记录)代表一条完整的业务数据。例如,某用户的具体订单信息就是一行记录,它包含了该订单的所有属性值,并且需要满足所有列的约束条件。如果一个订单记录中的 order_id
与其他记录重复,或者 customer_name
为空,那么这条记录就是不符合要求的。
表设计遵循数据库范式理论,主要包括以下三种范式:
第一范式(1NF)要求列不可再分。例如,地址字段通常需要拆分为省、市、区等更细的字段,这样可以确保每个字段只包含单一的数据信息,便于数据的处理和查询。如果地址字段不拆分,当需要查询某个城市的所有订单时,就会变得非常困难。
第二范式(2NF)要求非主键字段完全依赖主键。在订单明细表中,商品价格依赖于订单 ID 和商品 ID,只有同时确定这两个主键字段,才能唯一确定商品价格,避免了数据的冗余和不一致性。如果商品价格只依赖于商品 ID,而不考虑订单 ID,那么在不同的订单中可能会出现同一商品不同价格的情况,导致数据混乱。
第三范式(3NF)要求消除传递依赖。例如,在员工表中,部门电话通过部门 ID 关联到部门表中获取,而不是直接存储在员工表中,这样可以减少数据的冗余,提高数据的维护性。如果部门电话直接存储在员工表中,当部门电话发生变化时,需要更新所有该部门员工的记录,容易出现遗漏和错误。
1.3 数据类型
MySQL 8.0 支持丰富的数据类型,合理选择数据类型可以优化存储和查询性能。以下是一些常见的数据类型及其特点和应用场景:
整数类型包括 TINYINT、SMALLINT、INT/INTEGER 和 BIGINT。TINYINT 占用 1 字节,取值范围为 -128 到 127,常用于表示布尔值(0/1)、状态码等,占用空间小。例如,在一个用户表中,可以用 TINYINT 来表示用户的是否激活状态,0 表示未激活,1 表示激活。SMALLINT 占用 2 字节,取值范围为 -32768 到 32767,可用于存储年龄、非跨世纪年份等数据。INT/INTEGER 占用 4 字节,取值范围约为 ±21 亿,适合作为用户 ID、订单编号等唯一标识。BIGINT 占用 8 字节,取值范围约为 ±9.2×10^18,用于存储分布式 ID、天文数据等大数值。
浮点数类型有 FLOAT 和 DOUBLE。FLOAT 占用 4 字节,是单精度浮点,适用于商品评分等非精确计算的场景,精度相对较低。例如,在一个商品评价系统中,可以用 FLOAT 来存储商品的评分,因为评分不需要非常高的精度。DOUBLE 占用 8 字节,是双精度浮点,可用于科学计算、高精度数值等需要较高精度的场景。
定点小数类型为 DECIMAL(p, s),其中 p 为总位数,s 为小数位。常用于财务数据,如金额(¥199.99),可以精确表示小数。在处理财务数据时,精确的小数表示非常重要,因为一点小的误差可能会导致严重的财务问题。
二进制类型包括 BINARY 和 VARBINARY。BINARY 是固定长度二进制,最大 255 字节,可用于存储加密数据、图片二进制流等。VARBINARY 是可变长度二进制,最大 65535 字节,适用于存储动态二进制数据,根据实际数据长度分配空间。
日期/时间类型有 DATE、TIME、DATETIME 和 TIMESTAMP。DATE 格式为 YYYY - MM - DD,常用于记录生日、订单日期等只需要日期信息的场景。TIME 格式为 HH:MM:SS,可用于表示营业时间、航班时刻等时间信息。DATETIME 格式为 YYYY - MM - DD HH:MM:SS,用于记录订单创建时间等同时包含日期和时间的信息。TIMESTAMP 自动更新当前时间,时间范围为 1970 - 2038 年,通常用于记录数据的最后修改时间,当数据更新时会自动更新该字段的值。
字符串类型包括 CHAR(n)、VARCHAR(n)、TEXT 和 JSON。CHAR(n) 是固定长度字符串,适用于存储长度固定的数据,如身份证号(固定 18 位),不足长度时会用空格填充。VARCHAR(n) 是可变长度字符串,常用于存储用户名等长度可变的数据,根据实际存储的字符串长度分配空间。TEXT 是长文本,最大 65535 字节,可用于存储商品描述、文章内容等较长的文本信息。JSON 是结构化 JSON 数据,用于存储配置项、非结构化元数据等,方便处理和查询复杂的嵌套数据。
1.4 主键
主键是表中唯一标识每条记录的字段或字段组合,是关系型数据库的核心约束之一,具有以下特性:
唯一性方面,主键值在表中不能重复,每个值只能对应一条记录。例如,user_id
作为用户表的主键,每个 user_id
值只能对应一个用户,确保了数据的唯一性。如果出现重复的 user_id
,就无法准确区分不同的用户。
非空性要求主键字段不允许为 NULL,这是为了确保每条记录都有一个有效的标识。如果主键字段可以为 NULL,那么就无法唯一确定一条记录。比如,在一个订单表中,如果 order_id
可以为 NULL,那么就无法确定哪些记录是有效的订单。
永久性方面,主键值尽量不要随着业务的变化而修改,因为修改主键值可能会导致关联表的引用失效。例如,如果修改了订单表的 order_id
,那么与之关联的订单明细表中的 order_id
也需要相应修改,否则会出现数据不一致的问题。
MySQL 8.0 支持以下两种主键类型:
单列主键使用单个字段作为主键。例如,order_id
可以作为订单表的主键,并且可以设置为自增字段(AUTO_INCREMENT
属性),这样在插入新记录时,order_id
会自动递增,方便管理和维护。以下是创建一个包含单列主键的订单表的示例:
CREATE TABLE orders (order_id INT AUTO_INCREMENT PRIMARY KEY,customer_name VARCHAR(50),order_date DATE
);
在这个例子中,order_id
是单列主键,并且使用了 AUTO_INCREMENT
属性。当插入新记录时,order_id
会自动分配一个唯一的值。CREATE TABLE
是用于创建表的 SQL 命令,orders
是表的名称。order_id
是列名,INT
表示整数类型,AUTO_INCREMENT
表示自增属性,PRIMARY KEY
表示该列为主键。customer_name
是列名,VARCHAR(50)
表示可变长度字符串,最大长度为 50。order_date
是列名,DATE
表示日期类型。
复合主键由多个字段组合作为主键。例如,在订单明细表中,(order_id, product_id)
可以作为复合主键,确保每个订单中的每个商品都是唯一的。以下是创建一个包含复合主键的订单明细表的示例:
CREATE TABLE order_details (order_id INT,product_id INT,quantity INT,PRIMARY KEY (order_id, product_id)
);
在这个例子中,order_id
和 product_id
组合成复合主键,只有这两个字段的值都相同时,才认为是重复记录。CREATE TABLE
是用于创建表的 SQL 命令,order_details
是表的名称。order_id
和 product_id
是列名,INT
表示整数类型。quantity
是列名,INT
表示整数类型。PRIMARY KEY (order_id, product_id)
表示 order_id
和 product_id
组合为主键。
需要注意的是,MySQL 建议每张表都设置主键。如果没有显式设置主键,InnoDB 会自动生成一个隐藏的 ROW_ID
,但这可能会影响性能。
二、数据库技术构成
2.1 数据库系统
数据库系统由硬件、软件、数据和用户四个部分构成,其核心组件包括:
数据库(Database)是物理存储数据的文件集合。在 MySQL 中,根据不同的存储引擎,数据库表现为不同的文件格式,如 InnoDB 存储引擎使用 .ibd
文件,MyISAM 存储引擎使用 .MYD
文件。不同的存储引擎具有不同的物理结构和特点,用户可以根据实际需求选择合适的存储引擎。例如,InnoDB 支持事务和外键,适合处理高并发的事务性应用;MyISAM 不支持事务,但具有较高的读写性能,适合处理大量的只读数据。
数据库管理系统(DBMS)是数据库系统的核心软件层,负责数据的存储、查询、更新和安全控制等操作。MySQL 8.0 提供了 Query Optimizer(查询优化器)、Transaction Engine(事务引擎)等组件,这些组件协同工作,提高了数据库的性能和可靠性。查询优化器可以根据 SQL 语句和数据库的统计信息,选择最优的查询执行计划,从而提高查询性能。事务引擎可以保证事务的原子性、一致性、隔离性和持久性,确保数据的完整性和一致性。
数据库应用程序是面向用户的应用层,通过 API 或框架与数据库进行交互。例如,Java 可以通过 JDBC(Java Database Connectivity)连接 MySQL 数据库,Python 可以通过 pymysql 库连接 MySQL 数据库,方便开发人员进行数据的读写操作。开发人员可以使用这些 API 或框架,将数据库操作集成到自己的应用程序中,实现各种业务功能。
2.2 SQL 语言
SQL(Structured Query Language)是操作关系型数据库的标准语言,MySQL 8.0 完全兼容并扩展了 SQL 语言,它可以分为四大类:
2.2.1 数据定义语言(DDL)
用于定义数据库对象,如数据库、表、索引、视图等。常见的 DDL 命令及其说明如下:
CREATE DATABASE db_name;
用于创建一个新的数据库。以下是创建一个名为 e_commerce
的数据库的示例:
CREATE DATABASE e_commerce;
CREATE DATABASE
是用于创建数据库的 SQL 命令,e_commerce
是数据库的名称。执行这个命令后,系统会在磁盘上创建一个新的数据库目录,用于存储该数据库的数据和元数据。
CREATE TABLE table_name (col1 INT PRIMARY KEY, col2 VARCHAR(50));
用于创建一个新的表,需要指定表名和列的定义。以下是创建一个名为 users
的表,包含 user_id
和 user_name
两列的示例:
CREATE TABLE users (user_id INT PRIMARY KEY,user_name VARCHAR(50)
);
CREATE TABLE
是用于创建表的 SQL 命令,users
是表的名称。user_id
是列名,INT
表示整数类型,PRIMARY KEY
表示该列为主键。user_name
是列名,VARCHAR(50)
表示可变长度字符串,最大长度为 50。执行这个命令后,系统会在指定的数据库中创建一个新的表,用于存储用户数据。
ALTER TABLE table_name ADD COLUMN new_col DATETIME;
用于修改表的结构,如添加列。以下是在 users
表中添加一个 register_time
列的示例:
ALTER TABLE users ADD COLUMN register_time DATETIME;
ALTER TABLE
是用于修改表结构的 SQL 命令,users
是表的名称。ADD COLUMN
表示添加列,register_time
是新列的名称,DATETIME
表示日期时间类型。执行这个命令后,系统会在 users
表中添加一个新的列,用于存储用户的注册时间。
DROP TABLE table_name;
用于删除指定的表。以下是删除 users
表的示例:
DROP TABLE users;
DROP TABLE
是用于删除表的 SQL 命令,users
是表的名称。执行这个命令后,系统会从数据库中删除指定的表及其所有数据和元数据。
CREATE INDEX idx_name ON table_name(col);
用于创建索引,提高查询性能。以下是在 users
表的 user_name
列上创建一个索引的示例:
CREATE INDEX idx_user_name ON users(user_name);
CREATE INDEX
是用于创建索引的 SQL 命令,idx_user_name
是索引的名称,users
是表的名称,user_name
是要创建索引的列名。执行这个命令后,系统会在 users
表的 user_name
列上创建一个索引,加快对该列的查询速度。
2.2.2 数据操作语言(DML)
用于操作表中的数据,常见的 DML 命令及其说明如下:
INSERT INTO table_name (col1, col2) VALUES (val1, val2);
用于向表中插入新的数据。以下是向 users
表中插入一条记录的示例:
INSERT INTO users (user_id, user_name) VALUES (1, 'John');
INSERT INTO
是用于向表中插入数据的 SQL 命令,users
是表的名称。(user_id, user_name)
是要插入数据的列名,(1, 'John')
是要插入的数据值。执行这个命令后,系统会在 users
表中插入一条新的记录,包含 user_id
为 1 和 user_name
为 ‘John’ 的数据。
UPDATE table_name SET col1 = new_val WHERE condition;
用于更新表中的数据,需要指定更新的列和更新条件。以下是将 users
表中 user_id
为 1 的记录的 user_name
更新为 Mike
的示例:
UPDATE users SET user_name = 'Mike' WHERE user_id = 1;
UPDATE
是用于更新表中数据的 SQL 命令,users
是表的名称。SET user_name = 'Mike'
表示将 user_name
列的值更新为 ‘Mike’,WHERE user_id = 1
表示更新 user_id
为 1 的记录。执行这个命令后,系统会将 users
表中 user_id
为 1 的记录的 user_name
更新为 ‘Mike’。
DELETE FROM table_name WHERE condition;
用于删除表中满足条件的数据。以下是删除 users
表中 user_id
为 1 的记录的示例:
DELETE FROM users WHERE user_id = 1;
DELETE FROM
是用于删除表中数据的 SQL 命令,users
是表的名称,WHERE user_id = 1
表示删除 user_id
为 1 的记录。执行这个命令后,系统会从 users
表中删除 user_id
为 1 的记录。
TRUNCATE TABLE table_name;
用于清空表中的所有数据,比 DELETE
命令更高效,因为它不会记录删除操作的日志。以下是清空 users
表的示例:
TRUNCATE TABLE users;
TRUNCATE TABLE
是用于清空表中数据的 SQL 命令,users
是表的名称。执行这个命令后,系统会快速清空 users
表中的所有数据,并且不会记录删除操作的日志。
2.2.3 数据查询语言(DQL)
用于检索表中的数据,核心命令是 SELECT
。MySQL 8.0 增强了查询功能,如支持 CTE(公共表表达式)。以下是查询年龄大于 18 岁的用户的姓名和邮箱,按注册时间降序排列,取前 10 条记录的示例:
SELECT user_name, email
FROM users
WHERE age > 18
ORDER BY register_time DESC
LIMIT 10;
SELECT
是用于查询数据的 SQL 命令,user_name, email
是要查询的列名。FROM users
表示从 users
表中查询数据。WHERE age > 18
表示查询 age
大于 18 的记录。ORDER BY register_time DESC
表示按 register_time
列降序排列。LIMIT 10
表示取前 10 条记录。执行这个命令后,系统会从 users
表中查询出 age
大于 18 的记录,按 register_time
降序排列,取前 10 条记录,并返回 user_name
和 email
列的值。
以下是使用 CTE 查询销量前十的商品名称的示例:
WITH top_sales AS (SELECT product_id, SUM(quantity) total_soldFROM ordersGROUP BY product_idORDER BY total_sold DESCLIMIT 10
)
SELECT p.product_name, t.total_sold
FROM products p JOIN top_sales t ON p.product_id = t.product_id;
WITH
关键字定义了一个临时结果集 top_sales
,它从 orders
表中查询每个 product_id
的销售总量,并按销售总量降序排列,取前 10 条记录。然后在主查询中,将 products
表和 top_sales
临时结果集进行连接,查询出销量前十的商品名称和销售总量。执行这个命令后,系统会先计算出 top_sales
临时结果集,然后将其与 products
表进行连接,返回销量前十的商品名称和销售总量。
2.2.4 数据控制语言(DCL)
用于控制数据库的访问权限,常见的 DCL 命令及其说明如下:
GRANT SELECT, INSERT ON db_name.table_name TO 'user'@'localhost';
用于授予用户对指定数据库和表的特定权限。以下是授予用户 test_user
对 e_commerce
数据库中 orders
表的 SELECT
和 INSERT
权限的示例:
GRANT SELECT, INSERT ON e_commerce.orders TO 'test_user'@'localhost';
GRANT
是用于授予权限的 SQL 命令,SELECT, INSERT
是要授予的权限,e_commerce.orders
是要授予权限的数据库和表,'test_user'@'localhost'
是要授予权限的用户。执行这个命令后,用户 test_user
就可以在本地主机上对 e_commerce
数据库中的 orders
表进行 SELECT
和 INSERT
操作。
REVOKE DELETE ON db_name.* FROM 'user'@'localhost';
用于收回用户对指定数据库和表的特定权限。以下是收回用户 test_user
对 e_commerce
数据库中所有表的 DELETE
权限的示例:
REVOKE DELETE ON e_commerce.* FROM 'test_user'@'localhost';
REVOKE
是用于收回权限的 SQL 命令,DELETE
是要收回的权限,e_commerce.*
表示 e_commerce
数据库中的所有表,'test_user'@'localhost'
是要收回权限的用户。执行这个命令后,用户 test_user
就不能在本地主机上对 e_commerce
数据库中的任何表进行 DELETE
操作。
CREATE ROLE 'admin_role';
用于创建一个新的角色,MySQL 8.0 新增了角色管理功能。以下是创建一个名为 admin_role
的角色的示例:
CREATE ROLE 'admin_role';
CREATE ROLE
是用于创建角色的 SQL 命令,'admin_role'
是要创建的角色名称。执行这个命令后,系统会创建一个名为 admin_role
的角色。
GRANT 'admin_role' TO 'user'@'localhost';
用于为用户分配角色。以下是将 admin_role
角色分配给用户 test_user
的示例:
GRANT 'admin_role' TO 'test_user'@'localhost';
GRANT
是用于分配角色的 SQL 命令,'admin_role'
是要分配的角色,'test_user'@'localhost'
是要分配角色的用户。执行这个命令后,用户 test_user
就拥有了 admin_role
角色的所有权限。
2.3 数据库访问技术
MySQL 提供了多种方式实现应用程序与数据库的连接,不同的编程语言有对应的接口:
JDBC(Java):Java 可以通过 com.mysql.cj.jdbc.Driver
驱动连接 MySQL 数据库,支持 SSL 加密和连接池。连接池可以提高数据库连接的复用性,减少连接开销。以下是 Java 代码示例:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;public class JdbcExample {public static void main(String[] args) {try {// 加载驱动Class.forName("com.mysql.cj.jdbc.Driver");// 建立连接Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/e_commerce", "root", "password");// 创建 Statement 对象Statement stmt = conn.createStatement();// 执行查询ResultSet rs = stmt.executeQuery("SELECT * FROM users");// 处理结果集while (rs.next()) {System.out.println(rs.getString("user_name"));}// 关闭资源rs.close();stmt.close();conn.close();} catch (Exception e) {e.printStackTrace();}}
}
在这个示例中,首先使用 Class.forName("com.mysql.cj.jdbc.Driver")
加载 MySQL JDBC 驱动。然后使用 DriverManager.getConnection
方法建立与数据库的连接,需要提供数据库的 URL、用户名和密码。接着创建 Statement
对象,用于执行 SQL 语句。使用 executeQuery
方法执行查询语句,并返回结果集 ResultSet
。通过 while (rs.next())
遍历结果集,并使用 rs.getString("user_name")
获取 user_name
列的值。最后,关闭结果集、Statement
对象和连接,释放资源。
ODBC:是一种跨语言的数据库连接接口,C++、Python 等语言可以通过 ODBC 驱动连接 MySQL 数据库。例如,Python 可以使用 pyodbc
库。以下是 Python 代码示例:
import pyodbc# 建立连接
conn = pyodbc.connect('DRIVER={MySQL ODBC 8.0 ANSI Driver};SERVER=localhost;DATABASE=e_commerce;UID=root;PWD=password')
# 创建游标
cursor = conn.cursor()
# 执行查询
cursor.execute('SELECT * FROM users')
# 处理结果集
for row in cursor.fetchall():print(row[1])
# 关闭连接
conn.close()
在这个示例中,使用 pyodbc.connect
方法建立与数据库的连接,需要提供 ODBC 驱动、服务器地址、数据库名称、用户名和密码。然后创建游标 cursor
,用于执行 SQL 语句。使用 cursor.execute
方法执行查询语句,并使用 cursor.fetchall
方法获取所有结果。通过 for row in cursor.fetchall()
遍历结果集,并打印每行的第二个元素。最后,关闭连接,释放资源。
MySQL Connector/NET:是 .NET 平台专用的接口,支持 Entity Framework 等 ORM(对象关系映射)框架。通过 ORM 框架,开发人员可以使用面向对象的方式操作数据库,提高开发效率。
Node.js Connector:是 Node.js 环境的官方驱动,支持异步查询和 Promise 接口,适合开发高性能的 Node.js 应用程序。以下是 Node.js 代码示例:
const mysql = require('mysql2/promise');async function main() {const connection = await mysql.createConnection({host: 'localhost',user: 'root',password: 'password',database: 'e_commerce'});const [rows, fields] = await connection.execute('SELECT * FROM users');console.log(rows);connection.end();
}main().catch(console.error);
在这个示例中,使用 mysql2/promise
模块创建一个异步连接。通过 mysql.createConnection
方法建立与数据库的连接,需要提供主机地址、用户名、密码和数据库名称。使用 connection.execute
方法执行查询语句,并返回结果集和字段信息。通过 console.log(rows)
打印结果集。最后,使用 connection.end
方法关闭连接。
三、什么是 MySQL
3.1 客户机 - 服务器软件(C/S 架构)
MySQL 采用主从式架构,由客户端和服务器端组成:
服务器端(Server)运行 mysqld
进程,负责管理数据库文件、处理查询请求、维护事务和连接池等操作。服务器端可以部署在独立的服务器上,以提供更好的性能和稳定性。mysqld
进程是 MySQL 服务器的核心进程,它监听客户端的连接请求,处理客户端发送的 SQL 语句,并将查询结果返回给客户端。同时,它还负责管理数据库文件的存储和维护,确保数据的安全性和完整性。
客户端(Client)通过 TCP/IP 协议连接到服务器端,向服务器发送 SQL 请求并接收处理结果。客户端可以是命令行工具(如 mysql
)、图形化工具(如 Workbench)或应用程序接口。命令行工具 mysql
是一个常用的客户端工具,用户可以通过它输入 SQL 语句并执行。图形化工具 Workbench 提供了直观的界面,方便用户进行数据库管理和开发。应用程序接口则允许开发人员将 MySQL 集成到自己的应用程序中,实现数据的读写操作。
C/S 架构的工作流程如下:
首先,客户端向服务器发送连接请求,包含服务器的 IP 地址、端口号、用户名和密码等信息。客户端需要知道服务器的地址和端口号,才能与服务器建立连接。用户名和密码用于身份验证,确保只有授权的用户才能访问数据库。
服务器接收到连接请求后,验证客户端的身份信息。如果身份验证通过,服务器与客户端建立连接,并开始接收客户端发送的 SQL 语句。服务器会检查用户名和密码是否正确,如果正确则建立连接,并为客户端分配一个会话。
服务器接收到 SQL 语句后,由查询优化器对 SQL 语句进行解析和优化,生成最优的执行计划。然后,存储引擎根据执行计划从数据库文件中读取数据。查询优化器会分析 SQL 语句的语义和语法,根据数据库的统计信息和索引情况,选择最优的执行计划。存储引擎负责实际的数据存储和读取操作,不同的存储引擎有不同的实现方式。
最后,服务器将查询结果集返回给客户端,客户端接收到结果集后,根据需要进行渲染或处理。客户端可以将结果集显示在界面上,或者进行进一步的计算和处理。
3.2 MySQL 版本
MySQL 8.0 是目前主流的稳定版本,于 2018 年发布,相比 5.7 版本有以下重要改进:
性能提升方面,优化了 JSON 处理、CTE 查询和哈希索引等功能,事务处理速度提升约 2 倍。例如,在处理包含大量 JSON 数据的查询时,性能有显著提升。JSON 是一种常用的数据格式,在现代应用中广泛使用。MySQL 8.0 对 JSON 处理的优化,使得处理 JSON 数据更加高效。CTE 查询允许在查询中定义临时结果集,提高了 SQL 语句的可读性和可维护性。哈希索引可以加快某些类型的查询速度。
安全性增强方面,默认使用 caching_sha2_password
加密算法,提高了密码的安全性。同时,支持角色管理和行级权限控制,方便管理员进行精细的权限管理。caching_sha2_password
是一种更安全的加密算法,可以有效防止密码泄露。角色管理允许管理员创建不同的角色,并为角色分配不同的权限。行级权限控制可以对表中的每一行数据进行权限控制,确保只有授权的用户才能访问特定的数据。
JSON 增强方面,支持 JSON 文档键排序、路径表达式(JSON_PATH
)和 JSON_TABLE
函数,可以将 JSON 数据映射为表结构,方便进行查询和分析。JSON 文档键排序可以按照指定的顺序对 JSON 文档中的键进行排序。路径表达式(JSON_PATH
)允许用户使用类似于 XPath 的语法来查询 JSON 数据。JSON_TABLE
函数可以将 JSON 数据转换为表结构,方便进行 SQL 查询。
窗口函数方面,新增了 ROW_NUMBER()
、RANK()
、DENSE_RANK()
等窗口函数,简化了复杂的排名和分组统计操作。窗口函数可以在不使用子查询的情况下进行排名和分组统计,提高了查询的效率和可读性。
CTE 支持方面,允许在查询中定义临时结果集,提高了 SQL 语句的可读性和可维护性。CTE 可以将复杂的查询拆分为多个简单的步骤,每个步骤使用一个临时结果集,使得查询更加清晰和易于理解。
MySQL 的版本命名规则为 主版本号.次版本号.修订号
,如 8.0.36
。开发版本通常会标注 alpha
或 beta
,表示该版本处于开发测试阶段;稳定版本会标注 GA
(General Availability),表示该版本可以正式投入使用。
3.3 MySQL 的优势
3.3.1 速度与性能
查询优化器方面,MySQL 8.0 的查询优化器支持基于成本的查询计划,能够自动选择最优的索引和连接方式,提高查询性能。例如,在处理复杂的多表连接查询时,查询优化器可以快速找到最优的执行路径。查询优化器会根据数据库的统计信息和索引情况,计算不同执行计划的成本,并选择成本最低的执行计划。
InnoDB 存储引擎支持行级锁、ACID 事务和聚簇索引,适合高并发事务处理。在电商下单等场景中,行级锁可以减少锁冲突,提高并发性能;ACID 事务可以保证数据的一致性和完整性;聚簇索引可以提高数据的检索效率。行级锁只锁定需要操作的行,而不是整个表,从而减少了锁冲突。ACID 事务确保了事务的原子性、一致性、隔离性和持久性,保证了数据的正确性。聚簇索引将数据行按照主键的顺序存储,提高了主键查询的效率。
原生 JSON 支持方面,可以直接操作 JSON 数据,避免了传统字符串解析的性能损耗。例如,在处理包含 JSON 数据的查询时,无需先将 JSON 数据转换为字符串进行解析,提高了查询效率。MySQL 8.0 提供了一系列的 JSON 函数和操作符,方便对 JSON 数据进行查询和修改。
3.3.2 成本优势
开源免费方面,MySQL 的社区版完全免费,企业可以根据自身需求选择是否购买商业版。商业版提供了一些高级功能,如技术支持、安全审计等,但对于大多数小型和中型企业来说,社区版已经足够满足需求,节省了软件采购成本。开源免费使得 MySQL 成为了很多企业的首选数据库,尤其是对于预算有限的企业。
低硬件要求方面,MySQL 采用轻量级设计,对硬件资源的要求较低,可以在低配服务器(如 2 核 4G)上运行,节省了硬件采购和维护成本。轻量级设计使得 MySQL 在资源有限的环境下也能高效运行,降低了企业的硬件成本。
3.3.3 易用性
SQL 兼容性方面,支持标准 SQL 语法,学习成本低。对于已经熟悉 SQL 语言的开发人员来说,可以快速上手 MySQL。标准 SQL 语法使得开发人员可以使用他们熟悉的 SQL 语句进行数据库操作,减少了学习成本。
丰富文档方面,MySQL 的官方文档详细且更新及时,同时社区也非常活跃,如 Stack Overflow、MySQL 论坛等,开发人员可以在这些社区中获取帮助和交流经验。官方文档提供了详细的使用说明和示例,社区则为开发人员提供了一个交流和学习的平台。
3.3.4 可移植性
跨平台支持方面,支持 Windows、Linux、macOS、Solaris 等多种操作系统,应用程序可以在不同的操作系统之间无缝迁移,提高了开发和部署的灵活性。跨平台支持使得开发人员可以根据自己的需求选择合适的操作系统进行开发和部署,同时也方便了应用程序的迁移和扩展。
容器化支持方面,原生支持 Docker 部署,通过 docker-compose
可以快速搭建主从集群,方便进行开发、测试和生产环境的部署。Docker 是一种轻量级的容器化技术,可以将应用程序和其依赖的环境打包成一个容器,方便部署和管理。docker-compose
可以帮助用户快速搭建多个容器组成的集群,提高了开发和测试的效率。
3.3.5 丰富接口
支持 JDBC、ODBC、Python、PHP 等几乎所有主流编程语言的接口,方便开发人员将 MySQL 集成到不同的技术栈中,提高了开发效率。丰富的接口使得开发人员可以使用自己熟悉的编程语言进行数据库操作,无需学习新的接口和技术。
3.3.6 安全性与连接性
细粒度权限控制方面,可以按数据库、表、列级别进行授权,8.0 版本新增了角色管理功能,简化了权限分配过程。管理员可以根据用户的职责和需求,为用户分配不同的权限,确保数据的安全性。细粒度权限控制可以精确地控制用户对数据库的访问权限,防止敏感数据的泄露。
加密连接方面,支持 SSL/TLS 加密传输,防止数据在网络传输过程中被窃取。在生产环境中,建议使用加密连接,提高数据传输的安全性。SSL/TLS 加密可以对数据进行加密,确保数据在传输过程中不被窃取和篡改。
四、MySQL 的安装
4.1 MySQL 的编译安装
4.1.1 准备工作
在 OpenEuler 系统中通过源码编译安装 MySQL 8.0.36,需要先完成以下准备工作:
4.1.1.1 卸载 MariaDB 并安装依赖包
在安装 MySQL 之前,需要检查系统中是否已经安装了 MariaDB,如果安装了,需要先卸载。同时,需要安装编译所需的依赖包。以下是具体的命令和说明:
# 检查是否安装 MariaDB
[root@localhost ~]# rpm -q mariadb
mariadb-5.5.52-1.el7.x86_64# 卸载 MariaDB
[root@localhost ~]# dnf remove mariadb# 安装编译依赖包
[root@localhost ~]# dnf install -y gcc gcc-c++ make cmake autoconf libtool bison re2c \
openssl-devel libxml2-devel zlib-devel curl-devel libpng-devel \
libjpeg-turbo-devel freetype-devel libicu-devel oniguruma-devel \
sqlite-devel libxslt-devel libzip-devel pcre-devel apr-devel apr-util-devel \
ncurses-devel wget libtirpc-devel rpcgen
rpm -q mariadb
用于检查系统中是否安装了 MariaDB。如果安装了,会显示 MariaDB 的版本信息。dnf remove mariadb
用于卸载 MariaDB。dnf install -y
用于安装指定的依赖包,-y
表示自动确认安装。gcc
和 gcc-c++
是编译工具,用于将源代码编译成可执行文件。openssl-devel
提供加密支持,确保 MySQL 数据库的安全性。libxml2-devel
用于 XML 处理,MySQL 可能会使用到 XML 相关的功能。其他依赖包也都是为了确保 MySQL 的各项功能能够正常运行。
4.1.1.2 关闭 SELinux 和防火墙
SELinux 和防火墙可能会阻止 MySQL 服务的正常运行,在安装过程中建议关闭,在生产环境中可以后续配置白名单。以下是具体的命令和说明:
# 修改 SELinux 配置为禁用
[root@localhost ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
[root@localhost ~]# setenforce 0 # 立即生效# 关闭防火墙并禁止开机启动
[root@localhost ~]# systemctl disable firewalld
[root@localhost ~]# systemctl stop firewalld
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
用于修改 SELinux 的配置文件,将 SELINUX=enforcing
改为 SELINUX=disabled
,表示禁用 SELinux。setenforce 0
用于立即生效 SELinux 的禁用配置。systemctl disable firewalld
用于禁止防火墙开机启动,systemctl stop firewalld
用于停止防火墙服务。
4.1.1.3 安装 cmake 编译工具
cmake 是一个跨平台的编译工具,MySQL 8.0 的源码编译必须使用 cmake 生成 Makefile。以下是具体的命令和说明:
# 下载 cmake-3.16.2(最新稳定版)
[root@localhost ~]# wget https://cmake.org/files/v3.16/cmake-3.16.2.tar.gz
[root@localhost ~]# tar zxf cmake-3.16.2.tar.gz
[root@localhost ~]# cd cmake-3.16.2# 配置、编译、安装
[root@www cmake-3.16.2]# ./configure
[root@www cmake-3.16.2]# gmake && gmake install
wget https://cmake.org/files/v3.16/cmake-3.16.2.tar.gz
用于下载 cmake-3.16.2 的压缩包。tar zxf cmake-3.16.2.tar.gz
用于解压压缩包。cd cmake-3.16.2
用于进入解压后的目录。./configure
用于配置 cmake 的编译选项。gmake && gmake install
用于编译和安装 cmake。gmake
是 GNU Make 的别名,用于执行 Makefile 中的编译规则。
4.1.1.4 安装 Boost 库
MySQL 5.7 及以上版本依赖 Boost 库,编译时需要通过 -DWITH_BOOST
指定 Boost 库的路径。以下是具体的命令和说明:
# 下载 Boost 1.77.0(与 MySQL 8.0 兼容)
[root@localhost ~]# wget http://sourceforge.net/projects/boost/files/boost/1.77.0/boost_1_77_0.tar.gz
[root@localhost ~]# tar -zxf boost_1_77_0.tar.gz
[root@localhost ~]# mv boost_1_77_0 /usr/local/boost
wget http://sourceforge.net/projects/boost/files/boost/1.77.0/boost_1_77_0.tar.gz
用于下载 Boost 1.77.0 的压缩包。tar -zxf boost_1_77_0.tar.gz
用于解压压缩包。mv boost_1_77_0 /usr/local/boost
用于将解压后的目录移动到 /usr/local/boost
目录下。
4.1.2 源码编译及安装
4.1.2.1 创建运行用户
为了增强安全性,建议使用独立的用户运行 MySQL 服务,避免以 root 权限运行。以下是具体的命令和说明:
# 创建 mysql 用户组和用户(不允许登录系统)
[root@localhost ~]# groupadd mysql
[root@localhost ~]# useradd -M -s /sbin/nologin mysql -g mysql
groupadd mysql
用于创建 mysql
用户组。useradd -M -s /sbin/nologin mysql -g mysql
用于创建 mysql
用户,-M
表示不创建用户的主目录,-s /sbin/nologin
表示不允许用户登录系统,-g mysql
表示将用户添加到 mysql
用户组中。
4.1.2.2 解包源码
将 MySQL 源码解压到 /usr/src
目录,并进入该目录。以下是具体的命令和说明:
# 解压 MySQL 源码到 /usr/src 并进入目录
[root@localhost ~]# tar zxf mysql-8.0.36.tar.gz -C /usr/src
[root@localhost ~]# cd /usr/src/mysql-8.0.36
tar zxf mysql-8.0.36.tar.gz -C /usr/src
用于将 MySQL 源码解压到 /usr/src
目录下。cd /usr/src/mysql-8.0.36
用于进入解压后的目录。
4.1.2.3 配置编译参数
创建一个独立的构建目录,避免污染源码,然后使用 cmake 配置编译参数。以下是具体的命令和说明:
# 创建独立构建目录(避免源码污染)
[root@localhost ~]# mkdir build && cd build # 执行 cmake 配置
[root@www mysql-8.0.36]# cmake .. \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \ # 安装目录
-DSYSCONFDIR=/etc \ # 配置文件目录
-DMYSQL_DATADIR=/usr/local/mysql/data \ # 数据文件目录
-DWITH_SSL=system \ # 使用系统 SSL 库
-DENABLED_LOCAL_INFILE=ON \ # 允许本地文件导入
-DWITH_BOOST=/usr/local/boost \ # Boost 库路径
-DDEFAULT_CHARSET=utf8 \ # 默认字符集
-DDEFAULT_COLLATION=utf8_general_ci \ # 默认排序规则
-DWITH_EXTRA_CHARSETS=all # 支持所有额外字符集
mkdir build && cd build
用于创建独立的构建目录并进入该目录。cmake ..
用于执行 cmake 配置,..
表示上级目录,即 MySQL 源码目录。-DCMAKE_INSTALL_PREFIX=/usr/local/mysql
指定了 MySQL 的安装位置。-WITH_BOOST=/usr/local/boost
是 MySQL 8.0 编译必须的参数,指定了 Boost 库的路径。utf8
字符集支持中文等多语言,确保数据库可以存储和处理各种语言的数据。
4.1.2.4 编译安装
使用 make -j$(nproc)
命令进行并行编译,利用系统的所有 CPU 核心,加快编译速度。以下是具体的命令和说明:
# 并行编译(利用所有 CPU 核心加快速度)
[root@localhost build]# make -j$(nproc)
[root@localhost build]# make install
make -j$(nproc)
中的 $(nproc)
会返回系统的 CPU 核心数,-j
表示并行编译的线程数,因此 make -j$(nproc)
会利用系统的所有 CPU 核心进行并行编译,大幅缩短了编译时间。在生产环境中,编译过程可能需要数小时。make install
用于安装编译好的 MySQL 程序。
4.1.3 安装后的调整
4.1.3.1 建立配置文件
创建 my.cnf
配置文件,配置 MySQL 的相关参数。以下是具体的命令和说明:
# 创建 my.cnf 配置文件
[root@localhost ~]# vi /etc/my.cnf
[client]
socket=/usr/local/mysql/data/mysql.sock
[mysqld]
socket=/usr/local/mysql/data/mysql.sock
bind-address = 0.0.0.0 # 监听所有 IP
skip-name-resolve # 禁用 DNS 解析
port = 3306 # 端口号
basedir=/usr/local/mysql # 安装目录
datadir=/usr/local/mysql/data # 数据目录
max_connections=2048 # 最大连接数
character-set-server=utf8 # 服务端字符集
default-storage-engine=INNODB # 默认存储引擎
max_allowed_packet=16M # 最大数据包大小
vi /etc/my.cnf
用于编辑 my.cnf
配置文件。[client]
部分配置客户端连接的参数,socket=/usr/local/mysql/data/mysql.sock
表示客户端通过该套接字文件连接到 MySQL 服务器。[mysqld]
部分配置 MySQL 服务器的参数,bind-address = 0.0.0.0
允许远程连接,方便不同主机的客户端连接到 MySQL 服务器。skip-name-resolve
避免了 DNS 解析延迟,提高了连接速度。port = 3306
是 MySQL 服务器的默认端口号。basedir=/usr/local/mysql
指定了 MySQL 的安装目录。datadir=/usr/local/mysql/data
指定了 MySQL 的数据目录。max_connections=2048
表示 MySQL 服务器允许的最大连接数。character-set-server=utf8
表示服务端使用 utf8
字符集。default-storage-engine=INNODB
表示默认使用 InnoDB 存储引擎。max_allowed_packet=16M
表示 MySQL 服务器允许的最大数据包大小。
4.1.3.2 初始化数据库
可以选择无密码模式或带密码模式初始化数据库。在生产环境中,建议使用带密码模式。以下是具体的命令和说明:
# 无密码模式初始化(生产环境建议使用默认密码模式)
[root@localhost ~]# /usr/local/mysql/bin/mysqld --initialize-insecure --user=mysql \
--basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
# 带密码模式初始化(生成随机密码)
[root@localhost ~]# /usr/local/mysql/bin/mysqld --initialize --user=mysql \
--basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
# 初始化后会显示类似 "A temporary password is generated for root@localhost: Xr6:Gg*u8?/8"
/usr/local/mysql/bin/mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
用于无密码模式初始化数据库,--initialize-insecure
选项会生成无密码的 root 用户,在生产环境中不建议使用,因为这会存在安全风险。/usr/local/mysql/bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
用于带密码模式初始化数据库,会生成一个随机密码,需要妥善保存这个密码,用于后续登录 MySQL 服务器。
4.1.3.3 设置环境变量
将 MySQL 命令添加到系统的 PATH
环境变量中,这样可以在任意目录执行 mysql
、mysqldump
等命令。以下是具体的命令和说明:
# 将 MySQL 命令添加到 PATH
[root@www mysql-8.0.36]# echo "export PATH=$PATH:/usr/local/mysql/bin">> /etc/profile
[root@www mysql-8.0.36]# . /etc/profile # 立即生效
echo "export PATH=$PATH:/usr/local/mysql/bin">> /etc/profile
用于将 /usr/local/mysql/bin
目录添加到 PATH
环境变量中。>>
表示追加内容到文件末尾。/etc/profile
是系统的环境变量配置文件。. /etc/profile
用于立即生效环境变量的配置。
4.1.4 添加系统服务
4.1.4.1 复制服务脚本
复制 MySQL 的启动脚本到 /etc/rc.d/init.d
目录,并赋予执行权限。以下是具体的命令和说明:
# 复制启动脚本并赋予执行权限
[root@localhost ~]# cp /usr/local/mysql/support-files/mysql.server /etc/rc.d/init.d/mysqld
[root@localhost ~]# chmod +x /etc/rc.d/init.d/mysqld
cp /usr/local/mysql/support-files/mysql.server /etc/rc.d/init.d/mysqld
用于将 MySQL 的启动脚本复制到 /etc/rc.d/init.d
目录下,并命名为 mysqld
。chmod +x /etc/rc.d/init.d/mysqld
用于赋予 mysqld
脚本执行权限。
4.1.4.2 创建 systemd 服务配置
编辑 mysqld.service
文件,配置 systemd 服务。以下是具体的命令和说明:
# 编辑 mysqld.service
[root@localhost ~]# vi /lib/systemd/system/mysqld.service
[Unit]
Description=mysqld
After=network.target[Service]
Type=forking
ExecStart=/etc/rc.d/init.d/mysqld start
ExecReload=/etc/rc.d/init.d/mysqld restart
ExecStop=/etc/rc.d/init.d/mysqld stop
PrivateTmp=true[Install]
WantedBy=multi-user.target# 重载 systemd 配置并启用服务
[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl enable mysqld
[root@localhost ~]# systemctl start mysqld
vi /lib/systemd/system/mysqld.service
用于编辑 mysqld.service
文件。[Unit]
部分配置服务的基本信息,Description=mysqld
是服务的描述信息,After=network.target
表示该服务在网络服务启动后启动。[Service]
部分配置服务的启动、重启和停止命令,Type=forking
表示服务以分叉的方式启动。ExecStart=/etc/rc.d/init.d/mysqld start
表示启动服务的命令。ExecReload=/etc/rc.d/init.d/mysqld restart
表示重启服务的命令。ExecStop=/etc/rc.d/init.d/mysqld stop
表示停止服务的命令。PrivateTmp=true
表示为服务创建一个私有的临时目录。[Install]
部分配置服务的安装信息,WantedBy=multi-user.target
表示该服务在多用户模式下启动。systemctl daemon-reload
用于重载 systemd 的配置文件。systemctl enable mysqld
用于启用 mysqld
服务,使其在开机时自动启动。systemctl start mysqld
用于启动 mysqld
服务。
4.1.4.3 验证服务启动
查看 MySQL 服务的状态和端口监听情况,确保服务正常启动。以下是具体的命令和说明:
# 查看服务状态
[root@localhost ~]# systemctl status mysqld.service
● mysqld.service - mysqld
Loaded: loaded (/usr/lib/systemd/system/mysqld.service ; enabled ; vendor preset: disabled)
Active: active (running) since Sun 2017-02-19 19:43:37 CST ; 2min 58s ago# 查看端口监听
[root@localhost ~]# netstat -anpt | grep mysqld
tcp6 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 133192/mysqld
systemctl status mysqld.service
用于查看 mysqld
服务的状态。如果服务正常启动,会显示 Active: active (running)
。netstat -anpt | grep mysqld
用于查看端口监听情况,netstat -anpt
用于显示所有网络连接和端口监听信息,| grep mysqld
用于过滤出与 mysqld
相关的信息。如果服务正常启动,会显示 0.0.0.0:3306
处于监听状态。
4.2 MySQL 的二进制安装
4.2.1 基础环境准备
4.2.1.1 安装基础工具和依赖包
安装基础工具和 MySQL 依赖包,确保系统具备安装和运行 MySQL 的环境。以下是具体的命令和说明:
# 安装基础工具
[root@localhost ~]# dnf -y install gcc vim wget net-tools lrzsz tar# 安装 MySQL 依赖包
[root@localhost ~]# dnf install -y libaio numactl openssl ncurses-compat-libs
dnf -y install gcc vim wget net-tools lrzsz tar
用于安装基础工具,-y
表示自动确认安装。gcc
是编译工具,vim
是文本编辑器,wget
用于下载文件,net-tools
包含网络工具,lrzsz
用于文件传输,tar
用于文件压缩和解压。dnf install -y libaio numactl openssl ncurses-compat-libs
用于安装 MySQL 依赖包,libaio
提供异步 I/O 支持,提高了数据库的 I/O 性能。numactl
用于优化多处理器内存分配,确保 MySQL 在多处理器系统上能够高效运行。openssl
用于加密连接,保障数据传输的安全性。ncurses-compat-libs
提供兼容的终端库。
4.2.1.2 创建运行用户并关闭安全限制
创建 mysql
用户,并关闭 SELinux 和防火墙,避免对 MySQL 服务造成干扰。以下是具体的命令和说明:
# 创建 mysql 用户
[root@localhost ~]# useradd -M -s /sbin/nologin mysql# 关闭 SELinux 和防火墙(同编译安装步骤)
[root@localhost ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
[root@localhost ~]# setenforce 0
[root@localhost ~]# systemctl disable firewalld
[root@localhost ~]# systemctl stop firewalld
useradd -M -s /sbin/nologin mysql
用于创建 mysql
用户,-M
表示不创建用户的主目录,-s /sbin/nologin
表示不允许用户登录系统。sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
用于修改 SELinux 的配置文件,将 SELINUX=enforcing
改为 SELINUX=disabled
,表示禁用 SELinux。setenforce 0
用于立即生效 SELinux 的禁用配置。systemctl disable firewalld
用于禁止防火墙开机启动,systemctl stop firewalld
用于停止防火墙服务。
4.2.2 二进制安装
4.2.2.1 解压安装包并配置
解压 MySQL 二进制包,并创建数据目录,设置目录权限。然后初始化数据库,生成 root 用户的随机密码。以下是具体的命令和说明:
# 解压二进制包
[root@localhost ~]# tar xf mysql-8.0.36-linux-glibc2.28-x86_64.tar.xz
[root@localhost ~]# mv mysql-8.0.36-linux-glibc2.28-x86_64 /usr/local/mysql# 创建数据目录并设置权限
[root@localhost ~]# mkdir /usr/local/mysql/data
[root@localhost ~]# chown -R mysql:mysql /usr/local/mysql # 初始化数据库(带密码模式,生成随机密码)
[root@localhost ~]# cd /usr/local/mysql/bin
[root@localhost ~]# ./mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
tar xf mysql-8.0.36-linux-glibc2.28-x86_64.tar.xz
用于解压 MySQL 二进制包。mv mysql-8.0.36-linux-glibc2.28-x86_64 /usr/local/mysql
用于将解压后的目录移动到 /usr/local/mysql
目录下。mkdir /usr/local/mysql/data
用于创建数据目录。chown -R mysql:mysql /usr/local/mysql
用于将 /usr/local/mysql
目录及其子目录的所有权设置为 mysql
用户和 mysql
用户组。cd /usr/local/mysql/bin
用于进入 /usr/local/mysql/bin
目录。./mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
用于初始化数据库,会生成一个随机密码,需要妥善保存这个密码,用于后续登录 MySQL 服务器。
4.2.3 设定配置文件
创建 my.cnf
配置文件,配置内容与编译安装一致。然后设置环境变量,将 MySQL 命令添加到 PATH
中。以下是具体的命令和说明:
# 创建 my.cnf(配置内容与编译安装一致)
[root@localhost ~]# vi /etc/my.cnf
[client]
socket=/usr/local/mysql/data/mysql.sock
[mysqld]
socket=/usr/local/mysql/data/mysql.sock
bind-address = 0.0.0.0
skip-name-resolve
port = 3306
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
max_connections=2048
character-set-server=utf8
default-storage-engine=INNODB
max_allowed_packet=16M# 设置环境变量
[root@localhost ~]# echo "export PATH=$PATH:/usr/local/mysql/bin">> /etc/profile
[root@localhost ~]# . /etc/profile
vi /etc/my.cnf
用于编辑 my.cnf
配置文件,配置内容与编译安装一致。echo "export PATH=$PATH:/usr/local/mysql/bin">> /etc/profile
用于将 /usr/local/mysql/bin
目录添加到 PATH
环境变量中。>>
表示追加内容到文件末尾。/etc/profile
是系统的环境变量配置文件。. /etc/profile
用于立即生效环境变量的配置。
4.2.4 配置 systemctl 启动
复制服务脚本并创建 systemd 服务,配置与编译安装一致。然后重载 systemd 配置,启用并启动 MySQL 服务,最后验证端口监听情况。以下是具体的命令和说明:
# 复制服务脚本并创建 systemd 服务(同编译安装步骤)
[root@localhost ~]# cp /usr/local/mysql/support-files/mysql.server /etc/rc.d/init.d/mysqld
[root@localhost ~]# chmod +x /etc/rc.d/init.d/mysqld[root@localhost ~]# vi /lib/systemd/system/mysqld.service
[Unit]
Description=mysqld
After=network.target[Service]
Type=forking
ExecStart=/etc/rc.d/init.d/mysqld start
ExecReload=/etc/rc.d/init.d/mysqld restart
ExecStop=/etc/rc.d/init.d/mysqld stop
PrivateTmp=true[Install]
WantedBy=multi-user.target# 重载 systemd 配置
[root@localhost ~]# systemctl daemon-reload
# 启用服务
[root@localhost ~]# systemctl enable mysqld
# 启动服务
[root@localhost ~]# systemctl start mysqld
# 验证端口监听情况
[root@localhost ~]# netstat -anpt | grep mysqld
cp /usr/local/mysql/support-files/mysql.server /etc/rc.d/init.d/mysqld
用于将 MySQL 的启动脚本复制到 /etc/rc.d/init.d
目录下,并命名为 mysqld
。chmod +x /etc/rc.d/init.d/mysqld
用于赋予 mysqld
脚本执行权限。vi /lib/systemd/system/mysqld.service
用于编辑 mysqld.service
文件,配置与编译安装一致。systemctl daemon-reload
用于重载 systemd 的配置文件。systemctl enable mysqld
用于启用 mysqld
服务,使其在开机时自动启动。systemctl start mysqld
用于启动 mysqld
服务。netstat -anpt | grep mysqld
用于查看端口监听情况,如果服务正常启动,会显示 0.0.0.0:3306
处于监听状态。
总结
本文全面且深入地介绍了 MySQL 的相关知识,从数据库基础入手,详细阐述了数据库的定义、发展历程、核心特点,以及表、数据类型和主键等基本概念。接着介绍了数据库技术构成,包括数据库系统的组成、SQL 语言的四大类以及数据库访问技术。然后对 MySQL 进行了详细介绍,包括其 C/S 架构、版本特点和优势。最后,详细说明了 MySQL 8.0 在 OpenEuler 系统上的编译安装和二进制安装方法,包括准备工作、安装过程、安装后的调整以及系统服务的配置和验证。通过本文的学习,读者可以全面了解 MySQL 的基础知识和安装方法,为进一步学习和使用 MySQL 打下坚实的基础。在实际应用中,读者可以根据自己的需求选择合适的安装方式,并合理运用 MySQL 的各项功能,提高数据管理和处理的效率。同时,需要注意数据库的安全性和性能优化,确保数据的安全和稳定。