Oracle Data Gurad Archive Gap

 主庫與備庫之間的網路,因為電信維修,所以中斷連線。在網路恢復之後,卻沒有正常的恢復同步。

檢查備庫的alert log,發現有下列的錯誤:

Media Recovery Waiting for thread 1 sequence 72754

Fetching gap sequence in thread 1, gap sequence 72754-72756

Mon Aug 02 19:52:33 2021

FAL[client]: Failed to request gap sequence

 GAP - thread 1 sequence 72754-72756

 DBID 259219464 branch 847381128

FAL[client]: All defined FAL servers have been attempted.

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

Check that the CONTROL_FILE_RECORD_KEEP_TIME initialization

parameter is defined to a value that's sufficiently large

enough to maintain adequate log switch information to resolve

archivelog gaps.

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


在備庫執行下列的SQL,可以查詢gap的缺少的日誌

SQL> select * from v$archive_gap;

THREAD#   LOW_SEQUENCE#   HIGH_SEQUENCE#    

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

1         72754           72756


發生原因在於備庫於主庫中找不到對應的日誌72754、72756,因為我事前已先將archive log移至DataDomain暫存,所以主庫上當然找不到這些檔案。


先將archive log(72754、72755、72756)由Datadomain中複製到備庫中,再將它們註冊到備庫中,備庫就會開始恢復它們。

SQL> ALTER DATABASE REGISTER PHYSICAL LOGFILE '/tmp/PROD_72754.arc';     


如果需要恢復的日誌檔很多,則可以改用下列的SQL來產生語法:

