Oracle利用awrrpt.sql導出DB效能資料

 Oracle Database有一個AWR的工具,它收集了與效能有關的統計數據。

首先進入$ORACLE_HOME/rdbms/admin的目錄下,登入sqlplus並執行一個腳本:@awrrpt.sql,接著按照提示就可以將效能資料導出成txt或html的格式


SQL> @awrrpt.sql


Current Instance

~~~~~~~~~~~~~~~~


   DB Id    DB Name      Inst Num Instance

----------- ------------ -------- ------------

  259210000 TEST                1 TEST



Specify the Report Type

~~~~~~~~~~~~~~~~~~~~~~~

Would you like an HTML report, or a plain text report?

Enter 'html' for an HTML report, or 'text' for plain text

Defaults to 'html'

Enter value for report_type: html


Type Specified:  html  <--輸入html,表示要導出成網頁的格式



Instances in this Workload Repository schema

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


   DB Id     Inst Num DB Name      Instance     Host

------------ -------- ------------ ------------ ------------

* 259210000         1 TEST         TEST         TEST_DB


Using  259210000 for database Id

Using          1 for instance number



Specify the number of days of snapshots to choose from

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Entering the number of days (n) will result in the most recent

(n) days of snapshots being listed.  Pressing <return> without

specifying a number lists all completed snapshots.



Enter value for num_days: 14  <--選擇snapshot的天數


Listing the last 14 days of Completed Snapshots


                                                        Snap

Instance     DB Name        Snap Id    Snap Started    Level

------------ ------------ --------- ------------------ -----

TEST         TEST             79405 08 Feb 2024 01:00      1

                              79406 08 Feb 2024 02:00      1

                              79407 08 Feb 2024 03:00      1

(略)

                              79603 16 Feb 2024 07:00      1

                              79604 16 Feb 2024 08:00      1

                              79605 16 Feb 2024 09:00      1




Specify the Begin and End Snapshot Ids

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Enter value for begin_snap: 79405

Begin Snapshot Id specified: 79405 <--輸入開始的Snap Id


Enter value for end_snap: 79605

End   Snapshot Id specified: 79605  <--輸入結束的Snap Id




Specify the Report Name

~~~~~~~~~~~~~~~~~~~~~~~

The default report file name is awrrpt_1_79405_79605.html.  To use this name,

press <return> to continue, otherwise enter an alternative.


Enter value for report_name:  <--輸入指定的檔名,如不輸入,則以預設值


Using the report name awrrpt_1_79405_79605.html


<html lang="en"><head><title>AWR Report for DB: TEST, Inst: TEST, Snaps: 79405-79605</title>

<style type="text/css">

body.awr {font:bold 10pt Arial,Helvetica,Geneva,sans-serif;color:black; background:White;}

pre.awr  {font:8pt Courier;color:black; background:White;}

(略)


最後會產生一個html的檔案,就可以看指定的時段內,DB的效能資料了。



Powershell_批次備份與複製(微軟模擬飛行)

 因為微軟模擬飛行的遊戲需要中文化,網路上的說法是官方中文包放在遊戲目錄內,要自己更名,也就是將中文包的檔名改成英文檔名,但是遊戲的目錄下有一百多個中文包,所以用powershell來批次處理,希望改完後可以成功中文化

這支程式會先將英文檔名更名備份,再將中文檔名改為英文檔名,因為有設定參數,所以其實也可以用來批次處理其他的檔案


# -----程式使用方式-----
  # 語法: test001.ps1 -en [英文語系檔名] -tw [中文語系檔名]
  # 例如: test001.ps1 -en us_en.lang -tw tw_cn.lang
  # -------------------
  
  
  #param是設定參數,如下設定了兩個參數:en、tw
  param($en,$tw)
  
  $US_filename = $en #英文語系檔
  $TW_filename = $tw #中文語系檔
  $US_filename_bk = $US_filename + ".bk" #英文原始檔備份的檔名
  
  if ( $US_filename -and $TW_filename) {
  
      get-childitem -Path "E:\images\test001" -Filter $US_filename -Recurse | foreach {
  
          write-host  "----------------------------------------------------------------"
          write-host  "原始檔名:"  $_.FullName
  
          #更名
          Rename-Item -Path $_.FullName -NewName $US_filename_bk
  
          $US_Fullname_bk = -join($_.DirectoryName,"\$US_filename_bk")
  
          #檢查更名是否成功
          if ((Test-Path -Path $US_Fullname_bk )) {
              write-host  "更名:" $_.Name "-->" $US_filename_bk
  
              #複製中文語系並更名
              $TW_Fullname = -join($_.DirectoryName,"\$TW_filename") #完整的中文語系路徑
              $US_Fullname = -join($_.DirectoryName,"\$US_filename") #完整的英文語系路徑(Copy用)
              Copy-Item -Path $TW_Fullname -Destination $US_Fullname -Force
              write-host  "複製並更名:" $TW_Fullname "-->" $US_filename_bk
          
  
          } else {
              write-host  "更名失敗" 
          }
      }
  
  } else {
      write-host "參數en或tw的值為空白,語法:test001.ps1 -en [英文語系檔名] -tw [中文語系檔名]"
  }

Oracle DB變更archive log的路徑

 有一台Oracle Data guard的Standby DB,想要變更它的archive log路徑。

其實就跟Standalone一樣的做法,至於Primary DB則無需變動。


1、查詢目前archive log的狀態

SQL> archive log list

