数据库知识复习05

第五部分 用户管理、数据库事务及数据库备份与还原

1 MySQL 用户管理

MySQL 用户管理是数据库安全的核心环节,通过创建专用用户、分配最小权限,避免直接使用高权限的root用户,保障数据安全。

1.1 创建用户

MySQL 安装后默认生成root 超级用户,拥有全部权限。日常操作必须创建普通用户,按需分配权限。

基本语法

复制代码
CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码';

关键字段说明

  • 用户名:自定义账号名称

  • 主机名:限制用户登录的 IP / 主机

    • localhost:仅本地登录

    • %:所有主机均可登录(默认)

    • 具体 IP:仅指定 IP 可登录

  • IDENTIFIED BY:设置登录密码(必须加单引号)

注意事项

  1. 创建用户需要CREATE USER权限

  2. 新用户默认只有登录权限,无任何操作权限

  3. 可同时创建多个用户,用逗号分隔

  4. 密码建议复杂度高,避免空密码

实战案例

复制代码
-- 创建本地用户 test1,密码 test1
CREATE USER 'test1'@'localhost' IDENTIFIED BY 'test1';

-- 查看系统所有用户
SELECT user,host FROM mysql.user;

-- 使用新用户登录测试
mysql -utest1 -p

1.2 修改用户

用于修改用户名 + 主机名,不修改密码。

基本语法

复制代码
RENAME USER '旧用户'@'主机名' TO '新用户'@'主机名';

注意事项

  1. 旧用户必须存在,新用户不能重复

  2. 需要UPDATECREATE USER权限

  3. 重命名后权限保持不变

实战案例

复制代码
-- 将 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)

  1. **原子性(Atomicity)**事务是最小执行单元,所有操作要么全部完成,要么全部回滚,不允许中间状态。

  2. **一致性(Consistency)**事务执行前后,数据库的完整性约束不被破坏,数据始终合法。

  3. **隔离性(Isolation)**多个事务并发执行时,相互之间互不干扰。

  4. 持久性(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 事务并发问题

多个事务同时运行,会出现三类数据安全问题:

  1. 脏读 一个事务读取到另一个事务未提交的数据,对方回滚后,该数据无效。

  2. 不可重复读 一个事务内,两次读取同一行数据结果不同(被其他事务修改并提交)。

  3. 幻读一个事务按条件查询无数据,但插入时提示主键重复,像出现 "幻影数据"。

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 备份分类(物理与逻辑)

  1. 物理备份直接备份数据库操作系统的物理文件(数据文件、日志文件等)

    • 冷备份:关闭数据库时备份,最安全

    • 热备份:数据库运行中备份,依赖日志

    • 温备份:锁定表(可读不可写)时备份

  2. 逻辑备份 备份数据库的逻辑结构与数据,导出为 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 环境

  1. 停止 MySQL 服务

  2. 打包数据目录(如:C:\ProgramData\MySQL\MySQL Server 8.4

  3. 恢复时停止服务 → 还原目录 → 重启服务

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;
相关推荐
豆沙糕2 小时前
RAG文档切分最佳实践:企业级方案+主流策略+生产落地
数据库·人工智能
不会写DN2 小时前
SQL 多表操作全解
数据库·sql
爱莉希雅&&&2 小时前
linux中MySQL数据库备份恢复的四种方法(更新中)
linux·数据库·mysql·数据库备份·mysqldumper
云边有个稻草人2 小时前
时序数据库选型技术剖析:从写入、存储到查询的五个关键维度
数据库
疯狂成瘾者2 小时前
Chroma向量数据库
开发语言·数据库·c#
ayt0072 小时前
Netty AbstractNioChannel源码深度剖析:NIO Channel的抽象实现
java·数据库·网络协议·安全·nio
荒川之神2 小时前
Oracle 数据仓库星座模型(Galaxy Model)设计原则
数据库·数据仓库·oracle
杰克尼2 小时前
redis(day03-商户查询缓存)
数据库·redis·缓存
枕布响丸辣2 小时前
Python 操作 MySQL 数据库从入门到精通
数据库·python·mysql