设为首页 收藏本站
查看: 443|回复: 0

[经验分享] Oracle表空间和数据文件

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-1-27 08:27:25 | 显示全部楼层 |阅读模式
--1、查询数据库临时表空间信息
SELECT * FROM DATABASE_PROPERTIES WHERE PROPERTY_VALUE='TEMP';
--2、表空间信息
SELECT TP.tablespace_name AS 表空间名称,
       TP.block_size / 1024 || 'M' AS 空间块大小,
       TP.contents AS 空间类型,
       TP.extent_management AS 表空间管理方式
  FROM DBA_TABLESPACES TP;

--查询数据字典管理模式下,哪些区被占用,权限属于sys,如果是LOCAL管理方式,则数据行为空
SELECT * FROM UET$;
--查询数据字典管理模式下,哪些区是空闲状态(FET:FREE EXTENT TABLE)
SELECT * FROM FET$;
--创建普通表空间语法
CREATE TABLESPACE test DATAFILE 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TEST.DBF' SIZE 5M EXTENT MANAGEMENT LOCAL
--创建UNDO表空间
CREATE UNDO TABLESPACE testundo DATAFILE 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TESTUNDO.DBF' SIZE 5M
--创建临时表空间
CREATE TEMPORARY TABLESPACE testtemp TEMPFILE 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TESTTEMP.DBF' SIZE 5M

SELECT * FROM V$datafile;
wKiom1TFvu-TK3iwAAEzkzSOgJM682.jpg
wKioL1TFv86xZnToAADWqBQSD58746.jpg
wKiom1TFvvLBMqwrAADmQlnKHk8999.jpg


数据库(Database)可以拥有多个表空间(Tablespace),一个表空间在同一时间只能属于同一个数据库,即两者是1:N的关系;
一个表空间(Tablespace)可以由多个段(Segment)组成,段可以跨越不同的数据文件(Data file);
一个段(Segment)由由多个区(Extent)组成;
一个数据文件(Data file)由多个区组成,即存在1:N的关系,一个区只能属于一个数据文件;
一个区由多个连续的Oracle数据块(Block)组成;
在Oracle数据库中Block是最小的存储单位;

Oracle数据块与操作系统的数据块的关系是整数倍的关系,比如OS的block大小是4K,则Oracle数据块大小只能是4的整数倍,如4K、8K、16K等,整数倍的意义在于不必要的I/O;
附:
查询Windows操作系统Block大小的方法:命令行执行“fsutil fsinfo ntfsinfo c:”
查询Oracle Block大小的方法:sqlplus中执行 “show parameter db_block_size”
其他操作系统(如linux、HP-UNIX等)查询数据块大小方法具体请参考:http://blog.itpub.net/25116248/viewspace-1063047/
一个数据库中只有SYSTEM表空间是必须的,如果使用DBCA创建数据库时选择表空间管理方式为Local Managent,则日后无法再更改数据库表空间管理方式;

段(Segment)有两种管理方式
1、手动管理,用FREELIST,叫MSMM;
2、自动管理,叫ASSM

区(Extent)的两种管理方式
1、字典管理方式(Dictionary,Oracle8.15版本之前默认管理方式,现在已经被淘汰,字典管理方式容易产生递归,不能良好支持并发)
2、本地管理(Oracle9版本以后默认管理方式)

创建数据库时,会自动预置如下数据表空间
1、SYSAUX:这是SYSTEM 表空间的辅助表空间,Oracle Database 10g 或更高版本都必须拥有SYSAUX 表空间本地化自动段管理;
2、UNDOTBS1:这是数据库服务器用于存储还原信息的还原表空间
3、TEMP:如果执行的SQL 语句需要创建临时段(如大规模排序或创建索引),则可以使用临时表,创建数据库时如果用户没有明确指定默认临时表空间,则此表空间会被作为默认临时表空间。
4、USERS:此表空间用于存储永久用户对象和数据。
5、EXAMPLE:此表空间包含创建数据库时可以安装的例子数据


