The Will Will Web

記載著 Will 在網路世界的學習心得與技術分享

SQL Server 2012 Express LocalDB (SqlLocalDB) 深入剖析

微軟最新推出的 SQL Server 2012 Express LocalDB 是一種 SQL Server Express 的執行模式,特別適合用在開發環境使用,也內建在 Visual Studio 2012 之中。由於這種 SQL Server 的執行模式跟以往非常不同,我發現許多人不太清楚 LocalDB 的使用與管理方式,有必要專文介紹 SqlLocalDB 的相關知識。

關於 SQL Server 2012 Express LocalDB 的運作方式

在安裝 LocalDB 時會複製一個 SQL Server Express 執行個體所需的最少檔案,基本上 LocalDB 幾乎等同於完整的 SQL Server Express 資料庫引擎,且 LocalDB 方式啟動的 SQL Server Database Engine 執行個體與 SQL Server Express 具有相同的限制 (因為跟 SQL Server Express 共用相同的檔案),但 LocalDB 由於簡化了管理,所以比 SQL Server Express 還多了一些限制,不過這些限制通常不影響開發。相較於舊版的 SQL Server 2008 Express 來說,兩者有些差異性,比較如下:

  • SQL Server 2008 Express
    • 安裝 SQL Server 2008 Express 的過程時間花得比較久
    • 透過 SQL Server 2008 Express 安裝程式一次只能安裝一個 SQL 執行個體 (Instance),若要安裝更多執行個體則必須在執行一次 SQL Server 2008 Express 安裝程式
      註:預設執行個體名稱為 SQLEXPRESS
    • 需透過 SQL Server 組態管理員Windows 服務管理員 啟動該執行個體
  • SQL Server 2012 Express LocalDB
    • 安裝 SQL Server 2012 Express LocalDB 的過程非常快 (安裝時間非常短)
    • 安裝 SQL Server 2012 Express LocalDB 完後,預設會有個自動執行個體v11.0,但之後若要建立其他執行個體不再需要執行安裝程式,只需透過 SqlLocalDB.exe 工具程式即可任意建立新的執行個體,建立一個執行個體的時間不超過 3 秒
    • 可透過特殊的連接字串自動啟動該執行個體,或可透過 SqlLocalDB.exe 工具程式啟動,應用程式不需複雜或耗時的組態工作即可開始使用資料庫!
    • 在同一台主機裡,每個使用者都可以建立自己的 LocalDB 執行個體,每個執行個體是以不同使用者身分執行不同處理序,所以不同使用者可有同名的執行個體

SQL Server 2012 Express LocalDB 區分兩種執行個體類型,分別為:

  • LocalDB 自動執行個體 ( Automatic Instances )
    • LocalDB 自動執行個體是公用的。
    • 安裝完 LocalDB 後的 v11.0 就是自動執行個體,雖然感覺只有一個執行個體,但是由於在同一台主機裡,每個使用者都可以建立自己的 LocalDB 執行個體,所有使用者雖然都有同名的 v11.0 的執行個體,但彼此都是獨立分開的處理序(Process)。這些執行個體會自動為使用者建立及管理,並且可供任何應用程式使用。
    • 使用者電腦上安裝的每一個 LocalDB 版本各存在一個 LocalDB 自動執行個體。未來如果還有下一版 SQL Server 2012 Express LocalDB 出現,就會再有新的執行個體名稱可用,預設自動執行個體名稱是一個 v 字元後面接著 xx.x 格式的 LocalDB 發行版本號碼。 例如,v11.0 代表 SQL Server 2012。
  • LocalDB 具名執行個體 ( Named Instances )
    • LocalDB 具名執行個體是私用的。
    • 這些執行個體是由該負責建立及管理該執行個體的使用者或特定單一應用程式所擁有。
    • 不同使用者預設無法存取自訂的 LocalDB 具名執行個體,除非你手動建立具名執行個體的分享功能,開啟分享功能後就可以讓其他使用者存取該具名執行個體的資料庫。

 

了解 SQL Server 2012 Express LocalDB 執行個體的資料庫檔案所在路徑

在安裝好 SQL Server 2012 Express LocalDB 之後,預設會有個執行個體名為 v11.0,該執行個體的相關檔案所在目錄通常位於以下目錄 ( 請將 <user> 替換成你的登入帳號 )

C:\Users\<user>\AppData\Local\Microsoft\Microsoft SQL Server Local DB\Instances

或用 %LOCALAPPDATA% 環境變數進入該目錄比較方便:

%LOCALAPPDATA%\Microsoft\Microsoft SQL Server Local DB\Instances

以下是顯示該目錄的圖示,這裡會列出所有 LocalDB 的執行個體:

在此目錄 ( v11.0 ) 下所看到的檔案都是執行個體的相關檔案,系統資料庫檔案、錯誤紀錄、紀錄追蹤、加密金鑰、…等等,不過若你在 LocalDB 執行個體中建立使用者資料庫時,必須要明確指定其資料檔與記錄檔的路徑,否則預設所有建立的資料庫都會位於 %USERPROFILE% 目錄下 ( C:\Users\<username> )

 

