MySQL 数据库初体验:从基础概念到服务部署全攻略

前言

21 世纪,人类迈入了 "信息爆炸时代",大量的数据、信息在不断产生、传递与交换,如何高效地存储、检索、维护和管理它们,对数据的有效存储、高效访问、方便共享和安全、有效控制已经成为信息时代亟待解决的问题。

数据库技术便是解决这一问题的核心技术。它是计算机科学的重要分支,其应用已从早期的商务数据处理,渗透到如今的地理信息、人工智能、物联网等各个领域。掌握数据库的基本原理与操作方法,是每一位 IT 从业者必备的核心技能。

本文将以 MySQL 数据库为核心,从数据库的基础概念讲起,逐步深入到 MySQL 服务的编译安装、二进制包安装,以及客户端访问等实操环节,为初学者提供一份全面、系统的 MySQL 入门指南。


1.1 数据库简介

1.1.1 使用数据库的必要性

在信息化时代,数据已经成为核心生产要素。无论是企业的业务运营、政府的公共管理,还是个人的日常生活,都离不开数据的支撑。而数据库,正是存储、管理和利用这些数据的核心工具。

使用数据库具有以下显著优势:

  • 结构化存储:可以将海量数据按照一定的逻辑结构进行组织,避免了文件系统中数据杂乱无章的问题,便于快速检索和访问。
  • 数据共享:允许多个用户或应用程序同时访问同一份数据,实现了数据的高效共享与协同工作。
  • 数据完整性:通过约束、事务等机制,保证数据的一致性和准确性,防止数据被非法篡改或损坏。
  • 数据安全性:提供了完善的权限管理和安全机制,保护敏感数据不被泄露或破坏。
  • 可扩展性:能够随着业务的发展灵活地扩展存储容量和处理能力,满足不断增长的数据需求。

1.1.2 数据库的基本概念

1. 数据

数据(Data)是描述事物的符号记录,是信息的载体。它可以是数字、文字、图形、图像、声音、视频等多种形式。在计算机中,数据以 "记录" 的形式按照统一的格式进行存储,例如在学生信息表中,一条记录就代表一个学生的完整信息。

2. 数据库和数据库表

数据库(Database,DB)是 "按照数据结构来组织、存储和管理数据的仓库"。简单来说,数据库就是表的集合。它以一定的数据模型和组织方式,将相互关联的数据存储在一起,形成一个结构化的数据集合。

而数据库表(Table)则是数据库中最基本、最重要的组成单元,它是一个二维结构,由行和列组成。每一行代表一条记录,每一列代表一个属性。例如,在一个学生信息表中,每一行代表一个学生,每一列分别代表学号、姓名、性别、年龄等属性。

3. 数据库管理系统和数据库系统

数据库管理系统(Database Management System,DBMS)是实现对数据库资源进行组织、管理和存取的系统软件。它是用户与数据库之间的接口,提供了数据定义、数据操纵、数据库运行管理、数据维护等核心功能。

常见的 DBMS 功能包括:

  • 数据定义:创建、修改和删除数据库、表、视图等对象。
  • 数据操纵:对数据进行增、删、改、查操作。
  • 数据库运行管理:并发控制、事务管理、故障恢复等,保证数据库的高效和安全运行。
  • 数据维护:数据备份、恢复、性能优化等。

数据库系统(Database System,DBS)则是一个更宏观的概念,它由数据库、数据库管理系统、应用程序、用户等部分组成。用户可以通过 DBMS 或应用程序来操作数据库,完成各种业务需求。

1.1.3 数据库发展史

数据库技术的发展至今已经成为先进信息技术的重要组成部分,是现代计算机信息系统和计算机应用系统的基础和核心。数据库技术最初产生于 20 世纪 60 年代中期,根据数据模型的发展,可以划分为三个阶段:第一代的层次与网状数据库系统;第二代的关系数据库系统;第三代的以面向对象模型为主要特征的数据库系统。

1. 数据库系统发展史

(1) 初级阶段 ------ 第一代数据库20 世纪 60 年代,第一代数据库系统问世。它们是以层次模型与网状模型为数据模型的数据库系统。

  • 典型代表:1969 年 IBM 公司研制的层次模型 的数据库管理系统 ------IMS(Information Management System);以及 20 世纪 70 年代美国数据库系统语言协会(CODASYL)下属的数据库任务组(DBTG)提出的网状模型数据库系统。
  • 特点:数据结构复杂,操作繁琐,不适合初学者。

