2015年11月10日 星期二

[ORACLE] 11g建立sequence

簡單來說三個步驟
1. 建立TABLE
2. 建立sequence
3. 建立trigger

以下為初階範本
create table T_Owner.t_Table(
  emp_id number primary key,   --重點一定要為PK,TYPE我會用number ,比較不會怕爆掉,在SQL Server用int就有爆過的經驗
  emp_name varchar2(100)
  );

create sequence emp_id_seq
minvalue  1
maxvalue  999999999999999999999999999
start  with 1
increment  by  1
nocache; --這邊還有另外一種為cache模式,主要差別在於會不會發生跳號問題


create trigger trg_emp_id
   before insert on T_Owner.t_Table
   for each row
   begin
   select emp_id_seq.nextval
    into :new.emp_id
   from dual;
  end;
   /

進階版 http://proxy.gtn.com.tw/forum/index.php?topic=25.0

2015年5月18日 星期一

[SSIS] 透過SSIS將有難字的資料轉出後內碼會被改變(亂碼)

問題:透過SSIS轉成文字檔(或是匯入資料庫)時難字的內碼會被改變,例如正確的應該是,但經過SSIS後會變成。

原因:
        難字的內碼不在BIG5 code page裡面,也就是造字,當SSIS透過Microsoft OLE DB provider連線到oracle會判斷Big5 950(non-UNICODE),就會直接報錯不讓你轉。但當SSIS透過Oracle OLE DB provider連線到oracle時則會判斷為UNICODE,此時就會將CH_NM欄位轉換成UNICODE,這個動作是由Oracle OLE DB provider自動判斷並自動轉換的,此時難字字元內碼就已經被轉換過了,所以存進SQL Server後的binary也不會相同了。

解法:
        簡單來說就是將Oracle來源端的難字欄位轉成binary(透過utl_raw packages),並直接寫入到SQL Server對應的binary欄位其內碼就不會變,由於binary是一樣的這時再將此欄位用convert的函數再轉回char。

1. 在SQL Server上建立一個 B2U_01的暫存TABLE,將有難字的欄位NAME其type設定為binary
2. SSIS部分會建立兩個資料流程,一個是Oracle資料匯入SQL Server,一個是SQL Server資料匯出成文字檔
    2.1 在第一個資料流程(Oracle資料匯入SQL Server)的來源端
    原語法: select NAME from myORCL.CARD_HOLDER_DIM where CH_ID='A123456789';
    修正語法:select utl_raw.cast_to_raw(NAME) from myORCL.CARD_HOLDER_DIM where CH_ID='A123456789';

    2.2 在第二個資料流程(SQL Server資料匯出成文字檔)的來源端
           語法:SELECT convert(char(40),[NAME]) as NAME FROM [B2U_01]

2015年4月16日 星期四

[TOMCAT] 資料庫連線數不斷增加且不會釋放連線

        最近有套系統一段時間AP連到DB Sessios就衝高,然後把CPU吃到100%,結果就是資料庫變得很慢很慢,目前解法是請AP從程式面去找問題,另外在TOMCAT的參數檔中也有相關設定可用,我們環境就只有預設值像是maxActive,maxIdle,maxWait之類的,但有個我覺得很重要的參數abandoned connection竟然沒有,目前已經相關參數設定上去,再觀察看看有沒有改善了,詳細說明及設定方式請參考http://clearinfotech.blogspot.tw/2012/08/tomcat-data-source.html

2015年3月11日 星期三

[ORACLE] 使用SQL Loader將文字檔匯入資料庫出現ORA-01861及ORA-01722錯誤訊息解法

1. 準備好SQL*Loader Control File
========Control File範例,檔名為import.ctl=========
load data
infile 'EXP_MYTABLE.txt'
into table MYTABLE
fields terminated by ","
(datadt,actno,brno)
===========================================
以上參數說明如下:
> infile 上傳檔案的路徑及檔名,此例為EXP_MYTABLE.txt,且路徑與Control File相同
> into table 要載入到那一個table,上面表示要載入MYTABLE
> fields terminated by 欄位與欄位的分隔符號
(datadt,actno,brno) 要填入資料的表格欄位名稱

2. 執行sqlldr,語法:sqlldr 帳號/密碼@ORACLE_SID control=控制檔名
    例如:sqlldr system/system@mysid control=import.ctl

結果就出現 ORA-01861: literal does not match format string的錯誤訊息,此錯誤訊息是指日期格式不匹配,解法很簡單將Control File內容改一下就OK了。
========Control File範例,檔名為import.ctl=========
load data
infile 'EXP_MYTABLE.txt'
into table MYTABLE
fields terminated by ","
(datadt timestamp "yyyy-mm-dd hh24:mi:ss", actno,brno)
===========================================

P.S. 在我的環境下import.ctl及EXP_MYTABLE.txt都是在Windows下產生,但sqlldr是在Linux下執行,所以再將檔案上傳到Linux時須先將檔案轉成linux格式,簡單來說就是把enter符號給去掉,不然有可能會在執行sqlldr出現錯誤,或是ORA-01722:invalid number的錯誤

2014年9月9日 星期二

[SQL Server] 產生大量資料的小語法

DECLARE @i INT
DECLARE @MAX INT
 SET @i = 0
  SET @MAX = 10000
  WHILE (@i<@MAX)
  BEGIN
  INSERT INTO zTable_1 VALUES('abc','xyz')
  Set @i=@i+1
 END

[SQL Server] 自SQL Server 2008 R2 Cluster手動切換SQL Server 2008 R2 Mirror程序

--需求
   本地SQL Server 2008 R2 Cluster兩個Node主機須關機維護,並將服務切換至異地,待本地兩個Node主機完成維護後,需將維護這段期間資料回寫回本地資料庫

--環境說明,請參考以下網址
   SQL Server 2008 R2 容錯移轉叢集 + 鏡像(不具有自動容錯移轉的高安全性模式)

--切換程序
--本地切換到異地
--在本地node1主機上
01. 確認前端已無任何程式或排程連線到SQL Server
02. 將本地node2關機
03. 在[Microsoft SQL Server Management Studio]視窗中點選[新增查詢]
04. 在[新增查詢]視窗執行[sp_who2]確認已無連線
05. 在[Microsoft SQL Server Management Studio]視窗中依序展開[sqlcluster01]>[資料庫]>[MARGIN_QUOTE(主體,已同步處理)]上右鍵[工作]>[啟動資料庫鏡像監視器]
06. 在[資料庫鏡像監視器]視窗中確認[鏡像狀態]皆為[已同步處理]
07. 在[資料庫鏡像監視器]視窗中確認[未傳送的紀錄]為[0KB]
08. 在[Microsoft SQL Server Management Studio]視窗中依序展開[sqlcluster01]>[資料庫]>[MARGIN(主體,已同步處理)]上右鍵[工作]>[啟動資料庫鏡像監視器]
09. 在[資料庫鏡像監視器]視窗中確認[鏡像狀態]皆為[已同步處理]
10. 在[資料庫鏡像監視器]視窗中確認[未傳送的紀錄]為[0KB]
11. 在[Microsoft SQL Server Management Studio]視窗中依序展開[sqlcluster01]>[資料庫]>[MARGIN_QUOTE(主體,已同步處理)]上右鍵[屬性]
12. 在[資料庫屬性 - MARGIN_QUOTE]視窗中的[選取頁面]點選[鏡像]
13. 在[鏡像]頁面按下[容錯移轉]
14. 在[資料庫屬性]視窗中按下[是]
15. 在[Microsoft SQL Server Management Studio]視窗中依序展開[sqlcluster01]>[資料庫]>[MARGIN(主體,已同步處理)]上右鍵[屬性]
16. 在[資料庫屬性 - MARGIN_QUOTE]視窗中的[選取頁面]點選[鏡像]
17. 在[鏡像]頁面按下[容錯移轉]
18. 在[資料庫屬性]視窗中按下[是]

