2014年4月29日 星期二

如何還原單一頁面毀損的情況

        在前面我已有二篇文章介紹到如何進行資料庫的修復,但是由於有許多的客戶資料庫短期內排定時間進行停機的修復,為了達到最少停機時間,所以客戶請我們確認如何進行單一頁面修正的方式,所以我將這個方式詳細的整理如下,希望大家可以多多利用。


其他參考文章:
如何修復一個 Suspect Database
http://caryhsu.blogspot.tw/2011/10/suspect-database.html
SQL Server 最佳案例 - 如何修復一個有問題的資料庫 (Suspect Database)
http://caryhsu.blogspot.com/2011/07/sql-server-suspect-database.html


1、在這我找了一個有毀壞的資料庫,當我進行查詢時,就會發生下列的錯誤。

很明顯的,你可以看到系統會發生一個(824) 的錯誤,其中最重要的是你可以看到頁面(1:143)有發生毀損。


2、相同的,你可以看到在SQL Server中也會看到相關 (824) 的錯誤訊息。

3、我們也可以透過 msdb..suspect_pages 的系統資料表來確認,你可以發生資料表也會出現一筆相同的錯誤資訊。

4、由於無法查詢,所以我們可以嘗試透過下列的語法來查過目前的頁面(1:143)的內容資訊。

語法:
dbcc traceon(3604)                 --啟用dbcc page的訊息顯示
dbcc page(broken, 1, 143, 3)

上述 [broken] 是我的資料庫名稱。



5、接下來最重要的,我們來開始進行資料庫的修復,基本上如果你是SQL 2012 (含) 以上的版本,非常的恭喜你,你可以透過介面的方式直接設定,但如果是 2005 or 2008 or 2008R2的版本時,你也可以透過語法的方式直接進行。

5-1 透過SQL語法:
Restore Database broken Page = ‘1:143’ FROM Disk = ‘你之前備份的路徑’;

5-2 透過介面進行(For 2012)
點選資料庫(broken)右鍵 -> 工作 -> 還原 -> 頁面

完成後即可直接快速的只針對單一頁面進行,但其實在頁面還原上還是有許多的限制,建議你在使用前還是評估一下會比較好。


頁面還原限制:
  • Transaction log
  • Allocation pages: 
    • Global Allocation Map (GAM) pages
    • Shared Global Allocation Map (SGAM) pages
    • Page Free Space (PFS) pages
  • Page 0 of all data files (the file boot page)
  • Page 1:9 (the database boot page)
  • Full-text catalog


其他參考文章:
如何修復一個 Suspect Database
http://caryhsu.blogspot.tw/2011/10/suspect-database.html
SQL Server 最佳案例 - 如何修復一個有問題的資料庫 (Suspect Database)
http://caryhsu.blogspot.com/2011/07/sql-server-suspect-database.html
Performing Page Restores
http://technet.microsoft.com/en-us/library/ms175168(v=sql.100).aspx


關鍵字:SQL ServerSuspect824、Restore Page、DBCC Page

2014年4月24日 星期四

如何透過程式的方式將ReportingService的報表匯出並指定格式

        最近接到客戶的需求,需要可以直接將Reporting Service 2012上的報表,透過程式的方式,直接以Excel匯出,相信有經驗的使用者都知道可以透過Reporting Service上的Web Service來進行,所以本篇我們來介紹一下如何來進行。

1、報表輸出資訊:
下列是我們希望匯出的報表資訊。

2、當開啟專案後,先加入第一個Web Service。

路徑請輸入:http://myreportserver/reportserver/reportservice2005.asmx
參考名稱請使用預設值


3、依序再加入第二個Web Service

路徑請輸入:http://myreportserver/reportserver/reportexecution2005.asmx
參考名稱:ReportExecutionService

