Oracle 数据库系统笔记(一)

Oracle 数据库系统

  • 使用版本:Oracle 11gR2
  • 安装:https://oracle-base.com/articles/11g/articles-11g#db11g_release_2_installations
  • 卸载:https://oracle-base.com/articles/misc/manual-oracle-uninstall
  • 启动:net start orcalserviceorcl

0. 历史

Oracle 数据库系统笔记(一)_第1张图片
image.png

四人帮创始人(左起为Ed Oates,Bruce Scott,Bob Miner,Larry Ellison)此 Scott 就是彼 Scott, Scott/tiger, tiger 为他家一只 cat 的名字.他更准确的说是 Oracle 的第一位雇员.用汇编语言写成的第一版(2.0)甲骨文系统在 1978 年正式推出.2009年 IBM 收购 SUN 失败一周后, Oracle 成功收购 SUN, Oracle 从纯软厂商走向软硬结合的唯一能和 IBM 全面抗衡的公司.

几个概念:

  • RDBMS: Relational Database Management System

一.体系结构

Oracle 服务器实例

由内存和后台进程组成的用于访问数据库的方法,由 SID 标识,默认为创建数据库时的全局数据库名,通过实例访问数据库,实例是一个共享存储区和一组与文件中的数据交互的进程。
启动数据库三部曲及对应模式:

  • NOMOUNT: 启动实例
  • MOUNT: 装载数据库
  • OPEN: 打开数据库
    命令启动:
    STARTUP [NOMOUNT | MOUNT | OPEN ] [RESTRICT] [PFILE = 初始化参数文件];
  • FORCE 强制重启,相当于 SHUTDOWN ABORT 后 startup
  • 模式切换: alter database mount|open

1.物理结构

  • Oracle 物理结构是一个或多个数据文件的集合.
Oracle 数据库系统笔记(一)_第2张图片
D:\app\oradata\orcl.png

数据文件(*.DBF)

  • 所在数据字典: V$DATAFILE
  • 用于保存数据库的所有数据
  • 特征:
    • 一个数据文件仅与一个数据库联系
    • 一个数据文件只能从属于一个表空间
    • 一个表空间可以包含几个数据文件
    • 数据库容量越界时数据文件可以自动扩展
数据文件目录
  • 创建数据文件:
-- 向 ORCL 数据库的 USERS 表空间添加一个10M的 user02 数据文件.
 alter tablespace users 
add datafile 'D:\app\oradata\orcl\user02.dbf' size 10M;
  • 删除数据文件:
-- 删除 TEMP 表空间的 temp02 数据文件.
alter tablespace temp
drop tempfile
'D:\app\oracle\orcl\temp02.dbf';

控制文件(*.CTL)

  • 一个由 Oracle 进程读写的二进制文件, 记录数据库的物理结构(数据库名,创建时间, 表空间名,数据文件和日志文件名称等), 用于标识数据库和日志文件
  • 相关数据字典视图: V$controlfile

重做日志文件(*.log)

  • 用于保存用户对数据库进行的变更操作
  • 数据字典视图: V$log, V$logfile

2.逻辑结构

Oracle 数据库逻辑结构由表空间(tablespace), 段(segment), 区间(extent), 数据块(data block) 组成.

表空间(tablespace)

数据库中的基本逻辑结构,一系列数据文件的集合,一个数据库可以有多个表空间,一个表空间可以有多个数据文件,一个数据文件只能从属于一个表空间

  • 系统用户表空间数据字典:dba_tablespaces

  • 普通用户表空间数据字典:user_tablespaces

  • Oracle 中的6个默认表空间:


    image
  • 重看 tablespace 的总空间, 剩余空间, 使用率

select df.tablespace_name "表空间名",totalspace "总空间M",freespace "剩余空间M",round((1-freespace/totalspace)*100,2) "使用率%"
from
(select tablespace_name,round(sum(bytes)/1024/1024) totalspace from dba_data_files group by tablespace_name) df,
(select tablespace_name,round(sum(bytes)/1024/1024) freespace from dba_free_space group by tablespace_name) fs
where df.tablespace_name=fs.tablespace_name order by df.tablespace_name ; 
Oracle 数据库系统笔记(一)_第3张图片
image.png
  • 查看一个表空间的 extent, block 的数量
-- file_id 为数据文件号, block_id, 区起始数据块号
select tablespace_name,file_id,extent_id,block_id,blocks 
from dba_extents 
where tablespace_name='LEO1' order by extent_id;
  • 创建表空间
