日誌管理

ORACLE入門之ORACLE的日誌管理
 $ORACLE_BASE/admin/orasid/bdump/alert_orasid.log記錄了重作日誌的轉換,數據庫啓動和關閉,數據庫結構的改變,回退段的修改,死鎖,內部錯誤等信息.
   數據庫治理員需要檢查這個文件有無ORA-錯誤並定期地對這個日誌文件進行存檔整理。
   在UNIX下可以用grep命令把alert_orasid.log裏出現的錯誤保存到另一個文件。然後去找原因。
   $grep ORA- alert_orasid.log > error.log
   大家都知道,文件越大,其打開和讀寫的開銷越大。假如日誌文件太大了(超過5M), 需要對它截斷處理。
   直接刪除它,讓ORACLE重新生成不是好的方法。因爲ORACLE是通過一個指向文件的指針進行寫操作。
   在數據庫運行時刪除了這個文件, ORACLE仍然用原來的文件指針進行寫操作,有可能寫一個不存在的文件導致硬盤空間佔用。
   我們要採用以下的方法:
   $tail -100 $ORACLE_BASE/admin/orasid/bdump/alert_orasid.log > /tmp/oracle_temp.log
   $cp /tmp/oracle_temp.log $ORACLE_BASE/admin/orasid/bdump/alert_orasid.log
   $rm /tmp/oracle_temp.log
   對日誌文件進行截斷處理。
   listener的日誌文件$ORACLE_HOME/network/log/listener.log記錄了通過listener處理的網絡請求信息,它包含客戶端請求的時間,連接方式(專用或共享),連接程序,網絡協議,主機名,網絡端口號等信息。
   我們也需要週期地截斷它,方法是先停止listener記日誌的工作:
   $lsnrctl set log_status off
   然後進行文件處理( 把原來的日誌保存到備份文件夾, 使原來的listener.log置空 )
   $cp $ORACLE_HOME/network/log/listener.log $ORACLE_BACKUP/network/log/listener_1.log
   $cp /dev/null $ORACLE_HOME/network/log/listener.log
   文件操作完成後,打開listener記日誌的工作:
   $lsnrctl set log_status on
   假如你會寫簡單的shell程序,可以把上面的步驟固化成一個腳本,定一個時間表, 讓操作系統去做。
   下面是我寫的一個按天分割保存listener.log的文件auto_listener.sh
   rq=` date +"%d" `
   cp $ORACLE_HOME/network/log/listener.log $ORACLE_BACKUP/network/log/listener_$rq.log
   su - oracle -c "lsnrctl set log_status off"
   cp /dev/null $ORACLE_HOME/network/log/listener.log
   su - oracle -c "lsnrctl set log_status on"
 你可以根據自己的情況定義環境變量ORACLE_HOME,ORACLE_BACKUP或者直接改成實際的目錄就可以讓操作系統root用戶23:59分運行這個shell腳本完成日誌文件的分割處理。
 

