1. 数据存储结构及管理

1.1. 表中数据的存储

从零开始学习Oracle_数据库管理部分(2)_oracle

1.2. Block的内容与结构

从零开始学习Oracle_数据库管理部分(2)_oracle_02

1.3. 表空间(tablespace)

1.3.1. 常见表空间及视图查询

在创建数据库时,会伴随产生如下表空间

SYSTEM 表空间:存储系统数据、数据字典,必须保持 ONLINE。

SYSAUX 表空间:存储系统数据,作为SYSTEM表空间的辅助表空间,存放一些其他的 metadata 组件,如 OEM,Streams 等会默认存放在 SYSAUX 表空间里。

TEMP 表空间:存储临时数据,临时段。

UNDO 表空间(UNDOTBS1):存储UNDO数据,UNDO段。

USERS:用户的默认表空间。

相关视图

1)dba_tablespaces:查询表空间信息

SQL> select tablespace_name, status, contents, logging, extent_management, allocation_type, segment_space_management from dba_tablespaces;

从零开始学习Oracle_数据库管理部分(2)_oracle_03

2)dba_data_files:查询数据文件

SQL> select tablespace_name, file_name, status from dba_data_files;
SQL> select name from v$tempfile;

从零开始学习Oracle_数据库管理部分(2)_oracle_04

1.3.2. 创建表空间

SQL> create tablespace mytbs01 datafile '/u01/app/oracle/oradata/ORCL/mytbs01.dbf' size 100M;
SQL> create table t1(id number(4), name char(10)) tablespace mytbs01;    -- 创建表时指定表空间
SQL> create index idx1 on t1(id) tablespace mytbs01;    -- 创建索引时指定表空间

1.3.3. 查看用户对象所在的表空间

SQL> select table_name, tablespace_name from user_tables;    -- 查看用户表及对应存储的表空间
SQL> select index_name, tablespace_name from user_indexes;    -- 查看用户索引及对应存储的表空间

1.3.4. 区管理方式(extent_management)

1)字典管理表空间(dictionary managed),在创建时需要指定存储参数:

initial:为段分配的第一个区的大小

next:为段分配的第二个区的大小

pctincrease:从第三个区开始,每个区在前一个区的基础上增加50%

minextents:在创建段时,一开始分配的区的数量

maxextents:一个段最多的区的数量

2)本地管理表空间(local managed):所有区的大小都相同

创建表空间的时候指定区管理方式:

SQL> create tablespace mytbs02 
     datefile '/u01/app/oracle/oradata/ORCL/mytbs02.dbf' size 50M
     extent management local
     autoallocate;
SQL> create tablespace mytbs03
     datafile '/u01/app/oracle/oradata/ORCL/mytbs03.dbf' size 100M
     extent management local
     uniform size 10M;

3)数据字典中查询表空间的区管理方式

SQL> select tablespace_name, extent_management from dba_tablespaces;

1.3.5. 段管理方式(segment_space_management)

1)manual:在每个段的头部有一个freelist保存空闲的块号,块号需要占用空间,事务要对freelist加锁,执行效率相对较低。

2)auto:在每个段的头部有一个bitmap,采用0和1表示块的状态。

创建表空间的时候指定段管理方式

SQL> create tablespace mytbs04
     datafile '/u01/app/oracle/oradata/ORCL/mytbs04.dbf' size 100M
     extent management local
     uniform size 10M
     segment space management auto;

1.3.6. bigfile 表空间

只有一个数据文件,具有4G个数据块,要求区管理方式为 local,段管理方式为 auto。

1)创建 bigfile 表空间

SQL> create bigfile tablespace mytbs05 datafile '/u01/app/oracle/oradata/ORCL/mytbs05.dbf' size 10M;

2)查询 bigfile 表空间

SQL> select bigfile, tablespace_name, extent_management, segment_space_management from dba_tablespaces;

1.3.7. TEMP,临时表空间

1)创建 TEMP 表空间

SQL> create temporary tablespace mytemptbs01 tempfile '/u01/app/oracle/oradata/ORCL/mytemptbs01.dbf' size 100M;

