![]() |
好,丘goodchos
地址:110台北市信義區松勤街54號
電話:02 2758 2609
|
2013年10月12日 星期六
2013年10月8日 星期二
[ORACLE] ORA-03143 已不支援連線此伺服器版本
簡單來說就是ORACLE 11g Client 程式無法連線到Oracle 8i的資料庫.沒辦法用最新版本的管理程式管理個版本的資料庫主機真是麻煩~
[SQL Server] 建立可透過排程自動啟動並結束的SQL Trace
關於SQL Trace及SQL Server Profiler的差別及使用注意事項可看文章最後的參考資料
透過以下程序就可以自動啟動,並且在指定時間停止
1. 依序展開[開始]->[Microsoft SQL Server 2008 R2]->[效能工具]->[SQL Server Profiler]
2. 在[SQL Server Profiler]視窗中的工具列依序展開[檔案]->[新增追蹤]
3. 在[連接到伺服器]視窗選擇要Trace的資料庫主機後按下[連接]
4. 在[追蹤屬性]視窗選擇您要監控的項目以及設定相關屬性後按下[執行]
5. 回到[SQL Server Profiler]視窗中的工具列依序展開[檔案]->[停止追蹤]
6. 在[SQL Server Profiler]視窗中的工具列依序展開[檔案]->[匯出]->[指令碼追蹤定義]->[對於 SQL Server 2005-2008 R2]後將檔案存放在您指定的路徑下且該副檔名為.sql,例如:Trace_Temp.sql
7. 使用 SSMS 管理工具,開啟Trace_Temp.sql
8.在Trace_Temp.sql檔案中找到以下的程式碼並修改參數後存檔,關於sp_trace_create的相關參數請參考TECHNET
declare @rc int
declare @TraceID int
declare @maxfilesize bigint
declare @stoptime datetime
set @maxfilesize = 100
set @stoptime = '2013-10-08 07:15:00'
-- Please replace the text InsertFileNameHere, with an appropriate
-- filename prefixed by a path, e.g., c:\MyFolder\MyTrace. The .trc extension
-- will be appended to the filename automatically. If you are writing from
-- remote server to local drive, please use UNC path and make sure server has
-- write access to your network share
@TraceID output, 2 --> 指定在到達 max_file_size 時,關閉目前的追蹤檔,建立一個新檔案
@tracefile=N'D:\myTrace\TraceLog' --> 指定存放路徑
@maxfilesize = 100 --> 單一Trace檔案大小上限
@stoptime = '2013-10-08 07:15:00' --> 停止Trace時間
9. 將Trace_Temp.sql排入排程(SQL或Windows排程皆可)
10. 待Trace完成後,再用SQL Server Profiler工具開啟或是匯入到SQL Server中做後續分析
參考資料
1. 德瑞克老師的使用 SQL Profiler 建立「SQL 追蹤(SQL Trace)」
2. Facebook的Super SQL Server 楊老師的文件"資料庫管理主題 VII, 如何藉由SQL Server Profiler快速產生sp_trace程序"
3.TECHNET sp_trace_create (Transact-SQL)
透過以下程序就可以自動啟動,並且在指定時間停止
1. 依序展開[開始]->[Microsoft SQL Server 2008 R2]->[效能工具]->[SQL Server Profiler]
8.在Trace_Temp.sql檔案中找到以下的程式碼並修改參數後存檔,關於sp_trace_create的相關參數請參考TECHNET
declare @rc int
declare @TraceID int
declare @maxfilesize bigint
declare @stoptime datetime
set @maxfilesize = 100
set @stoptime = '2013-10-08 07:15:00'
-- Please replace the text InsertFileNameHere, with an appropriate
-- filename prefixed by a path, e.g., c:\MyFolder\MyTrace. The .trc extension
-- will be appended to the filename automatically. If you are writing from
-- remote server to local drive, please use UNC path and make sure server has
-- write access to your network share
exec @rc =
sp_trace_create @TraceID output, 2, N'D:\myTrace\TraceLog',
@maxfilesize, @stoptime
參數說明@TraceID output, 2 --> 指定在到達 max_file_size 時,關閉目前的追蹤檔,建立一個新檔案
@tracefile=N'D:\myTrace\TraceLog' --> 指定存放路徑
@maxfilesize = 100 --> 單一Trace檔案大小上限
@stoptime = '2013-10-08 07:15:00' --> 停止Trace時間
9. 將Trace_Temp.sql排入排程(SQL或Windows排程皆可)
10. 待Trace完成後,再用SQL Server Profiler工具開啟或是匯入到SQL Server中做後續分析
參考資料
1. 德瑞克老師的使用 SQL Profiler 建立「SQL 追蹤(SQL Trace)」
2. Facebook的Super SQL Server 楊老師的文件"資料庫管理主題 VII, 如何藉由SQL Server Profiler快速產生sp_trace程序"
3.TECHNET sp_trace_create (Transact-SQL)
2013年10月3日 星期四
[SQL Server] 透過SSMS產生還原資料庫的指令檔,還可以追交易紀錄檔喔~
還原資料庫的時候如果只是還原一個 .bak,不論是透過SSMS或是指令都是很簡單的事情,但是如果是要還原交易紀錄檔,或是備份有分成完整+差異或完整+增量,我都是自己一行一行寫,真的很累人,碰到比較大的資料庫或是交易紀錄檔很多的.....那真的會自己寫到死,如果中間有寫錯一個,那又要再來一次~真的很想哭~後來看到保哥的這篇文章,真是如獲至寶啊~
產生還原資料庫指令碼的程序如下
1. 開啟Microsoft SQL Server Management Studio
2. 在要還原的資料庫上右鍵->工作->還原->資料庫
3. 在[還原資料庫-MyDB]視窗中的確認以下相關資訊(如下圖所示)後按下[指令碼]
a. [目的地資料庫]
b .[來源資料庫]
c. [選擇要還原的備份組]:勾選要還原的項目
4.就可以產生以下的指令碼,天啊~如果要自己寫是多麼痛苦的事情啊
RESTORE DATABASE [MyDB] FROM DISK = N'H:\DB_Backup\MyDB_backup_2013_10_02_220001_1783058.bak' WITH FILE = 1, NORECOVERY, NOUNLOAD, STATS = 10
GO
RESTORE LOG [MyDB] FROM DISK = N'H:\DB_Backup\MyDB\MyDB_backup_2013_10_02_230000_9407058.trn' WITH FILE = 1, NORECOVERY, NOUNLOAD, STATS = 10
GO
RESTORE LOG [MyDB] FROM DISK = N'H:\DB_Backup\MyDB\MyDB_backup_2013_10_03_000001_6391058.trn' WITH FILE = 1, NORECOVERY, NOUNLOAD, STATS = 10
GO
RESTORE LOG [MyDB] FROM DISK = N'H:\DB_Backup\MyDB\MyDB_backup_2013_10_03_010001_5991547.trn' WITH FILE = 1, NORECOVERY, NOUNLOAD, STATS = 10
GO
RESTORE LOG [MyDB] FROM DISK = N'H:\DB_Backup\MyDB\MyDB_backup_2013_10_03_020001_2523547.trn' WITH FILE = 1, NORECOVERY, NOUNLOAD, STATS = 10
GO
RESTORE LOG [MyDB] FROM DISK = N'H:\DB_Backup\MyDB\MyDB_backup_2013_10_03_030000_9679547.trn' WITH FILE = 1, NORECOVERY, NOUNLOAD, STATS = 10
GO
RESTORE LOG [MyDB] FROM DISK = N'H:\DB_Backup\MyDB\MyDB_backup_2013_10_03_040001_7287547.trn' WITH FILE = 1, NORECOVERY, NOUNLOAD, STATS = 10
GO
RESTORE LOG [MyDB] FROM DISK = N'H:\DB_Backup\MyDB\MyDB_backup_2013_10_03_050001_4131547.trn' WITH FILE = 1, NORECOVERY, NOUNLOAD, STATS = 10
GO
RESTORE LOG [MyDB] FROM DISK = N'H:\DB_Backup\MyDB\MyDB_backup_2013_10_03_060001_0507547.trn' WITH FILE = 1, NORECOVERY, NOUNLOAD, STATS = 10
GO
RESTORE LOG [MyDB] FROM DISK = N'H:\DB_Backup\MyDB\MyDB_backup_2013_10_03_070000_8443547.trn' WITH FILE = 1, NORECOVERY, NOUNLOAD, STATS = 10
GO
RESTORE LOG [MyDB] FROM DISK = N'H:\DB_Backup\MyDB\MyDB_backup_2013_10_03_080001_5427547.trn' WITH FILE = 1, NORECOVERY, NOUNLOAD, STATS = 10
GO
RESTORE LOG [MyDB] FROM DISK = N'H:\DB_Backup\MyDB\MyDB_backup_2013_10_03_090001_7419547.trn' WITH FILE = 1, NORECOVERY, NOUNLOAD, STATS = 10
GO
RESTORE LOG [MyDB] FROM DISK = N'H:\DB_Backup\MyDB\MyDB_backup_2013_10_03_100001_5938796.trn' WITH FILE = 1, NORECOVERY, NOUNLOAD, STATS = 10
GO
RESTORE LOG [MyDB] FROM DISK = N'H:\DB_Backup\MyDB\MyDB_backup_2013_10_03_110001_3406796.trn' WITH FILE = 1, NORECOVERY, NOUNLOAD, STATS = 10
GO
RESTORE LOG [MyDB] FROM DISK = N'H:\DB_Backup\MyDB\MyDB_backup_2013_10_03_120001_1342796.trn' WITH FILE = 1, NORECOVERY, NOUNLOAD, STATS = 10
GO
RESTORE LOG [MyDB] FROM DISK = N'H:\DB_Backup\MyDB\MyDB_backup_2013_10_03_130000_7874796.trn' WITH FILE = 1, NORECOVERY, NOUNLOAD, STATS = 10
GO
RESTORE LOG [MyDB] FROM DISK = N'H:\DB_Backup\MyDB\MyDB_backup_2013_10_03_140001_5014796.trn' WITH FILE = 1, NORECOVERY, NOUNLOAD, STATS = 10
GO
RESTORE LOG [MyDB] FROM DISK = N'H:\DB_Backup\MyDB\MyDB_backup_2013_10_03_150001_2170796.trn' WITH FILE = 1, NORECOVERY, NOUNLOAD, STATS = 10
GO
RESTORE LOG [MyDB] FROM DISK = N'H:\DB_Backup\MyDB\MyDB_backup_2013_10_03_160000_9638796.trn' WITH FILE = 1, NOUNLOAD, STATS = 10
GO
附註:使用這項功能當然有些限制的
1. MSDB資料庫是OK的。
2. 要還原的資料庫日期存在備份組中,例如要還原的資料庫時間已超過備份組的時間,那就沒辦法做到。
3. 所以還是自己寫隻Restore程式或許會更方便。
產生還原資料庫指令碼的程序如下
1. 開啟Microsoft SQL Server Management Studio
2. 在要還原的資料庫上右鍵->工作->還原->資料庫
3. 在[還原資料庫-MyDB]視窗中的確認以下相關資訊(如下圖所示)後按下[指令碼]
a. [目的地資料庫]
b .[來源資料庫]
c. [選擇要還原的備份組]:勾選要還原的項目
4.就可以產生以下的指令碼,天啊~如果要自己寫是多麼痛苦的事情啊
RESTORE DATABASE [MyDB] FROM DISK = N'H:\DB_Backup\MyDB_backup_2013_10_02_220001_1783058.bak' WITH FILE = 1, NORECOVERY, NOUNLOAD, STATS = 10
GO
RESTORE LOG [MyDB] FROM DISK = N'H:\DB_Backup\MyDB\MyDB_backup_2013_10_02_230000_9407058.trn' WITH FILE = 1, NORECOVERY, NOUNLOAD, STATS = 10
GO
RESTORE LOG [MyDB] FROM DISK = N'H:\DB_Backup\MyDB\MyDB_backup_2013_10_03_000001_6391058.trn' WITH FILE = 1, NORECOVERY, NOUNLOAD, STATS = 10
GO
RESTORE LOG [MyDB] FROM DISK = N'H:\DB_Backup\MyDB\MyDB_backup_2013_10_03_010001_5991547.trn' WITH FILE = 1, NORECOVERY, NOUNLOAD, STATS = 10
GO
RESTORE LOG [MyDB] FROM DISK = N'H:\DB_Backup\MyDB\MyDB_backup_2013_10_03_020001_2523547.trn' WITH FILE = 1, NORECOVERY, NOUNLOAD, STATS = 10
GO
RESTORE LOG [MyDB] FROM DISK = N'H:\DB_Backup\MyDB\MyDB_backup_2013_10_03_030000_9679547.trn' WITH FILE = 1, NORECOVERY, NOUNLOAD, STATS = 10
GO
RESTORE LOG [MyDB] FROM DISK = N'H:\DB_Backup\MyDB\MyDB_backup_2013_10_03_040001_7287547.trn' WITH FILE = 1, NORECOVERY, NOUNLOAD, STATS = 10
GO
RESTORE LOG [MyDB] FROM DISK = N'H:\DB_Backup\MyDB\MyDB_backup_2013_10_03_050001_4131547.trn' WITH FILE = 1, NORECOVERY, NOUNLOAD, STATS = 10
GO
RESTORE LOG [MyDB] FROM DISK = N'H:\DB_Backup\MyDB\MyDB_backup_2013_10_03_060001_0507547.trn' WITH FILE = 1, NORECOVERY, NOUNLOAD, STATS = 10
GO
RESTORE LOG [MyDB] FROM DISK = N'H:\DB_Backup\MyDB\MyDB_backup_2013_10_03_070000_8443547.trn' WITH FILE = 1, NORECOVERY, NOUNLOAD, STATS = 10
GO
RESTORE LOG [MyDB] FROM DISK = N'H:\DB_Backup\MyDB\MyDB_backup_2013_10_03_080001_5427547.trn' WITH FILE = 1, NORECOVERY, NOUNLOAD, STATS = 10
GO
RESTORE LOG [MyDB] FROM DISK = N'H:\DB_Backup\MyDB\MyDB_backup_2013_10_03_090001_7419547.trn' WITH FILE = 1, NORECOVERY, NOUNLOAD, STATS = 10
GO
RESTORE LOG [MyDB] FROM DISK = N'H:\DB_Backup\MyDB\MyDB_backup_2013_10_03_100001_5938796.trn' WITH FILE = 1, NORECOVERY, NOUNLOAD, STATS = 10
GO
RESTORE LOG [MyDB] FROM DISK = N'H:\DB_Backup\MyDB\MyDB_backup_2013_10_03_110001_3406796.trn' WITH FILE = 1, NORECOVERY, NOUNLOAD, STATS = 10
GO
RESTORE LOG [MyDB] FROM DISK = N'H:\DB_Backup\MyDB\MyDB_backup_2013_10_03_120001_1342796.trn' WITH FILE = 1, NORECOVERY, NOUNLOAD, STATS = 10
GO
RESTORE LOG [MyDB] FROM DISK = N'H:\DB_Backup\MyDB\MyDB_backup_2013_10_03_130000_7874796.trn' WITH FILE = 1, NORECOVERY, NOUNLOAD, STATS = 10
GO
RESTORE LOG [MyDB] FROM DISK = N'H:\DB_Backup\MyDB\MyDB_backup_2013_10_03_140001_5014796.trn' WITH FILE = 1, NORECOVERY, NOUNLOAD, STATS = 10
GO
RESTORE LOG [MyDB] FROM DISK = N'H:\DB_Backup\MyDB\MyDB_backup_2013_10_03_150001_2170796.trn' WITH FILE = 1, NORECOVERY, NOUNLOAD, STATS = 10
GO
RESTORE LOG [MyDB] FROM DISK = N'H:\DB_Backup\MyDB\MyDB_backup_2013_10_03_160000_9638796.trn' WITH FILE = 1, NOUNLOAD, STATS = 10
GO
附註:使用這項功能當然有些限制的
1. MSDB資料庫是OK的。
2. 要還原的資料庫日期存在備份組中,例如要還原的資料庫時間已超過備份組的時間,那就沒辦法做到。
3. 所以還是自己寫隻Restore程式或許會更方便。
[Windows Server] 主機突然發生所有的Service Port都正常,但執行相關程式都無法連接,最後主機就異常重開機
在此紀錄一下很像網路或是防火牆所造成的系統無法連線,實際上是Storage出問題。
資料庫突然無法連線,透過PING及TELNET Service Port皆正常,但是使用遠端桌面連線或是SSMS都會出現無法連線的錯誤訊息,沒過多久連PING都PING不到了,後來透過主機管理界面發現機器都藍底白字或是異常重開機,進入系統查看事件檢視器到底發生甚麼事情時,就發現每台出問題的主機事件檢視器都會有EMC PowerPath異常切換的錯誤發生(如下圖),切換不到一分鐘後系統就Crash了。
資料庫突然無法連線,透過PING及TELNET Service Port皆正常,但是使用遠端桌面連線或是SSMS都會出現無法連線的錯誤訊息,沒過多久連PING都PING不到了,後來透過主機管理界面發現機器都藍底白字或是異常重開機,進入系統查看事件檢視器到底發生甚麼事情時,就發現每台出問題的主機事件檢視器都會有EMC PowerPath異常切換的錯誤發生(如下圖),切換不到一分鐘後系統就Crash了。
2013年10月2日 星期三
[SQl Server] 資料庫異機還原後原帳號無法登入
將資料庫的備份檔案(*.bak)或是透過卸載下來的*.mdf搬移到另一台SQL Server後,透過RESTORE *.bak或是附加*.mdf方式還原資料庫後,當建立一組帳號與原SQL主機上的帳號一樣並賦予權限時會出現如下圖的錯誤訊息
透過SSMS圖形介面
透過SSMS的新增查詢
碰到此問題時可以透過SSMS連到還原後的資料庫,將結構描述及使用者中相關帳號都刪除後再賦予該帳號權限,但是若該帳號擁有物件的話是無法刪除的,所以又必須先將該帳戶擁有的物件移轉給其他帳號後才能刪除,這樣做還真的很麻煩。
會發生帳號名稱依樣但是就是無法Login的主要原因是,當帳號在建立時系統會產生一組對應的SID,當資料庫還原或是附加後,即便建立一組名稱相同的帳號其SID也不會一樣,所以也是無法使用該資料庫的。
所以過設定SID的方式來解決此問題,其步驟如下
1. 在來源端資料庫主機上先查出該帳號的SID,並把該SID記錄下來
指令:SELECT sid FROM [資料庫名稱].sys.syslogins WHERE name ='帳號名稱'
2. 到目的端資料庫主機上開啟SSMS查詢視窗後執行以下語法,執行完成後開啟該User屬性視窗的使用者對應,就會發現該有的權限及角色都會自動對應好,而且該帳號也可以順利登入資料庫主機(如下圖)。
指令:
USE [master]
GO
CREATE LOGIN [ao] WITH PASSWORD = N'ao',
DEFAULT_DATABASE = [AOMGR],
CHECK_EXPIRATION = OFF,
CHECK_POLICY = OFF,
SID = 0xECFF96DFC922EC45A164306BC8144CF8
GO
透過SSMS圖形介面
碰到此問題時可以透過SSMS連到還原後的資料庫,將結構描述及使用者中相關帳號都刪除後再賦予該帳號權限,但是若該帳號擁有物件的話是無法刪除的,所以又必須先將該帳戶擁有的物件移轉給其他帳號後才能刪除,這樣做還真的很麻煩。
會發生帳號名稱依樣但是就是無法Login的主要原因是,當帳號在建立時系統會產生一組對應的SID,當資料庫還原或是附加後,即便建立一組名稱相同的帳號其SID也不會一樣,所以也是無法使用該資料庫的。
所以過設定SID的方式來解決此問題,其步驟如下
1. 在來源端資料庫主機上先查出該帳號的SID,並把該SID記錄下來
指令:SELECT sid FROM [資料庫名稱].sys.syslogins WHERE name ='帳號名稱'
2. 到目的端資料庫主機上開啟SSMS查詢視窗後執行以下語法,執行完成後開啟該User屬性視窗的使用者對應,就會發現該有的權限及角色都會自動對應好,而且該帳號也可以順利登入資料庫主機(如下圖)。
指令:
USE [master]
GO
CREATE LOGIN [ao] WITH PASSWORD = N'ao',
DEFAULT_DATABASE = [AOMGR],
CHECK_EXPIRATION = OFF,
CHECK_POLICY = OFF,
SID = 0xECFF96DFC922EC45A164306BC8144CF8
GO
附註:
--查詢整個Instance下所有帳號SID
SELECT loginname, name, sid, dbname FROM master.sys.syslogins
--查詢某資料庫中所有使用者的SID
SELECT * FROM
[資料庫名稱].sys.sysusers
2013年9月29日 星期日
[SQL Server] 資料庫備份時發現執行狀態一直在SUSPENDED
執行資料庫備份排程發現執行時間比平常久,透過以下查了一下發現
透過sp_who2發現該session一直處於SUSPENDED
透過排程看只看到一直在執行中
所以以上兩者都沒辦法看到目前進度,所以可以透過一個sys.dm_exec_requests來查看目前執行的狀況,只要percent_complete欄位值有不斷在增加就沒問題了
範例:SELECT session_id,command, percent_complete FROM sys.dm_exec_requests WHERE session_id= 110
參考資料:http://technet.microsoft.com/zh-tw/library/ms177648.aspx
透過sp_who2發現該session一直處於SUSPENDED
透過排程看只看到一直在執行中
所以以上兩者都沒辦法看到目前進度,所以可以透過一個sys.dm_exec_requests來查看目前執行的狀況,只要percent_complete欄位值有不斷在增加就沒問題了
範例:SELECT session_id,command, percent_complete FROM sys.dm_exec_requests WHERE session_id= 110
參考資料:http://technet.microsoft.com/zh-tw/library/ms177648.aspx
訂閱:
文章 (Atom)



