create tablespace  
datafile  [,  --指定数据文件大小
[autoextend [on|off]] next  -- 指定数据文件扩展方式:自动/非自动扩展
[maxsize |unlimited] -- 指定数据文件为自动扩展方式时的最大值或无限制
[permanent | temperary] --指定表空间的类型为永久/临时
扩大数据库的3种方式
  • 在表空间增加数据文件:
-- 为 system 表空间增加一个 30M 数据文件 
alter tablespace system 
add datafile 'test01.dbf'
size 30M;
  • 增加数据文件的大小:
    alter database datafile 'filename.dbf' autoextend on next 20m maxsize 1000M
  • 增加表空间:
    create tablespace users datafile 'filename.dbf'
  • 删除表空间
    drop tablespace tpname including contents and datafiles
  • 设置读写状态
    alter tablespace tpname read only
  • 设置离线|在线
    alter tablespace tpname offline|online
  • 删除表空间
-- 可选择同时删除其内容和数据文件
drop tablespace 
[including contents [and datafile]]

表分区

段(Segment)

由一组连续/不连续的区间组成的逻辑存储单元,代表特定数据类型的数据存储结构

根据段的存储对象类型,分成以下4种:

  • 数据段(data segment)
    • 用于存储表或簇的数据
  • 索引段(index segment)
  • 回滚段(rollback segment)
  • 临时段(temporary segment)

常见情况为表, 索引都是一个段

select segment_name, segment_type
from user_segments;
段空间管理
  • MSSM(手动)
  • ASSM(自动)

区间(extent)

区间是数据库存储空间中分配的一个逻辑单位,由一组连续的数据块组成,区间存储于段中,是磁盘空间分配的最小单位

  • 区间的分配
  • 区间的大小及数量

数据块(data block)

  • 数据块是 Oracle 管理数据库存储空间的最小数据储存单位,一个数据块对应一定数量的数据库空间,标准数据块大小由 DB_BLOCK_SIZE 指定.
  • 数据块既是逻辑单位,也是物理单位

相互关系:

  • 数据库由若干个表空间组成
  • 表空间由一个或多个数据文件组成
  • 表空间存放段
  • 段由区间组成
  • 区间由数据块组成
  • 块是数据库中最小的分配单元也是数据库使用的最小 I/O 单元

操作系统的块(每个簇字节数):

Oracle 数据库系统笔记(一)_第4张图片
image.png
Oracle 数据库系统笔记(一)_第5张图片
image.png

3.内存结构

分为 SGA, PGA

  • SGA(System Global Area):一组由 Oracle 分配的共享的内存结构,包括:数据库缓冲存储区, 共享池,重做日志缓冲区,Java 存储区, 大型存储区
  • 查询 sga 各组件大小
select * from v$sga;
-- 或者
show parameter sga;
  • PGA(Program Global Area): 一块包含一个服务进程的数据和控制信息的内存区域,用于处理 SQL 语句和容纳会话信息
  • 查询数据库实例参数:
    show parameter instance name
  • 查询数据库名字:
    show parameter db_name
    select name from v$database
  • 显示 SGA 参数大小及当前实际大小
    show sga
    select name, current_size from v$buffer_pool

二.用户管理

登录

sqlplus /nolog
conn u_name/u_password@domain [as sysdba|sysoper|normal]

系统用户

  • sys :sys 必须以系统管理员或系统操作员身份登陆:conn sys/password as sysdba
  • system : conn system/password
  • sysman

普通用户

  • scott:Oracle 数据库创始人之一名字,默认被锁,默认密码:tiger
    解锁命令:alter user username sccount unlock
    修改用户密码(记得原密码): password
    修改用户密码(忘记原密码): alter user u_name identified by new_password;

查看用户

  • show user 查看当前登陆用户
  • desc dba_users 查看用户数据字典
  • select username from dba_users

创建用户

创建用户:

create user  identified by 
default tablespace 
quota unlimited on 
  • docker 下的 oracle 可能没有 scott ,可以通过脚本创建一个
  • vim /u01/app/oracle/product/11.2.0/xe/rdbms/admin/scott.sql
Rem Copyright (c) 1990 by Oracle Corporation
Rem NAME
REM    UTLSAMPL.SQL
Rem  FUNCTION
Rem  NOTES
Rem  MODIFIED
Rem gdudey   06/28/95 -  Modified for desktop seed database
Rem glumpkin   10/21/92 -  Renamed from SQLBLD.SQL
Rem blinden   07/27/92 -  Added primary and foreign keys to EMP and DEPT
Rem rlim   04/29/91 -      change char to varchar2
Rem mmoore   04/08/91 -      use unlimited tablespace priv
Rem pritto   04/04/91 -      change SYSDATE to 13-JUL-87
Rem   Mendels 12/07/90 - bug 30123;add to_date calls so language independent
Rem
rem
rem $Header: utlsampl.sql 7020100.1 94/09/23 22:14:24 cli Generic $ sqlbld.sql
rem
SET TERMOUT OFF
SET ECHO OFF
rem CONGDON    Invoked in RDBMS at build time. 29-DEC-1988
rem OATES:     Created: 16-Feb-83
GRANT CONNECT,RESOURCE,UNLIMITED TABLESPACE TO SCOTT IDENTIFIED BY TIGER;
ALTER USER SCOTT DEFAULT TABLESPACE USERS;
ALTER USER SCOTT TEMPORARY TABLESPACE TEMP;
CONNECT SCOTT/TIGER
DROP TABLE DEPT;
CREATE TABLE DEPT
       (DEPTNO NUMBER(2) CONSTRAINT PK_DEPT PRIMARY KEY,
DNAME VARCHAR2(14) ,
LOC VARCHAR2(13) ) ;
DROP TABLE EMP;
CREATE TABLE EMP
       (EMPNO NUMBER(4) CONSTRAINT PK_EMP PRIMARY KEY,
ENAME VARCHAR2(10),
JOB VARCHAR2(9),
MGR NUMBER(4),
HIREDATE DATE,
SAL NUMBER(7,2),
COMM NUMBER(7,2),
DEPTNO NUMBER(2) CONSTRAINT FK_DEPTNO REFERENCES DEPT);
INSERT INTO DEPT VALUES
(10,'ACCOUNTING','NEW YORK');
INSERT INTO DEPT VALUES (20,'RESEARCH','DALLAS');
INSERT INTO DEPT VALUES
(30,'SALES','CHICAGO');
INSERT INTO DEPT VALUES
(40,'OPERATIONS','BOSTON');
INSERT INTO EMP VALUES
(7369,'SMITH','CLERK',7902,to_date('17-12-1980','dd-mm-yyyy'),800,NULL,20);
INSERT INTO EMP VALUES
(7499,'ALLEN','SALESMAN',7698,to_date('20-2-1981','dd-mm-yyyy'),1600,300,30);
INSERT INTO EMP VALUES
(7521,'WARD','SALESMAN',7698,to_date('22-2-1981','dd-mm-yyyy'),1250,500,30);
INSERT INTO EMP VALUES
(7566,'JONES','MANAGER',7839,to_date('2-4-1981','dd-mm-yyyy'),2975,NULL,20);
INSERT INTO EMP VALUES
(7654,'MARTIN','SALESMAN',7698,to_date('28-9-1981','dd-mm-yyyy'),1250,1400,30);
INSERT INTO EMP VALUES
(7698,'BLAKE','MANAGER',7839,to_date('1-5-1981','dd-mm-yyyy'),2850,NULL,30);
INSERT INTO EMP VALUES
(7782,'CLARK','MANAGER',7839,to_date('9-6-1981','dd-mm-yyyy'),2450,NULL,10);
INSERT INTO EMP VALUES
(7788,'SCOTT','ANALYST',7566,to_date('13-JUL-87')-85,3000,NULL,20);
INSERT INTO EMP VALUES
(7839,'KING','PRESIDENT',NULL,to_date('17-11-1981','dd-mm-yyyy'),5000,NULL,10);
INSERT INTO EMP VALUES
(7844,'TURNER','SALESMAN',7698,to_date('8-9-1981','dd-mm-yyyy'),1500,0,30);
INSERT INTO EMP VALUES
(7876,'ADAMS','CLERK',7788,to_date('13-JUL-87')-51,1100,NULL,20);
INSERT INTO EMP VALUES
(7900,'JAMES','CLERK',7698,to_date('3-12-1981','dd-mm-yyyy'),950,NULL,30);
INSERT INTO EMP VALUES
(7902,'FORD','ANALYST',7566,to_date('3-12-1981','dd-mm-yyyy'),3000,NULL,20);
INSERT INTO EMP VALUES
(7934,'MILLER','CLERK',7782,to_date('23-1-1982','dd-mm-yyyy'),1300,NULL,10);
DROP TABLE BONUS;
CREATE TABLE BONUS
(
ENAME VARCHAR2(10) ,
JOB VARCHAR2(9)  ,
SAL NUMBER,
COMM NUMBER
) ;
DROP TABLE SALGRADE;
CREATE TABLE SALGRADE
      ( GRADE NUMBER,
LOSAL NUMBER,
HISAL NUMBER );
INSERT INTO SALGRADE VALUES (1,700,1200);
INSERT INTO SALGRADE VALUES (2,1201,1400);
INSERT INTO SALGRADE VALUES (3,1401,2000);
INSERT INTO SALGRADE VALUES (4,2001,3000);
INSERT INTO SALGRADE VALUES (5,3001,9999);
COMMIT;
SET TERMOUT ON
SET ECHO ON

三.权限管理

系统权限

grant privilege [,privilege...] to uname

角色分配

数据库预定义角色:

  • connect:登录执行基本函数
  • resource:建立用户自己的数据对象
  • dba:所有系统权限
    grant connect,resource to ;

回收权限

四.Table:表管理

  • dba_tables:数据库中所有的表
  • user_tables:当前登录用户拥有的表对象
  • all_tables:当前登录用户可以访问的表对象
-- 删除表数据:delete & truncate
delete table tname;  --可撤销删除数据,可带条件,但效率低,空间不会及时释放
trancate table tname; --清除所有数据,保留表结构,效率高,释放空间,不可撤销
drop table tname; -- 删除表结构, 不可撤销

数据类型

数据类型 最大长度 说明
char(size) 2000字节 固定长度,默认1字节
varchar2(size) 4000字节 可变长字符串
number(precision, scale) 2000 包含小数位的数值类型

视图

视图是一个由 select 语句定义内容的作为查看数据便捷方式的虚拟表.

  • 创建一个视图:
create [or replace] [force | noforce] -- force 不考虑基表是否存在
view v_name
as