(2) 中级阶段 ------ 第二代数据库 自 70 年代起,关系数据库开始出现。

  • 典型代表:IBM 研究员 E.F.Codd 于 1970 年发表的论文《大型共享数据库的关系模型》,奠定了关系数据库的理论基础。随后,IBM 的 System R、Oracle 等产品相继问世。
  • 特点:以关系模型为基础,用简单的二维表来表示数据,操作便捷,理论成熟,成为至今应用最广泛的数据库类型。
  • 里程碑:SQL(Structured Query Language) 诞生,它成为关系数据库的标准语言,极大地简化了数据库操作。

(3) 高级阶段 ------ 第三代数据库 随着面向对象技术的发展,面向对象数据库应运而生。

  • 特点:将数据和操作数据的方法封装为 "对象",更符合现实世界的建模需求,能够处理更复杂的数据类型(如图形、音频、文档等)。
  • 现状:目前,关系数据库依然是市场的主流,而面向对象数据库则在特定领域(如 CAD、GIS)得到了广泛应用。
2. 经典数据模型

数据模型是数据库系统的核心和基础,它规定了数据的组织方式和操作规则。在数据库发展史上,出现了三种经典的数据模型:网状模型、层次模型和关系模型

(1) 网状模型

  • 数据结构:用 "网状结构" 来表示实体与实体之间的联系。它允许一个节点有多个父节点,也允许一个节点有多个子节点,能够直接表达 "多对多" 的关系。
  • 优点:可以直观地描述复杂的现实世界关系。
  • 缺点:数据结构和操作都非常复杂,编程难度大,不易维护。

(2) 层次模型

  • 数据结构:用 "树形结构" 来表示实体与实体之间的联系。它是一种有根、有序的树,每个节点只有一个父节点(根节点除外),是 "一对多" 的关系。
  • 优点:结构简单,查询效率高。
  • 缺点:无法直接表达 "多对多" 的关系,数据插入、删除操作复杂。

(3) 关系模型

  • 数据结构:用 "二维表(关系表)" 来表示实体与实体之间的联系。它是目前最重要、最流行的数据模型。
  • 核心概念
    • 实体:现实世界中客观存在并可相互区别的事物(如 "学生""银行账户")。
    • 关系:实体与实体之间的联系(如 "学生选课""客户拥有账户")。
    • 属性:实体所具有的某一特性(如 "学号""姓名""账户余额")。
  • 优点
    • 结构简单,易于理解和使用。
    • 有严格的数学理论基础(集合论、关系代数)。
    • 数据独立性高,程序与数据分离。
    • 操作便捷,通过 SQL 语言即可完成复杂的数据查询和管理。
  • 地位:关系模型是现代数据库技术的基石,MySQL、Oracle、SQL Server 等主流数据库均基于此模型。

1.1.4 当今主流数据库介绍

1. 关系数据库

(1) MySQL

  • 开源、免费、轻量、高性能,是目前最受欢迎的开源关系型数据库。
  • 由瑞典 MySQL AB 公司开发,后被 Sun 公司收购,最终归属 Oracle。
  • 广泛应用于 Web 开发、中小企业、互联网创业等场景,是 LAMP(Linux+Apache+MySQL+PHP)技术栈的核心组件。

(2) Oracle

  • 功能最强大、最稳定的商业关系型数据库,由 Oracle 公司开发。
  • 支持复杂事务、高并发、分布式架构,是大型企业、金融、电信等核心业务系统的首选。
  • 性能卓越,安全性高,但价格昂贵,对运维人员技术要求高。

(3) SQL Server

  • 微软公司开发的关系型数据库,与 Windows Server 操作系统深度集成。
  • 界面友好,易于使用,适合在 Windows 平台下的企业级应用。
  • 提供了丰富的商业智能和数据分析功能。

(4) PostgreSQL

  • 功能强大的开源关系型数据库,支持复杂查询、事务、并发控制。
  • 对 SQL 标准支持完善,并且扩展能力极强,支持 JSON、地理信息等高级数据类型。
  • 在地理信息系统(GIS)、科学计算等领域应用广泛。
2. 非关系数据库(NoSQL)

随着大数据和 Web 2.0 的发展,传统关系数据库在处理高并发、海量数据、灵活数据结构时遇到了瓶颈,NoSQL(Not Only SQL) 数据库应运而生。

