3 体系结构
Oracle 采取的是 Client/Server 架构。
3.1 Client
3.1.1 Sqlplus
这是一个轻量级的功能强大的客户端, 是 dba 必须掌握的工具。
我们可以配置 sqlplus 的一些行为,两个命令:
- show. 用来显示配置参数
- set. 用来设置配置参数
比如:
show all -- 显示所有配置参数 show lines -- 显示 lines 的配置信息 show errors -- 显示错误 set lines[ize] 333 -- 将行宽设置为 333 set pages[ize] 444 -- 将每页的记录数设置为 444 set echo off/on -- 导入外部文件,是否要显示原始 sql 语句 set feedback on/off -- 是否显示“查询到xx数据”等信息 set timing on/off -- 是否显示语句的执行时间 set autocommit on/off -- 是否启用自动提交 set autotrace on/off -- 是否输出执行计划 set serveroutput on/off-- 是否显示来自服务端的信息 column aaa format a22 -- 将列 'aaa' 的宽度限制为 22 个字幕'a'的大小。column 命令很强大,语句也复杂,此处不提。
在 sqlplus 中有缓冲区的概念:
缓冲区是用来记录上一次执行的命令语句的空间。
我们可以通过一些列简单命令,对上一次输入的语句进行一些控制:
- 增
append/insert
- 删
delete
- 改
change
- 查
list
- 执行修改后的语句
run
或者/
例子:
list -- 显示完整的缓存区 list 3 -- 显示并定位到第三行 list 3 5 -- 显示第三行到第五行的内容 list last -- 定位到最后一行
list 3 del -- 删除第三行
list 3 append order by sal -- 定位到第三行,然后追加 order by sal insert order by sal -- 开启新的一行,插入 order by sal
list 3 change /emp/dept -- 定位到第三行,将这一行的 emp 换为 dept
还有其他一些命令:
get D:\aaa.sql -- 将文件加载到缓冲区,但不执行 start D:\aaa.sql -- 将文件加载到缓冲区,并且执行 @D:\aaa.sql -- 是上面一条语句的简写形式 save D:\bbb.sql -- 将缓冲区的内容保存到文件中 edit -- 调用外部编辑器,编辑缓冲区 clear screen -- 清空缓冲区
show user -- 显示当前用户 show parameters -- 显示 oracle 的配置参数 show parameters nls -- 显示 oracle 中所有跟语言配置相关的一些参数 describe emp -- 显示 emp 表的结构信息
3.2 TNSListener
lsnrctlD:\oracle\product\12.1.0\dbhome_1\network\admin\listener.ora
3.3 Server
Oracle 服务端分为两部分:
Instance
实例Database
数据库
3.3.1 实例
实例, 又称为数据库引擎,由 SGA(System Global Area, 系统全局区)
和 一系列后台进程
组成。它需要启动才会生成,用来加载并管理一个数据库。
服务启动的大致过程:
- [读取] 读取系统的 ORACLE_SID 环境变量,确定要启动的实例名字,比如为 xxoo
- [加载] 从
$ORABASE/admin/xxoo
和$ORA_HOME/database/SPFILEXXOO.ora
等位置加载相关配置文件。配置文件的名字是根据 sid 来定义的。 - [启动] 从配置文件中,读取相关信息,比如数据库名字、数据库控制文件位置、SGA 等信息,并根据这些,初始化数据库加载需要的
内存空间(SGA)
和相关进程
。 - [装载] 根据配置文件中读取的数据库信息,找到各种数据文件位置,并装载数据库。
- [启动] 进行数据校验等,如果没有问题,启动数据库。
可以通过查看启动过程协助理解:
-- 首先,登录 sys 用户,只有管理员才有完全操纵数据库的权力
-- shutdown 用来关闭。如果不带参数,默认为 normal
---- immediate 表示立即关闭,如果有未处理完操作,回滚并断开
---- normal 表示等待所有连接断开才关闭数据库
---- 其他参数,略
shutdown immediate;
-- 启动数据库,分解为三个动作:
---- 启动实例
---- 利用启动的实例去挂载数据库
---- 校验并打开数据库
-- 只有完全打开,才能进行完全的数据操作
-- 也可以指定参数,启动到某个阶段。这是在维护数据库中使用的命令。
startup -- 如果不加参数,
startup nomount -- 启动到 nomount 阶段
startup mount -- 启动到 mount 阶段
-- 当然,也可以这样分步启动:
startup nomount
alter database mount
alter database open
3.3.2 数据库
数据库, 是保存在硬盘上的文件集合,它是数据的主要载体。
$OracleBase\oradata\[数据库名字]\
- 物理组件
数据库是保存在操作系统的一系列文件。
默认安装情况下,这些文件都在
$ORACLE_BASE/oradata
文件夹下:oradata/ └── orcl [数据库的名字] ├── CONTROL01.CTL ├── CONTROL02.CTL ├── EXAMPLE01.DBF ├── REDO01.LOG ├── REDO02.LOG ├── REDO03.LOG ├── SYSAUX01.DBF ├── SYSTEM01.DBF ├── TEMP01.DBF ├── UNDOTBS01.DBF └── USERS01.DBF
从文件角度分析,一个数据库包含下面几类(组件):
- 控制文件(control file)。记录数据库的物理结构和其他信息,如数据库名称、各种文件位置等。多副本。
select * from v$controlfile;
- 数据文件(data file)。用来存储数据的文件,会自动扩张。数据以块为单位进行保存。
select name, status, enabled from v$datafile;
- 重做日志文件(redo log)。用来记录用户的所有操作,为了备份恢复。一个数据库至少有两个日志组,每个日志组至少有一个成员,成员之间是镜像关系。用户的操作会记录到 redo log 中,当一个组记录满了,会自动切换到下一个组。轮流循环。
-- 需要理解 Oracle 日志的思路: -- 它采取了【多个分组,轮流循环写入;每组多成员,互为镜像;保存更多信息,使用归档模式】的方式,保证了记录安全性。 -- 在生产环境中,需要日志调整到不同的磁盘中,这样,即使某个文件损坏,或某块磁盘损坏,都可以通过镜像的日志文件对数据进行恢复。 -- 查看 redo log 日志组 select * from v$log; select * from v$logfile; -- 增加/删除 日志组 alter database add logfile 'd:/sss.rlog' size 100m; alter database drop logfile 'd:/sss.rlog'; -- 清空日志组 alter database clear logfile group 1; alter database clear unarchived logfile group 1; -- 为日志组 增加/删除 成员 alter database add logfile member 'd:/ssss.log' to group 1; alter database drop logfile member 'd:/ssss.log'; -- 重命名文件 -- 首先,在文件夹管理器里,将文件改名,比如,改为 ssss.redolog -- 其次,重启数据库到 mount 状态,然后执行重命名命令 alter database rename file 'd:/ssss.log' to 'd:/ssss.redolog'; -- 日志组一般是在写满的时候自动切换。 -- 我们也可以手动切换 alter system switch logfile;
- 归档日志文件。是重做日志的补充(redo log 记录的记录是有限的),可以把写满的 redo log 进行备份。
-- Oracle 的归档模式默认是关闭的 -- 归档模式会占用大量空间 -- 但他们用更多的空间,保存更多的历史记录,保障更大的安全性 -- 查看状态 archive log list; -- 切换数据库到归档模式 alter database archivelog; -- 启动 archive log start; -- 查看状态 archive log list;
- 其他文件
- 控制文件(control file)。记录数据库的物理结构和其他信息,如数据库名称、各种文件位置等。多副本。
- 逻辑组件
https://docs.oracle.com/cd/B28359_01/server.111/b28318/physical.htm#CNCPT1082
从 Oracle 内部管理数据的角度,可以将 Oracle 分为4个组件:
- 表空间(tablespace)。表空间是 Oracle 中进行维护的最基本单位。数据库是由若干表空间组成的。一个表空间至少对应一个物理文件。
-- 内置的各种表空间 ---- system/sysaux 系统表空间/系统辅助表空间,用来保存系统字典表和其他信息,数据库创建完会自动生成 ---- users 用户表空间,创建新用户时,默认使用的表空间 ---- temp 临时表空间 ---- undo 回滚表空间 -- 查看表空间信息 select * from v$tablespace; -- 查看所有表空间跟文件对应关系 SELECT FILE_NAME, BLOCKS, TABLESPACE_NAME from dba_data_files; -- 创建表空间 create tablespace xxx datafile 'D:/sss.dbf' size 50m autoextend on next 50m maxsize 1024m; -- 创建临时表空间 create temporary tablespace yyy tempfile 'D:/ANOTHER_TMP.dbf'; -- 删除表空间 drop tablespace xxx;
- 段(Segment)。包括索引段、数据段等。表空间被划分为若干区域,每个区域负责存放不同类型数据,这些区域这就是段。
- 区(Extend)。为存储数据分配的连续空间。
- 块(Block)。数据块是 Oracle 数据库最小的逻辑单元。它代表在读写操作的时候,每次处理的数据大小是多少。正常情况下,它是操作系统块的整数倍,默认是 8 KB。
show parameters block;
- 表空间(tablespace)。表空间是 Oracle 中进行维护的最基本单位。数据库是由若干表空间组成的。一个表空间至少对应一个物理文件。