Database log mode              Archive Mode
Automatic archival             Enabled
Archive destination            /a/archive
Oldest online log sequence     104171
Next log sequence to archive   0
Current log sequence           104175


2、查詢DB的parametre:log_archive_dest_1

SQL> show parameter log_archive_dest_1

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
log_archive_dest_1                   string      LOCATION=/a/archive  

                                           

3、變更archive log的路徑

SQL> alter system set log_archive_dest_1='LOCATION=/b/archive' scope=both;


4、強制switch log來檢查在新目錄下是否有產生archive log file

SQL> alter system switch logfile;


如果在新的路徑/b/archive下有產生新的archive log就表示成功了。


利用dbms_application_info,讓v$session記錄額外的資訊

 DBMS_APPLICATION_INFO是一个非常有用的package,它提供了在V$SESSION 新增自訂紀錄的功能,以便追蹤SESSION

例如我們有一個第三方的程式連線DB,但是從v$session的資訊看來,只能查詢到程式名稱,但是不知道是誰執行了這個程式,所以每次發現某個session執行時間很久時,就只能強迫刪除,無法進一步與使用者討論。

此時就可以利用DBMS_APPLICATION_INFO來將自訂的紀錄提供到v$session中,簡單的範例如下:

declare
    aa number ;
    v_action varchar2(50);
    v_module varchar2(50);
    v_client_info varchar2(50);
begin
    dbms_application_info.set_action('設定action資料');
    dbms_application_info.set_module('設定Module資料','設定Action資料');
    dbms_application_info.set_client_info('設定Client_info資料');


    select 1+1 into aa from dual;


    dbms_application_info.read_client_info( v_client_info);
    dbms_application_info.read_module(v_module,v_action);  

    dbms_output.put_line('Client_info => ' || v_client_info) ;
    dbms_output.put_line('Action => ' || v_action) ;
    dbms_output.put_line('Module => ' || v_module);    

end;

其中dbms_application_info.set_module有兩個參數,第一個是設定moduel,第二個是設定action, 換句話說第二個參數與set_action是一樣的效果。

另外也可以用read_client_info與read_module這兩個函數來取出v$session中的client_info、module與action欄位的值



Solaris查詢CPU的Core與Thread的數量

 查physical processors數量
# kstat -m cpu_info | grep chip_id | sort -u | wc -l | tr -d ' '

查virtual processors數量
# kstat -m cpu_info | grep 'module: cpu_info' | sort -u | wc -l | tr -d ' '

查CPU的Core數
# kstat -m cpu_info | grep core_id | sort -u | wc -l | tr -d ' '

 

每顆CPU有多少Core:(Core)/(physical processors)

每個Core有多少的Threads:(virtual processors)/(Core)




直接連線到Mail Server,用Command來寄發Mail

 有時候會遇到使用者收不到程式自動寄發信件的問題,可以用Command的方式來測試Mail Server,記錄一下步驟:

用Telnet登入Mail Server,假設Mail server的IP是192.168.1.100,Port是25
$ telnet 192.168.1.100 25

成功登入Mail Server後,首先用helo或ehlo跟Server打招呼,成功會回傳250的Code
HELO

輸入指令MAIL FROM:<email address>,讓mail server知道是誰要寄信,如果mail server允許寄件人則會回傳成功的Code:250
MAIL FROM: test01@test.com

輸入指令RCPT TO:<email address>,收件人,成功會回傳250的Code
RCPT TO: test02@test.com

接著輸入指令DATA,通知Server要準備要輸入信件的主旨與內容
DATA

輸入指令SUBJECT: <text>,主旨,按下Enter
SUBJECT: test subject

接著開始輸入內容,預設在新行頭一字輸入「.」來可以結束內容,就可以把信寄發出去

要結束Telnet,輸入quit就可以離開了。


下面是實際的例子:

[2023-12-06 10:29.25]  ~

[test.6138] ➤ telnet 192.168.1.100 25

Trying 192.168.1.100...

Connected to 192.168.1.100.

Escape character is '^]'.

220 test-mail.server.local Microsoft ESMTP MAIL Service ready at Wed, 6 Dec 2023 10:30:09 +0800

HELO

250 test-mail.server.local Hello [192.168.1.39]

MAIL FROM: test01@test.com

250 2.1.0 Sender OK

RCPT TO: test02@test.com

250 2.1.5 Recipient OK

DATA

354 Start mail input; end with <CRLF>.<CRLF>

SUBJECT: test subject


body test

.

250 2.6.0 <8cd94457@test-mail.server.local> Queued mail for delivery

Oracle DB:利用sqlnet.ora限制IP連線

 因為需要限制IP連線DB,同事提供SQLnet方案,用防火牆也是可以的。

防火牆設定比較複雜,但是可以設定的比較詳細,sqlnet只針對DB,且功能不如防火牆多。

DB是19c,只有單機,所以環境單純,在$ORACLE_HOME/network/admin/sqlnet.ora中加入下列:

# 啟用設定
TCP.VALIDNODE_CHECKING=yes 

# 允許清單(限用IP)
TCP.INVITED_NODES=(192.192.192.10,ip2,ip3) 

# 拒絕清單
TCP.EXCLUDED_NODES=(192.168.192.20,ip2,ip3)

我只有設定允許清單,所以不在清單內的IP就會被拒絕

sqlnet.ora設定完成後,需要重啟linstener才能生效。

重啟linstener的過程中,已連線到DB的Session仍可正常作業,但是無法新增Session。