ORACLE体系结构--数据文件管理

女生的网名这么多〃 提交于 2019-12-01 15:22:28

数据文件管理

存储结构与数据文件


1、存储结构:
database----tablespace----segment-----extent-----blocks
                       |
                   datafile

tablespace:存储表数据索引数据的空间:

>>>select tablespace_name ,contents from dba_tablespaces; //查看表空间,及分类
 

SQL> select tablespace_name,contents from dba_tablespaces;

TABLESPACE_NAME         CONTENTS
------------------------------ ---------
SYSTEM        PERMANENT
SYSAUX        PERMANENT
UNDOTBS1        UNDO
TEMP        TEMPORARY
USERS        PERMANENT
EXAMPLE         PERMANENT


2.表空间分类:
永久表空间:
system/永久表空间/系统表空间/字典表空间:主要存放当前数据库数据字典信息(对象的结构信息),ORACLE内部的基表,dbca建库默认存放到system表空间,
desc tab$ //oracle内部的基表
desc user$ //oracle内部的用户
desc ts$ //oracle内部的表空间
sysaux:永久表空间/辅助表空间,10g,内部使用工具(oem组建,审计,导入导出等) 用来分担system表的负担
select occupant_name,occupant_desc from v$sysaux_occupants; //查看oracle内部的工具
user/example:用户表空间 内部使用的模板表空间,工作中需要用到的表空间需要手动创建

回退表空间undo/ 数据块更改前的前镜像,用来做rollback或闪回操作的表空间
临时表空间 temp/ 1.主要用来存放用户的临时数据,用户退出后,表空间被释放,用户排序操作

表空间的状态:
1.online :联机,正常状态
2.offline :脱机表空间离线,表明跟实例断开连接
3.read write:可写
4.read only : 只读 ,只能查询,不能做DML操作

system---不能offline/read only
sysaux ---不能read only
undotbs1--不能offline/read only
temp--不能offline/read only
uesrs/example --任何操作都可以
>>>alter tablespace system offline/read only ; //操作会出错
 

一.永久表空间:


a.表空间创建
按照大小:
小表表空间:一个表空间下可以存放多个数据文件,最多可以存放1023个数据文件,每个数据文件的大小不能超过32G,数据库默认创建小表表空间,数据文件头部4K。
大表表空间:一个表空间下只存放一个数据文件,1个数据块(2K--32K 默认为8K)
大表表空间最大128T,最小8T ,可以放40亿个数据块 数据文件头部4M。


create [smallfile|bigfile] tablespace <必须以字母开头,不能包含特殊字符> datafile ‘/ 必须以.dbf结尾’ size<> [extent uniform size <> |autoextent on <> | segment management LOCAL|AUTO ] ; //永久表空间的的创建,一般为自动

>>>create tablespace llq datafile '/*/*/*/*.dbf' size 50m autoextend on; //自动增长的表空间,不用关注表空间的大小,只关注我们磁盘的大小
>>>select tablespace_name,bytes ,file_name from dba_data_files; //查看表空间的大小和路径
 

SQL> create tablespace carla datafile '/opt/u01/oracle/oradata/maxdb/carla01.dbf' size 100m autoextend on;

Tablespace created.
SQL> select tablespace_name,bytes,file_name from dba_data_files;
TABLESPACE BYTES FILE_NAME
---------- ---------- --------------------------------------------------
CARLA     104857600 /opt/u01/oracle/oradata/maxdb/carla01.dbf
USERS       5242880 /opt/u01/oracle/oradata/maxdb/users01.dbf
UNDOTBS1    115343360 /opt/u01/oracle/oradata/maxdb/undotbs01.dbf
SYSAUX     650117120 /opt/u01/oracle/oradata/maxdb/sysaux01.dbf
SYSTEM     754974720 /opt/u01/oracle/oradata/maxdb/system01.dbf
EXAMPLE     362414080 /opt/u01/oracle/oradata/maxdb/example01.dbf


