2018年9月14日 星期五

[Windows]清除過期檔案的好工具,forfile指令的應用

最近在下電腦d槽裡有許多過期的檔案分散在各個子目錄中,因為想空出多些空間想刪除這些無用的檔案,因為分散在各個子目錄總不能一個個點進去刪除吧?!
IT人應該是要想辧法將一些固定作業的SOP實作成自動化排程,因此曾經看過有forfile指令似乎還不錯用。

使用範例如下:

刪除D槽TempFiles目錄底下(含子目錄),所有100天之前的檔案

forfiles /p d:\TempFiles /s /m *.* /d -100 /c "cmd /c del @file"

參數說明:
    /P    pathname 表示要開始搜尋的路徑。預設資料夾是目前的目錄 (.)。
    /M   searchmask 根據 searchmask 搜尋檔案。預設的 searchmask 是 '*'。
    /S    指示 forfiles 遞迴搜尋子目錄。例如 "DIR /S"。
    /C    command 表示每個檔案要執行的命令。命令字串應該包含在雙括號之間。
                             預設的命令是 "cmd /c echo @file"。
    /D    date          選取上次修改日期大於或
                        等於 (+),或小於或等於 (-)
                        指定日期 (使用
                        "yyyy/MM/dd" 格式指定) 的檔案; 或選取
                        上次修改日期大於或等於 (+)
                        目前日期加上 "dd" 天,或
                        小於或等於 (-) 目前日期減去
                        "dd" 天的檔案。有效的 "dd" 可以
                        是介於 0 - 32768 之間的數字。
                        如果未指定,"+" 將被視為預設符號。

2018年9月1日 星期六

[SQL]把找到的資料轉成HTML格式

在SQL實務應用上,相信不少人都會把抓出來的特定資料再透過email寄出來吧?
此時如果能轉成HTML格式會更方便閱讀,以下將分享使用FOR XML方式來達成此需求。

--建立測試資料
IF OBJECT_ID('#TT','U') IS NOT NULL
 DROP TABLE #TT
CREATE TABLE #TT 
(
   id INT,
   name VARCHAR(20),
   sex char(1),
   memo VARCHAR(50),
   cr_date datetime default(getdate())
)

INSERT INTO #TT 
(id,name,sex,memo)
VALUES
(1,N'John',N'M',N'test11111'),
(2,N'Lee',N'F',N'test22222'),
(3,N'Penny',N'F',N'test33333'),
(4,N'Wade',N'M',N'test444444'),
(5,N'James',N'M',N'test55555')

DECLARE @Content VARCHAR(MAX)
--將所有欄位名稱設成TD,再以''分隔
SET @Content = CAST((SELECT name AS 'TD','',
CASE sex WHEN 'M' THEN '男性' WHEN 'F' THEN '女性' END as 'TD','',
memo AS 'TD',''
FROM #TT
FOR XML PATH('tr'),TYPE) AS VARCHAR(MAX))

DECLARE @HTML VARCHAR(MAX)
SET @HTML='<HTML><BODY><TABLE border=1><TH>姓名</TH><TH>性別</TH><TH>MEMO</TH>'+@Content+'</TABLE>'

SELECT @HTML

[SQL Server][HA]鏡像應用Q&A

在上一篇文章己經把鏡像同步建立好了,
接著分享在資料庫維運時可能遇到的鏡像操作問題。
問題一、原本的主機發生問題(如硬碟故障或其它硬體有問題時),如何切換到備援機?
可以連至主機進行鏡像手動容錯移轉(manual failover)至備援機
USE [master]
ALTER DATABASE [APPSYS] SET PARTNER FAILOVER;
如果仍無法移轉,在容許資料遺失的情況下可執行以下指令
USE [master]
ALTER DATABASE MyDB SET PARTNER FORCE_SERVICE_ALLOW_DATA_LOSS 
或者至備援機斷開鏡像。
--連至備援端DB移除資料庫鏡像
USE [master]
--中斷鏡像同步後,如主體端DB沒有做過Log備份,都可以再次設定鏡像同步
ALTER DATABASE [APPSYS] SET PARTNER OFF;
--將資料庫恢復成RECOVERY模式,可進行存取的狀態
RESTORE DATABASE [APPSYS] WITH RECOVERY;

