数据文件管理
存储结构与数据文件
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
来源:oschina
链接:https://my.oschina.net/u/2918364/blog/801586