第五部分 用户管理、数据库事务及数据库备份与还原
1 MySQL 用户管理
MySQL 用户管理是数据库安全的核心环节,通过创建专用用户、分配最小权限,避免直接使用高权限的root用户,保障数据安全。
1.1 创建用户
MySQL 安装后默认生成root 超级用户,拥有全部权限。日常操作必须创建普通用户,按需分配权限。
基本语法
CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码';
关键字段说明
-
用户名:自定义账号名称 -
主机名:限制用户登录的 IP / 主机-
localhost:仅本地登录 -
%:所有主机均可登录(默认) -
具体 IP:仅指定 IP 可登录
-
-
IDENTIFIED BY:设置登录密码(必须加单引号)
注意事项
-
创建用户需要CREATE USER权限
-
新用户默认只有登录权限,无任何操作权限
-
可同时创建多个用户,用逗号分隔
-
密码建议复杂度高,避免空密码
实战案例
-- 创建本地用户 test1,密码 test1
CREATE USER 'test1'@'localhost' IDENTIFIED BY 'test1';
-- 查看系统所有用户
SELECT user,host FROM mysql.user;
-- 使用新用户登录测试
mysql -utest1 -p
1.2 修改用户
用于修改用户名 + 主机名,不修改密码。
基本语法
RENAME USER '旧用户'@'主机名' TO '新用户'@'主机名';
注意事项
-
旧用户必须存在,新用户不能重复
-
需要UPDATE 或CREATE USER权限
-
重命名后权限保持不变
实战案例
-- 将 test1 改名为 testUser1
RENAME USER 'test1'@'localhost' TO 'testUser1'@'localhost';
-- 查看用户是否修改成功
SELECT user,host FROM mysql.user;
1.3 用户授权与权限查看
新用户默认只有登录权限,必须授权才能操作数据库。
1.3.1 查看用户权限
-- 查看指定用户权限
SHOW GRANTS FOR '用户名'@'主机名';
USAGE ON *.*:表示无任何操作权限,仅能登录
1.3.2 授权语法
GRANT 权限列表 ON 数据库.表 TO '用户名'@'主机名';
常用权限
-
SELECT:查询 -
INSERT:插入 -
UPDATE:修改 -
DELETE:删除 -
ALL PRIVILEGES:所有权限(除授权外)
实战案例
-- 授予 testUser1 操作 test 库所有表的全部权限
GRANT ALL ON test.* TO 'testUser1'@'localhost';
-- 再次查看权限
SHOW GRANTS FOR 'testUser1'@'localhost';
1.3.3 撤销权限
REVOKE ALL ON 数据库.表 FROM '用户名'@'主机名';
实战案例
-- 撤销 test 库的所有权限
REVOKE ALL ON test.* FROM 'testUser1'@'localhost';
1.4 删除用户
删除用户会同时清除该用户的所有权限配置。
基本语法
DROP USER '用户名'@'主机名';
实战案例
-- 删除用户 testUser1
DROP USER 'testUser1'@'localhost';
-- 查看用户是否删除
SELECT user,host FROM mysql.user;
2 数据库事务
2.1 事务概述
数据库事务 是一组不可分割的数据库操作序列,是保证数据安全与一致性的核心机制。事务遵循要么全部执行成功,要么全部执行失败的原则,典型场景:银行转账、订单支付、机票购买。
2.2 事务四大特性(ACID)
-
**原子性(Atomicity)**事务是最小执行单元,所有操作要么全部完成,要么全部回滚,不允许中间状态。
-
**一致性(Consistency)**事务执行前后,数据库的完整性约束不被破坏,数据始终合法。
-
**隔离性(Isolation)**多个事务并发执行时,相互之间互不干扰。
-
持久性(Durability) 事务一旦提交,对数据的修改是永久生效的,即使系统崩溃也不会丢失。
2.3 准备测试环境
创建账户表,用于演示转账事务:
-- 删除已存在表
drop table if exists account;
-- 创建账户表
create table account(
id int primary key AUTO_INCREMENT comment 'ID',
name varchar(10) comment '姓名',
money double(10, 2) comment '余额'
);
-- 插入测试数据
insert into account(name, money) values ('张三', 2000), ('李四', 2000);
-- 查询数据
select * from account;
2.4 未控制事务(自动提交)
MySQL 默认自动提交事务,每执行一条 DML 语句就自动提交一次。
正常情况
-- 张三扣款
update account set money = money - 1000 where name = '张三';
-- 李四收款
update account set money = money + 1000 where name = '李四';
执行成功,数据一致。
异常情况
如果第一条执行成功、第二条报错,会出现数据不一致(张三钱扣了,李四没收到)。
2.5 控制事务方式一:修改自动提交
查看自动提交状态
SELECT @@autocommit;
-
1:自动提交(默认) -
0:手动提交
关闭自动提交
SET @@autocommit = 0;
提交 / 回滚事务
COMMIT; -- 提交事务,永久生效
ROLLBACK; -- 回滚事务,撤销所有修改
特点
-
仅对当前会话窗口有效
-
所有 DML 语句都需要手动提交
2.6 控制事务方式二:手动开启事务
语法
BEGIN;
-- 或
START TRANSACTION;
-- 执行业务SQL
-- ...
COMMIT; -- 提交
ROLLBACK;-- 回滚
案例 1:正常提交(转账成功)
start transaction;
update account set money = money - 1000 where name = '张三';
update account set money = money + 1000 where name = '李四';
commit;
案例 2:事务回滚(转账失败)
start transaction;
update account set money = money - 1000 where name = '张三';
rollback; -- 回滚,数据恢复
2.7 事务并发问题
多个事务同时运行,会出现三类数据安全问题:
-
脏读 一个事务读取到另一个事务未提交的数据,对方回滚后,该数据无效。
-
不可重复读 一个事务内,两次读取同一行数据结果不同(被其他事务修改并提交)。
-
幻读一个事务按条件查询无数据,但插入时提示主键重复,像出现 "幻影数据"。
2.8 事务隔离级别
为解决并发问题,MySQL 提供 4 种隔离级别:从上到下,隔离级别越高,安全性越高,性能越低。
| 隔离级别 | 脏读 | 不可重复读 | 幻读 | 说明 |
|---|---|---|---|---|
| Read Uncommitted(读未提交) | ✅ | ✅ | ✅ | 性能最高,安全性最差 |
| Read Committed(读已提交) | ❌ | ✅ | ✅ | 解决脏读 |
| Repeatable Read(可重复读) | ❌ | ❌ | ✅ | MySQL 默认,解决脏读 + 不可重复读 |
| Serializable(串行化) | ❌ | ❌ | ❌ | 最高级别,完全无并发,性能最低 |
2.9 查看与设置隔离级别
查看当前隔离级别
select @@transaction_isolation;
设置隔离级别
-- 会话级(当前窗口)
SET SESSION TRANSACTION ISOLATION LEVEL 级别;
-- 全局级(所有窗口)
SET GLOBAL TRANSACTION ISOLATION LEVEL 级别;
2.10 隔离级别演示(多会话对比)
案例 1:读未提交 → 出现脏读
-- 会话1
set session transaction isolation level read uncommitted;
start transaction;
-- 会话2
start transaction;
update account set money = money - 1000 where name = '张三';
-- 会话1:读到未提交数据(脏读)
select * from account;
-- 会话2回滚,会话1数据无效
案例 2:读已提交 → 解决脏读,但出现不可重复读
set session transaction isolation level read committed;
-
不会读到未提交数据
-
事务内两次查询结果不一致
案例 3:可重复读 → 解决不可重复读(MySQL 默认)
set session transaction isolation level repeatable read;
-
事务期间数据不受其他事务修改影响
-
仍可能出现幻读
案例 4:串行化 → 解决所有问题(性能极低)
set session transaction isolation level serializable;
-
读写完全阻塞
-
无并发,无任何数据问题
3 数据库备份与还原
3.1 数据库备份介绍
3.1.1 数据备份的重要性
在生产环境中,数据是核心资产,任何数据丢失都可能造成严重损失,因此备份是数据库运维中必不可少的安全保障。
3.1.2 数据丢失的常见原因
-
程序错误、代码 BUG 导致数据异常
-
人为操作失误(误删库、误删表)
-
磁盘故障、服务器宕机
-
自然灾害、病毒攻击、数据盗窃
3.1.3 备份分类(物理与逻辑)
-
物理备份直接备份数据库操作系统的物理文件(数据文件、日志文件等)
-
冷备份:关闭数据库时备份,最安全
-
热备份:数据库运行中备份,依赖日志
-
温备份:锁定表(可读不可写)时备份
-
-
逻辑备份 备份数据库的逻辑结构与数据,导出为 SQL 脚本,可跨版本、跨平台使用。
3.1.4 备份策略分类
-
完全备份:每次备份全部数据
-
差异备份:只备份上次完全备份后修改的数据
-
增量备份:只备份上次备份(完全 / 增量)后修改的数据
3.2 物理冷备份与恢复
冷备份 = 关闭数据库 → 打包数据目录适用于维护窗口、停机备份,安全性最高。
Linux 环境
# 1. 停止MySQL服务
systemctl stop mysqld
# 2. 创建备份目录
mkdir /backup
# 3. 打包数据目录(按日期备份)
tar zcvf /backup/mysql_all-$(date +%F).tar.gz /usr/local/mysql/data/
# 4. 恢复时:停止库 → 解压覆盖 → 启动库
Windows 环境
-
停止 MySQL 服务
-
打包数据目录(如:
C:\ProgramData\MySQL\MySQL Server 8.4) -
恢复时停止服务 → 还原目录 → 重启服务
3.3 逻辑备份与恢复(mysqldump)
MySQL 最常用逻辑备份工具,导出 SQL 脚本,可跨平台、轻量灵活。
3.3.1 备份命令(在系统 CMD 执行,非 MySQL 内)
1. 备份指定库中的指定表
mysqldump -uroot -p 库名 表名 > 备份文件.sql
示例:
mysqldump -uroot -p test emp > empbackup.sql
2. 备份整个数据库
mysqldump -uroot -p --databases 库名 > 库备份.sql
示例:
mysqldump -uroot -p --databases test > test_backup.sql
3. 备份所有数据库
mysqldump -uroot -p --all-databases > all_database_backup.sql
3.4 数据恢复(mysql 命令导入)
3.4.1 恢复单张表
mysql -uroot -p 库名 < 表备份.sql
示例:
mysql -uroot -p test < empbackup.sql
验证:
show tables;
select count(*) from emp;
3.4.2 恢复整个数据库
mysql -uroot -p < 库备份.sql
示例:
mysql -uroot -p < test_backup.sql
3.4.3 恢复所有数据库
mysql -uroot -p --default-character-set=utf8 < all_database_backup.sql
验证:
show databases;
use test;
show tables;
select * from dept;