ORACLE體系結構--數據文件管理

數據文件管理

存儲結構與數據文件linux


一、存儲結構:
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 ; //操做會出錯
 vim

一.永久表空間:


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; //查看錶空間的大小和路徑
 windows

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 爲默認的表空間 ,默認使用的永久表空間爲usersoracle

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.表空間的管理
永久表空間:
修改spa

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號和其餘一致code

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>


一、做用
回退操做------rollback
閃回操做------commit
一致性----------
二、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

 

數據庫由多個表空間構成,一個表空間有多個段,一個段有多個區,一個區有多個數據塊

 2、段
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

相關文章
相關標籤/搜索