select 'ALTER DATABASE REGISTER PHYSICAL LOGFILE ''/tmp/'||substr(name,35)||''';' from v$archived_log where  SEQUENCE#>=72754 and SEQUENCE#<=72756 and thread#=1 and NAME<>'standby service name';

                         

將缺少的日誌都補上後,備庫就可以正常與主庫同步了。

附上scp的語法,記錄一下:

scp 來源檔案 <遠端帳號>@<遠端伺服器>:<遠端目錄>

例:scp PROD_72832.arc PROD_72833.arc  <USER>@<SERVER>:<PATH> 


Excel VBA 自訂函數 傳入儲存格參數

 為了解決一個有1000個欄位的判斷問題,所以使用自訂函數來自動判斷。

但是自訂函數又遇到了另一個問題,也就是沒有辦法自動加號,先看程式碼如下:

Function test01(aa, bb)

   a = Cells(aa, bb).Value

   test01 = a

End Function

程式碼很簡單,只是如果單純傳入欄號、列號時,下一列無法自動加號,如下圖

(為了顯示公式,所以直接轉成文字)


由上圖可知,公式都是(1,1),而不會自動變成(1,2),(1,3),這樣對於一個有數百列的Excel,要一個一個手動改實在太麻煩了。

還好最後有試出一個方法可以解決這個問題,就是利用標準的公式column與row,這樣終於可以解決問題了。


公式說明如下:
Column是傳回參照位址欄之編號,如COLUMN(B1)傳回2,也就是欄B
Row是傳回參照位址列之編號,如ROW(C2)傳回2,也就是第二列

用這兩個公式就可以將儲存格的參照位址傳入VBA,並享受自動加號的功能。





限制IE瀏覽器無法開啟

 由於上一篇提供我已經設定好Edge的IE模式,所以在企業網站清單內都可以以IE核心來開啟網頁。

Edge啟用IE模式:https://blog.twtnn.com/2021/06/edgeie.html

接著就是限制IE瀏覽器無法被使用者開啟,強迫使用者只能使用Edeg這個安全性高的瀏覽器。

開啟「群組原則」=> 使用者/電腦設定 => 系統管理範本 => Internet Explorer

選擇「停用Internet Explorer做為獨立瀏覽器」

將這個原則啟用,我另外設定了永遠顯示,當使用者要開啟IE瀏覽器時就會出現警告


測試一下直接開啟IE瀏覽器,就會出現下列的警告,並且導向Edge瀏覽器


這個原則設定並不影響Edge的IE模式,所以還是可以用Edge來瀏覽IE Only的網頁,換句話說,只是讓你開不了IE瀏覽器,但是IE核心並沒有被停用。


設定Edge啟用IE模式及企業網站設定

 基於微軟的建議,企業擁有以IE為基礎的舊版網站和應用程式,可以移到Edge中的IE模式,而且最少會提供到2029年。

正好我們的EBS 11i就是微軟說的舊版網站,需要有像IE一樣能支援NPAPI外掛的瀏覽器,所以就來研究看看。

一開始找了好多文件,有的是開啟實驗功能來啟用IE模式;或設定某個參數來開啟,不過這些方式在我的電腦上都沒有成功。

不是這些文件有錯誤,而是我的Edge是最新的版本,上述的方式已經無法再適用了。

最後研究了好久,參考了微軟的文件及網友的文件後,終於測試成功了,可以在Edge中以IE模式來開啟EBS 11i的Forms,而且也順便設定當Edge碰到EBS的網址會自動啟用IE模式。

這樣的方式可以讓使用者瀏覽一般網頁時可以用安全性高的Edge,而遇到特定網頁是則開啟相容的IE模式來瀏覽,可以避免用IE 11來瀏覽一般網頁。


一、啟用Edge的IE模式

先到微軟的網站上下載Edge的「群組原則」範本,注意自己的Edge版本來下載對應的範本

網址:https://www.microsoft.com/zh-tw/edge/business/download


解壓後找到<解壓目錄>\windows\admx\msedge.admx和<解壓目錄>\windows\admx\zh-TW\msedge.admx

將這兩個檔案各自複製到對應的資料夾C:\Windows\PolicyDefinitions和C:\Windows\PolicyDefinitions\zh-TW

接著開啟「群組原則」,選擇電腦設定/使用者設定 -> 系統管理範本 -> Microsoft Edge

(如果沒有複製msedge.admx,則不會有Microsoft Edge的原則)

將「設定Internet Explorer整合」的狀態改為啟用,以啟用Edge的IE模式


另一個「允許Internet Explorer模式測試」的設定則是開啟Edge的IE模式選項,啟用後在Edge的選項「更多工具」中會出現「在Internet Explorer模式中開啟網站」


這個選項是允許手動切換以IE模式來瀏覽開啟的網頁,如果不想使用者可以隨意切換,則不要啟用「允許Internet Explorer模式測試」



二、設定企業網站設定

配合企業網站的設定,可以讓Edge遇到特定的網址時,可以自動切換IE模式來瀏覽,一樣必需在「群組原則」內設定。

「群組原則」 -> 電腦設定/使用者設定 -> 系統管理範本 -> Microsoft Edge -> 設定「企業模式網站清單」

勾選啟用後,在選項內填入清單,此清單是一個XML的檔案,可以放在本機、遠端資料夾、或網站上


XML的語法可以參考微軟的「企業模式結構描述 v.2 指導方針」,網址:https://docs.microsoft.com/zh-tw/internet-explorer/ie11-deploy-guide/enterprise-mode-schema-version-2-guidance

設定完成後,可以在Edge中鍵入edge://compat/enterprise來查看清單的狀況

也可以下載微軟的一個小工具「Enterprise Mode Site List Manager for 」,快速產生XML檔

網址:https://docs.microsoft.com/zh-tw/internet-explorer/ie11-deploy-guide/use-the-enterprise-mode-site-list-manager



三、設定完第一、二步驟後,就可以測試看看是否成功。

IE 11 更新後無法開啟Oracle EBS 11i的Forms

在更新之前,IE開啟EBS都是正常的,安裝的是Java 1.6_51的版本,後來系統要求更新,之後就無法開啟EBS了。

檢查一下IE的版本如下,也有將EBS的網址加入「相容性」及「安全性網站」內,畢竟之前都是正常的。


接著再檢查「管理附加元件」內也有java的plug-in元件,但是就是無法開啟EBS



最後是在IE的捷徑上按右鍵,選擇「以系統管理員」執行,沒想到這樣就可以開啟EBS了。


Node.js利用Crypto模組產生亂數字串

 兩階段驗證的流程中需要一個金鑰,測試時因為只有一名使用者,所以就自行指定亂數字串。

但是如果有多位使用者,自訂亂數字串就顯得不合時宜了。

在網路上找到crypto模組可以產生亂數,我的程式如下,記錄一下以方便未來直接引用


import crypto from 'crypto';

let buf = crypto.randomBytes(12);

let buf_str = buf.toString('base64');

console.log(buf_str);


randomBytes會傳回指定Bytes長度的亂數資料,其類型為 binary buffer

利用toString()並指定base64編碼轉成字串

這樣就可以很方便取得亂數字串了。

支援的編碼類型有:ascii, utf8, utf16le/ucs2, base64, binary,  hex

Node.js SyntaxError:Cannot use import statement outside a module

 今天在測試Node.js的功能時,使用import的語法,執行時出現錯誤:Cannot use import statement outside a module

出錯的程式片段如下:

import express from 'express';

如果修改程式如下,則執行成功:

const express = require('express');

原來在ES6標準釋出後,module成為標準,以export匯出介面,用import引入模組。

但是在之前採用的是的是CommonJS規範,以module.exports匯出介面,用require引入模組。

我的Node.js版本是v16.0.0,我的解決方式是修改package.json,增加語法 "type":"module"



Oracle Data Gurad Archive Gap