alter tablespace offline;
alter tablespace online;
说明:offline可以使表空间离线,但是不能对system、temp以及有活动事务的undo表空间进行离线操作;

--查询数据文件信息
select * from dba_data_files;
select * from v$datafile;
--修改数据文件自动扩展范围
alter database datafile 'E:\APP\NEUSOFT\ORADATA\ORCL\DATAFILE\O1_MF_DUSHUAI_BBQ2GWSK_.DBF' autoextend on next 50M maxsize unlimited;
--查询临时数据文件信息
select * from dba_temp_files;
select * from v$tempfile;
--空间分配信息
select * from dba_free_space;
select * from dba_extents;
--修改数据文件自动扩展范围
alter database datafile 'E:\APP\NEUSOFT\ORADATA\ORCL\DATAFILE\O1_MF_DUSHUAI_BBQ2GWSK_.DBF' autoextend on next 50M maxsize unlimited;


            ================================================
                    Oracle表空间和数据文件章节试验章节
            ================================================
SQL> --更改会话标识符为dushuai
SQL> set sqlprompt "dushuai>>"
dushuai>>--创建一个本地化管理的表空间,初始大小定义为20M,统一块大小256K
dushuai>>create tablespace test datafile 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TEST.DBF' size=20M extent management local uniform=256K;
create tablespace test datafile 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TEST.DBF' size=20M extent management local uniform=256K
                                                                                     *
第 1 行出现错误:
ORA-02237: 无效的文件大小

dushuai>>create tablespace test datafile 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TEST.DBF' size 20M extent management local uniform size 256K;

表空间已创建。

dushuai>>--上面的创建错误,依然说明对于创建表空间的语法不熟练,加强练习!
dushuai>>--创建一个test用户,默认表空间是test
dushuai>>create user test identified by test default tablespace test;

用户已创建。

dushuai>>--为新创建的用户test赋予基本权限
dushuai>>grant connect,resource to test;

授权成功。

dushuai>>--下面我们用新创建的用户登录sqlplus
dushuai>>conn test/test
已连接。
dushuai>>show user
USER 为 "TEST"
dushuai>>--创建一张表test,则test表默认的表空间就是test
dushuai>>create table test (id integer,name varchar2(100));

表已创建。

dushuai>>desc test
名称                                      是否为空? 类型
----------------------------------------- -------- ----------------------------
ID                                                 NUMBER(38)
NAME                                               VARCHAR2(100)

dushuai>>--向test表插入几行模拟数据
dushuai>>insert into test values(1,'dushuai');

已创建 1 行。

dushuai>>insert into test values(2,'tom');

已创建 1 行。

dushuai>>commit;

提交完成。
dushuai>>col name for a20;
dushuai>>select * from test;

        ID NAME                                                                 
---------- --------------------                                                
         1 dushuai                                                              
         2 tom                                                                  

dushuai>>--查看dba_tablespace表的字段信息

dushuai>>grant dba to test;

授权成功。

dushuai>>conn test/test;
已连接。
dushuai>>desc dba_tablespaces;
名称                                      是否为空? 类型
----------------------------------------- -------- ----------------------------
TABLESPACE_NAME                           NOT NULL VARCHAR2(30)
BLOCK_SIZE                                NOT NULL NUMBER
INITIAL_EXTENT                                     NUMBER
NEXT_EXTENT                                        NUMBER
MIN_EXTENTS                               NOT NULL NUMBER
MAX_EXTENTS                                        NUMBER
PCT_INCREASE                                       NUMBER
MIN_EXTLEN                                         NUMBER
STATUS                                             VARCHAR2(9)
CONTENTS                                           VARCHAR2(9)
LOGGING                                            VARCHAR2(9)
FORCE_LOGGING                                      VARCHAR2(3)
EXTENT_MANAGEMENT                                  VARCHAR2(10)
ALLOCATION_TYPE                                    VARCHAR2(9)
PLUGGED_IN                                         VARCHAR2(3)
SEGMENT_SPACE_MANAGEMENT                           VARCHAR2(6)
DEF_TAB_COMPRESSION                                VARCHAR2(8)
RETENTION                                          VARCHAR2(11)
BIGFILE                                            VARCHAR2(3)