(1) 键值型数据库(Key-Value)

  • 代表:Redis、Memcached。
  • 特点:以 "键 - 值" 对存储数据,读写速度极快,常用于缓存、会话存储等场景。

(2) 文档型数据库(Document)

  • 代表:MongoDB、CouchDB。
  • 特点:以类似 JSON 的文档格式存储数据,结构灵活,易于扩展,适合存储半结构化数据。

(3) 列族型数据库(Column-Family)

  • 代表:HBase、Cassandra。
  • 特点:按列存储数据,适合海量数据的分布式存储和实时查询,常用于大数据分析场景。

(4) 图数据库(Graph)

  • 代表:Neo4j、OrientDB。
  • 特点:以图结构存储数据,擅长处理复杂的关系网络,如社交网络、知识图谱等。

1.2 关系数据库的基本概念

关系数据库是目前应用最广泛的数据库类型,它以关系模型为基础,将数据组织成二维表的形式。

1.2.1 关系数据库的基本术语

  • 关系(Relation):一个二维表,对应我们通常所说的 "表"。
  • 元组(Tuple):表中的一行,代表一条记录,对应一个实体的实例。
  • 属性(Attribute):表中的一列,代表实体的一个特性,也称为 "字段"。
  • 域(Domain):属性的取值范围,例如 "性别" 属性的域只能是 "男" 或 "女"。
  • 关键字(Key) :也称为 "键",是表中一个或多个属性的组合,用于唯一标识一条记录。
    • 主键(Primary Key):一个表中只能有一个主键,它的值必须唯一且非空,用于唯一标识表中的每一行。
    • 外键(Foreign Key):用于建立两个表之间的关联,它引用了另一个表的主键。

1.2.2 关系数据库的特点

  • 数据结构单一:所有数据都以二维表的形式存在,直观易懂。
  • 数据独立性高:数据的物理存储和逻辑结构相互独立,程序修改不会影响数据结构。
  • 集合操作:操作的对象和结果都是集合(表),而非单条记录。
  • 坚实的理论基础:基于关系代数和集合论,保证了数据操作的正确性和可靠性。

1.3 MySQL 服务基础

MySQL 是一个真正的多线程、多用户的 SQL 数据库服务,凭借其高性能、高可靠和易于使用的特性,成为服务器领域中最受欢迎的开源数据库系统。2008 年以前,MySQL AB 公司由 MySQL AB 公司运营,后在 Sun 公司收购 MySQL AB 公司,Oracle 公司收购 Sun 公司的过程后,目前 MySQL 项目由 Oracle 公司负责运营和维护。

本节将介绍 MySQL 的两种安装方式:源码编译安装二进制包安装,以及服务控制和客户端访问的方法。

1.3.1 MySQL 的编译安装

源码编译安装可以最大程度地自定义 MySQL 的功能和配置,适合对性能有特殊要求或需要定制功能的场景。本文以MySQL 8.0.36版本为例,在 CentOS/RHEL 系统下进行演示。

1. 准备工作

在正式安装 MySQL 8.0.36 之前,需要完成以下准备工作:

(1) 卸载系统自带的 MariaDBCentOS/RHEL 系统默认自带 MariaDB,它与 MySQL 存在冲突,必须先卸载:

复制代码
rpm -qa mariadb
rpm -e --nodeps mariadb

(2) 安装依赖包与编译工具安装 MySQL 编译所需的依赖库、开发工具和头文件:

复制代码
dnf install -y gcc gcc-c++ make cmake autoconf libtool openssl-devel libxml2-devel zlib-devel libicu-devel oniguruma-devel libjpeg-turbo-devel freetype-devel libpng-devel libtiff-devel libwebp-devel openjpeg2-devel libX11-devel libXext-devel libXrender-devel libXi-devel libXrandr-devel libXcursor-devel libXfixes-devel libXcomposite-devel libXdamage-devel libXxf86vm-devel mesa-libGL-devel ncurses-devel wget libtirpc-devel rpcgen

(3) 关闭 SELinux 与防火墙SELinux 和防火墙会影响 MySQL 的正常访问,需要临时关闭:

复制代码
# 永久关闭SELinux
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
setenforce 0

# 关闭并禁用防火墙
systemctl stop firewalld
systemctl disable firewalld

(4) 安装 CMakeMySQL 8.0 源码编译需要 CMake 3.16.2 及以上版本:

复制代码
wget https://cmake.org/files/v3.16/cmake-3.16.2.tar.gz
tar zxf cmake-3.16.2.tar.gz
cd cmake-3.16.2
./configure
gmake && gmake install