建立 SQL Server 2012 Express LocalDB 具名執行個體

你可以想像一下,一個 SQL 資料庫執行個體就如同一台完整的 SQL Server 資料庫伺服器,在一個執行個體裡面會有自己的系統資料庫 (master, msdb, model, temp),就跟我們一般在使用 SQL Server 沒有什麼兩樣,當你建立額外的 LocalDB 執行個體的話,這些系統資料庫就會跟另一個具名執行個體完全獨立開來,彼此完全互不影響。

就開發的角度來說,你甚至可以在開發測試的環境裡建立一套跟客戶端正式主機完全相同的資料庫環境,光是這一點就與以往的 SQL Server Express 差別甚大,也是新版 LocalDB 真正厲害的地方!

在建立新的 LocalDB 執行個體之前,必須先了解 SqlLocalDB.exe 工具程式的路徑,請參考以下路徑:

C:\Program Files\Microsoft SQL Server\110\Tools\Binn\SqlLocalDB.exe
       

以下是建立 LocalDB 執行個體的指令,其中 “Projects” 是你可以自行命名的執行個體名稱:

SqlLocalDB.exe create Projects

 

接著我們透過指令列出所有 LocalDB 已經建立的所有執行個體,並查看特定執行個體的相關資訊:

SqlLocalDB.exe info
SqlLocalDB.exe info Projects

 

接著我們在看看文章稍早介紹過的實體檔案路徑,你將會發現多了一個目錄,我們用 %LOCALAPPDATA% 環境變數進入該目錄看看:

%LOCALAPPDATA%\Microsoft\Microsoft SQL Server Local DB\Instances

 

進入該目錄就會看到如同 SQL Server 完整版一樣有這些系統資料庫檔案、錯誤紀錄、紀錄追蹤、加密金鑰、…等等,如下圖示:

 

 

共用 SQL Server 2012 Express LocalDB 具名執行個體

由於同一台主機裡,每個使用者都可以建立自己的 LocalDB 具名執行個體,且不同使用者之間彼此都是獨立分開的處理序(Process)在執行這個執行個體,所以預設的情況下不同使用者之間無法連接不同使用者建立的具名執行個體,這也是一個基本的安全防護機制。

若今天你需要必須讓同一台電腦多個不同的使用者連接特定使用者的具名執行個體的話,就必須以 系統管理員 權限建立共用名稱,如此一來才能讓其他使用者連接。

我們先來看看執行 SqlLocalDB.exe 時所顯示的說明頁面:

其建立共用與取消共用的步驟如下:

1. 設定共用具名執行個體

  你可列出有哪些具名執行個體,然後在指定特定執行個體一個分享名稱:

SqlLocalDB.exe info
SqlLocalDB.exe share "will" "Projects" "ProjectsShare"
  • “will” 是執行個體處理序的執行身分識別
  • ”Projects” 是執行個體名稱
  • ”ProjectsShare” 是共用名稱

2. 取消共用具名執行個體

我們再看一次 SqlLocalDB.exe 顯示的說明頁面  這裡 unshare 的中文翻譯其實是有問題的!因為執行 unshare 的時候,輸入的參數應該是 “私用名稱” 才對,但文件卻寫 ”共用名稱”!

SNAGHTML27b0b579

以下是執行取消共用的指令範例:

SqlLocalDB.exe unshare "Projects"

以下是建立共用與取消共用的指令執行圖示:

 

連接 SQL Server 2012 Express LocalDB 執行個體

由於 SQL Server 2012 Express LocalDB 透過特殊的連接字串自動啟動該執行個體,以前我們連接本機 SQL Server 都會用 (local) 當成伺服器名稱,或用 (local)\執行個體名稱 這種格式也蠻常見的。

當你安裝 LocalDB 後,如果要透過 Management Studio 管理該執行個體,建議使用 SQL Server 2012 Management Studio 進行連接,因為用新版的 Management Studio 可以使用新的連接字串來連接 LocalDB 執行個體,其伺服器名稱的格式變成:(localdb)\執行個體名稱,如下圖示:

這時你可能會納悶問說:「我好像還沒啟動資料庫耶?怎麼就直接連線了?連得上嗎?」

SQL Server 2012 Express LocalDB 執行個體比較特殊,當你透過 SQL 用戶端嘗試連接 LocalDB 執行個體時,該執行個體就會自動啟動,無須事先手動啟動你想連接的 LocalDB 執行個體。

當你用 Management Studio 連接 (localdb)\v11.0 之後,可以開啟【工作管理員】起來看看,這時你將會發現有個用目前登入者身分執行的 sqlservr.exe 執行個體程序已被啟���,由於這是一個獨立的 SQL 執行個體,因此吃記憶體的能耐也是跟以前差不多的,你只要把 LocalDB 執行個體想像成一台獨立的 SQL Server Express 執行個體就對了!

連接後的畫面與所有功能將會與 SQL Server Express 完全一樣:

如果你想用舊版的 Management Studio ( SQL 2008 之前的版本 ) 連接 LocalDB 執行個體,那就稍微麻煩一些,你必須先利用 SqlLocalDB.exe 的 start 命令手動啟動 LocalDB 具名執行個體,再用 info 命令取得這個執行個體的管道名稱(pipe name):

