大型数据库课程知识整理

常见数据库有哪些?

关系型数据库:Oracle、MySQL、Microsoft SQL Server
非关系型数据库:Redis、MongoDB
开源数据库:MongoDB、Redis、MariaDB

SQL和NOSQL区别和优缺点

SQL(关系型数据库)基于表,数据结构必须事先定义好;而NoSQL(非关系型或分布式数据库)基于键值对,数据是动态无结构的。

  • SQL优点:结构化数据,能进行复杂查询、有事务处理,可保持数据一致性、精确、有历史数据
  • SQL缺点:数据需要转换为基础类型、扩展较为困难、大量数据的写入处理较慢
  • NOSQL优点:快速、便宜、可扩展、适于保存大量和分层数据
  • NOSQL缺点:缺乏事务处理、不擅长复杂查询、不遵循ACID

数据库系统可以从那些方面进行优化?

1.应用层的优化

应用响应速度的瓶颈:查询缓慢、CPU饱和、网络延迟、文件I/O
使用连接池和缓存。

2.数据库设计与配置优化

优化设计不良或索引不佳的表结构,能把性能提升几个数量级

3.数据库配置优化

包括缓存大小、I/O调优、并发数等,能获得两到三倍的性能提升。

4.操作系统和硬件优化

CPU、内存、I/O、网络、操作系统

5.架构优化

构建大型、高性能应用程序,可分为分散式数据库架构、集中式数据库架构、分布式数据库架构

IOE概念

IBM是服务器提供商,Oracle是数据库软件提供商,EMC则是存储设备提供商,三者构成了一个从软件到硬件的企业数据库系统。

Oracle体系结构

详见此处

物理结构

分为控制文件、数据文件、重做日志文件

  • 控制文件
    记录数据库的物理结构
  • 数据文件
    储存所有数据库数据。逻辑结构中的一个表空间对应一个或多个数据文件。
  • 重做日志文件
    记录数据所发生的修改。

内存结构

系统全局区和程序全局区

  • 系统全局区(SGA)
    系统所有进程共享的内存区域。
  • 程序全局区(PGA)
    为了某个进程所服务的。这个内存区不是共享的,只有用户的服务进程以及后台进程本身才能够访问它自己的PGA区。

后台服务进程

  • 数据库复写器(DBWn)
    管理缓冲储存区,将缓冲区的脏数据写入磁盘
  • 日志复写器(LGWR)
    管理日志缓冲区,将上次写磁盘后的所有日志缓冲写入日志文件
  • 系统监控进程(SMON)
    执行实例恢复
  • 进程监控器(PMON)
    在用户进程出现故障后执行进程恢复
  • 检查点(CKPT)
    修改控制文件信息
  • 归档进程(ARCn)
    自动归档联机重做日志文件

Oracle扩展 RAC

Oracle扩展用得最多的方式是RAC(实时应用集群)
两(多)台服务器上各自运行一个数据库进程,共同管理、操作一个数据库,客服端无论连接哪个都可以操作数据库。当某一个服务器故障时,其他服务器还可以正常工作。由于不需要临时启动新的服务进程,因此没有切换时间。
优点

  • 良好的可伸缩性
  • 高可用性
  • 缓存融合技术
  • 降低硬件成本
  • 切换时间短
    缺点
  • 管理复杂
  • 对网络有较高要求

双机热备

在双机热备份方式下,需要共享存储,数据库系统平时只能在一台服务器 ( 例如服务器 A) 上运行,另一台服务器无法直接访问数据库,自然也无法进行负载分担。当服务器 A 由于故障失效时,由相应的操作系统软件控制,将服务器 A 管理的存储设备 ( 如硬盘 ) 转交给服务器 B 控制,同时在服务器 B 上启动另一个数据库进程,管理数据库。这种切换并启动新的数据库核心的过程一般需要几十秒到几分钟。

表空间

Oracle的表空间属于Oracle中的存储结构,是一种用于存储数据库对象(如:数据文件)的逻辑空间,是Oracle中信息存储的最大逻辑单元,其下还包含有段、区、数据块等逻辑数据类型。表空间是在数据库中开辟的一个空间,用于存放数据库的对象,一个数据库可以由多个表空间组成
相较于mysql有多个数据库,oracle只有一个数据库,其下有多个表空间。
oracle安装完数据库的一般流程:先建表空间(分区)–>再建用户(分配相应的表空间和用户权限)–>登陆用户,建表

