Oracle架構設計01:表空間的管理維護規范


Oracle數據庫的表空間管理可以說是非常簡單和基礎的一項維護工作,但是越簡單的事情就越要制定統一的規范,這樣數據庫的各項管理工作才會愈加的簡單高效。

那么接下來,問題來了..
Q1:當我們接手一個新項目,有哪些規范可以參考?

Q2:當我們維護的是一個歷史項目,有哪些需要去檢查記錄?

Q1:當我們接手一個新項目,有哪些規范可以參考?

可以從以下幾方面來考慮:

1. 不要試圖使用任何系統自帶的表空間作為你的業務表空間。

包括system,sysaux,undo,users等,這是約定俗成的標准規范。

2. 數據表空間和索引表空間分開管理。

比如DBS_D_JINGYU存放數據,那么同時定義DBS_I_JINGYU存放對應表的索引。

3. 不同業務用戶的表空間區分開,相同業務用戶不同類數據的表空間區分開。

### 情景1:如果一個庫中有多個業務,分別對應不同的業務用戶,那么可以根據用戶划分 ### 例如:現在有2個業務用戶jingyu, ludan; 那么設計為表空間DBS_D_JINGYU存放jingyu業務用戶的數據,表空間DBS_D_LUDAN存放luduan業務用戶的數據。 ``` create tablespace DBS_D_JINGYU; create tablespace DBS_D_LUDAN;

create user jingyu identified by jingyu default tablespace DBS_D_JINGYU;
create user ludan identified by ludan default tablespace DBS_D_LUDAN;

grant resource, connect to jingyu, ludan;

### 情景2:如果只有一個業務用戶,但業務很復雜,有不同種類的數據,則可以根據數據的種類不同划分對應的表空間。 ###
比如jingyu用戶,對應默認的表空間是DBS_D_JINGYU。
另外建立幾個表空間存放其他明確划分的數據。
DBS_D_CONFIG 存jingyu用戶下的配置數據。
DBS_D_FACT 存jingyu用戶下實際產生的業務數據。
### 小結: ###
這里的情景舉例只是提供了一個思路或者說形成規范的意識。
其實實際生產中本身並沒有一個通用的規范,例如:
如果實際業務量很小,數據量很小,可能就沒必要分這么細致;
如果數據量很大,可能存放業務數據的部分還要根據實際業務划分的更細致;
如果業務用戶非常多,但各自的數據量都很少,也沒必要為每個用戶都分配獨立的表空間。

順便提一句,底層存儲方面現在建議直接使用Oracle ASM技術,條帶化減少I/O爭用和熱塊問題。
同時使用OMF可以使創建表空間變的非常簡單,如上面的例子中創建表空間不再需要手工指定datafile和數據文件大小。
但**實際項目中為了避免自動擴展造成的空間管理過分配問題**,一般不設置自動擴展,即指定固定大小並關閉自動擴展。如下例:

假設ASM磁盤組為DATA;

創建新的表空間DBS_D_JINGYU的語句:

create tablespace DBS_D_JINGYU datafile '+DATA' size 30G autoextend off;

為表空間DBS_D_JINGYU增加一個新的30G數據文件的語句:

alter tablespace DBS_D_JINGYU add datafile '+DATA' size 30G autoextend off;

查詢DATA的空間使用情況:

select name, total_mb, free_mb, USABLE_FILE_MB from v$asm_diskgroup where name='DATA';


<h1 id="2">Q2:當我們維護的是一個歷史項目,有哪些需要去檢查記錄?</h1>
<h2 id="2.1">1. 查詢表空間使用率</h2>
[【轉載】Oracle 查看表空間使用率SQL腳本](http://www.cnblogs.com/jyzhao/articles/3766757.html)
<h2 id="2.2">2. 查詢當前連接用戶用到了哪些表空間</h2>

select tablespace_name from user_tables union
select tablespace_name from user_tab_partitions union
select tablespace_name from user_indexes union
select tablespace_name from user_ind_partitions;

<h2 id="2.3">3. 查詢數據表空間中是否錯誤的存放了索引</h2>

select owner, segment_name, segment_type, sum(bytes)/1024/1024
   from dba_segments
 where tablespace_name = 'DBS_D_JINGYU'
 group by owner, segment_name, segment_type
 having segment_type in ('INDEX PARTITION','INDEX')
 order by 4 desc

<h2 id="2.4">4. 查詢拼接出刪除歷史分區表的執行SQL</h2>

select c.table_name,
c.tablespace_name,
c.partition_name,
'alter table ' || c.table_name || ' drop partition ' ||
c.partition_name || ';'
from user_tab_partitions c
where c.partition_name like '%'
and c.tablespace_name = 'DBS_D_JINGYU'
order by c.table_name, c.partition_position;

注:partition_name的過濾條件自己加上。 
<h2 id="2.5">5. 查詢某表空間中的段所屬用戶、段名、段類型</h2>

select owner, segment_name, segment_type, sum(bytes)/1024/1024
  from dba_segments
 where tablespace_name = 'DBS_D_JINGYU'
 group by owner, segment_name, segment_type
 order by 4 desc

<h2 id="2.6">6. 查詢表空間中數據文件的當前大小(MB),最大大小(GB),是否自動擴展</h2>

set linesize 200
col file_name for a66
select FILE_ID, FILE_NAME, TABLESPACE_NAME, BYTES/1024/1024 "MB", MAXBYTES/1024/1024/1024 "GB", AUTOEXTENSIBLE, STATUS, ONLINE_STATUS from dba_data_files;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM