Oracle数据库之表空间(tablespace)---面试再也不害怕系列之一
Oracle数据库之表空间(tablespace)---面试再也不用害怕系列之一Oracle数据库的地位不用多说,懂得都懂,大型公司基本必备的数据库,没有之一。在咱们国家,虽然有喊口号--去o化,可口号喊得在响亮,身体却很诚实,因此,Oracle也是运维或者开发面试时所需要掌握的基础知识之一。Oracle数据库的特点是重型的(数据库的方方面面的功能都有所涵盖,比如,快速备份,自动化备份,任务计划,
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;
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)