分類:SQL Server

SQL Server HA 移轉後,自動編號(auto increment)增跳1000

幫客戶建置 SQL Server Always On availability groups 之後,客戶發現一個讓他們困擾的問題:

當容錯移轉發生,資料庫服務移轉到另一個副本,再寫入資料後,設定自動增長編號的欄位值會直接跳到 1000,然後繼續 +1 增長。

以前沒注意到這情況,自己建 Lab 測試,同樣發生,如以下圖所示:

原來這是 SQL Server 的老問題,從 SQL Server 2017 之後,可以透過關閉 IDENTITY_CACHE,修正這問題。

但是 IDENTITY_CACHE 預設是開啟,這導致當容錯移轉發生,再寫入資料後,自動增長的編號會直接跳上 1000。

解決方式是,在所有 AG 節點主機的 SQL Server ,關閉 IDENTITY_CACHE。指令如下:

ALTER DATABASE SCOPED CONFIGURATION SET IDENTITY_CACHE = OFF
GO

參考
SQL SERVER – Identity Jumping 1000 – IDENTITY_CACHE

SQL Server Availability Group Listener 相關問題

Q1 : Multi-Subnet Failover Cluster 的 Listener 在 DNS 是一個 IP?

在 Multi-Subnet Failover Cluster ,WSFC 的 Cluster 在 DNS 只會有一筆 A record,即是 Owner node 的虛擬 IP

從容錯移轉叢集管理員可以看到,Owner node 的虛擬 IP 是上線,另一個 node 的虛擬 IP 是離線。

在 DNS 可以看到叢集名稱只有一個 IP 即是 Owner node 的虛擬 IP

當叢集核心資源移轉到另一個 node,DNS 叢集名稱對應的 IP 也會更換。

那麼在 Multi-Subnet Failover Cluster,Listener 的虛擬 IP 在 DNS 也是一個 IP?答案是多個 IP

從容錯移轉叢集管理員看到,Listener 虛擬 IP 在 Owner node 只會有一個虛擬 IP 上線

測試從一台沒有加入網域的主機 ping DNS Listener,只會回傳一個 IP,是在 Owner node 網段的虛擬 IP

移動可用性群組的叢集角色到另一個 node

Q2 : 從網域外的主機如何連線到可用性群組

伺服器名稱需要加入網域名稱;需使用 SQL Server 驗證

Q3 : AP 無法連線 Listener

比如 Java 開發的 AP,要連線 SQL Server 可用性群組的 Listener 失敗;或是可連上,但容錯移轉後,就連不上 SQL Server,特別是在多子網路的容錯移轉。

原因極可能是 JDBC Driver 不支援 SQL Server 可用性群組。

Microsoft JDBC Driver for SQL Server 4.0 版,連線到可用性群組的接聽程式(Listener)或容錯移轉叢集執行個體時,需指定 multiSubnetFailover=true。multiSubnetFailover 預設為 false。

Microsoft JDBC Driver for SQL Server 6.0版,新增了連線屬性 transparentNetworkIPResolution (TNIR),用來連線到可用性群組,特別是在多子網路,有多個虛擬 IP。當 transparentNetworkIPResolution = true 時,JDBC Driver 會嘗試連線到第一個可用的 IP 位址。 如果第一次嘗試失敗,驅動程式就會嘗試以平行方式連線到所有 IP 位址,直到逾時到期為止,當其中一個成功時,就會捨棄所有其他的連線嘗試。

Microsoft JDBC Driver for SQL Server 6.0版以上,transparentNetworkIPResolution 預設為 true。

基本上 Driver 連線過程是這樣:
1 問 DNS ,回傳所有 Listener IP
2 逐一用每個 IP 連線資料庫:如果連線失敗或 Timeout ,會用下一個 IP 嘗試連線

參考微軟官網文件:JDBC 驅動程式對於高可用性、災害復原的支援

參考

安裝 Power BI report server 使用 SQL Server Big Data Cluster

準備

  • SQL Server 2019 Big Data Cluster
  • Power BI Report Server (注意發行年份月份,2020年10月份版以上才可以使用 SQL Server BDC 作為 Power BI RS 的資料庫)
    下載 Microsoft Power BI Report Server- October 2020
  • 未加入網域的主機:Windows Server 2016

安裝

這裡有提到,需要SQL Server Database Engine Instance

注意一下:在2020年10月版,要安裝 Microsoft .NET 4.8

完成,重啟主機

設定

開啟 Report Server Configuration Manager

