数据库知识复习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;
相关推荐
杉氧22 分钟前
Navigation Compose 深度实践:如何优雅地串联起你的全栈 App?
android·架构·android jetpack
这个DBA有点耶1 小时前
AI写的SQL跑崩了生产库,这锅谁背?
数据库·人工智能·程序员
镜舟科技2 小时前
Databricks 再提 LTAP,AI 时代的数据底座为何重回大一统叙事?
数据库·架构·agent
Databend3 小时前
从湖仓升级为 Agent 时代的数据控制面,Snowflake 和 Databricks 有哪些布局
大数据·数据库·agent
雨白4 小时前
指针与数组的核心机制
android
ClouGence6 小时前
SQL Server CDC 能放到 Always On 备库读吗?一文讲透原理与实践
数据库·sql server
黄林晴8 小时前
Room 3.0 正式发布!包名彻底重构,KMP 成为核心主线
android·android jetpack
三少爷的鞋9 小时前
Kotlin 协程环境下的 DCL 懒加载:别把线程时代的经验直接搬过来
android
plainGeekDev9 小时前
Gson → kotlinx.serialization
android·java·kotlin