>>>select property_name,property_value from database_properties ; //查看当前永久表空间 ,default 为默认的表空间 ,默认使用的永久表空间为users

SQL> select property_name,property_value from database_properties  where property_name like 'DEF%';

PROPERTY_NAME        PROPERTY_VALUE
------------------------------ -------------------------
DEFAULT_TEMP_TABLESPACE        TEMP                     //默认使用的临时表空间为tmp
DEFAULT_PERMANENT_TABLESPACE   USERS           //默认永久表空间为users
DEFAULT_EDITION         ORA$BASE 
DEFAULT_TBS_TYPE        SMALLFILE                       //默认使用的表空间类型为小表表空间




>>>alter database default tablespace <>; //指定默认表空间

SQL> alter database default tablespace carla;

Database altered.

SQL> select property_name,property_value from database_properties  where property_name like 'DEF%';

PROPERTY_NAME        PROPERTY_VALUE
------------------------------ -------------------------
DEFAULT_TEMP_TABLESPACE        TEMP
DEFAULT_PERMANENT_TABLESPACE   CARLA
DEFAULT_EDITION         ORA$BASESQL
DEFAULT_TBS_TYPE        SMALLFILE




>>>alter database set default bigfile tablespace; //修改表空间的类型,使用大表表空间,一建表空间,就会建成大表表空间
>>>alter database set default smallfile tablespace; //使用小表表空间

SQL> create table emp1(ename varchar2(30)) tablespace carla;
SQL> select table_name,tablespace_name from user_tables where table_name like 'EMP';

TABLE_NAME        TABLESPACE
------------------------------ ----------
EMP        SYSTEM                      //在dba用户下,未指定表空间

SQL> select table_name,tablespace_name from user_tables where table_name like 'EMP1';

TABLE_NAME        TABLESPACE
------------------------------ ----------
EMP1        CARLA           //在dba用户下指定了表空间

SQL> select table_name,tablespace_name from user_tables where table_name='HAHA'; 

TABLE_NAME        TABLESPACE
------------------------------ ----------
HAHA        USERS  //在SCOTT用户下,不指定表空间默认会将表放到users表空间下


b.表空间的管理
永久表空间:
修改

1.改名 system/sysaux不能改名字,自己创建的用户表空间才可以改名字
    alter tablespace <old> rename to <new>;

2.表空间已满,表空间的迁移或表空间下数据文件的迁移
在open状态下执行:
1.不能离线的表空间,不能执行迁移操作,能够离线的表空间就可以执行迁移操作
系统表空间,undo表空间,tmp表空间都不能离线
只有自建的用户表空间可以操作

   a.离线表空间
   alter tablespace carla offline
   select tablespace_name,file_name from dba_data_files;
   b.将表空间下数据文件从一个地方拷贝到另一个地方
   ho cp ls /u01/oracle/oradata/maxdb/carla01.dbf ‘新的磁盘路径’;
   c.修改系统中表空间下所有数据文件的路径
   alter tablespace carla rename datafile '/u01/oracle/oradata/maxdb/ carla01.dbf' to '新的路径'; //更新系统中表空间的数据文件路径
   d.将表空间联机
   alter tablespace carla online ;

SQL> select status,name,file# from v$datafile; //查看我们数据文件的状态


数据文件的状态
online:表示数据文件在线
offline:表示数据文件离线
recover:表示数据文件需要做介质恢复,数据文件曾经离线过,或曾经被迁移过 。

2.迁移表空间下的某个数据文件 //项目中建议使用这个方式
前提是数据库已归档
a.离线数据文件
alter database datafile ' /u01/oracle/oradata/maxdb/carla01.dbf ' offline;
alter database datafile 6 offline; //此时status变为recover,更新数据文件的头部,保持头部的scn号和其他一致

SQL> select file#,ts#,name,status from v$datafile;            //查看数据文件的编号和状态

     FILE#   TS# NAME     STATUS