問題二、如何監控鏡像同步的情況?
可查詢sys.database_mirroring查詢當下鏡像的情況:
select db_name(database_id) as '資料庫名稱',mirroring_state_desc as '鏡像狀態' from sys.database_mirroring
where mirroring_state is not null
鏡像狀態可能的狀態有:
Unknown、正在同步處理、已同步處理、已暫停、已中斷連接
只要透過排程(Job)來定期執行以上語法,再判斷回傳鏡像狀態為己暫停或是己中斷連接時,
即發送通知給相關人員即可。

問題三、鏡像機制中斷後重建時要注意什麼?
在鏡像中斷後,只要主體端無任何備份(導致交易紀錄截斷)
仍可以直接進行鏡像同步,無需在備援機再次還原DB。
但假如主體端己經過做備份,則是仍須要到主體端備份DB後再至備援機進行DB還原才可以進行鏡像同步。

問題四、假設己容錯移轉至備援機,如何讓前端系統程式能使用相同的登入帳號(Login)?
在主體端可以使用微軟(KB提供的語法建立二支Store Procedure:sp_hexadecimal、sp_help_revlogin,
再執行exec sp_help_revlogin可顯示全部Login的建立Script,再拿去備援機執行即可複製Login。
exec sp_help_revlogin
--顯示Login Create Script
--CREATE LOGIN [tt01] WITH PASSWORD = 0x01005B429E7F53752B8B2B8DE7D5F97512738BA25CC527490C78 HASHED, SID = 0x51236A2E950F2A4680B087495907AFE3, DEFAULT_DATABASE = [APPSYS], CHECK_POLICY = ON, CHECK_EXPIRATION = OFF
問題五、如果遇到主機需要進行硬體維修或網路中斷時,可透過鏡像暫停和繼續來避開作業時間。
--暫停鏡像,以利後續作業
ALTER DATABASE APPSYS SET PARTNER SUSPEND;
--恢復鏡像
ALTER DATABASE APPSYS SET PARTNER RESUME;
--需等待後續的資料同步完成

參考資料:

[SQL Server]TempDB的基本調教

TempDB可以想像是SQL Server放在硬碟的暫存檔一樣,
除了在記憶體不足時將會使用TempDB來做運算之外,
在其它SQL Server會使用到TempDB的情況如下:
1.在下SQL Query時使用Group by, Order by,Union,distinct,sort等。
2.最常見的是Query中使用暫存表(#table_name or ##table_name)來做運算,切記使用後記得要drop暫存表以免TempDB愈長愈大
3.rebuild index,DBCC checkDB以及使用cursor時。

如何觀察TempDB是否引起IO latch?

有時侯在查看活動監視器時會發現CPU Loading會拉高到80%以上並持續一段時間,
此時可以輸入以下SQL Query來看是不是太多DB在等待使用TempDB,因而導致CPU在等待IO回應。
Select session_id, wait_type, wait_duration_ms, resource_description From sys.dm_os_waiting_tasks Where (wait_type like 'pagelatch_%' or wait_type like 'pageiolatch_%') and resource_description like '2:%'
那麼該如何減少多個DB去搶TempDB的資源的情況發生呢?
依照微軟的建議的作法,需要依照該台主機的CPU總Core數/2的數量來建立TempDB資料檔案,
例如總共有8 Core/2則要建立4個TempDB資料檔案,其建立的Script如下:
USE [master] GO ALTER DATABASE [tempdb] ADD FILE ( NAME = N'temp2',  FILENAME = N'E:\Program Files\Microsoft SQL Server 2016\MSSQL13.MSSQL2K16\MSSQL\DATA\temp2.ndf'SIZE = 8192KB , FILEGROWTH = 65536KB ) GO ALTER DATABASE [tempdb] ADD FILE ( NAME = N'temp3',  FILENAME = N'E:\Program Files\Microsoft SQL Server 2016\MSSQL13.MSSQL2K16\MSSQL\DATA\temp3.ndf'SIZE = 8192KB , FILEGROWTH = 65536KB ) GO --⋯⋯⋯⋯⋯⋯以此類推下去
TempDB如果要加強讀寫速度,建議可以規劃將檔案分散建立在不同的硬碟。

[SQL Server]主動通知SQL Server發生錯誤的機制

當SQL Server有特定錯誤發生時,管理人員也沒有時間經常去查看SQL Server錯誤檔, 於是有時特定錯誤可能很重要時,但卻沒有人被通知到,現在小弟實作一個主動通知的機制。 首先先新增警示,在這裡選擇想要被通知的錯誤訊息的等級或其它設定 接著在回應頁籤中,勾選執...