(5) 安装 Boost 库MySQL 8.0 需要 Boost 1.77.0 库支持:

复制代码
wget https://boostorg.jfrog.io/artifactory/main/release/1.77.0/source/boost_1_77_0.tar.gz
tar -zxf boost_1_77_0.tar.gz
mv boost_1_77_0 /usr/local/boost
2. 源码编译及安装

(1) 创建运行用户 为了安全起见,创建一个专用的mysql用户来运行 MySQL 服务:

复制代码
groupadd mysql
useradd -M -s /sbin/nologin mysql -g mysql

(2) 解压源码包将下载的 MySQL 源码包解压到指定目录:

复制代码
tar zxf mysql-8.0.36.tar.gz -C /usr/src/
cd /usr/src/mysql-8.0.36

(3) 配置编译选项 创建编译目录并执行cmake配置,指定安装路径、数据目录、字符集等关键参数:

复制代码
mkdir build && cd build
cmake .. \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DSYSCONFDIR=/etc \
-DMYSQL_DATADIR=/usr/local/mysql/data \
-DWITH_SSL=system \
-DWITH_BOOST=/usr/local/boost \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_EXTRA_CHARSETS=all

关键选项说明:

  • DCMAKE_INSTALL_PREFIX:MySQL 程序的安装目录。
  • DSYSCONFDIR:MySQL 配置文件的存放目录。
  • DMYSQL_DATADIR:MySQL 数据文件的存放目录。
  • DWITH_BOOST:指定 Boost 库的路径。
  • DDEFAULT_CHARSET:设置默认字符集为 UTF-8。

(4) 编译与安装使用多线程编译以加快速度:

复制代码
make -j$(nproc)
make install
3. 安装后的其他调整

(1) 建立配置文件 MySQL 8.0 源码安装后不再提供默认配置文件,需要手动创建/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
port=3306
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
default-storage-engine=INNODB
max_allowed_packet=1G
character-set-server=utf8
collation-server=utf8_general_ci

(2) 初始化数据库mysql用户身份初始化数据库,生成系统表和临时密码:

复制代码
/usr/local/mysql/bin/mysqld --initialize-insecure \
--user=mysql \
--basedir=/usr/local/mysql \
--datadir=/usr/local/mysql/data

注意 :如果使用--initialize(而非--initialize-insecure),会生成一个随机初始密码,需要妥善保存。

(3) 配置环境变量将 MySQL 的可执行文件路径添加到系统环境变量:

复制代码
echo 'export PATH=$PATH:/usr/local/mysql/bin' >> /etc/profile
source /etc/profile
4. 添加系统服务

为了方便通过systemctl管理 MySQL 服务,需要创建系统服务文件:

复制代码
cp /usr/local/mysql/support-files/mysql.server /etc/rc.d/init.d/mysqld
chmod +x /etc/rc.d/init.d/mysqld

# 或者创建systemd服务文件
cat > /usr/lib/systemd/system/mysqld.service << EOF
[Unit]
Description=MySQL Server
After=network.target
After=syslog.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
EOF

systemctl daemon-reload
systemctl enable mysqld

启动与验证服务

复制代码
systemctl start mysqld
systemctl status mysqld
netstat -antp | grep mysqld

如果看到mysqld进程监听在3306端口,说明服务启动成功。


1.3.2 MySQL 的二进制包安装

二进制包安装是更简单、更快捷的方式,它不需要编译,直接解压即可使用。本文以glibc 2.28 版本的二进制包为例。

1. 基础环境准备

与源码安装类似,需要先卸载 MariaDB、安装依赖包、创建mysql用户、关闭 SELinux 和防火墙:

复制代码
# 卸载MariaDB
rpm -e --nodeps mariadb

# 安装依赖包
dnf install -y libaio numactl openssl ncurses-compat-libs

# 创建mysql用户
useradd -M -s /sbin/nologin mysql

# 关闭SELinux和防火墙
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
setenforce 0
systemctl stop firewalld
systemctl disable firewalld
2. 二进制安装

(1) 解压并移动二进制包

复制代码
tar xf mysql-8.0.36-linux-glibc2.28-x86_64.tar.xz
mv mysql-8.0.36-linux-glibc2.28-x86_64 /usr/local/mysql

(2) 初始化数据库

