Sql-Server-2016

SQL Server 2016 - 將輸出文件寫入映射的 Samba 共享(CentOS 7)

  • February 25, 2022

我有一個儲存過程,它正在遍歷表、獲取數據並將結果寫入 csv 文件(主要是為 FTP 客戶提供最新數據)。

將其寫入本地 D: 驅動器時,一切正常。文件按原樣寫入,每個人都很高興。

當我設置新的 FTP 伺服器時,我決定嘗試放棄 12672 批處理腳本,將文件從 DB 伺服器(執行 SQL Server 2016 的 Win Server 2012 r2)傳輸到 FPT 伺服器(CentOS 7 + Samba)並獲得查詢輸出直接寫在那裡。

SQL Server 報告查詢已成功執行,但輸出文件在途中某處消失在網路黑洞中。

慢慢地失去了我的想法。

下面列出了我 99% 確定不會導致問題的事情:

  • Samba - 儘管安全性仍然有點偏執,但它暫時不受使用者限制。
  • 防火牆 - 關閉/打開它沒有任何區別。
  • SELinux - 與 firewalld 相同,強制、許可、禁用沒有區別。
  • Linux 上的文件系統權限 - 777 是一個測試共享,並以 MSSQLUSER 身份起訴,並成功地在我試圖讓 SQL 伺服器寫入的同一路徑中寫入了一個文件,以檢查這一點。

Samba 完全沒有記錄任何內容,這讓我相信 SQL 甚至沒有嘗試觸及該共享。Linux 端根本沒有任何跡象表明 SQL 試圖建立連接。

我目前的理論是它拒絕這樣做,因為映射共享的不是 SQL Server 的服務帳戶,所以這裡是:

  • 有沒有辦法為所有使用者映射該網路驅動器?我不願意在儲存的過程中添加額外的程式碼來映射驅動器/之後刪除它。最終遊戲是讓所有內部轉移都以這種方式進行,這意味著相當多的 SP 需要改變,並且不同的時間表在某些時候不可避免地會發生衝突。更不用說每天瘋狂的映射數量了。無數的Google搜尋指向一個簡單的答案“不”,但正如他們所說,希望最後死去。
  • 如果我要更改服務帳戶 (NT SERVICE\MSSQLSERVER) 憑據,我將面臨哪些潛在後果?不幸的是,我沒有一台伺服器可以以科學的名義犧牲並找出我自己。
  • 是否有一個我缺少的簡單解決方案可以讓我這樣做?我想重新發明輪子嗎?

任何建議表示讚賞。我可以在 Linux 機器上做/更改任何我想做的事情,Windows 方面的事情有點複雜,因為我對 Microsoft 系統的知識/經驗充其量只是“平庸”。

為了在 SQL Server 服務帳戶下映射網路驅動器,您需要作為服務帳戶登錄到伺服器。然後使用net use /persistent:yes連接共享。這應該使 SQL Server 服務帳戶每次登錄到該伺服器時都可以自動使用該共享。

說了這麼多,而不是使用驅動器號作為共享,只需通過 UNC 名稱直接寫入 Linux SMB 共享……所以\\linux-machine\share\some-file-name.csv

或者,正如 Aaron Bertrand 在評論中提到的那樣,編寫一個實用程序來從 SQL Server 查詢數據並直接寫入 Linux 上的 samba 共享。

設法接近我想要達到的目標。事後諸葛亮——@Aaron Bertrand 建議的方法是最明智的做法——將數據導出到 SQL Server 機器上的本地共享,將其安裝在 Linux 機器上,並設置一個 cron 作業來提取數據。

然而,我並不理智,並決心以我的方式做事(而且,我仍然相信在我們的案例中這是一種更好的處理方式)。

首先,SQL Server (2016) 不想寫入映射的網路驅動器。哪個使用者映射了它,共享在 Linux 機器上的“可訪問性”程度似乎並不重要(SELinux 關閉,Firewalld 關閉,目錄權限設置,因此任何人都可以做他們想做的任何事情)。看起來它甚至沒有嘗試在那裡寫 - CentOS 盒子上的日誌中絕對沒有任何內容。

提供 SQL Server UNC 路徑(\\1.2.3.4\share\file\\server-name\share\file)使事情變得更好,至少我可以看到它最終嘗試做某事,但被 samba 關閉。很多香煙和後來發誓 - SQL Server 不會嘗試作為它用來訪問 samba 共享的帳戶進行身份驗證。它不發送任何憑據,因此預設為來賓帳戶(當然,我已禁用)。下面可能不屬於這裡,因為它與數據庫無關,也與 samba/權限有關,但有一天有人可能會發現它很有幫助,所以就到這裡吧。

下一步是創建一個訪問受限的使用者,該 samba 可以用作訪客帳戶,而不是預設的“nobody”:

adduser user_name -M -r -g samba_group -s /sbin/nologin

更改 smb.conf 以使用它:

[global]
       map to guest = never
-That way guest login attempts outside specified shares still get shut down
       guest account = user_name

設置文件系統權限:

chmod -R g+w /directory/pathchown -R owner:samba_group /directory/path

更新 SQL Server 中的查找表以使用網路路徑而不是本地目錄,看到它最終做你想做的事,喝杯啤酒慶祝一下。

引用自:https://dba.stackexchange.com/questions/205110