---------- ---------- --------------------------------------------- -------
 1     0 /opt/u01/oracle/oradata/maxdb/system01.dbf    SYSTEM
 2     1 /opt/u01/oracle/oradata/maxdb/sysaux01.dbf    ONLINE
 3     2 /opt/u01/oracle/oradata/maxdb/undotbs01.dbf   ONLINE
 4     4 /opt/u01/oracle/oradata/maxdb/users01.dbf     ONLINE
 5     6 /opt/u01/oracle/oradata/maxdb/example01.dbf   ONLINE
 6     7 /opt/u01/oracle/oradata/carla01.dbf     RECOVER


b.拷贝
ho cp /u01/oracle/oradata/maxdb/carla01.dbf /新路径/;
 

SQL> ho cp /opt/u01/oracle/oradata/carla01.dbf /opt/u01/oracle/oradata/maxdb/carla01.dbf



c.修改系统中文件路径
alter database rename file '/' to '/';
 

SQL> alter database rename file '/opt/u01/oracle/oradata/carla01.dbf' to '/opt/u01/oracle/oradata/maxdb/carla01.dbf';




d.恢复数据文件
recover datafile '/' | 编号6;


e.数据文件联机
alter database datafile '/' | 编号6 online;
 

SQL>  select file#,ts#,name,status from v$datafile;  //查看数据文件的状态

     FILE#   TS# NAME     STATUS
---------- ---------- --------------------------------------------- -------
 1     0 /opt/u01/oracle/oradata/maxdb/system01.dbf    SYSTEM
 2     1 /opt/u01/oracle/oradata/maxdb/sysaux01.dbf    ONLINE
 3     2 /opt/u01/oracle/oradata/maxdb/undotbs01.dbf   ONLINE
 4     4 /opt/u01/oracle/oradata/maxdb/users01.dbf     ONLINE
 5     6 /opt/u01/oracle/oradata/maxdb/example01.dbf   ONLINE
 6     7 /opt/u01/oracle/oradata/maxdb/carla01.dbf     ONLINE

6 rows selected.

//



在mount状态下执行: //工作中基本用不上,因为需要关闭数据库
1.cp---
2.alter database rename file '/' to '/';
3.alter database open;




c.表空间的扩容
表空间使用85%以上考虑对表空间进行扩容

>>> desc dba_data_files;
>>>desc dba_free_space ;


SQL> select tablespace_name,bytes/1024/1024  bytes from dba_data_files;

TABLESPACE_NAME      BYTES       //总的表空间大小
------------------------------ ----------
CARLA       100
USERS 5
UNDOTBS1       110
SYSAUX       620
SYSTEM       720
EXAMPLE    345.625

6 rows selected.

SQL> select  tablespace_name ,sum(bytes/1024/1024) bytes from dba_free_space group by tablespace_name;    //空闲表空间的大小

TABLESPACE_NAME      BYTES
------------------------------ ----------
SYSAUX    39.875
UNDOTBS1    88.625
USERS     .5625
SYSTEM    2.5625
EXAMPLE       35.5
CARLA   98.9375

6 rows selected.

SQL> 



表空间的使用百分比
 

SQL> select a.tablespace_name,((total-free)/total)*100||'%' 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; 

TABLESPACE_NAME         ((TOTAL-FREE)/TOTAL)*100||'%'
------------------------------ -----------------------------------------
SYSAUX        93.5987903225806451612903225806451612903%
UNDOTBS1        18.125%
USERS        88.75%
SYSTEM        99.6440972222222222222222222222222222222%
EXAMPLE         89.7287522603978300180831826401446654611%
CARLA        1.0625%

6 rows selected.




1.将表空间置为自动增长(推荐使用)
>>>select tablespace_name, autoextensible from dba_data_files; //查看是否为自动增长
>>>alter database datafile '/' autoextend on;

SQL> select tablespace_name,autoextensible from dba_data_files;

TABLESPACE_NAME         AUT
------------------------------ ---
CARLA        YES
USERS        YES
UNDOTBS1        YES
SYSAUX        YES
SYSTEM        YES
EXAMPLE         YES

6 rows selected.



