數據文件管理
存儲結構與數據文件linux
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
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 <>;
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