2015年6月30日 星期二

[Oracle優化]CPU使用率突然飆高了!

        某天管理的Oracle,它的CPU使用率突然飆高了一倍,平常使用率很低的,所以飆高了一倍還好。對一個穩定的系統來講,CCU沒有多一倍,CPU卻飆高一倍是很奇怪的,而且接下公司有辦活動,要是CCU暴增就不敢保證不會有問題了,所以要想辦法找出什麼原因造成CPU飆高

        首先看飆高當天的AWR,下圖是Top 5 Timed Foreground Events,第一名的DB CPU約佔73%,第二名的library cache: mutex X只佔10%左右,這還算正常

2015年6月22日 星期一

[SSIS][PostgreSQL]Error code:0x80040E21 Description: Multiple-step OLE DB operation generated errors.

        在SSIS Project裡,我打算從PostgreSQL匯入資料到SQL Server上,然後執行時出現如下錯誤,從錯誤訊息裡得知好像是欄位型態轉換的問題

[OLE DB Destination [29]] Error: SSIS Error Code DTS_E_OLEDBERROR.  An OLE DB error has occurred. Error code: 0x80040E21.
An OLE DB record is available.  Source: "Microsoft SQL Server Native Client 11.0"  Hresult: 0x80040E21
Description: "Multiple-step OLE DB operation generated errors. Check each OLE DB status value, if available. No work was done.".

[OLE DB Destination [29]] Error: An error occurred while setting up a binding for the "name" column. The binding status was "DT_NTEXT".
The data flow column type is "DBBINDSTATUS_UNSUPPORTEDCONVERSION".
The conversion from the OLE DB type of "DBTYPE_IUNKNOWN" to the destination column type of "DBTYPE_WVARCHAR" might not be supported by this provider.

        PostgreSQL該欄位上是TEXT,而SQL端對應欄位是NVARCHAR,我中間沒有加入資料轉換元件,對於異質資料轉換,我習慣在來源端就先轉掉好了,比較不容易出問題,所以直接在PostgreSQL來源端用cast轉換就好,例子如下
select id,cast(name as varchar(32)) as name from accounts
         這樣就沒再出錯囉

2015年6月17日 星期三

[SSIS]如何連到PostgreSQL

        首先去下載psqlodbc,因Server是64 bit的,用Visual Studio開發SSIS Project得用32 bit,而我開發佈署都在同一台Server上,所以兩種Driver都得裝喔

        安裝完Driver後,設定ODBC Data Source Administrator,也是32 bit與64 bit都要設,記得名稱要設一樣的,下面會講一下設定


2015年6月6日 星期六

[SQL Server]Linked Server到Oracle時,出現'To_Date' is not a recognized built-in function name的解法

       用連結伺服器連到Oracle要取資料,因為有日期時間的過濾條件,在Oracle需要用To_Date函數,但此函數無法通過SQL Server語法剖析的檢查,會出如下的錯誤
Select * From LK_ORA..HR.EMPLOYEES Where  Login_Date >= To_Date('2015-05-01 00:00:00','yyyy-mm-dd hh24:mi:ss') And Login_Date < TO_DATE('2015-05-02 00:00:00','yyyy-mm-dd hh24:mi:ss');


       解法一:在Oracle建View,在SQL端直接讀View,但多了道建View的手續

       解法二:在SQL端改用Exec,比較簡單,範例如下
EXEC ('Select * From HR.EMPLOYEES Where  Login_Date >= To_Date(''2015-05-01 00:00:00'',''yyyy-mm-dd hh24:mi:ss'') And Login_Date < TO_DATE(''2015-05-02 00:00:00'',''yyyy-mm-dd hh24:mi:ss'')') at LK_ORA;