2.重置表空间的大小或数据文件大小

>>>alter database datafile '/' resize 200m; //业务空闲时才建议使用

3.表空间下增加数据文件(推荐使用)
alter tablespace carla add datafile '/*..*/carla02.dbf' size 100m;

SQL> alter tablespace carla add datafile '/opt/u01/oracle/oradata/maxdb/carla02.dbf' size 100m;

SQL>  select file#,ts#,name,status from v$datafile;

     FILE#   TS# NAME     STATUS
---------- ---------- --------------------------------------------- -------
 1     0 /opt/u01/oracle/oradata/maxdb/system01.dbf    SYSTEM
 2     1 /opt/u01/oracle/oradata/maxdb/sysaux01.dbf    ONLINE
 3     2 /opt/u01/oracle/oradata/maxdb/undotbs01.dbf   ONLINE
 4     4 /opt/u01/oracle/oradata/maxdb/users01.dbf     ONLINE
 5     6 /opt/u01/oracle/oradata/maxdb/example01.dbf   ONLINE
 6     7 /opt/u01/oracle/oradata/maxdb/carla01.dbf     ONLINE
 7     7 /opt/u01/oracle/oradata/maxdb/carla02.dbf     ONLINE

7 rows selected.

SQL> select tablespace_name ,autoextensible from dba_data_files;

TABLESPACE_NAME         AUT
------------------------------ ---
CARLA        YES
CARLA        YES
USERS        YES
UNDOTBS1        YES
SYSAUX        YES
SYSTEM        YES
EXAMPLE         YES

7 rows selected.

SQL> 


d.表空间的删除

表空间没有对象时
drop tablespace <>;
表空间有对象时,连同对象一起删除
drop tablespace <> including contents;
删除表空间的同时,将物理上的数据文件一并删除
drop tablespace <> including contents and datafiles;

system/sysaux/undo/temp不可以删除,默认表空间不可以删除
e.表空间相关视图的查询
dba_tablespaces
dba_data_files
dba_free_space
v$tablespace
 

回退/undo表空间

SQL> show parameter undo_

NAME      TYPE  VALUE
------------------------------------ ----------- ------------------------------
undo_management       string  AUTO                             //默认为自动管理
undo_retention      integer  900
undo_tablespace       string  UNDOTBS1
SQL> 


1、作用
回退操作------rollback
闪回操作------commit
一致性----------
2、undo表空间出现问题时,才需要创建undo表空间
create undo tablespace <> datafile '/' size <> autoextendon [segment management <> extent management <> |uniform size <>];
当前系统使用的undo表空间是哪一个,大小,管理方式

SQL> show parameter undo_

NAME				     TYPE	 VALUE
------------------------------------ ----------- ------------------------------
undo_management 		     string	 AUTO                             //默认为自动管理
undo_retention			     integer	 900
undo_tablespace 		     string	 UNDOTBS1
SQL> 

3.undo的管理
undo_management : 10g后两种都有
rollback segment : 9i时,只有这个 10也有
aum:auto undo mangement 自动管理会使用undo表空间
mum:manual undo management 手动管理
11g 当undo设置为手动管理(manual)后,
普通用户不能做dml操作,
sys用户可以做dml操作,sys用户使用的系统回退段,放在system表空间里
auto ----普通用户亦能做dml操作
undo表空间是用来给普通用户用的

undo表空间分为10个段
undo_retention :undo段中的信息保留时间,默认为900s ,并不准确,跟事务的大小有关。

SQL> select bytes/1024/1024 bytes from dba_data_files where tablespace_name='UNDOTBS1';

     BYTES
----------
       110                                  //默认大小为100m,是自动增长的
       
SQL> select  tablespace_name,segment_name from dba_rollback_segs;  //查看undo的段