dushuai>>--上面的错误说明一个普通用户无法查询dba_ 报表
dushuai>>SELECT TP.tablespace_name AS 表空间名称,
  2         TP.block_size / 1024 || 'M' AS 空间块大小,
  3         TP.contents AS 空间类型,
  4         TP.extent_management AS 表空间管理方式
  5    FROM DBA_TABLESPACES TP
  6    WHERE TP.tablespace_name='TEST';

表空间名称         空间块大小    空间类型      表空间管理                                    
--------------     -----------   ----------  ------------------        
TEST                   8M        PERMANENT       LOCAL                                                                 


dushuai>>--我们将新创建的test表空间设置为只读
dushuai>>alter tablespace test read only;

表空间已更改。

dushuai>>--表空间设置为只读模式,会引起系统发生检查点操作,会促使DBWR进程将内存块中的脏数据写入磁盘数据文件中
dushuai>>--需要注意的是,检查点只会写脏数据,但是并不会完结事务,所以在设置只读模式前,必须保证没有尚未结束的事务,否则操作会hang在哪里;
dushuai>>--我们检测一下只读模式下,能否插入、删除、更新数据行
dushuai>>insert into test values(3,'wanwei');
insert into test values(3,'wanwei')
            *
第 1 行出现错误:
ORA-00372: 此时无法修改文件 7
ORA-01110: 数据文件 7: 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TEST.DBF'


dushuai>>delete from test where id=2;
delete from test where id=2
            *
第 1 行出现错误:
ORA-00372: 此时无法修改文件 7
ORA-01110: 数据文件 7: 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TEST.DBF'


dushuai>>update test set id=88 where id=2;
update test set id=88 where id=2
       *
第 1 行出现错误:
ORA-00372: 此时无法修改文件 7
ORA-01110: 数据文件 7: 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TEST.DBF'


dushuai>>--上面的事例告诉我们,表空间只读模式下是无法进行DML操作的;
dushuai>>--我们再试试是否可以truncate、drop表
dushuai>>truncate table test;
truncate table test
               *
第 1 行出现错误:
ORA-00372: 此时无法修改文件 7
ORA-01110: 数据文件 7: 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TEST.DBF'


dushuai>>drop table test;

表已删除。

dushuai>>--上面的事例告诉我们,只读模式下只能drop,不能truncate
dushuai>>--更改表空间为可读可写模式
dushuai>>alter tablespace test read write;

表空间已更改。

dushuai>>--如果一个表空间不需要更新、写入数据,可以设置为只读模式
dushuai>>--表空间离线操作:system、处于活动状态的undo表空间、默认的temp表空间不能离线,表空间后,用户无法访问;
dushuai>>alter tablespace test offline;

表空间已更改。

dushuai>>--查询表test
dushuai>>select * from test;
select * from test
              *
第 1 行出现错误:
ORA-00942: 表或视图不存在
dushuai>>--上述现象说明,表空间离线后,无法再访问表空间中原有的对象信息,如表;

dushuai>>--表空间在线
dushuai>>alter tablespace test online;

表空间已更改。

SQL> show user
USER 为 "SYS"
SQL> --变更test表空间为自动扩展模式,每次自动扩展大小为10M
SQL> alter database datafile 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TEST.DBF' autoextend on next 10M;

数据库已更改。

SQL> --注意使用的是alter database命令项

SQL> DESC DBA_FREE_SPACE
名称                                      是否为空? 类型
----------------------------------------- -------- ----------------------------
TABLESPACE_NAME                                    VARCHAR2(30)
FILE_ID                                            NUMBER
BLOCK_ID                                           NUMBER
BYTES                                              NUMBER
BLOCKS                                             NUMBER
RELATIVE_FNO                                       NUMBER

