体系结构

体系结构

Oracle 采取的是 Client/Server 架构。

assets/dot/oracle_cs.gif

客户端(Client)操作数据库的请求发送后,服务端的监听器(TNSListener)接收到请求,并将其转发给相应的数据库实例(Instance),再由实例(Instance)去操纵数据库(Database)。 返回操作结果,是一个相反的过程。下面是个简陋的图示:

assets/dot/oracle_construct.gif

Client

Sqlplus

这是一个轻量级的功能强大的客户端, 是 dba 必须掌握的工具。

用 sqlplus 连接数据库的语法为:

# Usage:
#   sqlplus 用户名/密码@主机名:端口号/实例名
# 参数个数不是固定的

sqlplus                         # 会要求你输入用户名密码,默认连接本地 ORACLE_SID 变量指定的数据库
sqlplus vip                     # 会要求你输入密码
sqlplus vip/vip                 # 连接本地 ORACLE_SID 变量指定的数据库

sqlplus sys/hello as sysdba     # sys 用户必须用 sysdba 或 sysoper 的身份登录

sqlplus vip@192.168.0.111/orcl  # 连接 192.168.0.111 机器上的 orcl 数据库,用户名为 vip
sqlplus vip@192db               # 连接 别名 为 192db 的数据库

我们可以配置 sqlplus 的一些行为,两个命令:

  1. show. 用来显示配置参数
  2. 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 表的结构信息

JDBC

用 Java 连接数据库,需要用到 jdbc 驱动,它们可以在下面目录中找到:

主目录\product\12.1.0\dbhome_1\jdbc\lib\*.jar

比如 ojdbc7_g.jar7 表示适用于 JDK 版本 1.7, g 表示自带更多调试信息。

TNSListener

TNSListener,是用来监听来自客户端的请求,并将其转发给相对应的服务端实例的一种后台服务。

它是沟通客户端与服务端的一个桥梁。

比如,下面用 sqlplus 客户端将会连接 localhost 上的 orcl 数据库:

sqlplus vip/vip@localhost/orcl

请求会发送到 localhost 主机的 1521 号端口, 作为监听的 TNSListener 收到这个请求后,再把请求转发给对应的 orcl 数据库实例。

所以必须开启监听服务,并且配置正确,才能连接操作数据库。

注:如果用 sqlplus vip/vip 的方式连接数据库,即没有指定连接的机器,那么默认连接的是本机数据库
这种连接是不需要监听服务的,因为为了增加连接速度,这样的本地连接 oracle 会使用一个专用的进程直接连接实例

我们可以使用 Oracle 提供的 lsnrctl 命令操纵监听服务的开启或关闭:

lsnrctl status    # 查看状态
lsnrctl stop      # 停止监听服务
lsnrctl start     # 开启监听服务
lsnrctl reload    # 重启监听服务
lsnrctl services  # 查看监听的连接情况

我们可以使用 Oracle 的 Net Manager 工具来配置自己的监听器。

实质上,用 Net Manager 配置跟直接修改下面文件的作用是一样的:

主目录\product\12.1.0\dbhome_1\network\admin\listener.ora

我们在 Net Manager 中对 listener 的配置对应的是这一段代码:

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 0.0.0.0)(PORT = 1521))
    )
    ...
  )

只要修改其中的 host/port 等,重启监听服务即可。

Server

Oracle 服务端分为两部分:

  1. Instance 实例
  2. Database 数据库

实例(Instance)

实例, 又称为数据库引擎,由 SGA(System Global Area, 系统全局区) 和 一系列后台进程 组成。 它需要启动才会生成,用来加载并管理一个数据库。

服务启动的大致过程:

  1. [读取] 读取系统的 ORACLE_SID 环境变量,确定要启动的实例名字,比如为 xxoo
  2. [加载] 从 $ORABASE/admin/xxoo 和 $ORA_HOME/database/SPFILEXXOO.ora 等位置加载相关配置文件。配置文件的名字是根据 sid 来定义的。
  3. [启动] 从配置文件中,读取相关信息,比如数据库名字、数据库控制文件位置、SGA 等信息,并根据这些,初始化数据库加载需要的 内存空间(SGA) 和 相关进程 。
  4. [装载] 根据配置文件中读取的数据库信息,找到各种数据文件位置,并装载数据库。
  5. [启动] 进行数据校验等,如果没有问题,启动数据库。

可以通过查看启动过程协助理解:

-- 首先,登录 sys 用户,只有管理员才有完全操纵数据库的权力
-- shutdown 用来关闭。如果不带参数,默认为 normal
---- immediate 表示立即关闭,如果有未处理完操作,回滚并断开
---- normal 表示等待所有连接断开才关闭数据库
---- 其他参数,略
shutdown immediate;

-- 启动数据库,分解为三个动作:
---- 启动实例
---- 利用启动的实例去挂载数据库
---- 校验并打开数据库
-- 只有完全打开,才能进行完全的数据操作
-- 也可以指定参数,启动到某个阶段。这是在维护数据库中使用的命令。
startup             -- 如果不加参数,
startup nomount     -- 启动到 nomount 阶段
startup mount       -- 启动到 mount 阶段

-- 当然,也可以这样分步启动:
startup nomount
alter database mount
alter database open

数据库(Database)

数据库, 是保存在硬盘上的文件集合,它是数据的主要载体。

$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

从文件角度分析,一个数据库包含下面几类(组件):

  1. 控制文件(control file)。记录数据库的物理结构和其他信息,如数据库名称、各种文件位置等。多副本。
    select * from v$controlfile;
        
  2. 数据文件(data file)。用来存储数据的文件,会自动扩张。数据以块为单位进行保存。
    select name, status, enabled from v$datafile;
        
  3. 重做日志文件(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;
        
  4. 归档日志文件。是重做日志的补充(redo log 记录的记录是有限的),可以把写满的 redo log 进行备份。
    -- Oracle 的归档模式默认是关闭的
    -- 归档模式会占用大量空间
    -- 但他们用更多的空间,保存更多的历史记录,保障更大的安全性
    
    -- 查看状态
    archive log list;
    
    -- 切换数据库到归档模式
    alter database archivelog;
    
    -- 启动
    archive log start;
    
    -- 查看状态
    archive log list;
        
  5. 其他文件
逻辑组件

https://docs.oracle.com/cd/B28359_01/server.111/b28318/physical.htm#CNCPT1082

从 Oracle 内部管理数据的角度,可以将 Oracle 分为4个组件:

  1. 表空间(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'
      size 5m;
    
    -- 删除表空间
    drop tablespace xxx;
        
  2. 段(Segment)
    • 段是对象在数据库中占用的空间
    • 包括索引段、数据段等
    • 表空间被划分为若干区域,每个区域负责存放不同类型数据,这些区域这就是段
  3. 区(Extend)
    • 由连续的数据块组成,由 Oracle 自动分配管理
    • 会自动扩展大小
  4. 块(Block)
    • 数据块是 Oracle 数据库最小的逻辑单元
    • 它代表在读写操作的时候,每次处理的数据大小是多少
    • 正常情况下,它是操作系统块的整数倍,默认是 8 KB
    • 可以通过参数 db_block_size 控制
      show parameters block;
              

assets/image/database-oracle/oracle_logic_2017-08-17_14-33-06.jpg


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值