Oracle数据库的江湖地位不用多说,懂得都懂,大型公司基本必备的数据库,没有之一。在咱们国家,虽然有喊口号--去o化,可口号喊得在响亮,身体却很诚实,因此,Oracle也是运维或者开发面试时所需要掌握的基础知识之一。

Oracle数据库的特点是重型的(数据库的方方面面的功能都有所涵盖,比如,快速备份,自动化备份,任务计划,触发器,视图,视图函数,超级细分的角色用户管理系统,内存管理,表空间管理,安全审计等等,但其实各方面的相关配置是有迹可循的,相对于所谓的号称轻型,小巧的软件,那些软件配置起来,可能是天马行空,无从下手的感觉),可快速使用的,在架构方面,可快速组合成集群的一种关系型数据库。那么,既然是关系型数据库,自然有非常多的逻辑(不管内在还是外在),我们需要学习的就是掌握这些逻辑,并在生产中为我们所用。

一,表空间的概念(tablespace)

oarcle数据库真正存放数据的是数据文件(data files),Oarcle表空间(tablespaces)实际上是一个逻辑的概念,他在物理上是并不存在的,那么把一组data files 捻在一起就成为一个表空间。

表空间属性:

1)一个数据库可以包含多个表空间,一个表空间只能属于一个数据库。

2)一个表空间可以包含多个数据文件,一个数据文件只能属于一个表空间。

3)表空间有实际大小,可以理解为Linux的磁盘配额,是一种特殊的具有磁盘配额的文件系统,如果没有设置自动动态调整autoextensiable字段为no,而表空间又被数据占用完毕,那么,数据库的这个表空间将不能保存任何数据

从逻辑的角度来看,一个数据库(database)下面可以分多个表空间(tablespace);一个表空间下面又可以分多个段(segment);一个数据表要占一个段(segment),一个索引也要占一个段(segment )。 一个段(segment)由多个 区间(extent)组成,那么一个区间又由一组连续的数据块(data block)组成。这连续的数据块是在逻辑上是连续的,有可能在物理磁盘上是分散。

《1》

那么从物理的角度上看,一个表空间由多个数据文件组成,数据文件是实实在在存在的磁盘上的文件。这些文件是由oracle数据库操作系统的block 组成的,通常,文件的后缀名是dbf。

SELECT * FROM DBA_DATA_FILES;

输出如下:
C:\APP\ADMINISTRATOR\ORADATA\MYORACLE\USERS01.DBF	4	USERS	5242880	640	AVAILABLE	4	YES	34359721984	4194302	160	4194304	512	ONLINE
C:\APP\ADMINISTRATOR\ORADATA\MYORACLE\UNDOTBS01.DBF	3	UNDOTBS1	110100480	13440	AVAILABLE	3	YES	34359721984	4194302	640	109051904	13312	ONLINE
C:\APP\ADMINISTRATOR\ORADATA\MYORACLE\SYSAUX01.DBF	2	SYSAUX	545259520	66560	AVAILABLE	2	YES	34359721984	4194302	1280	544210944	66432	ONLINE
C:\APP\ADMINISTRATOR\ORADATA\MYORACLE\SYSTEM01.DBF	1	SYSTEM	723517440	88320	AVAILABLE	1	YES	34359721984	4194302	1280	722468864	88192	SYSTEM
C:\APP\ADMINISTRATOR\ORADATA\MYORACLE\EXAMPLE01.DBF	5	EXAMPLE	104857600	12800	AVAILABLE	5	YES	34359721984	4194302	80	103809024	12672	ONLINE

autoextensiable字段yes表示该文件会动态的调整大小。可以看到,目前,我的这个数据库有5个表空间,名称为users,undotbs1,sysaux,system,example。

《2》

查询所有的现有的表空间的大小以及使用率:

