oracle维护表空间和数据文件
26,27,28,29
一:oracle 表空间概念
表空间是联系数据库的物理磁盘(数据文件)和逻辑组件的桥梁,表空间是用来存储oralce数据库对象例如:tables、indexes和 rollback segments。可以想象oracle物理磁盘和逻辑磁盘之间的关系,表空间的概念和这个一样。 PS: 数据文件 就相当于一个省的的范围(这个是实实在在存在的),而 表空间相当于在省上建立的管理机构,行政机构等,这些是相当于逻辑的结构,这些 表空间的 信息在数据字典中存储。
一个表空间是由至少一个数据库 datafiles(数据文件)组成,在表空间的总大小是可变的,所有分配在表空间的数据文件的物理磁盘空间大小也是可变的。
当表空间被定义的 时候,datafiles自动创建,在大多数情况下,所有的datafile是被提前分配的,当datafile创建的时候,空间即被设置,你,你能够定义datafile的初始大小。
tablespace 就是把一组data file 放在一起 成为一个 tablespace;是一个逻辑概念。
关于oracle的一些概念:
先科普以下概念:
1:oracle block concept(块概念)
一个oracle块是一个oracle数据块的最小的存储单元,oracle数据库块的大小当创建数据的时候被指定,除非oracle数据进行重构,否则不能进行修改了,数据库块大小通常为2K,4K,8K,16KOR 32K。一旦定义了块的大小,就能够创建新的 表空间了,表空间包含若干个块。
注意:oracle数据库instance也包含一个RAM buffer cache,组成RAM buffer cache的块适合和物理数据文件数据块相对应。
数据库包含有多个 tablespace 一个 tablespace包含一个或多个 datafiles ,一个表或者一个index 暂居一个segment
extent 由连续的oracle data block组成 : 逻辑上连续。
一个segment可以存储在不同的datafiles里面,跨越的概念;extent不能跨越datafiles。oralce data block 包含 一个或多 os block
二:表空间的类型:
1 :一个数据库至少包含一个tablespace 就是 SYSTEM;
system tablespace ;创建数据库的时候,创建包含数据字典包含SYSTEM undo segment
Non-SYSTEM tablespace
2:更科学的划分 tablespace的类型:
1:permanent 永久表空间 (SYSTEM 和 No-SYSTEM tablespace 就是这种类型)
2: undo 表空间
3:temporary 表空间
2,3是用于管理数据库 的表空间,所有不永久存储数据,
PS:当一个数据被创建的时候,将包含以下表空间:
- SYSTEM (the data dictionary)
- SYSAUX (optional database components)
- TEMP (temporary tablespace, see tablespace types below)
- UNDOTBS1 (undo tablespace, see tablespace types below)
- USERS (default users tablespace created)
3:创建表空间 create tablespace oracle doc 11:
创建表空间的简单语法:
SQL> CREATE TABLESPACE peng DATAFILE 'D:\APP\TOPWQP\ORADATA\ORCL\peng01.DBF' S
IZE 5M; 表空间已创建。
查找表空间信息
SQL> select * from v$tablespace; TS# NAME INC BIG FLA ENC
---------- ------------------------------ --- --- --- ---
0 SYSTEM YES NO YES
1 SYSAUX YES NO YES
2 UNDOTBS1 YES NO YES
4 USERS YES NO YES
3 TEMP NO NO YES
6 EXAMPLE YES NO YES
7 USER_TEMP NO NO YES
8 MY_SPACE YES NO YES
9 TS_MYDB YES NO YES
10 PENG YES NO YES 已选择10行。
如何知道一个表空间有哪些数据文件:
SQL> col file_name format a40
SQL>
SQL> select file_name ,tablespace_name from dba_data_files; FILE_NAME TABLESPACE_NAME
---------------------------------------- ------------------
D:\APP\TOPWQP\ORADATA\ORCL\USERS01.DBF USERS
D:\APP\TOPWQP\ORADATA\ORCL\UNDOTBS01.DBF UNDOTBS1
D:\APP\TOPWQP\ORADATA\ORCL\SYSAUX01.DBF SYSAUX
D:\APP\TOPWQP\ORADATA\ORCL\SYSTEM01.DBF SYSTEM
D:\APP\TOPWQP\ORADATA\ORCL\EXAMPLE01.DBF EXAMPLE
D:\APP\TOPWQP\ORADATA\ORCL\MY_SPACE.DBF MY_SPACE
D:\APP\TOPWQP\ORADATA\ORCL\TS_MYDB.DBF TS_MYDB
D:\APP\TOPWQP\ORADATA\ORCL\PENG01.DBF PENG 已选择8行。
4:两种管理数据字典的方式:
1: locally managed tablespace 自治式管理:
1:自己管理tablespace
2:数据字典中有个Bitmap 用于管理 tablespace (一个位图对应一个extent的意味1占用 0未占用)
在每一个数据文件的头,都会有一个bitmap 位图,来表示空间的占用情况。一个bit代表一个extent,占用1 未占用 0;locally-managed也是串行,不能并行,但是 每个表空可以自己管理,所有就相当于并行。如果SYSTEM表空间用的是local-managed ,其他表空间就只能是 local-managed的了。以后就要用local-managed 方式管理表空间。
如果由于历史的原因 dictionary 管理的 SYSTEM tablespace 想变成locally managed:需要执行如下命令:
DBMS_SPACE_ADMIN.TABLESPACE_MIGRANTE_TO_LOCAL('SYSTEM');
注意:做这个命令前的准备工作: 1:全备份数据库 2:确保临时表空间不是SYSTEM
自己管理的tablespace 有两个表管理这些数据:
?疑问 每个表空间口有自己的 DEBIT和CREDIT表吗?
DEBIT表:记录所有已经被分配的extent
CREDIT表:记录所有空闲的extent
当申请空间的时候,oracle就去查询这些表,然后分配空间,当向表中
插入数据的时候,就是在申请空间。
2: data-dictionary 的管理。
当自己的表中插入数据的时候,oracle要去查询数据字典(执行很多隐含sql)然后分配空间。因为数据字典只有一个:对数据字典的访问必须是序列化的,不能并发,如果通过数据字典,管理表空间, 容易造成数据库的开销过大,所以这种方式有点过时,中央集群的管理方式是 data-dictionary,地方似的管理是新出的管理表空间的方式。
PS:大事中央管,小事自己管。 中央集权制放掉,搞自治
3:undo tablespace:
主要是用来存储undo segment; 就是再对一个表或者表空间做修改的时候,undo 就是做事先进行备份。undo一定是 loacally mananged 以后有专门一章进行讲解;
5:temporary tablespaces:
就是oracle的临时存储用的,比如做一些大型的排序,在内存中做肯定不行,内存不够,这个时候就需要在临时表空间中进行排序操作。临时的中转站。有一个全局的临时表空间可以被大家共用,只用于存放临时的信息,可以 data-dictionary方式,但是推荐使用locally -mananged管理方式.
强烈建议,在创建数据库的时候额外指定 临时表空间。如果没有指定,默认是 SYSTEM这样做事很危险的。所以要指定。
有两种方式指定 default temporary tablespace:
1:创建数据库的使用 create database的时候。
DEFAULT TEMPORARY TABLESPACE temp TEMPFILE '路径/文件名' SIZE 400M
2: 可以使用 alter database 的时候。
ALTER DATABASE DEFAULT TEMPORYARY TABLESPACE default_temp2;(这个要首先创建表空间)
6: 查询默认的临时表空间
desc database_properties; col property_name format a20;
col property_value format a20; select property_name,property_value from database_properties;
7 :如何看一个表空间的 类型:
SQL> select tablespace_name,contents,extent_management from dba_tablespaces; TABLESPACE_NAME CONTENTS EXTENT_MAN
------------------ --------- ----------
SYSTEM PERMANENT LOCAL
SYSAUX PERMANENT LOCAL
UNDOTBS1 UNDO LOCAL
TEMP TEMPORARY LOCAL
USERS PERMANENT LOCAL
EXAMPLE PERMANENT LOCAL
USER_TEMP TEMPORARY LOCAL
MY_SPACE PERMANENT LOCAL
TS_MYDB PERMANENT LOCAL
PENG PERMANENT LOCAL 已选择10行。
8:修改默认表空间
下面进行新加一个表空间:
SQL> create temporary tablespace mytemp tempfile 'D:\APP\TOPWQP\ORADATA\ORCL\my
temp.DBF' size 100M extent management local; 表空间已创建。 SQL>
SQL> ALTER DATABASE DEFAULT TEMPORYARY TABLESPACE mytemp;
ALTER DATABASE DEFAULT TEMPORYARY TABLESPACE mytemp
*
第 1 行出现错误:
ORA-02231: ALTER DATABASE 选项缺失或无效 SQL>
SQL> ALTER DATABASE DEFAULT TEMPORARY TABLESPACE mytemp; 数据库已更改。 SQL>
默认临时表空间就修改了,可以通过如下命令查询:
SQL> select property_name,property_value from database_properties; PROPERTY_NAME PROPERTY_VALUE
-------------------- --------------------
DICT.BASE 2
DEFAULT_TEMP_TABLESP MYTEMP
ACE DEFAULT_PERMANENT_TA USERS
BLESPACE
一个数据库可以有多个临时表空间,但是只有一个default的表空间。
9: 表空间只读设置:
ALTER TABLESPACE mytemp READ ONLY;
执行这条语句:oracle将做如下操作:
1:引起 checkpoint;
2:数据变成只读操作
3:依然可以从表空间中删除一个object(table index 等)
这个在实际中用的不多,我简单说一下方法,就不做实验了。
实验: 创建一个表空间:
create tablespace wang datafile '/文件名/' size 100M
extent management local uniform size 128k; create user wang identified by wang default tablespace wang; 然后用user/user登录
创建表 就在以上指定的表空间中了。 create table wang (id integer,name char(10));
insert into t values(0,'wang'); commit; insert into t values(1,'qiupeng');
第二条不commit
然后切换到sys用户; 然后执行
alter tablespace wang read only; 如果transcription没有commit以上语句耗在这里,commit后这个语句才执行。 drop table wang ;这个命令可以执行。 相当于 一个省的地域是实实在在的文件, 省上面的行政机构是相当于
tablespace,是一个逻辑的结构,
这个tablespace的逻辑结构是存储在数据字段中的,可以执行 drop table操作
相当于对数据字典进行访问。
10 :让一个表空间 offline
以下表空间不能离线:
1:SYSTEM表空间
2:处于active的 undo segment 的表空间
3:default temporary 表空间不能离线 ,temporary 表空间如果不是default的就可以离线。
ALTER TABLESPACE mytemp OFFLINE; ALTER TABLESPACE mytemp ONLINE;
实验:
create table tt(id integer,name char(10));
insert into tt values(0,'wang');
commit;
select * from tt;
insert into tt values(1 ,'bbbbb');
select * from tt;
这个时候第二条记录还没有commit;
这意味在undo segment 有一个 active的。
如果表空间离线,就不能对这个表空间内的表做操作。
11: 变大和变小 表空间;(这个很有现实意义)
有二种方式:
1:表空间可以自动变大 创建表空间的时候 可以设置 AUTOEXTEND ON实现。
2:可以通过在表空间中加入新的数据文件来增加表空间。
1:查询表空间的使用情况:
DBA_DATA_FILES 这个表记录了所有数据文件情况。
DBA_FREE_SPACE 能够知道还剩余多少表空间。(如果是离线状态不能查出。)
google 搜索 : oracle tablespace usage sql
这个sql能够查询出数据库的所有表空间的使用情况;
注意这是一个很重要的sql:
SELECT /* + RULE */ df.tablespace_name "Tablespace",
df.bytes / (1024 * 1024) "Size (MB)",
SUM(fs.bytes) / (1024 * 1024) "Free (MB)",
Nvl(Round(SUM(fs.bytes) * 100 / df.bytes),1) "% Free",
Round((df.bytes - SUM(fs.bytes)) * 100 / df.bytes) "% Used"
FROM dba_free_space fs,
(SELECT tablespace_name,SUM(bytes) bytes
FROM dba_data_files
GROUP BY tablespace_name) df
WHERE fs.tablespace_name (+) = df.tablespace_name
GROUP BY df.tablespace_name,df.bytes
UNION ALL
SELECT /* + RULE */ df.tablespace_name tspace,
fs.bytes / (1024 * 1024),
SUM(df.bytes_free) / (1024 * 1024),
Nvl(Round((SUM(fs.bytes) - df.bytes_used) * 100 / fs.bytes), 1),
Round((SUM(fs.bytes) - df.bytes_free) * 100 / fs.bytes)
FROM dba_temp_files fs,
(SELECT tablespace_name,bytes_free,bytes_used
FROM v$temp_space_header
GROUP BY tablespace_name,bytes_free,bytes_used) df
WHERE fs.tablespace_name (+) = df.tablespace_name
GROUP BY df.tablespace_name,fs.bytes,df.bytes_free,df.bytes_used
ORDER BY 4 DESC;
在我数据库上的执行结果:
Tablespace Size (MB) Free (MB) % Free % Used
------------------------------ ---------- ---------- ---------- ----------
TS_MYDB 500 499.9375 100 0
MY_SPACE 500 499.9375 100 0
PENG 5 4.9375 99 1
MYTEMP 100 99 99 1
UNDOTBS1 365 335.6875 92 8
USER_TEMP 500 338 68 32
EXAMPLE 100 22.3125 22 78
USERS 9707.0625 462.8125 5 95
SYSAUX 821.25 41.9375 5 95
SYSTEM 710 1.125 0 100
TEMP 27 0 0 100
12 :三种方法扩展表空间
方法一: 自动扩充表空间
三种方式:
1: create database 指定 datafile 的时候可以增加选项 AUTOEXTEND ON NEXT 10M MAXSIZE 500M 这样数据库文件就能自动增长。
2: create tablespace 这个AUTOEXTEND ON NEXT 10M MAXSIZE 500M 也可以用在create tablespace。
3:ALTER TABLESPACE ADD DATAFILE
下面用第三种方式做实验:(修改的表空间必须实现,这个my_)
SQL> alter tablespace MY_SPACE add datafile 'D:\APP\TOPWQP\ORADATA\ORCL\mytemp
001.DBF' size 20M autoextend on next 10M maxsize 100M; 表空间已更改。
增加以后可以到 dba_data_files;表中看是否为自动增加:
desc dba_data_files;
col file_name format a20;
select file_name , tablespace_name,autoextensible from dba_data_files;
SQL> select file_name , tablespace_name,autoextensible from dba_data_files; FILE_NAME TABLESPACE_NAME AUT
-------------------- ------------------ ---
D:\APP\TOPWQP\ORADAT USERS YES
A\ORCL\USERS01.DBF D:\APP\TOPWQP\ORADAT UNDOTBS1 YES
A\ORCL\UNDOTBS01.DBF D:\APP\TOPWQP\ORADAT SYSAUX YES
A\ORCL\SYSAUX01.DBF D:\APP\TOPWQP\ORADAT SYSTEM YES
A\ORCL\SYSTEM01.DBF D:\APP\TOPWQP\ORADAT EXAMPLE YES
A\ORCL\EXAMPLE01.DBF D:\APP\TOPWQP\ORADAT MY_SPACE YES
A\ORCL\MY_SPACE.DBF D:\APP\TOPWQP\ORADAT TS_MYDB YES
A\ORCL\TS_MYDB.DBF D:\APP\TOPWQP\ORADAT PENG NO
A\ORCL\PENG01.DBF D:\APP\TOPWQP\ORADAT MY_SPACE YES
A\ORCL\MYTEMP001.DBF 已选择9行。
可以看到 刚增加的数据文件 是否为自动增长 autoextensible 这个属性显示 ;
如果不想新增加 数据文件的方式扩展表空间,可以使用: 如下命令 对原来的数据文件设置为自动扩展来扩展表空间(道理一样)
alter database datafile '数据文件位置+数据文件名' autoextend on next 10M maxsize 100M
方法二: 增加 数据文件 到 表空间。 这样表空间 就增加了。(先睡觉明天再研究)
oracle维护表空间和数据文件的更多相关文章
- Oracle数据库表空间与数据文件的关系描述正确的是( )
Oracle数据库表空间与数据文件的关系描述正确的是( ) A.一个表空间只能对应一个数据文件 B.一个表空间可以对应多个数据文件 C.一个数据文件可以对应多个表空间 D.表空间与数据文件没任何对应关 ...
- Oracle管理表空间和数据文件详解
介绍 表空间是数据库的逻辑组成部分 从物理上将:数据库数据存放在数据文件中 从逻辑上将:数据库则是存放在表空间中 表空间由一个或是多个数据文件组成 数据库的逻辑结构 介绍: Oracle中逻辑结构包括 ...
- Oracle的表空间和数据文件
一. 概念 表空间:是一个或多个数据文件的逻辑集合 表空间逻辑存储对象: 永久段-->如表与索引 临时段-->如临时表数据与排序段 回滚段-->用于事物回滚或闪回内存的撤销数据 表空 ...
- ORACLE - 管理表空间和数据文件
ORACLE表空间是一个逻辑分区,一个数据文件只能属于一个表空间,一个表空间可以拥有多个数据文件. 一般情况下,如果一个实例分配给多个应用使用,需要创建不同的表空间,每个用户使用自己的表空间. 一.表 ...
- Oracle 为表空间增加数据文件
dba权限检查下 select tablespace_name, file_id, file_name, ),) total_space from dba_data_files order by ta ...
- Oracle的表空间、数据文件、用户
每一个Oracle数据库都是由三种类型的文件组成:数据文件(Data File).日志文件(Log File)和控制文件(Control File).数据库的文件为数据库信息提供真正的物理 ...
- ORACLE 收缩表空间的数据文件
http://blog.itpub.net/29345367/viewspace-1816427/ 方法一: 在实际的应用中经常会遇到TRUNCATE或者DELETE表中的数据后发现表空间并没有将空间 ...
- oracle 删除表空间及数据文件方法
oracle 11g版本,创建数据库表空间,默认单个数据文件最大为32G,如果数据文件大于32G,可以增加数据文件. --删除空的表空间,但是不包含物理文件 drop tablespace table ...
- oracle查看表空间下数据文件
下面两个数据字典视图就知道了.查看有哪些表空间:select * from dba_tablespaces;查看有哪些数据文件在哪个表空间中:select * from dba_data_files; ...
随机推荐
- for语句之打印三角形问题
1.左下角直角三角形 Console.Write("请输入要打印几行:"); int a = Convert.ToInt32(Console.ReadLine()); ; i &l ...
- bmp图片数据提取
仿照别人的程序写的bmp数据提取C代码,并将提取的数据放到txt文档中 /* date : 2014/06/24 designer :pengxiaoen version : dev4.9.9.0 f ...
- WebFetch 是无依赖极简网页爬取组件
WebFetch 是无依赖极简网页爬取组件,能在移动设备上运行的微型爬虫. WebFetch 要达到的目标: 没有第三方依赖jar包 减少内存使用 提高CPU利用率 加快网络爬取速度 简洁明了的api ...
- 基于visual Studio2013解决C语言竞赛题之0422牛顿迭代法
题目
- BNU 26579 Andrew the Ant 【蚂蚁】
链接: http://www.bnuoj.com/bnuoj/problem_show.php?pid=26579 http://www.bnuoj.com/bnuoj/contest_show.ph ...
- Ubuntu下编译Android JNI最靠谱的方法...
网上资料太杂乱,搞了大半天都还是没搞懂怎么系统的调用NDK.最后干脆放弃了Win改用Ubuntu编译JNI,虽然编译环境简单了,但是资料却少了不少.几乎没有一篇完整的文章.我想或许是能在Ubuntu下 ...
- http 连接复用
定义 Http/1.0每次请求都需要建立新的TCP连接,连接不能复用.Http/1.1新的请求可以在上次建立的tcp连接之上发送,连接可以复用. 优点 减少重复进行tcp三次握手的开销,提高效率.注意 ...
- js 中 字符串的转换
JS 中将 number 转换为 string 我们比较熟悉,直接用toString() 的方法就可以了:那么将 string 转换成为 number 都有些什么方法呢?如下便简单的列举了一些,以便记 ...
- [转]CentOS下性能监测工具 dstat
原文链接:http://www.bkjia.com/Linuxjc/935113.html 参考链接:https://linux.cn/article-3215-1.html,http://lhfli ...
- 自己python程序的并行修改
遇到运算量大的程序,学习了下python并行运算的方法,在自己的程序上进行了修改,看看是否可以增加效率.原始代码是: import gt_apps as my_apps f=file('sample. ...