MySQL 从基础到实践
MySQL
一、数据库基础理论
1. 数据分类
- 结构化数据:可用二维表表达,有固定格式和长度,存储于关系型数据库,先有结构后有数据。
- 半结构化数据:介于结构化与非结构化之间,无标准数据表模型,含分隔标记,先有数据后有结构,如 HTML、JSON、XML。
- 非结构化数据:无固定结构和长度,无法用二维表呈现,需整体存储,如音视频、二进制文件。
2. 数据管理发展阶段
| 阶段 |
时间 |
特点 |
| 人工管理 |
20世纪50年代中期前 |
用于科学计算,依赖磁带存储,人工管理数据,批处理方式 |
| 文件系统 |
20世纪50年代后期-60年代中期 |
支持信息管理,磁盘存储,数据长期保存,批处理与联机实时处理并存 |
| 数据库系统 |
20世纪60年代后期至今 |
大容量磁盘,低冗余、高独立性,通过DBMS管理数据 |
3. 数据库核心概念
- 数据库(Database):长期存储、有组织、可共享的大量数据集合。
- 数据库管理系统(DBMS):操纵和管理数据库的软件,提供数据定义、操作、保护等功能。
- 数据库管理员(DBA):负责数据库全生命周期管理,保障稳定性、安全性和可用性。
- 关系型数据库(RDBMS):采用二维表模型组织数据,常见如 MySQL、Oracle、SQL Server。
4. 关系型数据库理论
- E-R模型:由实体(矩形)、属性(椭圆形)、联系(菱形)组成,用于数据建模。
- 联系类型:一对一(1:1)、一对多(1:n)、多对多(m:n)。
- 数据操作(CRUD):Create(插入)、Read(查询)、Update(更新)、Delete(删除)。
- 数据库规范化:含6种范式,核心是减少冗余、提升一致性,常用第三范式(3NF)。
二、MySQL 概述与安装
1. MySQL 基础信息
- 分支:包括官方MySQL、MariaDB(MySQL之父主导)、Percona Server(含XtraDB引擎)。
- 特性:跨平台、支持标准SQL、插件式存储引擎、单进程多线程架构。
2. MySQL 安装(源码安装示例,以5.7为例)
# 环境准备
hostnamectl set-hostname mysql01
systemctl disable firewalld.service --now
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
# 配置yum源
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
yum clean all && yum makecache
# 安装依赖包
yum -y install ncurses ncurses-devel bison cmake gcc gcc-c++
# 创建程序用户
useradd -s /sbin/nologin mysql
# 解压源码包和boost库
tar zxvf mysql-5.7.17.tar.gz -C /opt/
tar zxvf boost_1_59_0.tar.gz -C /usr/local/
mv /usr/local/boost_1_59_0 /usr/local/boost
# 配置安装环境
cd /opt/mysql-5.7.17/
cmake \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock \
-DSYSCONFDIR=/etc \
-DSYSTEMD_PID_DIR=/usr/local/mysql \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_PERFSCHEMA_STORAGE_ENGINE=1 \
-DMYSQL_DATADIR=/usr/local/mysql/data \
-DWITH_BOOST=/usr/local/boost \
-DWITH_SYSTEMD=1
# 编译安装
make && make install
# 配置权限和环境变量
chown -R mysql.mysql /usr/local/mysql/
echo 'PATH=/usr/local/mysql/bin:/usr/local/mysql/lib:$PATH' >> /etc/profile
echo 'export PATH' >> /etc/profile
source /etc/profile
# 初始化数据库
cd /usr/local/mysql/
bin/mysqld \
--initialize-insecure \
--user=mysql \
--basedir=/usr/local/mysql \
--datadir=/usr/local/mysql/data
# 配置系统服务
cp /usr/local/mysql/usr/lib/systemd/system/mysqld.service /usr/lib/systemd/system/
systemctl daemon-reload
systemctl start mysqld
systemctl enable mysqld
# 设置root密码
mysqladmin -u root -p password "huawei"
3. MySQL 多实例配置
- 概念:一台服务器运行多个MySQL进程,各进程监听不同端口,独立配置和数据。
- 优点:节约硬件资源、便于版本对比测试、集中管理。
- 缺点:资源抢占、单点故障风险。
- 配置方案:可通过不同MySQL版本或相同版本实现,指定不同端口(如3306、3307)和数据目录。
三、MySQL 核心组件与工具
1. 主要组成
| 类型 |
程序 |
功能 |
| 服务端 |
mysqld |
核心服务程序 |
| 服务端 |
mysqld_safe |
安全启动脚本 |
| 服务端 |
mysqld_multi |
多实例管理工具 |
| 客户端 |
mysql |
交互式CLI工具 |
| 客户端 |
mysqldump |
数据备份工具 |
| 客户端 |
mysqladmin |
服务端管理工具 |
| 客户端 |
mysqlimport |
数据导入工具 |
2. 配置文件
- 默认路径:/etc/my.cnf、/etc/my.cnf.d/(含client.cnf和mysql-server.cnf)。
- 生效顺序:/etc/my.cnf → /etc/mysql/my.cnf → ~/.my.cnf。
3. 常用客户端工具使用
(1)mysql 客户端
# 登录数据库
mysql -uroot -pHuawei@123 -h127.0.0.1 -P3306
# 显示版本
mysql -V
# 非交互式执行SQL
mysql -e "show databases;"
# 执行SQL脚本
mysql < test.sql
cat test.sql | mysql
# 以HTML格式输出
mysql -H -e "select version();"
(2)mysqladmin 工具
# 显示版本信息
mysqladmin -V
mysqladmin version
# 心跳检测
mysqladmin ping
# 持续执行命令(每秒1次,共3次)
mysqladmin -i 1 -c 3 ping
# 创建/删除数据库
mysqladmin create db1
mysqladmin -f drop db1
# 修改root密码
mysqladmin -uroot -p旧密码 password 新密码
(3)mycli 工具(增强版CLI)
# 安装依赖
yum install -y python39
pip3.9 config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
pip-3.9 install mycli
# 登录
mycli -uroot -pabcde
四、SQL 语言详解
1. 语言规范
- 不区分大小写(建议关键字大写),以
;结尾。
- 关键字不可跨行,子句建议独立成行。
- 注释:
-- 单行注释、/* 多行注释 */、# MySQL特有注释。
2. 语句分类
| 类型 |
说明 |
关键字 |
| DDL |
数据定义语言 |
CREATE、DROP、ALTER |
| DML |
数据操纵语言 |
INSERT、DELETE、UPDATE |
| DQL |
数据查询语言 |
SELECT |
| DCL |
数据控制语言 |
GRANT、REVOKE |
| TCL |
事务控制语言 |
BEGIN、COMMIT、ROLLBACK |
3. 数据类型
| 类别 |
关键字 |
| 整数类型 |
TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT |
| 浮点类型 |
FLOAT、DOUBLE |
| 定点数类型 |
DECIMAL |
| 日期时间类型 |
DATE、TIME、YEAR、DATETIME、TIMESTAMP |
| 字符串类型 |
CHAR、VARCHAR、TEXT、TINYTEXT、LONGTEXT |
| 枚举/集合类型 |
ENUM、SET |
| 二进制类型 |
BINARY、VARBINARY、BLOB |
| JSON类型 |
JSON |
4. DDL 语句(数据定义)
(1)数据库操作
-- 创建数据库
CREATE DATABASE IF NOT EXISTS testdb DEFAULT CHARACTER SET utf8mb4;
-- 查看数据库
SHOW DATABASES;
SHOW CREATE DATABASE testdb;
-- 修改数据库字符集
ALTER DATABASE testdb CHARACTER SET latin1;
-- 删除数据库
DROP DATABASE IF EXISTS testdb;
(2)表操作
-- 创建表
CREATE TABLE student (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(20) NOT NULL,
age TINYINT UNSIGNED,
gender ENUM('M','F') DEFAULT 'M'
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4;
-- 查看表
SHOW TABLES;
DESC student;
SHOW CREATE TABLE student;
-- 修改表
ALTER TABLE student RENAME stu; -- 改表名
ALTER TABLE stu ADD phone VARCHAR(11) AFTER name; -- 加字段
ALTER TABLE stu MODIFY phone INT; -- 改字段类型
ALTER TABLE stu DROP COLUMN phone; -- 删字段
-- 删除表
DROP TABLE IF EXISTS stu;
5. DML 语句(数据操纵)
-- 插入数据
INSERT INTO student (name, age) VALUES ('xiaoming', 20), ('xiaohong', 18);
INSERT INTO student VALUES (12, 'xiaoli', 19, 'F');
-- 更新数据(加条件,避免全表更新)
UPDATE student SET age=25 WHERE id=10;
UPDATE student SET age=30, gender='F' WHERE id>15;
-- 删除数据(逻辑删除推荐用字段标记,如is_del=1)
DELETE FROM student WHERE id=10;
-- 清空表(DDL,效率高,不支持事务)
TRUNCATE TABLE student;
6. DQL 语句(数据查询)
-- 基础查询
SELECT id AS 学号, name AS 姓名 FROM student;
-- 条件查询
SELECT * FROM student WHERE id IN (11,15) AND age>18;
SELECT * FROM student WHERE name LIKE 'xiao%' OR age BETWEEN 20 AND 30;
SELECT * FROM student WHERE name IS NULL;
-- 分组统计
SELECT gender, COUNT(*) AS total FROM student GROUP BY gender HAVING total>1;
SELECT MAX(age), MIN(age), AVG(age) FROM student;
-- 排序与分页
SELECT * FROM student ORDER BY age DESC;
SELECT * FROM student LIMIT 3,3; -- 跳过前3条,取3条
-- 去重
SELECT DISTINCT age FROM student;
五、MySQL 用户与权限管理
1. 用户账户
- 由
用户名@主机标识,主机支持IP、网段、通配符(%表示任意主机)。
- 示例:
root@localhost、test@'192.168.108.%'。
2. 用户操作
-- 创建用户
CREATE USER test@'192.168.108.%' IDENTIFIED BY '123456';
-- 重命名用户
RENAME USER test@'192.168.108.%' TO test2@'192.168.108.%';
-- 修改密码
ALTER USER root@'localhost' IDENTIFIED BY 'newpassword';
SET PASSWORD FOR test@'192.168.108.%' = 'newpassword';
-- 删除用户
DROP USER test2@'192.168.108.%';
-- 忘记root密码重置
vim /etc/my.cnf.d/mysql-server.cnf
# 添加:skip-grant-tables
systemctl restart mysqld
mysql -u root
UPDATE mysql.user SET authentication_string='' WHERE user='root' AND host='localhost';
FLUSH PRIVILEGES;
ALTER USER root@'localhost' IDENTIFIED BY 'xiaomi';
# 注释skip-grant-tables,重启服务
3. 权限管理
(1)权限类别
- 管理类:CREATE USER、SUPER、SHUTDOWN等。
- 程序类:CREATE、ALTER、DROP(针对函数、存储过程)。
- 库表级:SELECT、INSERT、UPDATE、DELETE等。
- 所有权限:ALL PRIVILEGES 或 ALL。
(2)授权与回收
-- 授权(指定库表)
GRANT SELECT, INSERT ON db1.student TO test@'192.168.108.%';
-- 授权所有权限(含转授权)
GRANT ALL PRIVILEGES ON *.* TO root@'192.168.108.%' WITH GRANT OPTION;
-- 回收权限
REVOKE DELETE ON db1.student FROM test@'192.168.108.%';
-- 查看权限
SHOW GRANTS FOR test@'192.168.108.%';
SHOW GRANTS FOR CURRENT_USER;
-- 刷新权限
FLUSH PRIVILEGES;
六、MySQL 高级应用
1. 备份与恢复
(1)冷备份
# 备份
systemctl stop mysqld
mkdir /mysql_bak
tar czf /mysql_bak/mysql-backup-$(date +%F).tar.gz /usr/local/mysql/data/*
systemctl start mysqld
# 恢复
systemctl stop mysqld
rm -rf /usr/local/mysql/data/*
tar xzf /mysql_bak/mysql-backup-2025-10-15.tar.gz -C /usr/local/mysql/data/
chown -R mysql:mysql /usr/local/mysql/data
systemctl start mysqld
(2)逻辑备份(mysqldump)
# 备份单个数据库
mysqldump -u root -p school > /mysql_bak/school.sql
# 备份多个数据库
mysqldump -u root -p --databases school mysql > /mysql_bak/school-mysql.sql
# 备份所有数据库
mysqldump -u root -p --all-databases > /mysql_bak/all.sql
# 备份单个表
mysqldump -u root -p school student > /mysql_bak/student.sql
# 恢复数据
mysql -u root -p school < /mysql_bak/student.sql
(3)增量备份(基于二进制日志)
# 开启二进制日志
vim /etc/my.cnf
# 添加:log-bin=mysql-bin
systemctl restart mysqld
# 完整备份
mysqldump -uroot -p school > /opt/school.sql
mysqladmin -uroot -p flush-logs # 刷新日志
# 恢复增量数据
mysqlbinlog --no-defaults /usr/local/mysql/data/mysql-bin.000003 | mysql -uroot -p
2. 主从复制与读写分离
(1)主从复制配置
主服务器(<192.168.108.101>)
# 配置my.cnf
vim /etc/my.cnf
server-id = 11
log-bin = master-bin
log-slave-updates = true
systemctl restart mysqld
# 创建复制用户并授权
mysql -uroot -p
GRANT REPLICATION SLAVE ON *.* TO 'myslave'@'192.168.108.%' IDENTIFIED BY '123456';
FLUSH PRIVILEGES;
SHOW MASTER STATUS; # 记录File和Position
从服务器(<192.168.108.102/103>)
# 配置my.cnf
vim /etc/my.cnf
server-id = 22 # 另一台为23
relay-log = relay-log-bin
relay-log-index = slave-relay-bin.index
systemctl restart mysqld
# 配置主从同步
mysql -uroot -p
CHANGE MASTER TO
master_host='192.168.108.101',
master_user='myslave',
master_password='123456',
master_log_file='master-bin.000001', # 主服务器的File
master_log_pos=604; # 主服务器的Position
START SLAVE;
SHOW SLAVE STATUS\G; # 检查Slave_IO_Running和Slave_SQL_Running是否为Yes
(2)读写分离(基于Amoeba)
Amoeba 服务器配置
# 安装JDK和Amoeba
chmod +x jdk-6u14-linux-x64.bin
./jdk-6u14-linux-x64.bin
mv jdk1.6.0_14/ /usr/local/jdk1.6
tar zxvf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/
# 配置环境变量
vim /etc/profile
export JAVA_HOME=/usr/local/jdk1.6
export AMOEBA_HOME=/usr/local/amoeba
export PATH=$PATH:$JAVA_HOME/bin:$AMOEBA_HOME/bin
source /etc/profile
# 配置amoeba.xml
vim /usr/local/amoeba/conf/amoeba.xml
# 修改客户端账号密码、读写池配置
# 配置dbServers.xml
vim /usr/local/amoeba/conf/dbServers.xml
# 配置主从服务器地址、数据库账号密码
# 启动Amoeba
/usr/local/amoeba/bin/amoeba start&
客户端测试
# 连接Amoeba(8066端口)
mysql -u amoeba -p123456 -h192.168.108.110 -P8066
# 写入操作(主服务器执行)
INSERT INTO student (name, age) VALUES ('卡卡西', 30);
# 读取操作(从服务器轮询)
SELECT * FROM school.student;
3. MHA 高可用
(1)环境准备
- 架构:1个管理节点(MHA Manager)、3个数据节点(1主2从)。
- 依赖:安装epel源、Perl模块、MHA Node(所有节点)和MHA Manager(管理节点)。
(2)核心配置
# 配置无密码认证(管理节点到所有数据节点)
ssh-keygen -t rsa
ssh-copy-id 192.168.108.131
ssh-copy-id 192.168.108.132
ssh-copy-id 192.168.108.133
# 配置app1.cnf
vim /etc/masterha/app1.cnf
# 配置manager日志、工作目录、主从复制信息、节点地址等
# 验证配置
masterha_check_ssh -conf=/etc/masterha/app1.cnf
masterha_check_repl -conf=/etc/masterha/app1.cnf
# 启动MHA
nohup masterha_manager --conf=/etc/masterha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/masterha/app1/manager.log 2>&1 &
# 查看状态
masterha_check_status --conf=/etc/masterha/app1.cnf
(3)故障切换
- 主库故障时,MHA自动将从库提升为主库,更新其他从库的主库地址,实现0-30秒故障切换。
- 故障修复后,需重新配置主从关系,将原主库变为新主库的从库。
七、MySQL 应用部署(LAMP架构)
1. 架构说明
- LAMP:Linux + Apache + MySQL + PHP,用于运行动态网站。
2. 部署步骤
# 安装Apache和PHP
yum -y install httpd php php-mysqlnd php-json php-gd php-xml php-mbstring php-zip
systemctl start httpd
systemctl disable --now firewalld
# 配置PHP测试页面
echo "<?php phpinfo(); ?>" > /var/www/html/test.php
# 下载并部署WordPress
cd /var/www/html/
wget https://cn.wordpress.org/latest-zh_CN.zip
unzip latest-zh_CN.zip
chown -R apache.apache wordpress/
# MySQL配置(创建数据库和用户)
mysql -uroot -p
CREATE DATABASE wordpress;
CREATE USER 'wordpresser'@'192.168.108.%' IDENTIFIED BY '123456';
GRANT ALL ON wordpress.* TO 'wordpresser'@'192.168.108.%';
FLUSH PRIVILEGES;
# 配置Apache虚拟主机
vim /etc/httpd/conf.d/blog.conf
<VirtualHost *:80>
ServerName blog.gqd.cloud
DocumentRoot "/var/www/html/wordpress"
<Directory "/var/www/html/wordpress">
AllowOverride all
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
systemctl restart httpd
3. 访问测试
- 配置本地hosts文件,添加
192.168.108.100 blog.gqd.cloud。
- 浏览器访问
http://blog.gqd.cloud,按向导完成WordPress配置。