表空间类型

分为系统表空间和非系统表空间

  • 系统表空间随着数据库创建被创建,包含数据字典信息和系统回滚段
  • 非系统表空间包括回滚段、临时段(用于排序操作),控制着分配给用户的空间容量。

表空间的管理

  • 本地管理的表空间
    自由扩展信息被记录在本身的位图中,位图中的每一位都对应一个或一组数据块,显示数据块是否被使用。
  • 字典管理的表空间(缺省)
    自由扩展信息被记录在全局数据字典中

表空间的操作

创建本地管理的表空间

CREATE TABLESPACE userdata
	DATAFILE '/userfile.dbf' SIZE 500M --储存地址、初始大小
	EXTENT MANAGEMENT LOCAL UNIFORM SIZE 256K;

创建字典管理的表空间

CREATE TABLESPACE userdata
	123DATAFILE '/userfile.dbf' SIZE 500M
	EXTENT MANAGEMENT DICTIONARY
	DEFAULT STORAGE (initial 1M NEXT 1M);

两种日志文件

重做日志文件分为在线重做日志和归档重做日志

在线重做日志

又称联机重做日志,指Orcale以SQL脚本的形式实时记录数据库中的数据更新。

归档重做日志

指当条件满足时,Oracle将在线重做日志以文件的形式保存在硬盘。

管理Oracle实例

启动数据库

使用指令startup启动一个数据库
启动步骤:shutdown→nomount(实例启动)→mount(控制文件打开)→open(控制文件描述的所有文件被打开)

关闭数据库的四种模式

关闭模式abortimmediatetransactionalnormal
描述称为终止关闭方式,终止关闭方式具有一定的强制性和破坏性。强制中断任何数据库操作oracle不但会立即中断当前用户的链接,而且会强行终止用户的当前活动事物,将未完成的事物回退阻止任何用户建立新的连接,等待所有活动事物提交后,再断开用户连接,当所有的活动事物提交完毕,所有的用户都断开连接后,将关闭数据库阻止任何用户建立新的连接,等待当前所有正在连接的用户主动断开连接,当所有的用户都断开连接后,将立即关闭数据库
允许新的接入××××
等待直到当前会话都结束×××
等待直到当前事务都结束××
强制执行checkpoint并关闭所有文件×
  • normal、transactional、immediate
    等待数据块高速缓冲区内容全部写入数据文件、未提交的事务回滚、释放资源后才关闭。
    这样关闭后数据库能够保持一致性,重新启动不需要进行实例恢复。
  • abort
    已经修改的数据块缓冲区内容不会写入数据文件、未提交的事务也不会回滚。
    这样关闭的数据无法保证一致性(脏数据库),重新启动后,必须将改变的信息写入重做日志文件、使用回滚段来回滚未提交的改变、且需要释放资源。

备份

备份形式

  • 全库备份
  • 按用户备份
  • 按表备份
  • 表空间备份

监听程序的管理

查看监听程序的状态:

%lsnrctl status

PL/SQL

优点

  1. 允许嵌入sql语句、允许定义常量和变量、允许过程语言结果、允许使用异常处理
  2. 能提高程序的运行性能,降低网络开销
  3. 提供模块化程序设计功能
  4. 具有控制语句
  5. 有良好兼容性

变量可见性

变量的作用域从声明部分开始到块的结束。变量的可见性是可以访问变量引用部分(嵌套块声明了相同变量,外部变量被屏蔽) ,可以用标签引用外部变量outer.v_value

判断if/else

DECLARE
	num INTEGER := -11;
BEGIN
	IF num < 0 THEN
		dbms_output.put_line('负数');
	ELSIF num > THEN
		dbms_output.put_line('正数');
	ELSE
		dbms_output.put_line('0');
	END IF;
END;

循环LOOP…EXIT…END

DECLARE
	v_num INTEGER := 1;
	v_mix INTEGER := 1;
BEGIN
	LOOP
		v_mix := v_mix + v_num;
		v_num := v_num + 1;
		IF v_num > 5 THEN
			EXIT;
		END IF;
	END LOOP;
END;

循环LOOP…EXIT WHEN…END

