Oracle數據庫的表空間管理可以說是非常簡單和基礎的一項維護工作,但是越簡單的事情就越要制定統一的規范,這樣數據庫的各項管理工作才會愈加的簡單高效。
那么接下來,問題來了..
Q1:當我們接手一個新項目,有哪些規范可以參考?
- 1. 查詢表空間使用率
- 2. 查詢當前連接用戶用到了哪些表空間
- 3. 查詢數據表空間中是否錯誤的存放了索引
- 4. 查詢拼接出刪除歷史分區表的執行SQL
- 5. 查詢某表空間中的段所屬用戶、段名、段類型
- 6. 查詢表空間中數據文件的當前大小(MB),最大大小(GB),是否自動擴展
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;