2)为数据块指定新的默认临时表空间

SQL> alter database default temporary tablespace mytemptbs01;

3)为用户指定临时表空间

SQL> alter user scott temporary tablespace mytemptbs01;

4)表空间组:多个临时表空间

SQL> alter tablespace mytemptbs01 tablespace group g1;
SQL> alter tablespace temp1 tablespace group g1;
SQL> alter database default temporary tablespace g1;

1.3.8. OMF

全称是Oracle Managed Files,即Oracle文件管理,使用OMF可以简化管理员的管理工作,不用指定文件的名字、大小、路径,其名字,大小,路径由oracle 自动分配。在删除不再使用的日志、数据、控制文件时,OMF也可以自动删除其对应的OS文件,对于未采用OMF来创建的表空间,在删除表空间之后,其数据文件并没有删除,v$datafile视图中被删除

OMF支持下列文件的自动管理:表空间、日志文件(联机)、控制文件,前提是需要为这些类型文件设定相关参数。

1)数据文件管理参数 db_create_file_dest:Oracle创建数据文件、临时文件时,在未明确指定路径的情况下的缺省路径,当db_create_online_log_dest_n未指定时,也作为联机日志文件和控制文件的缺省路径。

SQL> show parameter db_create_file_dest    -- 查看db_create_file_dest参数
SQL> alter system set db_create_file_dest='/u01/app/oracle/oradata/ORCL';    -- 设置db_create_file_dest参数
SQL> create tablespace ts5;    -- 此时创建表空间将使用OMF自动进行文件管理
SQL> create tablespace ts6 datafile size 10M;    -- 创建表空间的同时也可以指定大小

2)为重做日志文件指定路径 DB_CREATE_ONLINE_LOG_DEST_n

3)指定快速恢复区的路径 DB_RECOVERY_FILE_DEST

1.3.9. 表空间的扩展

数据库的几种扩展方法:

a. 创建新的表空间

b. 向已经存在的表空间中添加数据文件

c. 增加数据文件的容量

d. 让数据文件自动扩展

1)向表空间中增加文件

SQL> create tablespace ts4
     datafile '/u01/app/oracle/oradata/ORCL/ts4_1.dbf' size 20M, '/u01/app/oracle/oradata/ORCL/ts4_2.dbf' size 30M;    -- 创建表空间ts4
SQL> alter tablespace ts4
     add datafile '/u01/app/oracle/oradata/ORCL/ts4_3.dbf' size 20M;

2)手工扩展数据文件

SQL> select file_name, BYTES/1024/1024 as MB from dba_data_files;    -- 查看数据文件的大小
SQL> alter database datafile '/u01/app/oracle/oradata/ORCL/ts4.dbf' resize 50M;

3)允许数据文件自动扩展

SQL> create tablespace ts8
     datafile '/u01/app/oracle/oradata/ORCL/ts41.dbf' size 10M autoextend on next 20M maxsize 1G,
     '/u01/app/oracle/oradata/ORCL/ts42.dbf' size 30M autoextend off;    -- 创建表空间时指定数据文件自动扩展
SQL> alter database datafile '/u01/app/oracle/oradata/ORCL/ts51.dbf' autoextend on next 20M maxsize 2G;    -- 调整数据文件实现自动扩展
SQL> select file_name, autoextensible, increment_by, maxbytes/1024/1024 as max_mb from dba_data_files;

1.3.10. 表空间的删除与状态调整

1)删除表空间

SQL> drop tablespace ts1;
SQL> drop tablespace ts1 including contents;    -- 如果表空间中非空,不加including contents则无法删除
SQL> drop tablespace ts1 including contents and datafiles;    -- 删除表空间同时删除数据文件

2)改变表空间状态

SQL> alter tablespace ts5 offline;
SQL> alter tablespace ts5 online;
SQL> alter tablespace ts5 read only;
SQL> alter tablespace ts5 read write;

1.3.11. 在线移动数据文件