SqlLocalDB.exe start v11.0
SqlLocalDB.exe info v11.0

請注意:唯有已啟動的 LocalDB 執行個體才會有管道名稱,而且每次重新啟動執行個體都會有不同的管道名稱,這也是麻煩的地方。所以還是建議各位改裝 SQL Server 2012 Management Studio 比較方便些。

以下是我用 SQL Server 2008 Management Studio 連接 LocalDB 執行個體的連線畫面:

如果要透過 .NET 程式連接 LocalDB 執行個體的話,最簡單的方式就是連接到目前使用者所擁有的自動執行個體,在不指定資料庫的情況下其連接字串如下:

Server=(localdb)\v11.0;Integrated Security=true

請注意:每個執行個體都是以不同使用者身分執行的不同處理序,所以以上這段連線字串在同一台主機裡使用時,其 UserA 與 UserB 所連接的將會是完全不同的執行個體。

如果你想要指定資料庫連接的話,可以參考以下連線字串:

Server=(LocalDB)\v11.0; Integrated Security=true; AttachDbFileName=D:\Data\MyDB1.mdf

如果要連接共用的具名執行個體,其連線字串中的 Server 參數 的格式必須有所不同,範例如下:

(localdb)\.\ProjectsShare

 

停止 SQL Server 2012 Express LocalDB 執行個體

我們已經知道 SQL Server 2012 Express LocalDB 執行個體會在用戶端嘗試連接時自動啟動,但何時才會停止執行呢?其實停止執行個體有兩種方法:

  1. 只要該執行個體沒有任何 Active 的連線,過幾分鐘該執行個體就會自動停止 ( 該程序會自動消失 )
  2. 可以透過 SqlLocalDB.exe 工具程式強迫停止特定執行個體,如下指令:
    SqlLocalDB.exe stop v11.0
          

 

SQL Server 2012 Express LocalDB 與其他 SQL Server 版本的比較

在 SQL Server 2012 問世之前,SQL Server 依據不同的執行環境各有推出不同的版本,在執行上也有不同的限制,例如:

  • SQL Server Enterprise ( 企業版,適合大量資料或高可用性環境 )
  • SQL Server Standard   ( 標準版,適合用在一般資料庫處理環境 )
  • SQL Server Express    ( 輕量版,適合用在單機或小量資料庫的環境 )
  • SQL Server Compact   ( 精簡版,又稱 SQL CE,適用於行動化或嵌入式系統環境 )

而 SQL Server 2012 Express LocalDB 又是甚麼樣的一個定位呢?我將依據其資料庫系統複雜度加以重新排序過如下:

  • SQL Server Enterprise > Standard > Express > LocalDB > Compact

由於 SQL Server 2012 Express LocalDB 跟前版的 SQL Server 2008 R2 Express 很像,其中的限制有:

  • LocalDB 的執行個體定序設定為 SQL_Latin1_General_CP1_CI_AS,無法變更。
    • 但支援資料庫層級資料行層級運算式層級定序。
    • 也就是說,你只要在建立資料庫時指定其定序即可,或是掛載其他資料庫系統移過來的資料庫檔案,或還原自其他資料庫的備份檔也都不會有問題。
    • 自主資料庫遵循自主資料庫定序所定義的中繼資料和 tempdb 定序規則。
  • LocalDB 不得為合併式複寫訂閱者。
  • LocalDB 不支援 FILESTREAM。
  • LocalDB 針對 Service Broker 只允許本機佇列。

 

心得分享

這一版 SQL Server 2012 Express LocalDB 真的很棒,隨時隨地都可以建立不同的資料庫執行個體,讓開發人員能夠盡情的測試各種 SQL Server 2012 的新功能,也不用怕搞壞現有的開發資料庫環境。

除了開發環境外,對於同一台主機有許多網站的虛擬主機來說,也可以說非常方便,因為不同的應用程式集區或本機應用程式都可以非常便利的建立起獨立的執行個體,完全不會跟其他網站或應用程式發生衝突,徹底的降低 SQL Server 2012 Express 的管理複雜度,也大幅提升資料庫佈署的方便性!

除此之外,若開發人員採用 Code First 資料庫開發模式的話,在開發與佈署方面來說也確實更加便利,因為資料庫執行個體可以完全執行在自己的身分識別下執行,不用再開啟 Management Studio 事先設定安全性或預先建立資料庫等工作,透過獨立的執行個體也不用擔心使用 Code First 開發的程式執行時牽動到多人共用的開發資料庫,很輕易的就能在本機電腦自動建立起測試資料庫。

 

相關連結

影片教學

以下錄影是多奇數位創意有限公司於 2012/11/07 在公司內部的技術分享錄影,這 50 分鐘的分享內容包括 SQL Server 2012 Express LocalDB 的運作方式、管理 LocalDB 執行個體的方法與陷阱、認識 Visual Studio 2012 的資料庫管理工具以及日常開發使用 LocalDB 時的注意事項等等。

2012/11/07 多奇技術分享會 - SQL Server 2012 Express LocalDB 深入剖析