5.1 数据库的备份还原方法

5.1.1 命令行方法

  • 备份:

    1
    mysqldump -u用户名 -p密码 数据库名称 > 保存路径

    举例如下:

    注意,盘符分隔符用//

    另外,建议用 CMD 而不是 PowerShell 去导出(出锅了)

    此时,在E盘得到这个备份文件:

  • 还原:

    假如数据库stu被删掉,我们可以通过之前保存的.sql备份文件去还原:

    1. 首先创建一个数据库并使用它:

      1
      2
      CREATE DATABASES db1;
      USE DB1;
    2. 输入命令,将备份数据库还原到这个新库当中:

      1
      SOURCE 路径;

      举例:

      1
      SOURCE E://2333.sql;

5.1.2 图形化工具方法

  • 备份:

  • 还原:

5.2 事务处理

5.2.1 事务的基本概念

事务,是用户定义的一个数据库操作序列,这些操作要么全做,要么全不做,是一个不可分割的工作单位。一般而言,一个程序中包含多个事务。

事务的开始与结束可由用户显式控制,若用户没有显式地定义事务,则由数据库管理系统按默认规定自动划分事务。

事务的 ACID 特性

  1. 原子性
  2. 一致性:事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。故当数据库只包含成功事务提交的结果。
  3. 隔离性:一个事务的内部操作及使用的数据对其他并发事务是隔离的,并发执行的各个事务之间不能互相干扰。
  4. 持续性(永久性):一个事务一旦提交,它对数据库中数据的改变就应是永久性的。

5.2.2 手动提交事务

功能SQL语句(MySQL)
开启事务START TRANSACTION;
提交事务COMMIT;
回滚事务ROLLBACK;

若事务中SQL语句没有出现问题,最后用户 COMMIT 事务时,数据库数据会发生真正的改变。

反之,一旦某个语句有问题,用户可以 ROLLBACK 事务,此时数据库数据则会回退到事务开启前的状态。

事务执行,就是一个整体。所有的 SQL 语句都必须执行成功,若其中有一条 SQL 语句出现异常,则所有的 SQL 语句都要回滚,整个业务执行失败。

回滚点

某些操作成功完成后,后续操作有可能成功或失败,既然前面操作已经成功,不妨在当前成功的位置设置一个回滚点,可供后续操作失败时返回到该位置,而不是返回所有操作。

回滚点的操作语句
设置回滚点SAVEPOINT 名字;
回到回滚点ROLLBACK TO 名字;

举例如下:

  1. 开启事务。
  2. 令张三账户减少10块;
  3. 操作成功,设置回滚点:SAVEPOINT p;
  4. 令李四账户增加10块;
  5. 操作过程中出现问题,回到回滚点:ROLLBACK TO p;

5.2.3 自动提交事务

MySQL 默认情况下,每一条 DML(增删改)语句都作为一个单独的事务,语句执行完毕时自动提交事务。

  • 查看 MySQL 是否开启自动提交事务

    1
    SELECT @@AUTOCOMMIT;
  • 取消自动提交事务

    1
    SET @@AUTOCOMMIT = 0;

5.2.4 事务的隔离级别

保证事务 ACID 特性,是事务管理的重要任务。由于并发操作,多个用户同时访问同一个数据,会出现一些问题:

并发访问的问题描述
脏读一个事务读取到了另一事务中尚未提交的数据
不可重复读一个事务中两次读取的数据内容不一致,这由事务 update 时引发的问题。
幻读一个事务中两次读取的数据数量不一致,这由事务 insertdelete 时引发的问题。

而 MySQL 数据库对于上面的问题有四种隔离级别:

级别名称隔离级别脏读不可重复读幻读数据库默认隔离级别
1读未提交read uncommitted
2读已提交read commiteed不会Oracle、SQL Server
3可重复读repeatable read不会不会MySQL
4串行化serializable不会不会不会(特点:一个事务没有执行完,其他事务的SQL就执行不了,可以挡住幻读)

从上至下,隔离级别越高,安全性越高,但效率越低。

MySQL 事务隔离级别相关命令

  • 查询全局事务隔离级别

    1
    SELECT @@tx_isolation;
  • 设置隔离级别

    1
    2
    SET GLOBAL TRANSACTION ISOLATION LEVEL 级别字符串;
    /* 比如 repeatable read */

    隔离级别发生变化时,需要退出 MySQL 再重新登录方能查看。