SQL> --在test表空间下再增加一个表空间
SQL> alter tablespace test add datafile  'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TEST02.DBF' size 20M  autoextend on next 10M maxsize 500M;

表空间已更改。
SQL> --查询表空间使用率情况信息
SQL> col 表空间名称 for a10;
SQL> select a.tablespace_name "表空间名称",
  2         a.bytes / 1024 / 1024 "空间总大小/MB",
  3         (a.bytes - b.bytes) / 1024 / 1024 "空间已使用/MB",
  4         b.bytes / 1024 / 1024 "空间剩余/MB",
  5         round(((a.bytes - b.bytes) / a.bytes) * 100, 2) "空间使用率"
  6    from (select tablespace_name, sum(bytes) bytes
  7            from dba_data_files
  8           group by tablespace_name) a,
  9         (select tablespace_name, sum(bytes) bytes, max(bytes) largest
10            from dba_free_space
11           group by tablespace_name) b
12   where a.tablespace_name = b.tablespace_name
13   order by ((a.bytes - b.bytes) / a.bytes) desc
14  /

表空间名称 空间总大小/MB 空间已使用/MB 空间剩余/MB 空间使用率                  
---------- ------------- ------------- ----------- ----------                  
SYSAUX               280       277.375       2.625      99.06                  
SYSTEM               490        484.75        5.25      98.93                  
EXAMPLE              100       77.6875     22.3125      77.69                  
USERS                  5         3.375       1.625       67.5                  
UNDOTBS1              70       26.3125     43.6875      37.59                  
TEST                  40            .5        39.5       1.25                  
DUSHUAI              100         .0625     99.9375        .06                  

已选择7行。

SQL> /*总结:增加表空间容量的方法主要有以下几种,1、在已存在的表空间中添加一个新的数据文件datafile;2、对已存在的数据文件进行扩容处理,使用alter database命令;**/

SQL> conn /as sysdba
已连接。
SQL> show user
USER 为 "SYS"
SQL> set sqlprompt "dushuai>>"
dushuai>>--更改dba_data_files的输出格式
dushuai>>col file_name for a40;
dushuai>>col tablespace_name for a10
dushuai>>col bytes for a10
dushuai>>select file_name,tablespace_name,bytes/1024/1024 from dba_data_files where tablespace_name='TEST';

FILE_NAME                                TABLESPACE BYTES/1024/1024            
---------------------------------------- ---------- ---------------            
D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TE TEST                    20            
ST.DBF                                                                          

D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TE TEST                    20            
ST02.DBF                                                                        


dushuai>>--我们使用命令行增大指定表空间中数据文件的size大小
dushuai>>alter database datafile 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TEST.DBF' resize 40M;

数据库已更改。

dushuai>>--检验一下更改后数据文件size是否生效
dushuai>>select file_name,tablespace_name,bytes/1024/1024 from dba_data_files where tablespace_name='TEST';

FILE_NAME                                TABLESPACE BYTES/1024/1024            
---------------------------------------- ---------- ---------------            
D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TE TEST                    40            
ST.DBF                                                                          

D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TE TEST                    20            
ST02.DBF                                                                        


dushuai>>--下面我们进行表空间中数据文件移动路径的操作实验
dushuai>>--方法1:通过alter tablepace命令实现
dushuai>>--首先让数据文件所在的表空间离线,我们让test02这个数据文件移动到上级目录下
dushuai>>alter tablespace test offline;

表空间已更改。

dushuai>>--使用操作系统命令复制或移动数据文件路径,因为我们当前是windows环境,我们就使用图形化界面移动数据文件,移动完毕仅仅属于物理层面移动;
dushuai>>--我们还需要使用命令修改控制文件
dushuai>>alter tablespace test rename datafile 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TEST02.DBF' to 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST02.DBF';

表空间已更改。

dushuai>>--我们让表空间在线online
dushuai>>alter tablespace test online;

表空间已更改。