4、接著再將下列的程式碼輸入即可,如果你要進行測試時,請修改下列的程式行。


  • 17行 ->  rs.Credentials = new System.Net.NetworkCredential("caryhsu", " p@ssword ", " microsoft "); 
    • 請依序輸入使用者名稱、密碼、DomainName
  • 20行 ->  string reportPath = "/ssrs_render_test";
    • 報表名稱
  • 26行 ->  string fileName = @"c:\share\ssrs_render_test.xls";
    • 輸出的位置
  • 33行 ->  rsExec.Credentials = new System.Net.NetworkCredential("caryhsu", "p@ssword", "microsoft");
    • 請依序輸入使用者名稱、密碼、DomainName
  • 41+42行 -> 報表參數
    •  parameters[0].Name = "PurchaseOrderID";  >> 報表參數 -> 欄位名稱
    •  parameters[0].Value = "2";  >> 報表參數 -> 欄位值                                                  


程式碼範例:
// Create object and set credential to RSservice
ReportExecutionService.ReportExecutionService rsExec = new ReportExecutionService.ReportExecutionService();
WebReference.ReportingService2005 rs = new WebReference.ReportingService2005();
rs.Credentials = new System.Net.NetworkCredential("caryhsu", "p@ssword", "microsoft");

// Render arguments
string reportPath = "/ssrs_render_test";     //path is from root(ReportServer)
string format = "EXCEL";                     //Export Format
string deviceInfo = null;
string extension;
string[] streamIDs;
ReportExecutionService.Warning[] warnings;
string fileName = @"c:\share\ssrs_render_test.xls";
string encoding;
string mimeType;

try
{
// Load the report.
rsExec.Credentials = new System.Net.NetworkCredential("caryhsu", "p@ssword", "microsoft");              
ReportExecutionService.ExecutionInfo info = rsExec.LoadReport(reportPath, null);
WebReference.ReportParameter[] rsparameters = rs.GetReportParameters(reportPath, null, false, null, null);

if (rsparameters.Length > 0)
{
ReportExecutionService.ParameterValue[] parameters = new ReportExecutionService.ParameterValue[1];
parameters[0] = new ReportExecutionService.ParameterValue();
parameters[0].Name = "PurchaseOrderID";
parameters[0].Value = "2";

rsExec.SetExecutionParameters(parameters, "en-us");
}


byte[] reportBytes = rsExec.Render(
format,
deviceInfo,
out extension,
out mimeType,
out encoding,
out warnings,
out streamIDs);

// Write report bytes to a file.
using (FileStream stream = File.OpenWrite(fileName))
stream.Write(reportBytes, 0, reportBytes.Length);
}
catch (SoapException e)
{
Console.WriteLine(e.Detail.OuterXml);
}      


參考連結:
Available Rendering Extensions (Reporting Services)
http://technet.microsoft.com/en-us/library/cc627537(v=sql.100).aspx
Render Method
http://technet.microsoft.com/en-us/library/aa258532(v=sql.80).aspx

關鍵字:Reporting ServiceRenderReportExecutionService

2014年4月18日 星期五

TFS安裝 - TF400102錯誤排除

先前在嘗試著安裝Team Foundation Server(TFS) 2012時,但是在安裝完成後一直出現安裝不完成,從錯誤上來看,是發生TF400102與TF255466的錯誤,在嘗試安裝多次後都一直遇到相同的情況,在後來不斷的Troubleshooting後,終於找到解決的方法,所以我將方法整理如下。


1、從錯誤上來看,好像是由於有另一支的安裝程式在執行中,所以造成安裝失敗。


2、從工作管理員上來看,的確有一支程式 msiexec.exe 在執行中,但是我嘗試手動將此程式結束,而且也再次啟動TFS的安裝,但錯誤訊息還是相同,而且過不久, 程式又會再啟動。

3、後來我終於查到此問題主要是由於SQL Server 2012所造成,如下列的訊息所示。

Windows 安裝程式在安裝 SQL Server 2012 SP1 之後重複開始

4、解決方法很簡單,只需安裝下列的SQL Server 2012 SP1 CU2的更新後,再重新啟動電腦,此問題即可解決,當然安裝TFS的安裝也就可以自然的正常進行。

SQL Server 2012 Service Pack 1 的累積更新套件 2


關鍵字:SQL ServerTFSTeam Foundation ServerTF400102TF255466



2013年9月1日 星期日

