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配置。
相关推荐
2301_767902643 小时前
MySQL 入门
数据库·mysql
7ioik4 小时前
说一说MySQL数据库基本架构?
数据库·mysql·架构
@淡 定4 小时前
Redis持久化机制
数据库·redis·缓存
云老大TG:@yunlaoda3604 小时前
华为云国际站代理商DAS的跨境合规适配是如何保障数据合规的?
网络·数据库·华为云
TG:@yunlaoda360 云老大4 小时前
华为云国际站代理商HiLens的技术优势对跨境客户有哪些具体帮助?
服务器·数据库·华为云
+VX:Fegn08954 小时前
计算机毕业设计|基于springboot + vue健身房管理系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
东东的脑洞4 小时前
【面试突击】MySQL 查询优化核心面试知识点
mysql·面试·职场和发展
Leon-Ning Liu4 小时前
当SGA大于hugepage的时候,Oracle数据库是怎么使用hugepage的
数据库·oracle
马克学长4 小时前
SSM校园二手交易系统aqj3i(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·ssm 框架·javaweb 开发