我使用虛擬服務帳戶。虛擬服務帳戶代表 Windows 服務。它是權限最低的內建帳戶,具有網路登入權限。 如果沒有可用的網域使用者帳戶,或想要避免因密碼到期原則所可能產生的任何服務中斷,建議使用此帳戶。

點選 Apply 啟動 Web Service URL

完成啟動 Web Service URL

連線資料庫,建立新的 report server database

我連線 SQL Server Big Data Cluster 的 SQL Server Master Instance Front-End

自訂 Report server database 名稱

點選 Apply 啟動 Web Portal URL

完成後,產生一個可以連線的網址

請備份 key,千萬記得保存密碼

以上設定完成,開啟 Power BI 網站,我建立了一個資料夾測試

開啟 SSMS 連線 SQL Server Big Data Cluster 的 SQL Server Master Instance Front-End,可以看到建立的 Report Server 資料庫

問題

1 報表伺服器本機用 IE 瀏覽 power bi 入口網站,出現權限不足
以系統管理員身分開啟 IE
2 在用戶端瀏覽器開啟power bi 入口網站,出現權限不足

在指定資料夾授予使用者權限,使用者僅可以瀏覽使用被授權的資料夾

在群組或使用者填入 網域使用者,授予權限

3 在 Power BI Configure Manager 設定資料庫,出現無法識別這台主機

當確認測試連線資料庫是正常,也用其他工具例如 SSMS 測試可以連線資料庫,但在【服務驗證】填入 SQL Server 驗證後,出現以下錯誤訊息:

這很可能是找不到 SQL Server BDC 的 Instance: 「master-0」

解決方式:
在本機 hosts 檔加入 IP 與 master-0,例如:10.0.5.0 master-0

SQL Server 建立與移轉維護計畫

這篇文紀錄在 SQL Server 2008 R2 建立維護計畫,移轉至 SQL Server 2017 的過程。維護計畫的自動執行是使用 SQL Server Agent,因此必須在 SQL Server 組態管理員確認有啟動。

在 SQL Server 2008 R2

1 啟動 SQL Server Agent

2 新增維護計畫

3 建立子計畫

  • 子計畫不要多,容易出問題。建議只要建一個,使用預設。

4 設定排程時間

5 設定工作

  • 打開工具箱:選擇「檢視」> 「工具箱」

  • 選擇要執行工作,例如「備份資料庫工作」,拖拉到右側空白處

  • 在備份資料庫工作以滑鼠點二下,開啟設定視窗

  • 設定

  • 開啟 SQL Server Integration Services,找「存放的封裝」> 「MSDB」>「Maintenance Plans」裡面有所有的維護計畫。

移轉維護計畫

我測試的是從 2008 R2 匯出 SSIS 封裝,匯入到 SQL Server 2017

1 從 2008 R2 匯出 SSIS 封裝

在 SSMS 連接 Integration Services 。

連接成功之後,選擇「存放的封裝」→「MSDB」→「Maintenance Plans」,可以看到所有維護計畫的封裝。

右鍵點選需要移轉的封裝,選擇「匯出封裝」

可以選擇檔案系統,設定要匯出要存放的目錄和檔案名稱,就可以將封裝匯出成一個檔案,將這個檔案複製到新環境再匯入,就可以完成封裝的移轉。

2 SQL Server 2017 匯入 SSIS 封裝

開啟 SSMS Integration Services 選擇匯入封裝

選擇從 2008 R2 匯出的 *.dtsx 檔,進行匯入。

匯入完成

但是,仍要檢查是否所有設定都正確移轉。

一些狀況發生:

  • 錯誤一:以下錯誤,很有可能是沒有安裝 SSIS 或服務沒有啟動。我用 SQL Server 組態管理員檢查,的確沒安裝。

  • 錯誤二:見下圖,錯誤描述是:存取被拒。也就是我們需要以系統管理員身分啟動 SSMS。

  • 錯誤三:見下圖,錯誤描述是:指定的服務並不是已安裝的服務。這是因為沒有使用正確的 SSMS 版本。SQL Server Integration Services 必須使用對應版本的 SSMS 開啟。例如:SQL Server 2016 需使用 SSMS v16.5.4。SQL Server 2017 需使用 SSMS v17.9.1。

我安裝的是 SQL Server 2017,改用 SSMS V17.9.1 就可以開啟 SQL Server Integration Services。

  • 錯誤四:SSIS 服務組態中指定的 SQL Server 執行個體不存在或是無法使用。當以 SSMS 連接 SSIS,展開「存放的封裝」>「MSDB」時候,出現這個錯誤。

