目录
一、数据库概念解析
(一)数据库基础架构:数据如何有序存储?
(二)数据模型
二、MySQL安装实战:从源码编译到二进制部署(步步拆解)
(一)编译安装
(二)二进制安装
三、MySQL基础操作
(一)首次登录密码修改
(二)数据库与表操作
(三)权限管理
四、常见问题与解决方案
五、总结
1. 数据存储的最小单元:记录与列
(1, 王明, 男, 22, 汉, 计算机科学与技术)
是一条记录,完整描述一个学生的信息。男/女
(通过域完整性约束实现)。2. 表(Table):同类数据的二维表格
-- 创建学生表(含主键和约束)
CREATE TABLE students (
student_id INT PRIMARY KEY, -- 主键:唯一标识学生
name VARCHAR(50) NOT NULL, -- 姓名非空
age TINYINT CHECK (age BETWEEN 18 AND 50), -- 年龄范围约束
gender ENUM('男', '女') -- 枚举类型,限制取值
);
3. 数据库(Database)
students
(学生表)、courses
(课程表)、scores
(成绩表)。majors
表,学生表通过major_id
关联)。4. 数据库管理系统(DBMS)
CREATE TABLE
/ALTER TABLE
)、定义约束(主键/外键)。INSERT
/DELETE
/UPDATE
/SELECT
)。GRANT
/REVOKE
),如授予用户SELECT
权限但禁止DELETE
。 类型 |
代表产品 |
优势场景 |
开源与否 |
关系型 |
MySQL |
中小型网站、Web应用 |
开源 |
企业级关系型 |
Oracle |
大型企业复杂业务 |
闭源 |
NoSQL |
MongoDB |
海量非结构化数据存储 |
开源 |
5. 数据库系统(DBS)
1. 三代数据库模型对比
模型 |
数据结构 |
典型场景 |
优势 |
缺点 |
层次模型 |
树状结构(一对多) |
企业组织架构 |
结构清晰,适合单路径查询 |
不支持多对多关系 |
网状模型 |
图状结构(多对多) |
复杂关系(如订单-商品) |
支持复杂关联 |
开发难度高,约束零散 |
关系模型 |
二维表格 |
主流业务系统 |
简单易用(SQL语言),支持声明式查询 |
复杂查询效率需优化 |
2. 关系模型核心
NULL
)。student_id
),避免自然主键过长或变更。student_id
作为主键,确保无重复记录。students
的major_id
字段关联专业表majors
的major_id
主键:-- 创建学生表时定义外键
CREATE TABLE students (
student_id INT PRIMARY KEY,
major_id INT,
FOREIGN KEY (major_id) REFERENCES majors(major_id) -- 外键关联
);
3. 数据完整性
student_id
不可为空,且不能有两个学生同号。男/女
。student_id
必须存在于学生表中,避免“幽灵成绩”。CHECK
约束或应用程序逻辑实现。1. 环境准备
# 检查是否已安装MariaDB
rpm -q mariadb # 若输出类似“mariadb-5.5.52-1.el7.x86_64”,则需要卸载
dnf remove mariadb -y # 强制卸载
为什么?:MariaDB是MySQL的分支,端口(3306)和服务名可能冲突,需彻底移除。
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
关键依赖解释:
gcc/gcc-c++
:C/C++编译器,用于编译MySQL源码。cmake
:跨平台编译工具,生成Makefile。openssl-devel
:支持SSL加密连接(如HTTPS访问数据库)。# 修改SELinux配置为禁用(永久生效,需重启后完全生效)
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
setenforce 0 # 临时关闭,立即生效
# 关闭防火墙(生产环境需谨慎,后续可单独配置端口放行)
systemctl disable --now firewalld # 禁用并停止firewalld服务
注意:生产环境中,建议通过firewall-cmd --add-port=3306/tcp --permanent
放行3306端口,而非直接关闭防火墙。
2. 安装CMake
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 # 编译(耗时约5-10分钟,取决于服务器性能)
gmake install # 安装到系统路径(默认/usr/local/bin/cmake)
cmake --version # 应输出“3.16.2”或更高版本
3. 准备Boost库
wget http://sourceforge.net/projects/boost/files/boost/1.77.0/boost_1_77_0.tar.gz
tar -zxf boost_1_77_0.tar.gz # 解压
mv boost_1_77_0 /usr/local/boost # 移动到固定目录
groupadd mysql # 创建mysql用户组
useradd -M -s /sbin/nologin mysql -g mysql # 创建mysql用户,禁止登录系统
-M
:不创建用户主目录(减少安全风险)。-s /sbin/nologin
:用户无法通过SSH登录,仅用于运行MySQL服务。5. 解压源码并配置编译参数
tar zxf mysql-8.0.36.tar.gz -C /usr/src # 解压到/usr/src目录
cd /usr/src/mysql-8.0.36 # 进入源码目录
mkdir build && cd build # 创建独立构建目录(避免污染源码)
cmake .. \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \ # MySQL安装目录(所有可执行文件、库文件存放此处)
-DSYSCONFDIR=/etc \ # 配置文件路径(my.cnf将放在/etc目录)
-DMYSQL_DATADIR=/usr/local/mysql/data \ # 数据文件存储目录(表结构、数据文件在此处)
-DWITH_SSL=system \ # 使用系统自带的SSL库(非自研,更兼容)
-DENABLED_LOCAL_INFILE=ON \ # 允许从客户端本地文件导入数据(如LOAD DATA INFILE命令)
-DWITH_BOOST=/usr/local/boost \ # 指定Boost库路径(必须,否则编译失败)
-DDEFAULT_CHARSET=utf8 \ # 默认字符集(支持中文等多语言,避免乱码)
-DDEFAULT_COLLATION=utf8_general_ci \ # 排序规则(不区分大小写,如“a”和“A”视为相同)
-DWITH_EXTRA_CHARSETS=all \ # 安装所有额外字符集(如Latin1、UTF-8mb4等)
注意:若报错“Could not find Boost”,请检查Boost路径是否正确,或尝试升级Boost版本。
6. 编译与安装
make -j$(nproc) # 并行编译,$(nproc)获取CPU核心数(如4核则-j4,速度提升4倍)
make install # 安装到指定目录(约10分钟,需root权限)
-j2
)。7. 初始化配置
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地址连接(生产环境建议绑定具体IP,如192.168.1.100)
skip-name-resolve # 禁用DNS解析,加快连接速度(避免客户端IP反向解析耗时)
port=3306 # 监听端口(默认3306,可修改为其他端口如3307)
basedir=/usr/local/mysql # 安装目录(与CMake配置一致)
datadir=/usr/local/mysql/data # 数据目录(与CMake配置一致)
max_connections=2048 # 最大连接数(根据服务器性能调整,默认151,高并发场景需增大)
character-set-server=utf8 # 服务端默认字符集(需与客户端一致,避免乱码)
default-storage-engine=INNODB # 默认存储引擎(支持事务和外键,推荐使用)
max_allowed_packet=16M # 允许的最大数据包大小(上传大文件时需调大,如64M)
/usr/local/mysql/bin/mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
/usr/local/mysql/bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
Xr6:Gg*u8?/8
,需记录在日志中),需通过该密码登录后修改。echo "export PATH=$PATH:/usr/local/mysql/bin" >> /etc/profile # 将mysql命令添加到全局路径
source /etc/profile # 立即生效(无需重启)
8. 添加系统服务
cp /usr/local/mysql/support-files/mysql.server /etc/rc.d/init.d/mysqld # 重命名为mysqld
chmod +x /etc/rc.d/init.d/mysqld # 赋予执行权限
vi /lib/systemd/system/mysqld.service # 写入以下内容
[Unit]
Description=MySQL Database Server # 服务描述
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 # 重新加载服务配置
systemctl enable mysqld # 设置开机自启动
systemctl start mysqld # 启动服务
systemctl status mysqld # 查看状态(应显示active(running))
netstat -anpt | grep 3306 # 检查3306端口是否监听(tcp6 0 0 :::3306 :::* LISTEN)
1. 环境准备
# 检查是否已安装MariaDB
rpm -q mariadb # 若输出类似“mariadb-5.5.52-1.el7.x86_64”,则需要卸载
dnf remove mariadb -y # 强制卸载
为什么?:MariaDB是MySQL的分支,端口(3306)和服务名可能冲突,需彻底移除。
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
关键依赖解释:
gcc/gcc-c++
:C/C++编译器,用于编译MySQL源码。cmake
:跨平台编译工具,生成Makefile。openssl-devel
:支持SSL加密连接(如HTTPS访问数据库)。# 修改SELinux配置为禁用(永久生效,需重启后完全生效)
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
setenforce 0 # 临时关闭,立即生效
# 关闭防火墙(生产环境需谨慎,后续可单独配置端口放行)
systemctl disable --now firewalld # 禁用并停止firewalld服务
注意:生产环境中,建议通过firewall-cmd --add-port=3306/tcp --permanent
放行3306端口,而非直接关闭防火墙。
2. 安装CMake
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 # 编译(耗时约5-10分钟,取决于服务器性能)
gmake install # 安装到系统路径(默认/usr/local/bin/cmake)
cmake --version # 应输出“3.16.2”或更高版本
3. 准备Boost库
wget http://sourceforge.net/projects/boost/files/boost/1.77.0/boost_1_77_0.tar.gz
tar -zxf boost_1_77_0.tar.gz # 解压
mv boost_1_77_0 /usr/local/boost # 移动到固定目录
groupadd mysql # 创建mysql用户组
useradd -M -s /sbin/nologin mysql -g mysql # 创建mysql用户,禁止登录系统
-M
:不创建用户主目录(减少安全风险)。-s /sbin/nologin
:用户无法通过SSH登录,仅用于运行MySQL服务。5. 解压二进制包并配置路径
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 # 重命名并移动到固定目录
mkdir /usr/local/mysql/data # 创建数据目录
chown -R mysql:mysql /usr/local/mysql # 赋予mysql用户权限(关键:否则初始化报错)
6. 初始化数据库(自动生成随机密码)
cd /usr/local/mysql/bin # 进入二进制目录
./mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
2025-03-19T13:28:30.473508Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: Xr6:Gg*u8?/8
7. 初始化配置
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地址连接(生产环境建议绑定具体IP,如192.168.1.100)
skip-name-resolve # 禁用DNS解析,加快连接速度(避免客户端IP反向解析耗时)
port=3306 # 监听端口(默认3306,可修改为其他端口如3307)
basedir=/usr/local/mysql # 安装目录(与CMake配置一致)
datadir=/usr/local/mysql/data # 数据目录(与CMake配置一致)
max_connections=2048 # 最大连接数(根据服务器性能调整,默认151,高并发场景需增大)
character-set-server=utf8 # 服务端默认字符集(需与客户端一致,避免乱码)
default-storage-engine=INNODB # 默认存储引擎(支持事务和外键,推荐使用)
max_allowed_packet=16M # 允许的最大数据包大小(上传大文件时需调大,如64M)
/usr/local/mysql/bin/mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
/usr/local/mysql/bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
Xr6:Gg*u8?/8
,需记录在日志中),需通过该密码登录后修改。echo "export PATH=$PATH:/usr/local/mysql/bin" >> /etc/profile # 将mysql命令添加到全局路径
source /etc/profile # 立即生效(无需重启)
8. 添加系统服务
cp /usr/local/mysql/support-files/mysql.server /etc/rc.d/init.d/mysqld # 重命名为mysqld
chmod +x /etc/rc.d/init.d/mysqld # 赋予执行权限
vi /lib/systemd/system/mysqld.service # 写入以下内容
[Unit]
Description=MySQL Database Server # 服务描述
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 # 重新加载服务配置
systemctl enable mysqld # 设置开机自启动
systemctl start mysqld # 启动服务
systemctl status mysqld # 查看状态(应显示active(running))
netstat -anpt | grep 3306 # 检查3306端口是否监听(tcp6 0 0 :::3306 :::* LISTEN)
1. 安全模式登录(带临时密码)
mysql -u root -p # 提示输入密码时,粘贴初始化生成的临时密码(如Xr6:Gg*u8?/8)
mysql
服务已启动,且用户root@localhost
存在(默认仅允许本地登录)。2. 修改密码(两种方式)
mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '新密码123!';
mysql_native_password
:兼容旧版客户端(如Navicat),MySQL 8.0默认使用更安全的caching_sha2_password
,但部分客户端不支持,需显式指定。mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('新密码123!');
3. 退出客户端
mysql> EXIT; # 或QUIT; 或\q
1. 数据库操作(DDL)
-- 查看所有数据库
SHOW DATABASES; # 输出包含information_schema(元数据)、mysql(系统表)等
-- 创建数据库(指定字符集)
CREATE DATABASE school_db CHARACTER SET utf8 COLLATE utf8_general_ci;
-- 切换数据库
USE school_db; # 后续操作针对school_db
-- 删除数据库(危险!谨慎使用)
DROP DATABASE IF EXISTS school_db;
2. 表操作
CREATE TABLE majors (
major_id INT PRIMARY KEY, -- 主键:专业编号
major_name VARCHAR(100) NOT NULL -- 专业名称非空
);
CREATE TABLE students (
student_id INT PRIMARY KEY AUTO_INCREMENT, -- 自增主键(插入时自动生成)
name VARCHAR(50) NOT NULL,
gender ENUM('男', '女') NOT NULL,
age TINYINT,
major_id INT,
FOREIGN KEY (major_id) REFERENCES majors(major_id) -- 外键关联专业表
);
AUTO_INCREMENT
:自动递增,避免手动输入重复ID。-- 插入专业数据
INSERT INTO majors (major_id, major_name) VALUES (1, '计算机科学与技术'), (2, '信息管理');
-- 插入学生数据(major_id需存在于majors表中,否则报错)
INSERT INTO students (name, gender, age, major_id) VALUES ('王明', '男', 22, 1);
-- 内连接查询学生及其专业
SELECT s.student_id, s.name, m.major_name
FROM students s
INNER JOIN majors m ON s.major_id = m.major_id;
3. 数据修改与删除
-- 更新学生年龄
UPDATE students SET age = 23 WHERE student_id = 1;
-- 删除无效专业(需先删除学生表中关联的数据,否则外键约束拒绝删除)
DELETE FROM majors WHERE major_id = 999; -- 若存在学生关联该专业,报错!
-- 先删除学生数据再删专业(或设置级联删除)
DELETE FROM students WHERE major_id = 999;
DELETE FROM majors WHERE major_id = 999;
1. 授予远程访问权限
-- 创建用户'user1',允许从任意IP登录,密码'Password123!'
CREATE USER 'user1'@'%' IDENTIFIED WITH mysql_native_password BY 'Password123!';
-- 授予该用户对school_db数据库的所有权限
GRANT ALL PRIVILEGES ON school_db.* TO 'user1'@'%';
-- 刷新权限(立即生效)
FLUSH PRIVILEGES;
2. 回收权限
-- 回收user1对school_db的DELETE权限
REVOKE DELETE ON school_db.* FROM 'user1'@'%';
1. 安装报错:“No CMAKE_C_COMPILER could be found”
dnf install -y gcc gcc-c++
安装编译工具链。2. 登录报错:“Access denied for user 'root'@'localhost'”
/usr/local/mysql/data/localhost.err
日志,获取正确的临时密码。systemctl stop mysqld # 停止服务
/usr/local/mysql/bin/mysqld_safe --skip-grant-tables & # 跳过权限检查
mysql -u root # 无密码登录
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码'; # 直接修改密码
3. 乱码问题:查询结果出现“????”
SHOW VARIABLES LIKE 'character_set_%';
my.cnf
中设置统一字符集(如utf8
),重启服务。CHARACTER SET utf8 COLLATE utf8_general_ci
。MySQL的优势:
通过本文的步骤,能顺利完成MySQL的安装与基础操作。数据库的核心是“数据有序”,而MySQL正是实现这一目标的强大工具。动手实践才是掌握的关键,创建自己的数据库,设计表结构,插入数据,尝试各种查询,在实践中积累经验.