如何切換叢集的仲裁模式至節點與檔案共用多數

        相信在前面的幾篇文章中,大家已經知道如何架設AlwaysOn,也其了解與其他高可用性功能之間的差異,如果大家還是是不熟的話,可以參考下列的文章,因為陸續接到許多的網友來信問到關於AlwaysOn在沒有Quorum Disk是否仍可以進行Auto-Failover的部份,所以本篇我就來實際的介紹一下,如何將原本的 [節點與磁碟多數] 變更成 [節點與檔案共用多數],如此一來即可在不需要Quorum Disk的情況下進行運作。

參考文章:
SQL Server 2012 AlwaysOn vs. Database Mirroring
http://caryhsu.blogspot.tw/2012/04/sql-server-2012-alwayson-vs-database.html
SQL Server 2012 新功能 - AlwaysOn安裝與設定
http://caryhsu.blogspot.tw/2012/04/sql-server-2012-alwayson.html
SQL Server - AlwaysOn連線設定
http://caryhsu.blogspot.tw/2012/04/sql-server-alwayson.html

1、我們以最小的三台架構來進行,也就是二台節點與一台AD伺服器,一開始我們先在AD的目錄下設定一個檔案分享,分稱為 [sync_folder],並且選擇 [共用] -> [進階共用]。


2、請勾選 [共用此資料夾],並進行權限的設定。

3、此處需要指定 Cluster 的 Virtual Server Name進行設定,並設定為完全控制。

4、相同的在 [安全性] 的頁次中,也請將Virtual Server Name也一同設定進去,權限也是相同為[完全控制]。

5、開啟容錯移轉叢集管理員 -> Cluster Name -> 其他動作 -> 設定叢集仲裁設定

6、直接點下一步

7、選擇 [節點與檔案共用多數]

8、指定在AD伺服器上設定的共用目錄。

9、確認說明

10、設定仲裁設定。

完成上述的動作後,您可以嘗試著將原本的Quorum Disk下線或進行Failover確保動作是否可以正常的運作,其實上述的動作建議在你的節點只有二個的情況下選擇這個方式,當你有多個節點時,建議還是透過Quorum Disk來進行仲裁才會比較好。

參考連結:
Understanding Quorum Configurations in a Failover Cluster
http://technet.microsoft.com/en-us/library/cc731739.aspx
Failover Cluster Step-by-Step Guide: Configuring the Quorum in a Failover Cluster
http://technet.microsoft.com/zh-tw/library/cc770620(v=ws.10).aspx

關鍵字:SQL ServerQuorum DiskQuorum configurationAlwaysOn

2013年8月17日 星期六

如何搬移使用者資料庫到其他的磁碟上

資料庫在建立時都會選擇你要將檔案放置在那一個磁碟上,但如果遇到如空間不足或是磁碟效能不足時,就需要將資料庫轉移到其他的磁碟上,下列我們就介紹如何進行資料庫的轉移作業。

1、查詢資料庫的名稱與檔案路徑的資訊
--切換目前資料庫
use  dbname
go

--列出目前資料庫的檔案資訊
sp_helpfile
go



2、將緩衝資訊寫回MDF檔案中
checkpoint

這點非常重要,可以將目前緩衝的資訊立即寫回MDF檔案中,藉以加快後續的作業。

3、將資料庫設定成離線狀態
alter database dbname set offline
go

--此步驟可能會因為有人在使用中,所以無法切換完成,如果一直都無法切換完成時,建議可以將前端的應用程式先行停用,以免應用程式不斷的連線資料庫,造成連線失敗。

4、手動複制MDF與LDF檔案至新的磁碟上

5、更改檔案位址
use master
go
Alter database dbname modify file (name = dbname, filename = 'physical path')
go
Alterdatabase dbname modify file (name = dbname _log, filename = 'physical path')
go

6、資料庫設定成上線狀態
alterdatabase dbname set online
go


參考連結:
How to use Detach and Attach functions to move SQL Server databases
http://support.microsoft.com/kb/224071/en-us
Overview of Checkpoints
http://msdn.microsoft.com/zh-tw/library/ms189573.aspx


關鍵字:SQL ServerMove User Database