DECLARE
	v_num INTEGER := 1;
	v_mix INTEGER := 1;
BEGIN
	LOOP
		v_mix := v_mix + v_num;
		v_num := v_num + 1;
		EXIT WHEN v_num > 5;
	END LOOP;
END;

循环while…LOOP…END LOOP

DECLARE
	v_num INTEGER := 1;
	v_mix INTEGER := 1;
BEGIN
	WHILE v_num < 5 LOOP
		v_mix := v_mix + v_num;
		v_num := v_num + 1;
	END LOOP;
END;

循环for…IN…LOOP…END LOOP

DECLARE
	v_mix INTEGER := 1;
BEGIN
	FOR v_num IN 1..5 LOOP
		v_mix := v_mix * v_num;
	END LOOP;
END;

储存过程

CREATE OR REPLACE PROCEDURE 过程名
[(参数名 in|out|in out 类型名)] is
过程体

计算一个数的阶乘

CREATE OR REPLACE PROCEDURE proc(
	i_num in INTEGER,
	o_mix out INTEGER) is
	v_mix INTEGER := 1;
	v_num INTEGER := 1;
BEGIN 
	WHILE v_num <= i_num LOOP
		v_mix := v_num * v_mix;
		v_num := v_num + 1;
	END LOOP;
	o_mix := v_mix;
END;

交换两个数

CREATE OR REPLACE PROCEDURE(
	io_num1 in out NUMBER,
	io_num2 in out NUMBER)is
	v_temp NUMBER;
BEGIN 
	v_temp := io_num1;
	io_num1 := io_num2;
	io_num2 := v_temp;
END;

两个表join,输出字段

DECLARE
	TYPE t_rec IS RECORD(
		email account.email%TYPE,
		pw signon.password%TYPE);
	t_acc t_rec;
BEGIN
	SELECT account.email, signon.password into t_acc 
		from account inner join signon on signon.username = account.userid 
		where account.userid = '001';
	dbms_output.put_line(t_acc.email || t_acc.pw);
END;

触发器

游标

定义游标

CURSOR cursor_name[(parameter1[, parameter2, ...])]
	[return datatype]
is 
	select_statement;  -- 但不能使用INTO子句

打开游标

OPEN cursor_name[value1, value2, ...];

不能用open语句重复打开一个游标
提取数据

FETCH cursor_name into {variable_list | record_variable};

variable_list表示table属性定义的数组
record_variable表示表名或游标名定义的record变量(使用%rowtype)
关闭游标

CLOSE cursor_name;

游标实例

DECLARE 
 CURSOR cur is 
 select account.userid from account;
 v_userid account.userid%TYPE;
BEGIN
	open cur;
	fetch cur into v_userid;  -- 必须先fetch,cur%found才会为true
	WHILE cur%FOUND LOOP
		dbms_output.put_line(v_userid);
		fetch cur into v_userid;
	END LOOP;
	CLOSE cur;
END;
	

使用for循环语句可以省去open、fetch和close语句,且无需判断是否结束

DECLARE 
	CURSOR myCur IS
		SELECT dep_name FROM departments;
BEGIN 
	FOR v_emp IN my_CUR LOOP  -- 甚至连变量声明都可以省略
		dbms_output.put_line(v_emp.dep_name);  -- 注意:即使游标只查询一个字段,for循环的隐式变量依然是复合类型
	END LOOP;
END;

更进一步,可以在for中隐式声明游标

BEGIN
	FOR v_emp IN (
		SELECT dep_id, dep_name FROM departments) 
	LOOP
		dbms_output.put_line(v_emp.dep_id);
	END LOOP;
END;

索引(Index)

优点

  • 提高查询速度
  • 提高分组排序的速度

缺点

  • 创建和维护索引需要耗费时间
  • 索引需要物理空间
  • 对表进行插入、更新和删除时,索引需要动态维护

类别

  • B_tree单列索引
    基于单个列创建的索引
  • B_tree复合索引
    基于多列创建的索引
  • 位图索引
  • 函数索引
    使用列上的函数值作为key,而不是直接使用列的值
  • 反向索引
  • 分区索引和全局索引

OceanBase

产品特性

  • 高可用
  • 分布式
  • 兼容性
  • 高性能
  • 低成本
  • 多租户
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值