SELECT a.tablespace_name, 
a.bytes total, 
b.bytes used, 
c.bytes free, 
(b.bytes * 100) / a.bytes "% USED ", 
(c.bytes * 100) / a.bytes "% FREE " 
FROM sys.sm$ts_avail a, sys.sm$ts_used b, sys.sm$ts_free c 
WHERE a.tablespace_name = b.tablespace_name 
AND a.tablespace_name = c.tablespace_name; 

 

以上输出的单位为bytes,可以看到,sysaux表空间大致的总大小(可以理解为总配额)为550m,system表空间大致的总大小(可以理解为总配额)为720m。下图可以看到实际的物理文件大小比查询的略小,但基本接近(估算的,因此有差异)。

《4》

查询表空间剩余的使用容量:

SELECT tablespace_name, 
file_id, 
file_name, 
round(bytes / (1024 * 1024), 0) total_space 
FROM dba_data_files 
ORDER BY tablespace_name; 
select tablespace_name from dba_data_files;
SELECT SUM(bytes) / (1024 * 1024) AS free_space, tablespace_name 
FROM dba_free_space 
GROUP BY tablespace_name;

 

以上的单位为M,sysaux剩余配额为28.9m,system剩余配额为5.3m。当然了,在实际生产中,我们对这些无须在意,因为,前面也查询出了,表空间会autoextensiable,也就是表空间配额用完了,Oracle会自动给增加的。只要你的物理硬盘剩余空间足够多,它会不断的自动增加。

《5》

查询oracle数据库的关于db(数据库)的参数:

show parameter db;


输出如下:
NAME                          TYPE        VALUE                                    
----------------------------- ----------- ---------------------------------------- 
db_16k_cache_size             big integer 0                                        
db_2k_cache_size              big integer 0                                        
db_32k_cache_size             big integer 0                                        
db_4k_cache_size              big integer 0                                        
db_8k_cache_size              big integer 0                                        
db_block_buffers              integer     0                                        
db_block_checking             string      FALSE                                    
db_block_checksum             string      TYPICAL                                  
db_block_size                 integer     8192                                     
db_cache_advice               string      ON                                       
db_cache_size                 big integer 0                                        
db_create_file_dest           string                                               
db_create_online_log_dest_1   string                                               
db_create_online_log_dest_2   string                                               
db_create_online_log_dest_3   string                                               
db_create_online_log_dest_4   string                                               
db_create_online_log_dest_5   string                                               
db_domain                     string                                               
db_file_multiblock_read_count integer     128                                      
db_file_name_convert          string                                               
db_files                      integer     200                                      
db_flash_cache_file           string                                               
db_flash_cache_size           big integer 0                                        
db_flashback_retention_target integer     1440                                     
db_keep_cache_size            big integer 0                                        
db_lost_write_protect         string      NONE                                     
db_name                       string      myoracle                                 
db_recovery_file_dest         string      C:\app\Administrator\flash_recovery_area 
db_recovery_file_dest_size    big integer 3912M                                    
db_recycle_cache_size         big integer 0                                        
db_securefile                 string      PERMITTED                                
db_ultra_safe                 string      OFF                                      
db_unique_name                string      myoracle                                 
db_writer_processes           integer     1                                        
dbwr_io_slaves                integer     0                                        
rdbms_server_dn               string                                               
standby_archive_dest          string      %ORACLE_HOME%\RDBMS                      
standby_file_management       string      MANUAL                                   
xml_db_events                 string      enable                                   

那么,我这个Oracle数据库使用的block是默认的8192,数据库名称是myoracle

Segment(段) :段是指占用数据文件空间的通称,或数据库对象使用的空间的集合;段可以有表段、索引段、回滚段、临时段和高速缓存段等。

Extent (区间):分配给对象(如表)的任何连续块叫区间;区间也叫扩展,因为当它用完已经分配的区间后,再有新的记录插入就必须在分配新的区间(即扩展一些块);一旦区间分配给某个对象(表、索引及簇),则该区间就不能再分配给其它的对象.

二,新建表空间

这里的新建表空间,也就是新建表空间的对应文件,SQL语句如下:

create  tablespace test datafile 'C:\app\Administrator\oradata\myoracle\test02.dbf' size 200m;

表示新建一个200m大小的表空间名称为test,当然,这个表空间没有自增长,也没有最大限制。

create  tablespace test datafile 'C:\app\Administrator\oradata\myoracle\test02.dbf' size 200m autoextend on next 50m maxsize 20480m extent management local;

这条SQL语句表示新建一个名称为test,初始大小为200m的表空间,并且每次自增为50m,最多增加到20480m也就是20g。

三,删除表空间

删除表空间语句为:

alter database datafile 'C:\app\Administrator\oradata\myoracle\test02.dbf' offline; 这里需要注意,必须是归档模式才可以offline,如果不是归档模式,需要执行以下命令(使用SQLplus,登录sys用户以sysdba权限执行以下命令):

start database nomount;

alter database mount;

alter database archivelog;

alter database open;

archive log list;

确保是存档模式,才可以执行alter database datafile 'C:\app\Administrator\oradata\myoracle\test02.dbf' offline;否则会报错

错误报告 -
SQL 错误: ORA-01145: 除非启用了介质恢复, 否则不允许立即脱机
01145. 00000 -  "offline immediate disallowed unless media recovery enabled"
*Cause:    ALTER TABLESPACE ... OFFLINE IMMEDIATE or ALTER DATABASE DATAFILE
           ... OFFLINE is only allowed if database is in ARCHIVELOG mode.
*Action:   Take tablespace offline normally or shutdown abort. Reconsider your
           backup strategy. You could do this if you were archiving your logs.
ORA-01031: 权限不足

最后执行删除命令:

drop tablespace TEST including CONTENTS and datafiles CASCADE CONSTRAINTS;

删除上例新建的test表空间,上下文以及物理文件以及所有依赖彻底删除。当然,表空间内所建立的所有表,视图等等内容都会跟随删除。

四,表空间的指定使用

create table test(id int) tablespace test;

新建一个表,名称为test,就一个字段id int类型的表,指定使用上述所建立的新表空间。

五,表空间的扩容

很多时候,表空间可能会被大量的短时间内的数据撑爆,比如,我的Oracle的system表空间就已经达到百分之99以上,如果是生产库,那么很显然,很危险了。因此,手动扩容是一个比较好的选择。

增加表空间大小的四种方法
Meathod1:给表空间增加数据文件
ALTER TABLESPACE app_data ADD DATAFILE
'D:\ORACLE\PRODUCT\10.2.0\ORADATA\EDWTEST\APP03.DBF' SIZE 50M;
 
Meathod2:新增数据文件,并且允许数据文件自动增长
ALTER TABLESPACE app_data ADD DATAFILE
'D:\ORACLE\PRODUCT\10.2.0\ORADATA\EDWTEST\APP04.DBF' SIZE 50M
AUTOEXTEND ON NEXT 5M MAXSIZE 100M;
 
Meathod3:允许已存在的数据文件自动增长
ALTER DATABASE DATAFILE 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\EDWTEST\APP03.DBF'
AUTOEXTEND ON NEXT 5M MAXSIZE 100M;
 
Meathod4:手工改变已存在数据文件的大小
ALTER DATABASE DATAFILE 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\EDWTEST\APP02.DBF'
RESIZE 100M; 

扩容SQL语句为:

1,先查询出每个表空间的大小,该语句查询出的结果以m为单位:

select a.tablespace_name,total,free,total-free used from   

( select tablespace_name,sum(bytes)/1024/1024 total from dba_data_files   

group by tablespace_name) a,   

( select tablespace_name,sum(bytes)/1024/1024 free from dba_free_space   

group by tablespace_name) b  

where a.tablespace_name=b.tablespace_name;

2,本例以给system这个表空间扩容为例.从原始的690m扩容到800m,使用的是第四种方法:

alter database datafile 'C:\APP\ADMINISTRATOR\ORADATA\MYORACLE\SYSTEM01.DBF' resize 800m;

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