dushuai>>col file_name for a40;
dushuai>>col tablespace_name for a15
dushuai>>col bytes for a10
dushuai>>select file_name,tablespace_name,bytes/1024/1024 from dba_data_files where tablespace_name='TEST';

FILE_NAME                                TABLESPACE_NAME BYTES/1024/1024        
---------------------------------------- --------------- ---------------        
D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TE TEST                         40        
ST.DBF                                                                          

D:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST02. TEST                         20        
DBF                                                                             


dushuai>>--通过上面的查询语句我们看见操作已经成功
dushuai>>--下面我们使用方法2:alter database命令行将test.dbf移动到上级目录
dushuai>>--首先我们需要将数据库关闭
dushuai>>shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
dushuai>>--然后将数据库启动到mount状态
dushuai>>startup mount;
ORACLE 例程已经启动。

Total System Global Area  293601280 bytes                                       
Fixed Size                  1290208 bytes                                       
Variable Size             222298144 bytes                                       
Database Buffers           62914560 bytes                                       
Redo Buffers                7098368 bytes                                       
数据库装载完毕。
dushuai>>show user
USER 为 "SYS"
dushuai>>alter database rename file 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TEST.DBF' to 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST.DBF';

数据库已更改。

dushuai>>col file_name for a40;
dushuai>>col tablespace_name for a15
dushuai>>col bytes for a15
dushuai>>select file_name,tablespace_name,bytes/1024/1024 from dba_data_files where tablespace_name='TEST';
select file_name,tablespace_name,bytes/1024/1024 from dba_data_files where tablespace_name='TEST'
                                                      *
第 1 行出现错误:
ORA-01219: 数据库未打开: 仅允许在固定表/视图中查询


dushuai>>--上面的错误,是因为我们操作完毕后,没有将数据库状态变更为open状态
dushuai>>alter database open;

数据库已更改。

dushuai>>select file_name,tablespace_name,bytes/1024/1024 from dba_data_files where tablespace_name='TEST';

FILE_NAME                                TABLESPACE_NAME BYTES/1024/1024        
---------------------------------------- --------------- ---------------        
D:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST.DB TEST                         40        
F                                                                              

D:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST02. TEST                         20        
DBF                                                                             


dushuai>>--上面的查询结果让我们知道我们的操作已经成功
dushuai>>--总结:上面两种方法都是可以实现将指定数据文件修改文件路径的目的,但是推荐第一种方法,因为不需要全局关闭数据库,不影响其他表空间的用户使用,数据库的修改一定需要注意减小影响范围;


SQL> conn /as sysdba
已连接。
/*表空间语法汇总说明
--删除空的表空间,但是不包含物理文件
drop tablespace tablespace_name;
--删除非空表空间,但是不包含物理文件
drop tablespace tablespace_name including contents;
--删除空表空间,包含物理文件
drop tablespace tablespace_name including datafiles;
--删除非空表空间,包含物理文件
drop tablespace tablespace_name including contents and datafiles;
--如果其他表空间中的表有外键等约束关联到了本表空间中的表的字段,就要加上CASCADE CONSTRAINTS
drop tablespace tablespace_name including contents and datafiles CASCADE CONSTRAINTS;
**/
SQL> --使用including contents删除逻辑块
SQL> drop tablespace test including contents;

表空间已删除。

SQL> col file_name for a40
SQL> col tablespace_name for a15
SQL> select * from dba_data_files where tablespace_name='TEST';

未选定行

SQL> --但是此时已删除表空间中的原数据文件还是存放于物理磁盘上
SQL> --我们可以通过including contents and datafiles 进行彻底删除
SQL> drop tablespace test including contents and datafiles;
drop tablespace test including contents and datafiles
*
第 1 行出现错误:
ORA-00959: 表空间 'TEST' 不存在

SQL> drop tablespace dushuai including contents and datafiles;

表空间已删除。
SQL> spool off


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-41533-1-1.html 上篇帖子: DNS导致oracle监听出错 Connection reset by peer 下篇帖子: oracle 11g EM停止后无法启动 Oracle 空间
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表