复制代码
/usr/local/mysql/bin/mysqld --initialize-insecure \
--user=mysql \
--basedir=/usr/local/mysql \
--datadir=/usr/local/mysql/data
3. 设定配置文件

创建/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
port=3306
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
default-storage-engine=INNODB
max_allowed_packet=1G
character-set-server=utf8
collation-server=utf8_general_ci
4. 配置 systemd 启动

与源码安装步骤相同,创建mysqld.service文件并设置开机自启:

复制代码
cp /usr/local/mysql/support-files/mysql.server /etc/rc.d/init.d/mysqld
chmod +x /etc/rc.d/init.d/mysqld

cat > /usr/lib/systemd/system/mysqld.service << EOF
[Unit]
Description=MySQL Server
After=network.target
After=syslog.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
EOF

systemctl daemon-reload
systemctl enable mysqld
systemctl start mysqld

1.3.3 访问 MySQL 数据库

MySQL 服务启动后,就可以通过客户端工具进行访问了。

1. 登录 MySQL

(1) 首次登录与修改密码 如果初始化时使用了--initialize-insecure,可以直接空密码登录:

复制代码
mysql -uroot -p

按回车直接进入 MySQL 命令行。然后修改 root 用户密码:

复制代码
ALTER USER 'root'@'localhost' IDENTIFIED BY '你的新密码';
FLUSH PRIVILEGES;

如果初始化时使用了--initialize,则需要使用生成的随机密码登录:

复制代码
mysql -uroot -p
# 输入随机密码登录后,立即修改密码
ALTER USER 'root'@'localhost' IDENTIFIED BY '你的新密码';

(2) 允许远程登录默认情况下,root 用户只能在本地登录。为了允许远程连接,需要修改权限:

复制代码
CREATE USER 'root'@'%' IDENTIFIED BY '你的密码';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
2. 基本操作示例

登录 MySQL 后,就可以执行 SQL 语句了:

复制代码
-- 查看所有数据库
SHOW DATABASES;

-- 创建新数据库
CREATE DATABASE testdb;

-- 使用数据库
USE testdb;

-- 创建表
CREATE TABLE students (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50) NOT NULL,
    age INT,
    gender ENUM('男', '女')
);

-- 插入数据
INSERT INTO students (name, age, gender) VALUES ('张三', 20, '男'), ('李四', 19, '女');

-- 查询数据
SELECT * FROM students;

-- 更新数据
UPDATE students SET age=21 WHERE name='张三';

-- 删除数据
DELETE FROM students WHERE name='李四';
3. 退出 MySQL

在 MySQL 命令行中,输入exitquit即可退出:

复制代码
exit;

总结

本文从数据库的基础概念出发,系统介绍了数据库的发展历程、数据模型,以及 MySQL 数据库的两种核心安装方式(源码编译安装和二进制包安装),并详细演示了 MySQL 服务的启动、配置和客户端访问方法。

对于初学者而言,建议先从二进制包安装 入手,快速搭建起 MySQL 环境,熟悉基本的 SQL 操作;待有一定基础后,再尝试源码编译安装,深入理解 MySQL 的底层架构和编译原理。

掌握 MySQL 的基础操作,是进入数据库领域的第一步。下一步,你可以深入学习 SQL 高级查询、事务管理、索引优化、备份恢复等进阶内容,逐步成长为一名合格的数据库工程师。

相关推荐
hongtianzai2 小时前
MySQL中between and的基本用法
android·数据库·mysql
隔壁小邓2 小时前
数据库中间件全景解析:从连接管理到分布式协同
数据库·分布式·中间件
lcrml2 小时前
Redis简介、常用命令及优化
数据库·redis·缓存
一只努力的微服务2 小时前
【Calcite 系列】深入理解 Calcite 的 IntersectToSemiJoinRule
大数据·数据库·calcite·优化规则
todoitbo2 小时前
从「亡羊补牢」到「规则先行」:金仓数据库 SQL 防火墙实战解析
数据库·sql·数据安全·防火墙·金仓数据库
艾莉丝努力练剑2 小时前
【MYSQL】MYSQL学习的一大重点:数据库基础
linux·运维·服务器·数据库·c++·学习·mysql
I'mAlex2 小时前
金仓数据库赋能北京一卡通:国产数据库在民生核心系统的信创实践标杆
数据库·kingbasees
xcLeigh2 小时前
千日稳定守护,金仓数据库赋能北京一卡通斩获鼎信杯奖项
大数据·数据库·数据迁移·迁移·交通·金仓数据库·一卡通