--在異地sqlcmmirror主機上
19. 在[Microsoft SQL Server Management Studio]視窗中依序展開[sqlcmmirror1]>[資料庫]>[MARGIN_QUOTE(主體,已同步處理)]上右鍵[工作]>[啟動資料庫鏡像監視器]
20. 在[資料庫鏡像監視器]視窗中確認[鏡像狀態]皆為[已同步處理]
21. 在[資料庫鏡像監視器]視窗中確認[未傳送的紀錄]為[0KB]
22. 在[Microsoft SQL Server Management Studio]視窗中依序展開[sqlcmmirror1]>[資料庫]>[MARGIN(主體,已同步處理)]上右鍵[工作]>[啟動資料庫鏡像監視器]
23. 在[資料庫鏡像監視器]視窗中確認[鏡像狀態]皆為[已同步處理]
24. 在[資料庫鏡像監視器]視窗中確認[未傳送的紀錄]為[0KB]
25. 在[Microsoft SQL Server Management Studio]視窗中依序展開[sqlcmmirror1]>[資料庫]>[MARGIN_QUOTE(主體,已同步處理)]上右鍵[屬性]
26. 在[資料庫屬性 - MARGIN_QUOTE]視窗中的[選取頁面]點選[鏡像]
27. 在[鏡像]頁面的[伺服器網路位置]按下[暫停]
28. 在[資料庫屬性]視窗中按下[是]
29. 回到[資料庫屬性 - MARGIN_QUOTE]視窗中按下[確定]
30. 在[Microsoft SQL Server Management Studio]視窗中依序展開[sqlcmmirror1]>[資料庫]>[MARGIN(主體,已同步處理)]上右鍵[屬性]
31. 在[資料庫屬性 - MARGIN]視窗中的[選取頁面]點選[鏡像]
32. 在[鏡像]頁面的[伺服器網路位置]按下[暫停]
33. 在[資料庫屬性]視窗中按下[是]
34. 回到[資料庫屬性 - MARGIN]視窗中按下[確定]


--在本地node1主機上
35. 將本地node1關機


--異地切換至本地
--在異地sqlcmmirror主機上
01. 確認前端已無任何程式或排程連線到SQL Server
02. 在[Microsoft SQL Server Management Studio]視窗中點選[新增查詢]
03. 在[新增查詢]視窗執行[sp_who2]確認已無連線

--在本地node1主機上
04. 將本地node1開機

--在異地sqlcmmirror主機上
05. 在[Microsoft SQL Server Management Studio]視窗中依序展開[sqlcmmirror1]>[資料庫]>[MARGIN_QUOTE(主體,已同步處理)]上右鍵[屬性]
06. 在[資料庫屬性 - MARGIN_QUOTE]視窗中的[選取頁面]點選[鏡像]
07. 在[鏡像]頁面的[伺服器網路位置]按下[繼續]
08. 在[資料庫屬性]視窗中按下[是]
09. 回到[資料庫屬性 - MARGIN_QUOTE]視窗中按下[確定]
10. 在[Microsoft SQL Server Management Studio]視窗中依序展開[sqlcmmirror1]>[資料庫]>[MARGIN(主體,已同步處理)]上右鍵[屬性]
11. 在[資料庫屬性 - MARGIN]視窗中的[選取頁面]點選[鏡像]
12. 在[鏡像]頁面的[伺服器網路位置]按下[繼續]
13. 在[資料庫屬性]視窗中按下[是]
14. 回到[資料庫屬性 - MARGIN]視窗中按下[確定]
15. 在[Microsoft SQL Server Management Studio]視窗中依序展開[sqlcmmirror1]>[資料庫]>[MARGIN_QUOTE(主體,已同步處理)]上右鍵[工作]>[啟動資料庫鏡像監視器]
16. 在[資料庫鏡像監視器]視窗中確認[鏡像狀態]皆為[已同步處理]
17. 在[資料庫鏡像監視器]視窗中確認[未傳送的紀錄]為[0KB]
18. 在[Microsoft SQL Server Management Studio]視窗中依序展開[sqlcmmirror1]>[資料庫]>[MARGIN(主體,已同步處理)]上右鍵[工作]>[啟動資料庫鏡像監視器]
19. 在[資料庫鏡像監視器]視窗中確認[鏡像狀態]皆為[已同步處理]
20. 在[資料庫鏡像監視器]視窗中確認[未傳送的紀錄]為[0KB]
21. 在[Microsoft SQL Server Management Studio]視窗中依序展開[sqlcmmirror1]>[資料庫]>[MARGIN_QUOTE(主體,已同步處理)]上右鍵[屬性]
22. 在[資料庫屬性 - MARGIN_QUOTE]視窗中的[選取頁面]點選[鏡像]
23. 在[鏡像]頁面按下[容錯移轉]
24. 在[資料庫屬性]視窗中按下[是]
25. 在[Microsoft SQL Server Management Studio]視窗中依序展開[sqlcmmirror1]>[資料庫]>[MARGIN(主體,已同步處理)]上右鍵[屬性]
26. 在[資料庫屬性 - MARGIN_QUOTE]視窗中的[選取頁面]點選[鏡像]
27. 在[鏡像]頁面按下[容錯移轉]
28. 在[資料庫屬性]視窗中按下[是]

--在本地node2主機上
29. 將本地node2開機


--整個程序完成後環境確認
--在異地sqlcmmirror主機上
01. 在[Microsoft SQL Server Management Studio]視窗中依序展開[sqlcmmirror1]>[資料庫]下確認資料庫狀態為[MARGIN_QUOTE(鏡像,已同步處理/正在還原...)]
02. 在[Microsoft SQL Server Management Studio]視窗中依序展開[sqlcmmirror1]>[資料庫]下確認資料庫狀態為[MARGIN(鏡像,已同步處理/正在還原...)]

--在本地sqlcluster01主機上
03. 在[Microsoft SQL Server Management Studio]視窗中依序展開[sqlcluster01]>[資料庫]下確認資料庫狀態為[MARGIN_QUOTE(主體,已同步處理)]
04. 在[Microsoft SQL Server Management Studio]視窗中依序展開[sqlcluster01]>[資料庫]下確認資料庫狀態為[MARGIN(主體,已同步處理)]

[SQL Server] SQL Server 2008 R2 容錯移轉叢集 + 鏡像(不具有自動容錯移轉的高安全性模式)

--架構

--SQL Server 2008 R2 容錯移轉叢集安裝設定請參考以下連結
   安裝設定SQL Server 2008 R2 容錯移轉叢集 (一)
   安裝設定SQL Server 2008 R2 容錯移轉叢集 (二)
   安裝設定SQL Server 2008 R2 容錯移轉叢集 (三)

--設定程序
--在MARGIN_QUOTE資料庫設定不具有自動容錯移轉的高安全性模式
01. 完整備份來源端資料庫(在sqlcluster01主機上)
BACKUP DATABASE [MARGIN_QUOTE] TO  DISK = N'T:\MARGIN_QUOTE.bak' WITH NOFORMAT, NOINIT,  NAME = N'MARGIN_QUOTE-完整 資料庫 備份', SKIP, NOREWIND, NOUNLOAD,  STATS = 10
GO

02. 備份來源端資料庫的交易記錄檔(在sqlcluster01主機上)
BACKUP LOG [MARGIN_QUOTE] TO  DISK = N'T:\MARGIN_QUOTE_LOG.bak' WITH NOFORMAT, NOINIT,  NAME = N'MARGIN_QUOTE-交易記錄  備份', SKIP, NOREWIND, NOUNLOAD,  STATS = 10
GO

03. COPY T:\MARGIN_QUOTE.bak \\192.168.200.200\sharefolder

04. COPY T:\MARGIN_QUOTE_LOG.bak \\192.168.200.200\sharefolder

05. 還原資料庫(在sqlcmmirror1主機上,並注意參數NORECOVERY)
RESTORE DATABASE [MARGIN_QUOTE] FROM  DISK = N'D:\MARGIN_QUOTE.bak' WITH  FILE = 1,  MOVE N'MARGIN_QUOTE01' TO N'D:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Data\MARGIN_QUOTE.mdf',  MOVE N'MARGIN_QUOTE02' TO N'D:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Data\MARGIN_QUOTE_1.ndf',  MOVE N'MARGIN_QUOTE_log' TO N'D:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Data\MARGIN_QUOTE_2.ldf',  NORECOVERY,  NOUNLOAD,  STATS = 10
GO
 
06. 還原交易紀錄檔(在sqlcmmirror1主機上,並注意參數NORECOVERY)
RESTORE LOG [MARGIN_QUOTE] FROM  DISK = N'D:\MARGIN_QUOTE_LOG.bak' WITH  FILE = 1,  NORECOVERY,  NOUNLOAD,  STATS = 10
GO

--在sqlcluster01主機上
07. 在[Microsoft SQL Server Management Studio]視窗中依序展開[sqlcluster01]>[資料庫]>[MARGIN_QUOTE]上右鍵[工作]>[鏡像]

08. 在[設定資料庫鏡像安全性精靈]視窗中按[下一步]

09. 在[包含見證伺服器]視窗中點選[否]後按[下一步]

10. 在[主體伺服器執行個體]視窗中,將[端點名稱]欄位輸入[Margin_鏡像]後按[下一步]

11. 在[鏡像伺服器執行個體]視窗中按[連接]

12. 在[連接到伺服器]視窗中的[伺服器名稱]輸入[sqlcmmirror1]後按下[連接]
 
13. 回到[鏡像伺服器執行個體]視窗中按[下一步]

 
14. 在[服務帳戶]視窗中[主體]及[鏡像]欄位輸入[dba\dbadmin]後按[下一步]
 
15. 在[完成精靈]視窗中按下[完成]

16. 在[正在設定端點]視窗中按下[關閉]

17. 在[資料庫屬性]視窗按下[啟動鏡像]

18. 設定完成後就會出現如下的畫面後按下[確定]

--在MARGIN資料庫設定不具有自動容錯移轉的高安全性模式
19. 完整備份來源端資料庫(在sqlcluster01主機上)
BACKUP DATABASE [MARGIN] TO  DISK = N'T:\MARGIN.bak' WITH NOFORMAT, NOINIT,  NAME = N'MARGIN-完整 資料庫 備份', SKIP, NOREWIND, NOUNLOAD,  STATS = 10
GO

20. 備份來源端資料庫的交易記錄檔(在sqlcluster01主機上)
BACKUP LOG [MARGIN] TO  DISK = N'T:\MARGIN_LOG.bak' WITH NOFORMAT, NOINIT,  NAME = N'MARGIN-交易記錄  備份', SKIP, NOREWIND, NOUNLOAD,  STATS = 10
GO

21. COPY T:\MARGIN.bak \\192.168.200.200\sharefolder

22. COPY T:\MARGIN_LOG.bak \\192.168.200.200\sharefolder

23. 還原完整備份(在sqlcmmirror1主機上,並注意參數NORECOVERY)
RESTORE DATABASE [MARGIN] FROM  DISK = N'D:\MARGIN.bak' WITH  FILE = 1,  MOVE N'MARGIN01' TO N'D:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Data\MARGIN.mdf',  MOVE N'MARGIN02' TO N'D:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Data\MARGIN_1.ndf',  MOVE N'MARGIN_log' TO N'D:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Data\MARGIN_2.ldf',  NORECOVERY,  NOUNLOAD,  STATS = 10
GO

24. 還原交易紀錄檔(在sqlcmmirror1主機上,並注意參數NORECOVERY)
RESTORE LOG [MARGIN] FROM  DISK = N'D:\MARGIN_LOG.bak' WITH  FILE = 1,  NORECOVERY,  NOUNLOAD,  STATS = 10
GO

--在sqlcluster01主機上
25. 在[Microsoft SQL Server Management Studio]視窗中依序展開[sqlcluster01]>[資料庫]>[MARGIN_QUOTE]上右鍵[工作]>[鏡像]

26. 在[設定資料庫鏡像安全性精靈]視窗中按[下一步]

27. 在[包含見證伺服器]視窗中點選[否]後按[下一步]

28. 在[主體伺服器執行個體]視窗中按[下一步]

29. 在[鏡像伺服器執行個體]視窗中按[連接]

 30. 在[連接到伺服器]視窗中的[伺服器名稱]輸入[sqlcmmirror1]後按下[連接]

31. 回到[鏡像伺服器執行個體]視窗中按[下一步]

32. 在[服務帳戶]視窗中[主體]及[鏡像]欄位輸入[dba\dbadmin]後按[下一步]

33. 在[完成精靈]視窗中按下[完成]

34. 在[正在設定端點]視窗中按下[關閉]

35. 在[資料庫屬性]視窗按下[啟動鏡像]

36. 設定完成後就會出現如下的畫面後按下[確定]

相關文章
        自SQL Server 2008 R2 Cluster手動切換SQL Server 2008 R2 Mirror程序