TABLESPACE_NAME         SEGMENT_NAME
------------------------------ ------------------------------
SYSTEM        SYSTEM                                          
UNDOTBS1        _SYSSMU10_3271578125$
UNDOTBS1        _SYSSMU9_3945653786$
UNDOTBS1        _SYSSMU8_3612859353$
UNDOTBS1        _SYSSMU7_4222772309$
UNDOTBS1        _SYSSMU6_3654194381$
UNDOTBS1        _SYSSMU5_4011504098$
UNDOTBS1        _SYSSMU4_1126976075$
UNDOTBS1        _SYSSMU3_4004931649$
UNDOTBS1        _SYSSMU2_111974964$
UNDOTBS1        _SYSSMU1_1240252155$

11 rows selected.

SQL> select  tablespace_name,segment_name ,status from dba_rollback_segs;


TABLESPACE_NAME         SEGMENT_NAME       STATUS
------------------------------ ------------------------------ ----------------
SYSTEM        SYSTEM       ONLINE   //留给sys用户做dml操作的,online表示正在使用
UNDOTBS1        _SYSSMU10_3271578125$       ONLINE
UNDOTBS1        _SYSSMU9_3945653786$       ONLINE
UNDOTBS1        _SYSSMU8_3612859353$       ONLINE
UNDOTBS1        _SYSSMU7_4222772309$       ONLINE
UNDOTBS1        _SYSSMU6_3654194381$       ONLINE
UNDOTBS1        _SYSSMU5_4011504098$       ONLINE
UNDOTBS1        _SYSSMU4_1126976075$       ONLINE
UNDOTBS1        _SYSSMU3_4004931649$       ONLINE
UNDOTBS1        _SYSSMU2_111974964$       ONLINE
UNDOTBS1        _SYSSMU1_1240252155$       ONLINE

11 rows selected.



alter system set undo_tablespace=undotbs2 ;// 可以将我们的undo表空间进行切换

4.undo表空间数据文件丢失,或者undo表空间损坏,都需要将undo表空间删除
未使用的undo表空间可以直接删除
drop tablespace undotbs1

正在使用的表空间:
alter system set undo_management=manual scope=spfile ;//将自动管理改为手动管理,undo表空间就不会被使用了
然后重启,就可以删除undo表空间了
drop tablespace undotbs1 including contents and datafiles; //将数据文件一起删除
再重新建回去

>>create undo tablespace undotbs1 datafile '/*..*/undotbs1' size 100m autoextend on;

如果undo表空间的数据文件被删除了,然后立马关机,且有dml操作
1.shutdown immediate|abort
2. 我们启动到startup nomount 阶段,修改我们的undo管理 management=manual
alter system set undo_management=manual scope=spfile;

3.重启数据库
shutdown immediate
startup mount
4.然后在
select file#,name from v$datafile; //找到我们的数据文件是几号文件
alter database datafile 3 offline drop ; //将我们的undo表空间的数据文件离线,并标记为删除
5.打开数据库
alter database open;
6.删除undo表空间
drop tablespace undotbs1;

7.新建一个undo并设为默认的
create undo tablespace undotbs2 datafile '/' size <> autoextend on;
alter system set undo_management=auto scope=spfile;
alter system set undo_tablespace=undotbs2 scope=spfile;

8.重启并打开数据库
shutdown immediate
startup


如果第六步删除不成功
7.create pfile='/tmp/a.ora' from spfile;
8.加隐藏参数过滤掉活动的undo段
select segment_name from dba_rollback_segs where tablespace_name='UNDOTBS1';
 

desc x$ksppi // 查找隐藏参数


SQL> desc x$ksppi 
 Name    Null?    Type
 ----------------------------------------- -------- ----------------------------
 ADDR     RAW(8)
 INDX     NUMBER
 INST_ID     NUMBER
 KSPPINM     VARCHAR2(80)
 KSPPITY     NUMBER
 KSPPDESC     VARCHAR2(255)
 KSPPIFLG     NUMBER
 KSPPILRMFLG     NUMBER
 KSPPIHASH     NUMBER


SQL> select ksppinm from x$ksppi where ksppinm like '%segment%';

