新增資料到SQL Server,部分中文變成亂碼

 今天有一項小任務,把資料新增到簡中的SQL Server內,原本單純的任務,卻出現了中文亂碼的問題。

我是用SQL的insert語法在SQL Server Management Studio中把資料新增到資料庫中。

在SQL Server Management Studio中簡體中文是顯示正常的,新增也沒有問題。

新增完成後,檢查資料發現,僅有部份的中文是顯示「?」,但是多數中文卻又是正常的。

在查詢網路文章之後,發現有人提到SQL Server的欄位是NCHAR、NVARCHAR時,中文是使用Unicode編碼,

而程式碼或編輯管理工具有可能不是Unicode編碼,導致部份中文出現亂碼。

而解決的方式是使用前置詞大寫的「N」,而我加入後,中文果然就解決了。

例如:

insert temp value (N'台南',N'天氣')


微軟關於定序的說明:

https://docs.microsoft.com/zh-tw/sql/relational-databases/collations/collation-and-unicode-support?view=sql-server-ver15#SQL-collations


EBS 11i:解決The Output Post-processor is running but has not picked up this request

 今天EBS的一支報表出現執行完成但是有Warning的情形,如下圖:


按下View Output後,直接出現xml的url,而不是我們設定好的rdf檔




為了驗證,所以又執行數次相同的報表,但是無論參數如果修改,結果都是一樣的。


這支報表有用到XML Publisher的功能,其報表的log的部份如下圖。這部份的訊息是在執行XML Publisher時出現問題,但是報表實際上已完成。

出現的錯誤是The Output Post-processor is running but has not picked up this request. 

並提到一個解決方案是OPP Response Timeout to a higher value may be necessary

我把Concurrent:OPP Response Timeout的值加大後問題依舊,所以問題的關鍵不在這裡。



因為執行XML Publisher的是Output Post Processor這個Concurrent Manager,所以查看一下狀態。

雖然Output Post Processor看起來好像沒有問題,但是實際上點選「Processes」->「Manager Log」查看後發現log只記錄到6個小時前。

所以我把Output Post Processor按下Restart按鈕後,再到Requests查看Restart已完成,但是Output Post Processor的狀態還是一直在Restart。


最後的方式就是按下Output Post Processor的Terminate按鈕,確定Requests「Terminate All Managers (Abort)」完成後,再按下Activate按鈕


重新產生一個新的Output Post Processor Processes後,問題解決了。


後續:在Concurrent Managers -> 點選「Output Post Processor」 -> Processes -> Manager Log,檢查log後,發現是使用者忘了給報表參數下一個期限,



導致java.lang.OutOfMemoryError: Java heap space,如下圖



在重新檢視所有有問題的報表,在最初發生問題的報表(參數未下期限),其Report log有以下的另外的錯誤,明確指出processing failed





Python使用cx_oracle時中文亂碼

 今天在測試一個python程式以cx_oracle模組連線Oracle DB時,select一個中文的資料,結果是出現亂碼「???」。

資料庫的語系是:AMERICAN_AMERICA.ZHT16BIG5

原本想利用select convert(DATA,'utf8') from TABLE來轉換,結果還是失敗了。

最後修改客戶端的語系後,就可以成功顯示中文了。在python的程式中加入:

import os

os.environ['NLS_LANG'] = 'AMERICAN_AMERICA.AL32UTF8' 

要注意的是不是設定跟資料庫一樣,而是要設定客戶端的語系

記錄一下,以免以後又忘了。

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>