ORACLE入門之簡析REDO LOGFILE
  我們知道Oracle裏聯機日誌文件(Online redo logfile)循環記錄數據庫所有的事務(transaction)。
   它的大小、個數和存儲位置對數據庫性能和恢復也是有重要影響的。本文總結一下關於redo logfile的一些
   內容。
   一、redo logfile的簡單介紹
   它一般有大小相同的一組文件構成。我們可以查看數據庫視圖v$logfile知道它的個數和存儲位置。
   SVRMGRL> select * from v$logfile;
   查看數據庫視圖v$log知道它當前的狀態。
   SVRMGRL> select * from v$log;
    一個時間只有一組logfile group是工作狀態(current), redo logfile滿了後會自動切換到下一個logfile group, 假如數據庫是歸檔方式同時寫到歸檔日誌文件。這些文件不能用常規的文本編輯器查看, 它以特定的格式存放, 只有數據庫或者專門的軟件可以看懂它。
   redo logfile的最大數目是在創建數據庫時指明的。假如你想知道當前數據庫redo logfile的最大數值
   是多少,重新生成控制文件, 就可以知道。
   SVRMGRL>alter database backup controlfile to trace;
   這條語句會在$ORACLE_BASE/admin/dbname/udump/路徑下生成當前時間的一個*.trc文件, 也就是數據庫的控制文件, 用文本編輯器, 即可看到數據庫創建時用的一些參數, 包括redo logfile的最大數(maxlogfiles)。
    二、 redo logfile的大小和位置對數據庫性能的影響
   假如用ORACLE的安裝嚮導創建的典型數據庫, 它的redo logfile大小爲500K, 這基本上是不能滿足典型的OLTP應用的, 在數據庫日誌文件(alert_orasid.log)裏會記錄着頻繁的log switch。ORACLE推薦log switch時間最好在15--30分鐘之間, 所以redo logfile的大小由數據庫DML操作數據的大小決定其最佳大小。
   redo logfile最好有多個存儲位置, 多組成員, 使數據庫恢復時有更多的選擇。
   典型的OLTP應用,redo logfile大小可以爲16M。當然繁忙的數據庫, 例如當今的門戶網站, 這個值可以達到100M以上.
   假如你發現當前數據庫日誌文件裏log switch的時間偏大或者偏小,不要緊。ORACLE提供了在數據庫聯機狀態來改變redo logfile大小的方法。
    三、在聯機狀態改變redo logfile大小的方法
  假如原來有3個小的redo log file, 下面是UNIX環境下的一個例子:
   第一步: 往數據庫添加三個大的redo logfile
   SVRMGRL>ALTER DATABASE ADD LOGFILE GROUP 4('/opt/oradata/app/redo04.log',
    '/ora_bak/oradata2/redolog/redo04.log') size 16M reuse;
  SVRMGRL>ALTER DATABASE ADD LOGFILE GROUP 5
   ('/opt/oradata/app/redo05.log','/ora_bak/oradata2/redolog/redo05.log') size 16M reuse;
  SVRMGRL>ALTER DATABASE ADD LOGFILE GROUP 6('/opt/oradata/app/redo06.log','/ora_bak/oradata2/redolog/redo06.log') size 16M reuse;
  第二步: 手工地做log switch, 使新建的redo logfile起作用.
   SVRMGRL>alter system switch logfile;
   此操作可以執行一到幾次, 使舊的redo logfile成invalid狀態.
   第三步: 刪除原來舊的redo logfile.
   SVRMGRL>alter database drop logfile group 1;
  SVRMGRL>alter database drop logfile group 2;
  SVRMGRL>alter database drop logfile group 3;
  四、跟redo logfile有關的其它數據庫參數
  1、log_buffer
   log_buffer是ORACLE SGA的一部分, 所有DML命令修改的數據塊先放在log_buffer裏, 假如滿了或者到了check_point時候通過lgwr後臺進程寫到redo logfile裏去。它不能設得太大,這樣在意外發生時會丟失很多改變過的數據。它最好不要大於512K或者128K*CPU個數。
   我們可以用下面的SQL語句檢測log_buffer使用情況:
   SVRMGRL> select rbar.name,rbar.value,re.name,re.value,(rbar.value*100)/re.value'%' "radio"
   from v$sysstat rbar,v$sysstat re
   where rbar.name='redo buffer allocation retries'
  and re.name='redo entries';
   這個比率小於1%纔好,否則增加log_buffer的大小
   2、log_checkpoint_interval
   Oracle8.1 版本後log_checkpoint_interval指的是兩次checkpoint之間操作系統數據塊的個數。
 
  checkpoint時Oracle把內存裏修改過的數據塊用DBWR寫到物理文件,用LGWR寫到日誌和控制文件。
   一般UNIX操作系統的數據塊爲 512 bytes。
   從性能優化來說 log_checkpoint_interval = redo logfile size bytes / 512 bytes
   3、log_checkpoint_timeout
    Oracle8.1 版本後log_checkpoint_timeout指的是兩次checkpoint之間時間秒數。
   Oracle建議不用這個參數來控制,因爲事務(transaction)大小不是按時間等量分佈的。
   log_checkpoint_timeout = 0
  log_checkpoint_timeout = 900


oracle 日誌記錄存放位置 /ORACLE_BASE/admin/orcl/bdump/alert_orcl.log
 管理日誌組
SQL> select group#,sequence#,members,status from v$log;

SQL> col member format a40
增加日誌組
SQL> alter database add logfile ('d:\oracle\log3a.log','d:\oracle\log3b.log') size 5m;

alter table a rename column sno to snumber;(修改列名)
數據庫已更改。
SQL> select group#,sequence#,members,status from v$log;
增加成員
SQL> alter database add logfile member 'D:\ORACLE\LOG1A.LOG' to group 1,
 'D:\ORACLE\LOG2A.LOG' to group 2;
SQL> select group#,sequence#,members,status from v$log;

數據庫已更改。
刪除日誌組
SQL> alter database drop logfile group 4;
數據庫已更改。

日誌文件重命名或更改位置
SQL> col member format a40
SQL> select * from v$logfile;
SQL> shutdown immediate
拷貝
SQL> alter database rename file 'D:\ORACLE\LOG1A.LOG' to 'D:\ORACLE\LOG3A.LOG';

數據庫已更改。
SQL> alter database open;
SQL> select * from v$logfile;


本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/syc0616/archive/2008/11/17/3320788.aspx

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章