前言
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 命令行中,输入exit或quit即可退出:
exit;
总结
本文从数据库的基础概念出发,系统介绍了数据库的发展历程、数据模型,以及 MySQL 数据库的两种核心安装方式(源码编译安装和二进制包安装),并详细演示了 MySQL 服务的启动、配置和客户端访问方法。
对于初学者而言,建议先从二进制包安装 入手,快速搭建起 MySQL 环境,熟悉基本的 SQL 操作;待有一定基础后,再尝试源码编译安装,深入理解 MySQL 的底层架构和编译原理。
掌握 MySQL 的基础操作,是进入数据库领域的第一步。下一步,你可以深入学习 SQL 高级查询、事务管理、索引优化、备份恢复等进阶内容,逐步成长为一名合格的数据库工程师。