可能是設定檔指定的資料庫連線方式不對。設定檔位置:

C:\Program Files\Microsoft SQL Server[版本號]\DTS\Binn\MsDtsSrvr.ini.xml。

以系統管理員身分開啟記事本,開啟 MsDtsSrvr.ini.xml。修改 ServerName。

<Folder xsi:type="SqlServerFolder">  
     <Name>MSDB</Name>  
     <ServerName>>.</ServerName>  
</Folder>  

ServerName 預設是【.】。

參考:

使用 Data Migration Assistant 移轉 SQL Server 資料庫與帳戶

Data Migration Assistant 是甚麼工具

Data Migration Assistant (DMA) 是微軟提供的 SQL Server 資料庫帳戶移轉工具。可以移轉的 SQL Server 資料庫版本如下:

來源資料庫版本:

  • SQL Server 2005
  • SQL Server 2008
  • SQL Server 2008 R2
  • SQL Server 2012
  • SQL Server 2014
  • SQL Server 2016
  • SQL Server 2017

目標資料庫版本:

  • SQL Server 2012
  • SQL Server 2014
  • SQL Server 2016
  • Windows 和 Linux 上的 SQL Server 2017
  • SQL Server 2019
  • Azure SQL Database 單一資料庫
  • Azure SQL Database 受控執行個體
  • 在 Azure 虛擬機器上執行的 SQL server

0 測試環境與項目

  • 來源主機環境:Windows Server 2008 R2 SP1,需有 .NET Framework 4.7.2以上
  • 目標主機環境:Windows Server 2016
  • 來源資料庫:SQL Server 2008 R2
  • 目標資料庫:SQL Server 2016
  • 移轉工具:Data Migration Assistant v5.0 (DMA)
  • 移轉項目:資料庫與帳戶

1 安裝 Data Migration Assistant

  • 軟體下載網址:https://www.microsoft.com/en-us/download/details.aspx?id=53595
  • 執行DataMigrationAssistant .msi檔案進行安裝

開啟 Data Migration Assistant

執行評估

我們先執行評估,看看評估情況

這一步是選擇移轉目標的 SQL Serve 版本,我們選 2016

填入連線資訊,記得勾選 Trust server certificate

選擇要評估移轉的資料庫

完成評估,這裡顯示沒有相容性問題

評估結果可以匯出為 *.csv 檔

只執行移轉帳戶

  • DMA 可以只移轉帳戶,可以移轉帳戶和密碼,其餘設定不一定可以全部移轉,移轉後需要手動設定。

  • 可以重複移轉帳戶至目標 SQL Server,但新資料不會覆寫 >_<。所以,如果來源 SQL Sever 帳戶改密碼,需到目標 SQL Sever 刪除同名帳戶,再執行移轉。

開啟 DMA,點選 Migration,Source 與 Target 都選 SQL Server。

填入來源資料庫目標資料庫的連線資訊

因為只要移轉帳戶,不要勾選任何資料庫。

這裡會列出可以移轉的帳戶,以及告知是否目標資料庫已經存在同名帳戶

測試到這裡出現警告,原因是我要移轉的帳戶所綁定的資料庫在目標SQL Server 並不存在。雖然有警告,該帳戶仍會移轉過去。

開啟 SSMS 連線到目標 SQL Server,可以看到帳戶已經移轉,包含密碼。

執行資料庫移轉

  • 必須要建立一個來源與目標主機共用資料夾

  • DMA 執行者(例如網域使用者)須有權限存取共用資料夾

  • DMA 需要有權限存取 SQL Server

  • 如果目標SQL Server 已有同名資料庫,無法移轉。

1 新增移轉

2 填入來源與目標 SQL Server 連線資訊

3 選擇要移轉的資料庫

DMA 的做法是,使用來源 SQL Server 備份出資料庫放在共用資料夾,再使用目標 SQL Server 從共用資料夾取出檔案還原資料庫。因此:

  • 必須建立一個來源與目標主機共用資料夾,DMA 要有權限可存取

  • DMA 需要有權限需有存取 SQL Server ,必須在「來源」與「目標」的 SQL Server Service 指定帳戶,給予 DMA 夠大的權限,我使用 Domain administrator。

DMA 設定如下:勾選要移轉的 DB,填入共用資料夾的網路路徑,點選下一步。

這裡一樣可以移轉帳戶,如果不需要,就不要勾選。點選 Start Migration。

完成移轉

以 SSMS 到目標 SQL Server 可以看到

參考