数据库测试扫盲篇
2022-08-31
数据库测试扫盲篇
最近参与数据库POC测试,鉴于对数据库还不够了解,决定先以一些测试案例为蓝本,自我扫盲下。
表空间以及表空间管理
1、什么是表空间(TABLESPACE)
表空间是一种存储结构,它包含表、索引、大对象和长型数据。
以ORACLE为例,一个ORACLE数据库能够有一个或多个表空间,而一个表空间则对应着一个或多个物理的数据库文件,但一个数据库文件只能与一个表空间相联系。表空间是ORACLE数据库恢复的最小单位,容纳着许多数据库实体,如表、视图、索引、聚簇、回退段和临时段等。
2、什么是表空间管理
表空间管理包括:如对表空间的创建、修改、删除、扩容
参考链接
https://www.ibm.com/docs/zh/db2/10.5?topic=databases-table-spaces
https://www.modb.pro/db/335060
https://www.cnblogs.com/kerrycode/p/3418694.html
https://blog.51cto.com/u_14056283/3076029
数据库对象
一个数据库对象是 数据库中用于存储或引用数据的任何已定义对象。我们从 create 命令所做的任何事情都称为数据库对象。它可以用来保存和操作数据。
主要的数据库对象包含:触发器(Trigger)、表(Table)、视图(View)、存储过程(StoredProcedure)、索引(Index)、缺省值(Default)、图表(Diagram)、用户(User)、规则(Rule)等几类
参考链接
https://www.jianshu.com/p/ec63e6937e7c
https://zh-cn.myubi.tv/21731-what-is-a-database-object
数据库约束
概念:数据库约束是防止非法记录的规则,约束保存在数据字典(data dictionary)中, 约束可以被定义在列级或者表级。
类型:总的来说有五种:唯一性和主键约束、外键约束、检查约束、空值约束、默认值约束。
有五大关键词,UNIQUE和Primary Key, Foreign Key, CHECK, NOT NULL, DEFAULT
参考链接
https://developer.aliyun.com/article/91298
https://www.cnblogs.com/netsql/archive/2010/05/06/1729162.html
视图
视图是从一个或几个基本表(或视图)导出的表。 它与基本表不同,是一个虚表。数据库只存放视图的定义,而不存放视图对应的数据,这些数据仍存放在原来的基本表中。 所以基本表中的数据发生变化,从视图中查询出的数据也就随之改变了。 视图只供查询,数据不可更改。
参考链接
https://zhuanlan.zhihu.com/p/372569011
触发器(trigger)
触发器是与表有关的数据库对象,指的是在insert\update\delete操作之前或者之后,能够触发并执行触发器中定义的SQL语句集合。触发器的这种特性可以使得应用在数据库端确保数据的完整性以及日志记录,数据校验等操作。并且可以使用OLD和NEW来引用触发器中发生变化的记录内容。
触发器的分类:
DML触发器:DML(Data Manipulation Language)触发器是当数据库服务器中发生数据操作语言事件时执行的存储过程。DML触发器又分为两类:After触发器和Instead Of触发器
DDL触发器:DDL触发器是在响应数据定义语言(Data Definition Language)事件时执行的存储过程。DDL触发器一般用于执行数据库中管理任务。如审核和规范数据库操作、防止数据库表结构被修改等。
例如:
create trigger trigger_name
before/after insert/update/delete
on table_name
[for each row] --- 行级触发器
begin
trigger_stmt;
end;
参考链接
https://zhuanlan.zhihu.com/p/133291633
https://www.cnblogs.com/liushuijinger/archive/2012/06/10/2543941.html
存储过程(procedure)与函数(function)
存储过程和函数是事先经过编译并存储在数据库中的一段sql语句集合,调用存储过程和函数可以简化应用开发工作,提高数据库处理的效率。
函数和存储过程的区别:
1.函数有且只有一个返回值,而存储过程不能有返回值。
2.函数只能有输入参数,而存储过程可以有 in,out,inout多个类型参数。
3.存储过程中的语句功能更丰富,实现更复杂的业务逻辑,而函数中通常不会使用 insert,update,delete等语句,只是完成查询的工作,受输入参数并返回一个结果,功能针对性比较强。
4.存储过程一般是作为一个独立的部分来执行(call调用)。而函数可以作为查询语句的一个部分来调用。
例如:
--结束符号默认为 ; ,存储过程内使用 ; 结束一个语句
--在命令行模式下,为了便于区分可以自定义一个结束符号 $
delimiter $
create procedure proce_user01()
begin
insert into user(`id`,`username`, `password`) values(3, '王五', 'wangwu');
end $
delimiter $
create function fun_user(uname varchar(255), pass varchar(255))
returns int
begin
-- 声明一个局部变量
declare result int default 0;
insert into `user`(`username`, `password`) values(uname, pass);
-- 给变量赋值
set result = 1;
return result;
end $
参考链接
https://blog.51cto.com/u_15162069/2761745
http://static.kancloud.cn/king_om/mysql/2679517
事务(transaction)
把多条语句作为一个整体进行操作的功能,被称为数据库事务。数据库事务可以确保该事务范围内的所有操作都可以全部成功或者全部失败。如果事务失败,那么效果就和没有执行这些SQL一样,不会对数据库数据有任何改动。
可见,数据库事务具有ACID这4个特性:
- A:Atomic,原子性,将所有SQL作为原子工作单元执行,要么全部执行,要么全部不执行;
- C:Consistent,一致性,事务完成后,所有数据的状态都是一致的,即A账户只要减去了100,B账户则必定加上了100;
- I:Isolation,隔离性,如果有多个事务并发执行,每个事务作出的修改必须与其他事务隔离;
- D:Duration,持久性,即事务完成后,对数据库数据的修改被持久化存储。
对于单条SQL语句,数据库系统自动将其作为一个事务执行,这种事务被称为隐式事务。
# 关键词
BEGIN
COMMIT
ROLLBACK
隔离性(隔离级别)
对于两个并发执行的事务,如果涉及到操作同一条记录的时候,可能会发生问题。因为并发操作会带来数据的不一致性,包括脏读、不可重复读、幻读等。数据库系统提供了隔离级别来让我们有针对性地选择事务的隔离级别,避免数据不一致的问题。
Isolation Level | 脏读(Dirty Read) | 不可重复读(Non Repeatable Read) | 幻读(Phantom Read) |
---|---|---|---|
Read Uncommitted(读取未提交内容) | Yes | Yes | Yes |
Read Committed(读取提交内容) | - | Yes | Yes |
Repeatable Read(可重读) | - | - | Yes |
Serializable(可串行化) | - | - | - |
参考链接
https://www.huaweicloud.com/zhishi/edit-582116.html
https://www.liaoxuefeng.com/wiki/1177760294764384/1179611198786848
https://www.cnblogs.com/fjdingsd/p/5273008.html
https://cloud.tencent.com/developer/article/1816543
数据库审计
数据库审计是对数据库访问行为进行监管的系统,一般采用旁路部署的方式,通过镜像或探针的方式采集所有数据库的访问流量,并基于SQL语法、语义的解析技术,记录下数据库的所有访问和操作行为,例如访问数据的用户(IP、账号、时间),操作(增、删、改、查)、对象(表、字段)等。数据库审计系统的主要价值有两点,一是:在发生数据库安全事件(例如数据篡改、泄露)后为事件的追责定责提供依据;二是,针对数据库操作的风险行为进行时时告警。
参考链接
https://www.huaweicloud.com/zhishi/dbss10.html
数据库空间回收
背景:表中的数据被删除或更新后(UPDATE/DELETE),物理存储层面并不会直接删除数据,而是标记这些数据不可见,所以会在数据页中留下很多“空洞”,在读取数据时,这些“空洞”会随数据页一起加载,拖慢数据扫描速度,需要定期回收删除的空间。
VACUUM [FULL] [FREEZE] [VERBOSE] [table];
例:GaussDB(DWS) 数据仓库数据回收 https://support.huaweicloud.com/dws_faq/dws_03_0033.html
参考链接
驱动加载
1、数据库驱动
数据库驱动是应用程序和数据库存储之间的一种接口,数据库厂商为了某一种开发语言环境(比如Java,C)能够实现数据库调用而开发的类似翻译员功能的程序,将复杂的数据库操作与通信抽象成为了当前开发语言的访问接口。
2、驱动加载
//由于驱动的本质是一个类,所以加载驱动的过程其实就是加载类的过程,下面是常用的加载数据库驱动的具体代码:
//加载Oracle数据库驱动
Class.forName(“oracle.jdbc.driver.OracleDriver”);
//加载SQL Server数据库驱动
Class.forName(“com.microsoft.sqlserver.jdbc.SQLServerDriver”);
//加载MySQL 数据库驱动
Class.forName(“com.mysql.jdbc.Driver”);
参考链接
https://www.huaweicloud.com/zhishi/edu-arc-sjkkf01.html
https://www.modb.pro/db/107267
GUC参数
GUC: Grand Unified Configuration 指的是postgreSQL数据库的一种对数据库变量进行设置对数据库进行控制的机制。通常理解是对postgresql.conf文件中变量进行修改,或通过set命令对参数进行设置。但实际上GUC变量的种类,设置方法要更加复杂多样。在guc.h和guc.c中可以看到GUC变量的详细实现。
例如:GaussDB(DWS)的设置GUC参数 https://support.huaweicloud.com/devg-dws/dws_04_0885.html
参考链接
https://www.csdn.net/tags/NtzaYgysMzk1MTUtYmxvZwO0O0OO0O0O.html
逻辑复制(Logical Replication)
逻辑复制(Logical Replication),是一种根据数据对象的 复制标识(Replica Identity)(通常是主键)复制数据对象及其变化的方法。
逻辑复制 这个术语与 物理复制相对应,物理复制使用精确的块地址与逐字节复制,而逻辑复制则允许对复制过程进行精细的控制。
逻辑复制基于 发布(Publication) 与 订阅(Subscription)模型:
- 一个 发布者(Publisher) 上可以有多个发布,一个 订阅者(Subscriber) 上可以有多个 订阅 。
- 一个发布可被多个订阅者订阅,一个订阅只能订阅一个发布者,但可订阅同发布者上的多个不同发布。
针对一张表的逻辑复制通常是这样的:订阅者获取发布者数据库上的一个快照,并拷贝表中的存量数据。一旦完成数据拷贝,发布者上的变更(增删改清)就会实时发送到订阅者上。订阅者会按照相同的顺序应用这些变更,因此可以保证逻辑复制的事务一致性。这种方式有时候又称为 事务性复制(transactional replication)。
参考链接
https://pigsty.cc/zh/blog/2021/03/03/postgres%E9%80%BB%E8%BE%91%E5%A4%8D%E5%88%B6%E8%AF%A6%E8%A7%A3/
PostgreSQL
PostgreSQL 是一款高级的企业级开源关系数据库,支持 SQL(关系型)和 JSON(非关系型)查询。它是一个高度稳定的数据库管理系统,依托 20 多年的社区发展,造就了其高水平的故障恢复能力、完整性和正确性。
中文手册:http://www.postgres.cn/docs/9.3/intro-whatis.html
参考链接
https://aws.amazon.com/cn/rds/postgresql/what-is-postgresql/?tag=fsou0c-20
数据库备份与恢复
备份分类:
- 物理备份
这是数据库文件实物的副本,例如数据、控制文件、日志文件和已归档的重做日志。它是将数据库信息存储在其他位置的文件的副本,构成数据库恢复机制的基础
- 逻辑备份
它包含从数据库中提取的逻辑数据(由表、流程、视图和函数等构成)。但是,不建议单独保留逻辑备份,因为它只提供结构信息,用处不大。
备份类型:
- 完全备份
- 增量备份:仅复制自上次备份操作以来发生更改的数据
- 差异备份:复制自上次完全备份以来发生更改的所有数据
备份方法分类(根据是否需要数据库离线):
- 热备(online):数据库运行过程中直接备份
- 逻辑备份:“在 MySQL 数据库中,逻辑备份是指备份出的文件内容是可读的,一般是文本内容。内容一般是由一条条 SQL 语句,或者是表内实际数据组成。如 mysqldump 和 SELECT * INTO OUTFILE 的方法。这类方法的好处是可以观察导出文件的内容,一般适用于数据库的升级、迁移等工作。但其缺点是恢复的时间较长。”
- 裸文件备份:“复制数据库的物理文件,既可以在数据库运行中进行复制(如 ibbackup、xtrabackup 这类工具),也可以在数据库停止运行时直接复制数据文件。这类备份的恢复时间往往比逻辑备份短很多。”
- 冷备(offline):必须在数据库停止的情况下进行备份。这种备份最为简单,一般只需要复制相关的数据库物理文件即可。
- 温备:也是在数据库运行中备份,但是会对数据库操作有所影响。备份时仅支持读操作,不支持写操作。
一般情况下,我们需要备份的数据分为以下几种:
- 表数据
- 二进制日志、InnoDB 事务日志
- 代码(存储过程、存储函数、触发器、事件调度器)
- 服务器配置文件
并发备份
参考链接
https://www.veritas.com/zh/cn/information-center/data-backup-and-recovery