KSPPINM
--------------------------------------------------------------------------------
transactions_per_rollback_segment
rollback_segments
_rollback_segment_initial
_rollback_segment_count
_offline_rollback_segments 
_corrupted_rollback_segments                              //这个字段是我们需要隐藏的
_max_fsu_segments
_use_nosegment_indexes
_force_tmp_segment_loads
deferred_segment_creation

10 rows selected.

SQL> 


vim /tmp/a.ora
_corrupted_rollback_segments=('',''...)
9.使用pfile启动数据库
startup pfile='/tmp/a.ora';
10.删除undotbs1并重新创建一个undo设为默认的
drop tablespace undotbs1 including contents and datafiles;
create undo tablespace undotbs2 datafile '/' size <> autoextend on;
alter system set undo_management=auto scope=spfile;
alter system set undo_tablespace=undotbs2 scope=spfile;

11.重启并打开数据库
shutdown immediate
startup

如果第六步不删除不成功


5.undo扩容
a.将undo表空间下数据文件改为autoextend on;
alter database datafile '/' autoextend on;
b.将undo表空间下的数据文件大小重新设置resize
alter database datafile ‘/’ resize <>;
c.给undo表空间增减数据文件

alter tablespace <> add datafile '/' size <>;

 

temp 临时表空间

 


1.临时表空间的作用
存放用户临时数据
排序操作内存不够用时,会使用临时表空间排序
2.临时表空间的创建语法
当临时表空间出问题时才需要创建

create temporary tablespace <> tempfile '/' size <> [segment mamangement<auto|manual|local> |extent management<> uniform size<> ];

>>select tablespace_name,contents from dba_tablespace;
SQL> select property_name,property_value from database_properties where property_name like 'DEF%'; //
>>>select tablespace_name,bytes,file_name from dba_tmp_files //查看临时表空间
3.临时表空间管理
主要是临时表空间的扩容
a.自动增长
b.修改临时表空间的数据文件大小
c.增加临时表空间的数据文件

4.临时表空间丢失处理
a.11g---将数据库重启,即可自动创建回临时表空间数据文件
b.重新创建临时表空间,并设置新的为默认,在删除之前的就可以了
create temporary tablespace <> tempfile '/' size <>
alter database default temporary tablespace tmp1; //切换临时表空间
5.临时表空间视图
dba_temp_files
v$datafile

 

数据库由多个表空间构成,一个表空间有多个段,一个段有多个区,一个区有多个数据块

 二、段
1.
段的分类:
表段:用户创建表时,自动分配的段,存放表的数据
索引段:存放索引数据
临时段:存放临时数据
undo段:默认分配10个段




段的管理

1. 字典管理:(淘汰)
每做一次操作,需要更新字典,导致字典忙碌,数据库性能差,utl字典,fre字典
2.本地管理:段的前三个数据块以位图方式存放(存放指针),数据库性能影响降到最低;

 

表段



10g只要创建一个对象,立马分派给对象段
11g创建一个对象,不会立马分配段,插入数据后,才会给对象分配段
desc user_segments; //查看段的信息
>>>select segment_name,segment_type from user_segments;

>>>create table tc(id number primary key,loc clob); //primary 会自动创建索引,所以,会创建一个表段,一个索引段,然后根据(loc clob)会创建一个索引段,一个大对象的的数据段

段由连续的区构成,区只有大小没有名字
desc user_extents; //查看段下有几个区,默认为一个段分配一个区,只有当段放不下后才会又给他分配新的区。
select segment_name,extent_id from user_extents ;// 0表示分配了一个区
select segement_name,extents from user_segments;

一个区默认为64K,一个区有8个数据块,一个数据块的大小默认是8K,也可设置为2k,4k,16K,32K...
将区设置为自动管理,可以有效利用空间
根据数据的大小,数据越多,到17个区的时候,分配的是128个区,到第97个区的时候,会分配1024个块
select segment_name,extents,blocks from user_segments;
show parameter db_block_size; //查看默认数据块的大小
show parameter db_ ;
对于linux系统我们一般设置为4K以上,windows系统我们一般设置为2K

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!