从零开始学习Oracle_数据库管理部分(2)_oracle_05

SQL> alter database move datafile '/u02/orcl/t822.dbf' to '/u01/app/oradata/ORCL/t82.dbf';    -- 重新分配数据文件

从零开始学习Oracle_数据库管理部分(2)_oracle_06

 

2. 用户及权限管理

2.1. 数据库用户账户

每个数据库用户账户都有:

1)唯一的用户名

2)一个认证方法

3)一个默认的表空间

4)一个用户profile

5)一个初始的consumer组

6)一个账户状态

 

一个schema:

1)是用户拥有的数据库对象的一个集合

2)具有和用户账户相同的名称

2.2. 预定义的管理账户

1)SYS:拥有数据字典和自动工作负载存储库(AWR),用于启动和关闭数据库实例

2)SYSTEM:拥有额外的用于管理的表和视图

3)SYSBACKUP:便于RMAN(Oracle Recovery Manager)的备份恢复操作

4)SYSDG:便于Oracle Data Gurad的操作

5)SYSKM:便于Transparent Data Encryption wallet的操作

2.3. 用于数据库管理的权限

1)SYSDBA:标准数据库操作,如:启动和关闭数据库实例,创建服务器参数文件(spfile),改变日志归档模式,允许被授权人查看用户数据。

2)SYSOPER:标准数据库操作,如:启动和关闭数据库实例,创建服务器参数文件(spfile),改变日志归档模式。

3)SYSBACKUP:Oracle Recovery Manager (RMAN) 备份和恢复操作,通过RMAN或SQLPlus

4)SYSDG:Data Guard操作,通过使用Data Guard Broker或是DGMGRL命令行接口

5)SYSKM:管理Manage Transparent Data Encryption wallet操作

2.4. 用户认证的方法

1)密码:用户定义的用户尝试登录数据库时必须提供的密码。

2)外部:通过数据库外部的方法进行身份验证。

3)全局:通过使用基于LDAP的目录服务来标识用户。

管理员身份验证

a. 操作系统验证:针对SYS用户的本地登录 oracle用户 --> SYS

b. 口令文件验证:针对SYS用户的远程登陆,位于$ORACLE_HOME/dbs 目录,名为orapworcl

    重新创建口令文件:$ orapwd file="orapworcl" password="Qwer_1234"

2.5. 用户管理相关视图

1)dba_users

SQL> select username, password, account_status, lock_date, expiry_date from dba_users;    -- 查询用户信息

2)v$pwfile_users

SQL> select username, sysdba, sysoper, sysasm, sysbackup, syskm, sysdg, account_status from v$pwfile_users;    -- 查询所有的特权用户

3)dba_ts_quotas

SQL> select username, tablespace_name, max_bytes from dba_ts_quotas;    -- 查询用户对表空间的使用配额

4)v$session

SQL> select username, sid, serial# from v$session where username is not null;    -- 查询会话

2.6. 表空间配额的指定

SQL> grant unlimited tablespace to scott;
SQL> alter user scott quota 10M on t3;

2.7. 用户账号创建、调整及删除

SQL> create user jack identified by "1234";
SQL> create user john identified by "1234"
     default tablespace users
     temporary tablespace temp
     quota 20M on ts3
     account lock
     password expire;    -- 创建用户,指定用户使用的临时表空间、默认表空间账户可用性
SQL> alter user john
     default tablespace ts3
     temporary tablespace temp1;     -- 切换用户使用的表空间
SQL> alter user john 
     quota unlimited on ts3;    -- 调整john在ts3上的配额限制
SQL> alter user john account unlock;    -- 账户解锁
SQL> alter user john password expire;    -- 令用户密码过期
SQL> drop user john cascade;    -- 删除用户,级联删除

2.8. 用户权限管理

系统权限:用户在数据库范围内能够进行某种操作的权限

—— 例如:create session、create table、create procedure、create view等

对象权限:用户能够访问某个特定数据库对象的权限

2.8.1. 系统权限

1)为用户指定系统权限:

