oracle 日常維護工作內容oracle 日常維護工作內容
ORACLE數據庫管理員應按如下方式對ORACLE數據庫系統做定期監控:
(1). 每天對ORACLE數據庫的運行狀態,日志文件,備份情況,數據庫的空間使用情況,系統資源的使用情況進行檢查,發現並解決問題。
(2). 每周對數據庫對象的空間擴展情況,數據的增長情況進行監控,對數據庫做健康檢查,對數據庫對象的狀態做檢查。
(3). 檢查表空間碎片,提出下一步空間管理計划。對ORACLE數據庫狀態進行一次全面檢查。
====================
★每天的工作★
====================
(1).確認所有的INSTANCE狀態正常.登陸到所有數據庫或例程,檢測ORACLE后台進程:
$ps –-ef|grep ora
(2). 檢查文件系統的使用(剩余空間)。如果文件系統的剩余空間小於20%,需刪除不用的文件以釋放空間。
對於太平洋業務交易生產系統,要特別關注: /u01 和 數據庫日志歸檔目錄,當空間不足,請急時清理.
$df -k
$df -h
(3). 檢查日志文件和trace文件記錄alert和trace文件中的錯誤.連接到每個需管理的系統
※ 使用’telnet’
※ 對每個數據庫,cd 到bdump目錄,通常是$ORACLE_BASE/admin/<SID>/bdump
※ 使用 Unix ‘tail’命令來查看alert_<SID>.log文件
※ 如果發現任何新的ORA- 錯誤,記錄並解決
(4). 檢查數據文件的狀態記錄狀態不是“online”的數據文件,並做恢復。
Select file_name from dba_data_files where status=’OFFLINE’
(5). 檢查表空間的使用情況
--如果有表空間大於90%的就應該在當天清算前,增大該表空間,但對於(temp,undo)表空間除外,
--重點關注HS_HIS_data 和 HS_HIS_IDX 這兩個表空間.
SELECT d.tablespace_name, SPACE "SUM_SPACE(M)", blocks sum_blocks,
SPACE - NVL (free_space, 0) "USED_SPACE(M)",
ROUND ((1 - NVL (free_space, 0) / SPACE) * 100, 2) "USED_RATE(%)",
free_space "FREE_SPACE(M)"
FROM (SELECT tablespace_name, ROUND (SUM (BYTES) / (1024 * 1024),
2) SPACE, SUM (blocks) blocks
FROM dba_data_files
GROUP BY tablespace_name) d,
(SELECT tablespace_name,
ROUND (SUM (BYTES) / (1024 * 1024), 2) free_space
FROM dba_free_space
GROUP BY tablespace_name) f
WHERE d.tablespace_name = f.tablespace_name( )
UNION ALL --if have tempfile
SELECT d.tablespace_name, SPACE "SUM_SPACE(M)", blocks sum_blocks,
used_space "USED_SPACE(M)",
ROUND (NVL (used_space, 0) / SPACE * 100, 2) "USED_RATE(%)",
NVL (free_space, 0) "FREE_SPACE(M)"
FROM (SELECT tablespace_name, ROUND (SUM (BYTES) / (1024 * 1024),
2) SPACE, SUM (blocks) blocks
FROM dba_temp_files
GROUP BY tablespace_name) d,
(SELECT tablespace_name,
ROUND (SUM (bytes_used) / (1024 * 1024), 2) used_space,
ROUND (SUM (bytes_free) / (1024 * 1024), 2) free_space
FROM v$temp_space_header
GROUP BY tablespace_name) f
WHERE d.tablespace_name = f.tablespace_name( );
(6). 檢查剩余表空間
/* Formatted on 2007/03/01 15:56 (Formatter Plus v4.8.7) */
SELECT tablespace_name, SUM (blocks) AS free_blk,
TRUNC (SUM (BYTES) / (1024 * 1024)) AS free_m,
MAX (BYTES) / (1024) AS big_chunk_k, COUNT (*) AS num_chunks
FROM dba_free_space
GROUP BY tablespace_name;
(7). 監控數據庫性能運行AWR生成系統報告或者使用statspack收集統計數據
※注意:TOP-5事件
(8). 檢查數據庫性能,記錄數據庫的cpu使用、IO、buffer命中率等等
使用vmstat,iostat,glance,top等命令
(9). 日常出現問題的處理。
====================
★每周的工作★
====================
(1). 監控數據庫對象的空間擴展情況
根據本周每天的檢查情況找到空間擴展很快的數據庫對象,並采取相應的措施
--- 重點關注HS_HIS_data 和 HS_HIS_IDX 這兩個表空間
--- 刪除歷史數據
--- 擴表空間
alter tablespace <name> add datafile ‘<file>’ size <size>;
EXTENT MANAGEMENT LOCAL
SEGMENT SPACE MANAGEMENT AUTO;
(2). 監控數據量的增長情況
根據本周每天的檢查情況找到記錄數量增長很快的數據庫對象,並采取相應的措施
--- 重點關注HS_HIS_data 和 HS_HIS_IDX 這兩個表空間
--- 刪除歷史數據
--- 擴表空間
alter tablespace <name> add datafile ‘<file>’ size <size>;
EXTENT MANAGEMENT LOCAL
SEGMENT SPACE MANAGEMENT AUTO;
(3). 系統健康檢查
檢查以下內容:
init<sid>.ora
controlfile
redo log file
archiving
sort area size
tablespace(system,temporary,tablespace fragment)
datafiles(online/offline)
object(number of extent,next extent,index)
rollback segment
logging &tracing(alert.log,max_dump_file_size,sqlnet)
(4). 檢查無效的數據庫對象
/* Formatted on 2007/03/01 16:04 (Formatter Plus v4.8.7) */
--look over invalid objects
SELECT owner, object_name, object_type
FROM dba_objects
WHERE status = 'invalid';
(5). 檢查不起作用的約束
/* Formatted on 2007/03/01 16:07 (Formatter Plus v4.8.7) */
SELECT owner, constraint_name, table_name, constraint_type, status
FROM dba_constraints
WHERE status = 'DISABLED' AND constraint_type = 'P' ;
(6). 檢查無效的trigger
/* Formatted on 2007/03/01 16:08 (Formatter Plus v4.8.7) */
--look over triggers state
SELECT owner, trigger_name, table_name, status
FROM dba_triggers
WHERE status = 'DISABLED';
====================
★每月的工作★
====================
(1). 檢查表空間碎片
根據本月每周的檢查分析數據庫碎片情況,找到相應的解決方法
(2). 尋找數據庫性能調整的機會
比較每天對數據庫性能的監控報告,確定是否有必要對數據庫性能進行調整
(3). 數據庫性能調整
如有必要,進行性能調整
(4). 提出下一步空間管理計划
根據每周的監控,提出空間管理的改進方法
======================================
======================================
|| ★★★Oracle DBA 日常管理★★★ ||
======================================
======================================
目的:這篇文檔有很詳細的資料記錄着對一個甚至更多的ORACLE 數據庫每天的,每月的,每年的運行的狀態的結果及檢查的結果,在文檔的附錄中你將會看到所有檢查,修改的SQL和PL/SQL 代碼。
-------------
★目錄 ★
-------------
1.日常維護程序
A. 檢查已起的所有實例
B. 查找一些新的警告日志
C. 檢查DBSNMP 是否在運行
D. 檢查數據庫備份是否正確
E. 檢查備份到磁帶中的文件是否正確
F. 檢查數據庫的性能是否正常合理,是否有足夠的空間和資源
G. 將文檔日志復制到備份的數據庫中
H. 要常看DBA 用戶手冊
2.晚間維護程序
A.收集VOLUMETRIC 的數據
3.每周維護工作
A. 查找那些破壞規則的OBJECT
B. 查找是否有違反安全策略的問題
C. 查看錯誤地方的SQL*NET 日志
D. 將所有的警告日志存檔
E. 經常訪問供應商的主頁
4.月維護程序
A. 查看對數據庫會產生危害的增長速度
B. 回顧以前數據庫優化性能的調整
C. 查看I/O 的屏頸問題
D. 回顧FRAGMENTATION
E. 將來的執行計划
F. 查看調整點和維護
5.附錄
A. 月維護過程
B. 晚間維護過程
C. 周維護過程
6.參考文獻
---------------------------------------------------------------
==================
★一.日維護過程★
==================
A.查看所有的實例是否已起
確定數據庫是可用的,把每個實例寫入日志並且運行日報告或是運行測試文件。當然有一些操作我們是希望它能自動運行的。
可選擇執行:用ORACLE 管理器中的‘PROBE’事件來查看
B.查找新的警告日志文件
1). 聯接每一個操作管理系統
2). 使用‘TELNET’或是可比較程序
3). 對每一個管理實例,經常的執行$ORACLE_BASE/<SID>/bdump 操作,並使其能回退到控制數據庫的SID。
4). 在提示下,使用UNIX 中的‘TAIL’命令查看alert_<SID>.log,或是用其他方式檢查文件中最近時期的警告日志
5). 如果以前出現過的一些ORA_ERRORS 又出現,將它記錄到數據庫恢復日志中並且仔細的研究它們,這個數據庫恢復日志在〈FILE〉中
C.查看DBSNMP 的運行情況
檢查每個被管理機器的‘DBSNMP’進程並將它們記錄到日志中。
在UNIX 中,在命令行中,鍵入ps –ef | grep dbsnmp,將回看到2個DBSNMP 進程在運行。如果沒有,重啟DBSNMP。
D.查數據庫備份是否成功
E.檢查備份的磁帶文檔是否成功
F.檢查對合理的性能來說是否有足夠的資源
1). 檢查在表空間中有沒有剩余空間。
對每一個實例來說,檢查在表空間中是否存在有剩余空間來滿足當天的預期的需要。當數據庫中已有的數據是穩定的,數據日增長的平均
數也是可以計算出來,最小的剩余空間至少要能滿足每天數據的增長。
A) 運行‘FREE.SQL’來檢查表空間的剩余空間。
B) 運行‘SPACE.SQL’來檢查表空間中的剩余空間百分率
2). 檢查回滾段
回滾段的狀態一般是在線的,除了一些為復雜工作准備的專用 段,它一般狀態是離線的。
a) 每個數據庫都有一個回滾段名字的列表。
b) 你可以用V$ROLLSTAT 來查詢在線或是離線的回滾段的現在狀 態.
c) 對於所有回滾段的存儲參數及名字, 可用DBA_ROLLBACK_SEGS 來查詢。但是它不如V$ROLLSTAT 准確。
3). 識別出一些過分的增長
查看數據庫中超出資源或是增長速度過大的段,這些段的存儲參 數需要調整。
a) 收集日數據大小的信息, 可以用‘ANALYZE5PCT.SQL’。如果你收集的是每晚的信息, 則可跳過這一步。
b) 檢查當前的范圍,可用‘NR.EXTENTS.SQL’。
c) 查詢當前表的大小信息。
d) 查詢當前索引大小的信息。
e) 查詢增長趨勢。
4). 確定空間的范圍。
如果范圍空間對象的NEXT_EXTENT 比表空間所能提供的最大范圍還要大,那么這將影響數據庫的運行。如果我們找到了這個目標,可以用‘ALTER TABLESPACE COALESCE’調查它的位置,或加另外 的數據文件。
A)運行‘SPACEBOUND.SQL’。如果都是正常的,將不返回任何行。
5). 回顧CPU,內存,網絡,硬件資源論點的過程
A)檢查CPU的利用情況,進到x:.htm =>system
metrics=>CPU 利用頁,CPU 的最大限度為400,當CPU 的占用保持在350 以上有一段時間的話,我們就需要查看及研究出現的問題。
G.將存檔日志復制到備用數據庫中如果有一個備用數據庫,將適當的存檔日志復制到備用數據庫的期望位置,備用數據庫中保存最近期的數據。
H. 經常查閱DBA 用戶手冊
如果有可能的話,要廣泛的閱讀,包括DBA 手冊,行業雜志,新聞 組或是郵件列表。
-------------------------------------------------------------
====================
★二.晚間維護過程★
====================
大部分的數據庫產品將受益於每晚確定的檢查進程的運行。
A. 收集VOLUMETRIC 數據
1. 分析計划和收集數據更准確的分析計算並保存結果。
a) 如果你現在沒有作這些的話,用‘MK VOLFACT.SQL’來創建測定體積的表。
b) 收集晚間數據大小的信息,用‘ANALYZE COMP.SQL’。
c) 收集統計結果,用‘POP VOL.SQL’。
d) 在空閑的時候檢查數據,可能的話,每周或每個月進行。
我是用MS EXCEL 和ODBC 的聯接來檢查數據和圖表的增長
-------------------------------------------------------------
====================
★三.每周維護過程★
====================
★A. 查找被破壞的目標
1. 對於每個給定表空間的對象來說,NEXT_EXTENT 的大小是相同的,如12/14/98,缺省的NEXT_EXTENT 的DATAHI 為1G,DATALO 為500MB,
INDEXES 為256MB。
A) 檢查NEXT_EXTENT 的設置,可用‘NEXTEXT.SQL’。
B) 檢查已有的EXTENTS,可用‘EXISTEXT.SQL’。
2. 所有的表都應該有唯一的主鍵
a) 查看那些表沒有主鍵,可用‘NO_PK.SQL’。
b) 查找那些主鍵是沒有發揮作用的,可用‘DIS_PK.SQL’。
c) 所有作索引的主鍵都要是唯一的,可用‘ NONUPK.SQL’來檢 查。
3. 所有的索引都要放到索引表空間中。運行‘MKREBUILD_IDX.SQL’
4. 不同的環境之間的計划應該是同樣的,特別是測試環境和成品環境之間的 計划應該相同。
a) 檢查不同的2 個運行環境中的數據類型是否一致,可用‘DATATYPE.SQL’。
b) 在2 個不同的實例中尋找對象的不同點, 可用‘OBJ_COORD.SQL’。
c) 更好的做法是,使用一種工具,象尋求軟件的計划管理器那樣的 工具。
★B. 查看是否有危害到安全策略的問題。
★C. 查看報錯的SQL*NET 日志。
1. 客戶端的日志。
2. 服務器端的日志。
★D.將所有的警告日志存檔
★E.供應商的主頁
====================
1. ORACLE 供應商
http://www.oracle.com/
http://technet.oracle.com/
http://www.oracle.com/support
http://www.oramag.com/
2. Quest Software
http://www.quests.com/
3. Sun Microsystems
http://www.sun.com/
=====================
----------------------------------------------------------------
==================
★四.月維護過程★
==================
A.查看對數據庫會產生危害的增長速度
>從以前的記錄或報告中回顧段增長的變化以此來確定段增長帶來危害
B. 回顧以前數據庫優化性能的調整
>回顧一般ORACLE 數據庫的調整點,比較以前的報告來確定有害的發展趨勢。
C. 查看I/O 的屏頸問題
1. 查看前期數據庫文件的活動性,比較以前的輸出來判斷有可能導致屏頸問題的趨勢。
D. 回顧FRAGMENTATION
E. 計划數據庫將來的性能
>比較ORACLE 和操作系統的CPU,內存,網絡,及硬盤的利用率以此來確定在近期將會有的一些資源爭奪的趨勢
>當系統將超出范圍時要把性能趨勢當作服務水平的協議來看
F. 完成調整和維護工作
>使修改滿足避免系統資源的爭奪的需要,這里面包括增加新資源或使預期的停工。
----------------------------------------------------------------
==============
★五.附錄★
==============
===============
★A. 日常程序★
===============
※做好每天的記錄,總結分析表空間的增長幅度※
-★- Free.sql
/* Formatted on 2007/03/06 16:54 (Formatter Plus v4.8.7) */
SELECT tablespace_name, SUM (blocks) AS free_blk,
TRUNC (SUM (BYTES) / (1024 * 1024)) AS free_m,
MAX (BYTES) / (1024) AS big_chunk_k, COUNT (*) AS num_chunks
FROM dba_free_space
GROUP BY tablespace_name
-★- Space.sql
-- To check free, pct_free, and allocated space within a tablespace
/* Formatted on 2007/03/06 16:58 (Formatter Plus v4.8.7) */
SELECT tablespace_name, largest_free_chunk, nr_free_chunks, sum_alloc_blocks,
sum_free_blocks,
TO_CHAR (100 * sum_free_blocks / sum_alloc_blocks,
'09.99'
)
|| '%' AS pct_free
FROM (SELECT tablespace_name, SUM (blocks) AS sum_alloc_blocks
FROM dba_data_files
GROUP BY tablespace_name),
(SELECT tablespace_name AS fs_ts_name,
MAX (blocks) AS largest_free_chunk,
COUNT (blocks) AS nr_free_chunks,
SUM (blocks) AS sum_free_blocks
FROM dba_free_space
GROUP BY tablespace_name)
WHERE tablespace_name = fs_ts_name
-★- analyze5pct.sql
--To analyze tables and indexes quickly, using a 5% sample size
--(do not use this script if you are performing the overnight collection of volumetric data)
BEGIN
dbms_utility.analyze_schema ( '&OWNER', 'ESTIMATE', NULL, 5 ) ;
END ;
/
-★- nr_extents.sql
-- To find out any object reaching <threshold>;
-- extents, and manually upgrade it to allow unlimited max_extents (thus only objects we *expect* to be big are allowed to become big)
/* Formatted on 2007/03/06 17:25 (Formatter Plus v4.8.7) */
SELECT e.owner, e.segment_type, e.segment_name, COUNT (*) AS nr_extents,
s.max_extents,
TO_CHAR (SUM (e.BYTES) / (1024 * 1024), '999,999.90') AS mb
FROM dba_extents e, dba_segments s
WHERE e.segment_name = s.segment_name
GROUP BY e.owner, e.segment_type, e.segment_name, s.max_extents
HAVING COUNT (*) > &threshold
OR ((s.max_extents - COUNT (*)) < &&threshold)
ORDER BY COUNT (*) DESC
-★- spacebound.sql
-- To identify space-bound objects. If all is well, no rows are returned.
-- If any space-bound objects are found, look at value of NEXT extent size to figure out what happened.
-- Then use coalesce (alter tablespace <foo>; coalesce .
-- Lastly, add another datafile to the tablespace if needed.
/* Formatted on 2007/03/06 17:26 (Formatter Plus v4.8.7) */
SELECT a.table_name, a.next_extent, a.tablespace_name
FROM all_tables a,
(SELECT tablespace_name, MAX (BYTES) AS big_chunk
FROM dba_free_space
GROUP BY tablespace_name) f
WHERE f.tablespace_name = a.tablespace_name AND a.next_extent > f.big_chunk
===================
★B. 每晚處理程序★
===================
-★- mk_volfact.sql
-- mk_volfact.sql (only run this once to set it up; do not run it nightly!)
-- Table UTL_VOL_FACTS
CREATE TABLE utl_vol_facts (
table_name VARCHAR2(30),
num_rows NUMBER,
meas_dt DATE )
TABLESPACE platab
STORAGE (
INITIAL 128k
NEXT 128k
PCTINCREASE 0
MINEXTENTS 1
MAXEXTENTS unlimited
)
/
-★-Public Synonym
CREATE PUBLIC SYNONYM utl_vol_facts FOR &OWNER..utl_vol_facts
/
-★-Grants for UTL_VOL_FACTS
GRANT SELECT ON utl_vol_facts TO public
/
-★-analyze_comp.sql
BEGIN
sys.dbms_utility.analyze_schema ( '&OWNER','COMPUTE');
END ;
/
-★-pop_vol.sql
/* Formatted on 2007/03/06 17:28 (Formatter Plus v4.8.7) */
INSERT INTO utl_vol_facts
SELECT table_name, NVL (num_rows, 0) AS num_rows,
TRUNC (last_analyzed) AS meas_dt
FROM all_tables -- or just user_tables
WHERE owner IN ('&OWNER'); -- or a comma-separated list of owners
/
commit ;
/
===================
★C. 每周處理程序★
===================
1. nextext.sql
-- To find tables that don't match the tablespace default for NEXT extent.
-- The implicit rule here is that every table in a given tablespace should
-- use the exact same value for NEXT, which should also be the tablespace's
-- default value for NEXT.
-- This tells us what the setting for NEXT is for these objects today.
/* Formatted on 2007/03/06 17:30 (Formatter Plus v4.8.7) */
SELECT segment_name, segment_type, ds.next_extent AS actual_next,
dt.tablespace_name, dt.next_extent AS default_next
FROM dba_tablespaces dt, dba_segments ds
WHERE dt.tablespace_name = ds.tablespace_name
AND dt.next_extent != ds.next_extent
AND ds.owner = UPPER ('&OWNER')
ORDER BY tablespace_name, segment_type, segment_name
2. existext.sql
-- To check existing extents
-- This tells us how many of each object's extents differ in size from the tablespace's default size. If this report shows a lot of different sized extents, your free space is likely to become fragmented. If so,
-- this tablespace is a candidate for reorganizing.
/* Formatted on 2007/03/06 17:31 (Formatter Plus v4.8.7) */
SELECT segment_name, segment_type, COUNT (*) AS nr_exts,
SUM (DECODE (dx.BYTES, dt.next_extent, 0, 1)) AS nr_illsized_exts,
dt.tablespace_name, dt.next_extent AS dflt_ext_size
FROM dba_tablespaces dt, dba_extents dx
WHERE dt.tablespace_name = dx.tablespace_name AND dx.owner = '&OWNER'
GROUP BY segment_name, segment_type, dt.tablespace_name, dt.next_extent;
3. No_pk.sql
-- To find tables without PK constraint
/* Formatted on 2007/03/06 17:31 (Formatter Plus v4.8.7) */
SELECT table_name
FROM all_tables
WHERE owner = '&OWNER'
MINUS
SELECT table_name
FROM all_constraints
WHERE owner = '&&OWNER' AND constraint_type = 'P';
4. disPK.sql
-- To find out which primary keys are disabled
/* Formatted on 2007/03/06 17:32 (Formatter Plus v4.8.7) */
SELECT owner, constraint_name, table_name, status
FROM all_constraints
WHERE owner = '&OWNER' AND status = 'DISABLED' AND constraint_type = 'P'
5. nonuPK.sql
-- To find tables with nonunique PK indexes. Requires that PK names
-- follow a naming convention. An alternative query follows that
-- does not have this requirement, but runs more slowly.
/* Formatted on 2007/03/06 17:33 (Formatter Plus v4.8.7) */
SELECT index_name, table_name, uniqueness
FROM all_indexes
WHERE index_name LIKE '&KNAME%'
AND owner = '&OWNER'
AND uniqueness = 'NONUNIQUE'
UNION
SELECT c.constraint_name, i.tablespace_name, i.uniqueness
FROM all_constraints c, all_indexes i
WHERE c.owner = UPPER ('&OWNER')
AND i.uniqueness = 'NONUNIQUE'
AND c.constraint_type = 'P'
AND i.index_name = c.constraint_name
6. mkrebuild_idx.sql
-- Rebuild indexes to have correct storage parameters
/* Formatted on 2007/03/06 17:33 (Formatter Plus v4.8.7) */
SELECT 'alter index ' || index_name || ' rebuild ',
'tablespace INDEXES storage '
|| ' ( initial 256 K next 256 K pctincrease 0 ) ; '
FROM all_indexes
WHERE (tablespace_name != 'INDEXES' OR next_extent != (256 * 1024))
AND owner = '&OWNER'
/
7. datatype.sql
-- To check datatype consistency between two environments
/* Formatted on 2007/03/06 17:34 (Formatter Plus v4.8.7) */
SELECT table_name, column_name, data_type, data_length, data_precision,
data_scale, nullable
FROM all_tab_columns -- first environment
WHERE owner = '&OWNER'
MINUS
SELECT table_name, column_name, data_type, data_length, data_precision,
data_scale, nullable
FROM [email=all_tab_columns@&my_db_link]all_tab_columns@&my_db_link[/email] -- second environment
WHERE owner = '&OWNER2'
ORDER BY table_name, column_name ;
8. obj_coord.sql
-- To find out any difference in objects between two instances
/* Formatted on 2007/03/06 17:35 (Formatter Plus v4.8.7) */
SELECT object_name, object_type
FROM user_objects
MINUS
SELECT object_name, object_type
FROM [email=user_objects@&my_db_link]user_objects@&my_db_link[/email]