MySQL 从基础到实践

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为例)

Bash 复制代码
# 环境准备
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 客户端
Bash 复制代码
# 登录数据库
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 工具
Bash 复制代码
# 显示版本信息
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)
Bash 复制代码
# 安装依赖
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)数据库操作
SQL 复制代码
-- 创建数据库
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)表操作
SQL 复制代码
-- 创建表
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 语句(数据操纵)

SQL 复制代码
-- 插入数据
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 语句(数据查询)

SQL 复制代码
-- 基础查询
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@localhosttest@'192.168.108.%'

2. 用户操作

SQL 复制代码
-- 创建用户
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)授权与回收
SQL 复制代码
-- 授权(指定库表)
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)冷备份
Bash 复制代码
# 备份
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)
Bash 复制代码
# 备份单个数据库
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)增量备份(基于二进制日志)
Bash 复制代码
# 开启二进制日志
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>)
Bash 复制代码
# 配置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>)
Bash 复制代码
# 配置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 服务器配置
Bash 复制代码
# 安装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&
客户端测试
Bash 复制代码
# 连接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)核心配置
Bash 复制代码
# 配置无密码认证(管理节点到所有数据节点)
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. 部署步骤

Bash 复制代码
# 安装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配置。
相关推荐
北凉军2 分钟前
java连接达梦数据库,用户名是其他库的名称无法指定库,所有mapper查询的都是以用户名相同的库内的表
java·开发语言·数据库
尽兴-13 分钟前
MySQL索引优化:从理论到实战
数据库·mysql·优化·b+树·索引·最左前缀
ZKNOW甄知科技30 分钟前
IT自动分派单据:让企业服务流程更智能、更高效的关键技术
大数据·运维·数据库·人工智能·低代码·自动化
小光学长1 小时前
基于Web的长江游轮公共服务系统j225o57w(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
前端·数据库
Davina_yu1 小时前
2026年节假日表SQL
数据库·sql
是娇娇公主~2 小时前
工厂模式详细讲解
数据库·c++
天码-行空2 小时前
Linux 系统 MySQL 8.0 详细安装教程
linux·运维·mysql
码农小卡拉2 小时前
数据库:主键 VS 唯一索引 区别详解
java·数据库·sql
廋到被风吹走2 小时前
【数据库】【MySQL】锁机制深度解析:从原理到死锁分析实战
数据库·mysql
海棠AI实验室2 小时前
第 3 篇:方案写作——SOW / 里程碑 / 验收标准 / 风险假设的标准模板
数据库·python