MySQL 数据库
目录
一、数据库简介
1. 使用数据库的必要性
2. 数据库的基本概念
(1)数据
(2)数据库和数据库表
(3)数据库管理系统和数据库系统
3. 数据库系统发展史
(1)数据库系统发展史
初级阶段(20世纪50-60年代)
中级阶段(20世纪60-70年代)
高级阶段(20世纪70年代至今)
(2)经典数据模型
(3)当今主流数据库介绍
4. 关系数据库的基本概念
(1)关系数据库的基本结构
(2)主键与外键
(3)数据完整性规则
总结
二、MySQL 服务基础
1. MySQL 的编译安装
(1)前置条件准备
(2)源码编译及安装
(3)安装后的其他调整
(4)添加系统服务
2. MySQL 的二进制安装
(1)基础环境准备
(2)二进制安装
(3)设定配置文件
(4)配置 systemctl 方式启动
3. 访问 MySQL 数据库
4. 若无法启动MySQL
一、数据库简介
1. 使用数据库的必要性
-
传统文件存储的缺陷:
-
数据冗余:同一数据重复存储(如多个文件中保存相同用户信息)。
-
不一致性:数据更新不同步(如用户地址修改后未同步到所有文件)。
-
访问困难:需编写复杂程序读取不同格式的文件。
-
安全性低:难以统一控制数据访问权限。
-
-
数据库的核心优势:
-
数据共享:多用户、多应用安全共享数据。
-
减少冗余:通过规范化设计避免重复存储。
-
数据独立性:逻辑结构与物理存储分离,修改结构不影响应用。
-
事务支持:保证操作的原子性、一致性、隔离性、持久性(ACID)。
-
安全性控制:提供用户权限管理和数据加密。
-
2. 数据库的基本概念
(1)数据
-
定义:对客观事物属性的符号化记录(如数字、文本、图像)。
-
与信息的区别:
-
数据:原始、未处理的符号(如“25”)。
-
信息:经过处理、具有意义的数据(如“年龄25岁”)。
-
(2)数据库和数据库表
-
数据库:
-
结构化存储的数据集合(类似文件柜)。
-
包含多个表(类似文件夹)。
-
-
表:
-
由行(记录)和列(字段)组成的二维结构。
-
示例:学生表包含字段(学号、姓名、年龄),每行代表一个学生。
-
(3)数据库管理系统和数据库系统
-
数据库管理系统(DBMS):
-
管理数据库的软件(如 MySQL、Oracle)。
-
核心功能:
-
数据定义(创建表、字段)。
-
数据操作(增删改查)。
-
数据安全(权限控制、备份恢复)。
-
-
-
数据库系统(DBS):
-
组成:DBMS + 数据库 + 应用程序 + 用户。
-
数据库管理员:负责数据库的更新和备份、数据库系统维护等工作,保证数据库的运行
-
3. 数据库系统发展史
(1)数据库系统发展史
初级阶段(20世纪50-60年代)
-
特征:
-
数据存储依赖于 文件系统(如磁带、卡片),无统一管理。
-
数据冗余高,缺乏共享性,维护困难。
-
-
代表技术:
-
COBOL 文件处理系统。
-
中级阶段(20世纪60-70年代)
-
特征:
-
引入 数据库管理系统(DBMS),实现数据集中管理。
-
支持 层次模型 和 网状模型,解决部分冗余问题。
-
-
代表技术:
-
IMS(IBM 层次数据库)、CODASYL(网状数据库)。
-
高级阶段(20世纪70年代至今)
-
特征:
-
关系模型 提出(Edgar F. Codd,1970),数据以二维表形式组织。
-
支持 SQL 语言,标准化数据操作。
-
现代数据库扩展:分布式数据库、NoSQL、NewSQL、云数据库。
-
-
里程碑:
-
Oracle(1979)、MySQL(1995)、MongoDB(2009)。
-
(2)经典数据模型
模型 | 特点 | 示例 |
---|---|---|
层次模型 | 树形结构,数据按父子关系组织(1960年代 IBM IMS) | 适用于固定层级数据(如组织机构) |
网状模型 | 图结构,允许多对多关系(1970年代 CODASYL) | 复杂查询高效,但设计难度大 |
关系模型 | 二维表结构,通过数学关系描述数据(1970年 E.F. Codd 提出) | MySQL、Oracle 等主流数据库 |
数据模型 | 优缺点 |
---|---|
层次模型 | ✅ 查询效率高 ❌ 灵活性差,难以处理多对多关系 |
网状模型 | ✅ 支持复杂关系 ❌ 结构复杂,维护成本高 |
关系模型 | ✅ 结构清晰,支持复杂查询 ❌ 高并发场景性能受限 |
(3)当今主流数据库介绍
类型 | 特点 | 代表 |
---|---|---|
关系型数据库 | - 数据以表形式存储 - 支持 SQL 查询 - 强一致性,ACID 事务保障 | SQL Server、DB2、MySQL、PostgreSQL、Oracle |
非关系型数据库(NoSQL) | - 灵活的数据模型(键值、文档、图等) - 高扩展性,适合分布式架构 | MongoDB(文档)、Redis(键值)C |
非关系型数据库的优点:
- 数据库高并发读写的需求
- 对海量数据库高效率存储与访问
- 数据库的高扩展性与高可用性的需求
4. 关系数据库的基本概念
(1)关系数据库的基本结构
-
表(Table):数据存储的基本单元,由行(记录)和列(字段)组成。
-
行(Row/Record):一条完整的数据记录。
-
列(Column/Field):数据的属性(如
姓名
、年龄
)。
-
-
关系(Relation):表之间的逻辑关联,包括列名、数据类型、约束。
-
示例:
学生ID(主键) 姓名 年龄 班级ID(外键) 101 张三 20 C01 102 李四 22 C02
-
(2)主键与外键
-
主键(Primary Key):
-
唯一标识表中每行记录的字段(如学号)。
-
特性:非空、唯一、不可重复。
-
示例:
学生ID
是学生表的主键。
-
-
外键(Foreign Key):
-
指向其他表主键的字段,建立表间关联(如选课表的学号引用学生表的主键)。
-
作用:维护数据一致性,防止无效引用。
-
示例:
班级ID
是学生表的外键,指向班级表的班级ID
。
-
(3)数据完整性规则
完整性类型 | 说明 | 实现方式 |
---|---|---|
实体完整性 | 主键值唯一且非空 | PRIMARY KEY 约束 |
参照完整性 | 外键值必须存在于被引用表的主键中 | FOREIGN KEY 约束 |
域完整性 | 列值符合定义的数据类型和范围 | 数据类型、CHECK 约束、NOT NULL |
用户定义完整性 | 自定义业务规则(如年龄 ≥ 0) | CHECK 约束、触发器、存储过程 |
总结
概念 | 核心要点 |
---|---|
数据库必要性 | 解决数据冗余、不一致、访问困难,提供安全共享与事务支持 |
关系数据库结构 | 表结构、主键唯一性、外键关联 |
数据完整性 | 实体、参照、用户定义完整性共同保障数据准确性与一致性 |
二、MySQL 服务基础
1. MySQL 的编译安装
mysql 官方站点为 https://dev.mysql.com/
cmake 官方网站:https://cmake.org/download
Boost 库的网站:http://sourceforge.net/projects/boost/files/boost
(1)前置条件准备
#先保证没有其他的数据库
#安装依赖环境
dnf install -y gcc gcc-c++ make cmake autoconf libtool bison re2c opensll-devel libxm12-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#关闭SELinux和防火墙
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
setenforce 0
systemctl stop firewalld
systemctl disable firewalld#需要cmake编译,解压cmake源码包
tar zxvf cmke-xxx.tar.gz
cd cmake
./configure
gmake && gmake install#需要Boost库。解压安装
tar -zxf boost_xx.tar.gz
mv boost /usr/local/boost
(2)源码编译及安装
#创建运行用户
groupadd mysql
useradd -M -s /sbin/nologin mysql -g mysql#解包
tar zxf mysql.XX.tar.gz -C /usr/src
cd /usr/src/mysql-8...#配置
mkdir build && cd build
cmake .. -DCMACK_INSTALL_PREFIX=/usr/local/mysql -DSYSCONFDIR=/etc -DMYSQL_DATADIR=/usr/local/mysql/data -DWITH_SSL=system -DENABLED_LOCAL_INFILE=ON -DWITH_BOOST=/usr/local/boost -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS=all#编译安装
make -j$(nproc) && make install注释:$(nproc)用于获取系统上可用的处理器核心数量,并行编译,提高速度
(3)安装后的其他调整
#建立配置文件
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 #绑定监听地址 0.0.0.0
skip-name-resolve #跳过名称解析
port=3306 #设置3306端口
basedir=/usr/local/mysql #设置MySQL的安装目录
datadir=/usr/local/mysql/data #设置MySQL数据库的数据的存放目录
max_connections=2048 #允许最大连接数
character-set-server=utf8 #服务端使用的字符集默认为utf8
default-storage-engine=INNODB ##创建新表时使用的默认存储引擎
max_allowed_packet=16M #表示将最大允许数据包的大小设置为 16 兆字节[mysqld_safe]
log-error=/usr/local/mysql/data/error.log
(4)添加系统服务
#将MYSQL添加为systemd 标准服务
cp /usr/local/mysql/support-files/mysql.server /etc/rc.d/init.d/mysql
chmod +x /etc/rc.d/init.d/mysqld
#编辑生成mysqld.service 服务
vim /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###重启服务
systemctl start mysqld.service
systemctl status mysqld.service
netstat -anpt |grep mysqld
2. MySQL 的二进制安装
(1)基础环境准备
#安装依赖环境
dnf -y install gcc libaio numactl openssl ncurses-compat-libs#创建服务用户
useradd -M -s /sbin/nologin mysql#关闭防火墙
systemctl stop firewalld
systemctl disable firewalld#关闭SELinux
setenforce 0
vim /etc/selinux/config (修改)
SELINUX=disabled
(2)二进制安装
#解压源码包
tar xvf mysql-8.0.36-linux-glibc2.28-x86_64.tar.xz
mv mysql-8.0 /usr/local/mysql/cd /usr/local/mysql#创建数据文件
mkdir data
#设置所属
chown -R mysql:mysql /usr/local/mysql
cd /usr/local/mysql/bin
#初始化
./mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
(会生成初始密码)
(3)设定配置文件
vim /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[mysqld_safe]
log-error=/usr/local/mysql/data/error.log检测文件:mysqld --verbose --help --defaults-file=/etc/my.cnf | grep -A 1 "Default options" ## 输出默认配置文件的路径mysqld --validate-config ##命令配置检查#做软链接
ln -s /usr/local/mysql/bin/* /usr/local/bin#添加全局变量
vim /etc/profile
export PATH=$PATH:/usr/local/mysql/bin. /etc/profile #生效
解析:
1.“[client]” 部分设置客户端相关配置
- “socket=/usr/local/mysql/data/mysql.sock” 表明客户端通过该路径下的套接字文件与 MySQL 服务器进行通信。
2.“[mysqld]” 部分是 MySQL 服务器的核心配置
- “socket=/usr/local/mysql/data/mysql.sock” 同样设置服务器端的套接字路径,确保与客户端通信一致。
- “bind-address=0.0.0.0” 使 MySQL 服务器监听所有网络接口,允许来自任何 IP 地址的连接。
- “skip-name-resolve” 表示禁用 DNS 反向解析,可提高连接速度。
- “port=3306” 设置 MySQL 服务器监听的端口号为 3306。
- “basedir=/usr/local/mysql” 定义 MySQL 的安装目录。
- “datadir=/usr/local/mysql/data” 指明数据存储目录。
- “max_connections=2048” 设定服务器允许的最大并发连接数为 2048。
- “character-set-server=utf8” 设置服务器默认字符集为 UTF - 8。
- “default-storage-engine=INNODB” 规定默认的存储引擎为 InnoDB。“max_allowed_packet=16M” 表示服务器接受的最大数据包大小为 16MB。
3. “[mysqld_safe]” 是针对 MySQL 启动守护进程相关的配置段
- “log - error=/usr/local/mysql/data/error.log” 指定了 MySQL 错误日志的存储路径,即当 MySQL 运行过程中出现错误时,相关错误信息会记录到 “/usr/local/mysql/data/error.log” 这个文件里。
(4)配置 systemctl 方式启动
#加入系统服务,通过systemctl来管理
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
vim
[Unit]
Description=mysqld
After=network.target #服务之后启动[Service]
Type=forking
ExecStart=/etc/init.d/mysqld start
ExecReload=/etc/init.d/mysqld restart
ExecStop=/etc/init.d/mysqld stop
PrivateTmp=true[Install]
WantedBy=multi-user.targetsystemctl daemon-reload #重载
systemctl start mysqld #启动
netsrat -anpt | grep 3306 #查看是否启动成功
解析:
1. [Unit]部分:
- - `Description=mysqld`:对该服务的描述,表明此服务与MySQL数据库守护进程相关。
- - `After=network.target`:指定该服务在网络目标启动之后启动,确保网络环境准备好后再启动MySQL服务。
2. [Service]部分:
- - `Type=forking`:表示该服务的启动类型为forking,即启动过程中会创建子进程,父进程在子进程启动成功后退出。
- - `ExecStart=/etc/init.d/mysqld start`:定义服务启动时执行的命令,这里是调用`/etc/init.d/mysqld`脚本并传递`start`参数来启动MySQL服务。
- - `ExecReload=/etc/init.d/mysqld restart`:指定服务重新加载配置时执行的命令,即调用上述脚本并传递`restart`参数来重启MySQL服务。
- - `ExecStop=/etc/init.d/mysqld stop`:定义服务停止时执行的命令,通过传递`stop`参数给脚本停止MySQL服务。
- - `PrivateTmp=true`:表示为该服务创建一个独立的临时文件系统,增强服务运行的安全性和隔离性。
3. [Install]部分:
- - `WantedBy=multi-user.target`:意味着当系统进入多用户运行级别时,该服务会被启动。多用户运行级别是系统正常运行且允许多用户登录的状态。
3. 访问 MySQL 数据库
mysql -uroot -p #登录,随机生成的密码登录
mysql> alter user 'root'@'localhost' identified with mysql_native_password by 'pwd123'; #修改新密码exit #退出重新登录一下
4. 若无法启动MySQL
!!可以查看1.MySQL 数据文件损坏解决:mysqlcheck -u root -p --all-databases --auto-repair
执行此命令后,输入 MySQL 的 root 用户密码,工具会自动检查并修复所有数据库的数据文件。2.MySQL 日志文件损坏:MySQL 的日志文件损坏可能会导致启动失败。你可以尝试删除日志文件并重新启动 MySQL:
rm -f /var/log/mysql/error.log
systemctl start mysqld3. MySQL 配置文件存在错误my.cnf 或者 my.ini 这类配置文件若存在错误,会致使 MySQL 无法正常启动。
mysqld --verbose --help --defaults-file=/etc/my.cnf | grep -A 1 "Default options" #会输出默认配置文件的路径
mysqld --validate-config #要是配置文件存在错误,你需要对其进行修改。4. 数据目录权限问题MySQL 数据目录的权限设置不正确,会使得 MySQL 无法访问数据文件。
chown -R mysql:mysql /var/lib/mysql
chmod -R 755 /var/lib/mysql
将 /var/lib/mysql 目录的所有者和所属组设置为 mysql,并赋予适当的权限。5. 端口被占用
MySQL 默认使用 3306 端口,若该端口被其他程序占用,MySQL 就无法启动。
netstat -tulnp | grep 3306#若端口被占用,你需要找出占用该端口的程序并停止它,或者修改 MySQL 的配置文件,让其使用其他端口。