作者 Jeff 的所有文章

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

在Azure虛擬機的 Hyper-V 管理設置NAT

環境

Azure 虛擬機,作業系統:Windows Server 2019 DC。已安裝 Hyper-V。

建立內部交換器

以系統管理員身分開啟 PowerShell,建立名為 SwitchNAT 的【內部】虛擬交換器。 要注意的是,只能有一個 NAT 虛擬交換器。

New-VMSwitch -Name "SwitchNAT" -SwitchType Internal

紀錄虛擬交換器的 ifindex

查剛才建立的虛擬交換器的 ifindex,我們的例子是 17。

Get-NetAdapter

建立 NAT IP

假設Hyper-V 環境目標的虛擬機規劃網段是 192.168.0.X。我們可以設定 NAT IP 是 192.168.0.1/24。

所以以下指令參數 -PrefixLength 值=24; -InterfaceIndex 值是剛才建立的虛擬交換器的 ifindex = 17

New-NetIPAddress -IPAddress 192.168.0.1 -PrefixLength 24 -InterfaceIndex 17

建立 NAT network

規劃的網段是192.168.0.X,-InternalIPInterfaceAddressPrefix 值一般設置是 192.168.0.0/24

New-NetNat -Name "MyNATnetwork" -InternalIPInterfaceAddressPrefix 192.168.0.0/24

設置虛擬機 IP

01 將虛擬機網卡設置為剛才建立的 SwitchNAT 虛擬交換器

02 登入虛擬機,設定 IP

設定規劃的網段內 IP,例如:192.168.0.10。Default gateway 設置 SwitchNAT 的 IP,DNS 可以設置外部的 DNS,例如 google 的 DNS : 8.8.8.8

到這裡就完成了。

Windows 10 安裝 Ubuntu 20 失敗導致出現 Grub 錯誤 無法進入 Windows 開機

在我的 Windows 10 電腦安裝 Ubuntu 20,電腦只有一個硬碟,便將 Ubuntu 安裝其上。因為一些原因,結果 Ubuntu 安裝失敗。

當重啟電腦,直接進入 GRUB 錯誤:

只要輸入 exit ,就可以正常進入 Widnows 10。

問題是,要如何移除 grub bootloader?方法如下:

  • 1) 以系統管理員身分開啟「命令提示字元」,開啟 diskpart,指令如下
  • 2) diskpart
  • 3) list disk
  • 4) 選擇安裝系統的磁碟,我的例子是:select disk 0
  • 5) list partition
  • 6) 選擇系統(System),我的例子是:select partition 1
  • 7) 指派磁碟代號,assign letter=x
  • 8) 離開 diskpart:exit
  • 9) x:
  • 10) 列出目錄,dir
  • 11) 進入 EFI 資料夾,cd efi
  • 12) 列出目錄,dir
    看到裡面有 ubuntu 資料夾,grub 檔案就在裡面
  • 13) 刪除 ubuntu 資料夾,rd ubuntu /s
  • 14) 輸入Y 確定執行,然後輸入 exit 離開
  • 15) 重啟主機,將可直接進入 Windows 10 開機。