数据库的管理和维护

简单记录数据库的安全管理、并发控制中的事务,备份和恢复管理。

安全性管理

SQL server三级认证作用以及认证和授权内容

  • 服务器级别认证:身份验证,通过操作系统级别的安全验证来访问数据库系统。
  • 数据库级别认证:通过数据库用户账户进行控制,要访问一个数据库,必须拥有一个数据库的一个用户账号身份,该用户对应的权限访问数据库中的数据。
  • 数据库对象级别认证:常见的数据库对象级别认证包括对表、视图、存储过程、函数等数据库对象的访问权限控制。

权限管理

  • 对象权限:用户是否具有权限执行某一语句,主要用于控制创建数据库或数据库中对象而涉及的权限。(CRUD)。
  • 语句权限:用户对数据库执行操作的权限。(创建数据库、视图、表、存储函数等)。
  • 隐私权限:系统预定义而不需要授权就有的权限,包括固定服务器角色、固定数据库角色和数据库对象所有者所拥有的权限。

权限操作

授权

1
grant [权限名] on [数据库名.表名] to [用户名@IP地址]

撤销权限

1
revoke [权限名] on [数据库名.表名] to [用户名@IP地址]

禁止权限

MySQL中没有禁止权限,通过撤销权限来实现禁止。

SQL server:deny [权限名] on [数据库名.表名] to [用户名@IP地址]

权限查看

MySQL:show grantsshow grants for 'username'@'localhost'

SQL server:execute sp_helprotect [@name='对象名或授权语句名', @username='用户名', @grantorname='授权的用户账号名']

并发控制

事务

事务是由用户定义的一系列数据操作语句构成,这些操作语句要么全部执行要么全部不执行,是数据库运行的最小的、不可分割的工作单位。

ACID

  • 原子性:一个事务对于数据的所有操作都是不可分割的整体,要么全部执行,要么全部不执行。
  • 一致性:事务执行完成后,数据库中的内容必须全部更新,确保数据一致性。
  • 隔离性:一个事务执行不能被其他事务干扰,一个事务内部操作及其使用的数据对其他并发事务是隔离的,并发执行的各个事务之间不能互相干扰。
  • 持续性:一个事务一旦提交,它对数据库中数据的改变就是永久的。

显示事务:事务有显示的开始和结束标记。

MySQL:

1
2
3
4
5
6
# 开启事务
begin;
# 回滚事务
rollback;
# 提交事务
commit;

SQL server:

1
2
3
begin transact;
rollback;
commit;

隐式事务:每一条数据操作语句都自动成为一个事务。

并发控制概述

并发执行能提高系统资源的利用率,改善短事务的响应时间,但并发执行可能破坏事务的ACID特性。

并发操作导致的问题

  • 丢失更新:两个或两个以上的事务在更新同一数据值时,会发生某些修改被覆盖(丢失)的问题。(都在更新,但后面的更新数值覆盖前面更新结果,最后数值不对)。
  • 读“脏”数据:一个事务读取了另一个事务失败运行过程中的数据。事务T1更新数值,事务T2读取了这个数值,但事务T1失败了,回滚事务,事务T2读的数值和数据库中不一致。一个事务读到另一个事务还没有提交的数据
  • 不可重复读:不可重复读是指事务T1读取数据后,事务T2对该数据进行读取并执行更新操作,修改了T1读取的数据,T1操作完数据后,又重新读取这个数据,会发现读到的结果与前一次不一样。一个事务先后读取同一条记录,但两次读取的数据不同
  • 幻读一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在

并发控制方法

排他锁

写锁,只允许一个事务对数据进行修改,其他事务无法同时对该行数据进行读取或修改操作。

共享锁

读锁,允许多个事务同时读取同一行数据,但不允许任何事务对该行数据进行修改。

封锁技术

  • 一级封锁协议:事务在修改数据对象之前必须对其加X锁,直到事务结束时才释放锁。可以防止丢失更新的问题,当不能保证可重复读和脏读。
  • 二级封锁协议:是指在一级封锁协议基础上,加上事务T在读取数据之前必须先对其加S锁,读取完后立即释放S锁。可以防止数据丢失更新、读“脏”数据。
  • 三级封锁协议:指在一级封锁协议基础上,加上事务T在读取数据之前必须先对其加S锁,读取完后并不释放S锁,直到事务T结束才释放。可以防止丢失更新、不读“脏”数据,不可重复读。

活锁

某一个事务一直等待锁,进程“饿死”状态。

通过先来先服务解决。

死锁

每个事务相互等待其他事务释放封锁,都不能进行。

死锁预防:

  • 一次性封锁:要求每个事务必须一次性将所有要使用的诗句全部加锁后执行。扩大了封锁的范围,降低了系统的并发度。
  • 顺序封锁:要求所有事务必须按照一个预先约定的封锁顺序对所要用到的数据对象进行封锁。很难预先确定所有数据对象的加锁顺序。

死锁诊断和解除:

  • 超时法:对每个锁设定一个时限,如果某个事务的等待时间超过了该时限,就认为发生了死锁,此时调用解锁程序,以解除死锁。时限难于设置,若设置太长,则会导致死锁发生后不能及时发现;也有可能误判死锁。
  • 事务等待图法:特殊的有向图G=(T,U)。T为结点的集合,每个结点表示正在运行的事务;U 为边的集合,每条边表示事务等待的情况。若T1等待T2,那么T1、T2之间划一条有向边,从T1指向T2。建立事务等待图之后,诊断死锁的问题就变成了判断有向图G中是否存在回路的问题。

并发调度可串行性

多个并发执行是正确的,当且仅当结果与按某一顺序串行的执行这些事务时的结果相同,则称这种调度策略为可串行化的调度。

可串行性是并发事务正确调度的准则。目前数据库管理系统普遍采用两段锁协议来实现并发调度的可串行化,从而保证调度的正确性。

事务必须分为两个阶段对数据对象进行加锁和解锁:

  • 在对任何数据进行读写操作之前,要先申请并获得对该数据的封锁。

    事务可以申请获得任何数据对象上的任何类型的锁,但是不允许释放任何锁。

  • 在释放一个封锁之后,事务不再申请和获得对该数据的封锁。

    事务可以释放任何数据对象上的任何类型的锁,但不允许申请任何锁。

事务遵守两段封锁协议是可串行化调度的充分条件,而不是必要条件

备份及恢复管理

数据备份

  • 完全备份

    将备份整个数据库,不仅包括用户表、系统表、索引、视图、存储过程等所有数据库对象,还包括事务日志部分。

    MySQL在cmd命令行实现完全备份和恢复:

    1
    2
    3
    4
    # 完全备份
    mysqldump -u username -p mydatabase > backup.sql
    # 还原备份
    mysql -u username -p mydatabase < backup.sql
  • 差分备份

    仅备份自上次完全备份以来数据改变部分的内容。

    1
    2
    # 备份名为mydatabase的数据库中表mytable中id大于100的行
    mysqldump -u username -p mydatabase mytable --where="id > 100" > diff_backup.sql

    恢复和完全备份相同。

  • 事务日志备份

    对事务日志进行备份,备份时复制自上次备份以来对数据库所做的改变。

    事务日志备份和差分备份有所不同。差分备份无法将数据库恢复到出现故障前某一个指定的时刻,它只能将数据库恢复到上一次差分备份结束的时刻。

  • 文件或文件组备份

    数据库由磁盘上的许多文件构成。如果数据库非常大,执行完全备份是不可行的,可以使用文件备份或文件组备份来备份数据库的一部分。