SQL> grant create table, create session to john;
SQL> grant create table, create session to john with admin option;

2)回收系统权限:

SQL> revoke create table from john;

3)与系统权限有关的数据字典视图

system_privilege_map:查询当前数据库所定义的系统权限

dba_sys_privs:查询任何一个用户所拥有的系统权限

SQL> select privilege from dba_sys_privs where grantee='SCOTT';

user_sys_privs:查询当前用户所拥有的系统权限

session_privs:当前用户登录之后在当前会话中所具有的系统权限

SQL> select * from session_privs;

2.8.2. 对象权限

对象权限:用户能够访问某个特定数据库对象的权限

例如:针对表的对象权限:select、insert、update、delete、references

     针对存储过程的对象权限:execute

1)为用户指定对象权限

SQL> grant select on scott.dept to john;
SQL> grant select on scott.dept to john with grant option;

2)回收对象权限

SQL> revoke select on scott.dept from john;

3)与对象权限有关的数据字典视图

dba_tab_privs:查询任何用户具有的对象权限

SQL> select owner, table_name, privilege, grantor from dba_tab_privs where grantee='john';

user_tab_privs:查询当前用户所具有的对象权限

SQL> select owner, table_name, privilege, grantor from user_tab_privs;

dba_col_privs 及 user_col_privs:查询列级权限

SQL> grant update(dname) on scott.dept to john;    -- 赋予列级权限

2.9. 角色

1)角色的创建

SQL> create role r1;

2)SYS用户将系统权限指定给角色

SQL> grant create session, create table to r1;

3)普通用户例如scott,将对象角色指定给角色

SQL> grant select, update on dept to r1;

4)将角色r1指定给用户

SQL> grant r1 to user1;

5)与角色相关的视图

dba_roles:查询当前数据库中所有的角色

role_sys_privs:查询一个角色所具有的系统权限

SQL> select privilege from role_sys_privs where role='R1';

role_tab_privs:查询一个角色所具有的对象权限

SQL> select owner, table_name, privilege from role_tab_privs where role='R1';

user_role_privs:当前用户所具有的角色

6)特殊的角色

CONNECT:仅具有创建session的权限。

RESOURCE:仅具有创建TABLE、CLUSTER,INDEXTYPE,OPERATOR,PROCEDEURE,SEQUENCE,TABLE,TRIGGER,TYPE的权限。同时,当把ORACLE resource角色授予一个user的时候,不但会授予ORACLE resource角色本身的权限,而且还有unlimited tablespace权限,但是,当把resource授予一个role时,就不会授予unlimited tablespace权限。(对于新用户常用的赋权操作即赋予CONNECT和RESOURCE两个角色)

SQL> select privilege from role_sys_privs where role='RESOURCE';    -- 查看RESOURCE角色的权限
SQL> create user u2 identified by "Qwer_1234";
SQL> grant connect, resource to u2;    -- 为u2赋予CONNECT与RESOURCE角色

DBA:对应的是对Oracle实例里对象的操作权限的集合。

2.10. profile

一次只为用户分配一个配置文件。profile能够控制资源消耗、管理账户状态和控制密码过期时间

相关参数:

failed_login_attemps:指定用户登录失败的次数

password_lock_time:锁定的天数

password_life_time:口令的有效期(天数)

password_grace_time:口令的宽限期(天数)

password_reuse_time:密码重用时间,天数

password_reuse_max:密码重用,次数

idle_time:会话的空闲时间,超时将自动断开

connect_time:会话能够持续的时间

cpu_per_session:用户在一个会话内能够消耗的cpu时间,1/100秒

session_per_user:一个用户最多的并发会话数量

logical_reads_per_session:一个会话最多能够读取多少个数据块

1)创建profile

SQL> create profile p1 limit 
     failed_login_attempts 3
     password_lock_time 1;
SQL> create profile p2 limit 
     password_reuse_time 1
     password_reuse_max 3;
SQL> create profile p5 limit
     cpu_per_session  100
     logical_reads_per_session 500;

2)调整用户profile

SQL> alter user u1 profile p1;