OLTP資料庫(.bak檔)
https://learn.microsoft.com/en-us/sql/samples/adventureworks-install-configure?view=sql-server-ver16&tabs=ssms
OLAP資料庫(.abf檔)
https://github.com/Microsoft/sql-server-samples/releases/tag/adventureworks-analysis-services
OLTP資料庫(.bak檔)
https://learn.microsoft.com/en-us/sql/samples/adventureworks-install-configure?view=sql-server-ver16&tabs=ssms
OLAP資料庫(.abf檔)
https://github.com/Microsoft/sql-server-samples/releases/tag/adventureworks-analysis-services
有個需求需要將多一筆資料的多欄位值轉成多列資料
之前都使用unpivot,試了一下直接用outer apply就可達成,十分好用。
其中concat 會自動處理null 為空值再串聯文字,所以也不用判斷isnull(col1,'')了。
declare @tab table (col1 nvarchar(10),col2 nvarchar(10),col3 nvarchar(10),col4 nvarchar(10))
insert into @tab values
('A','X','Y','Z'),
('B','X','Y',null),
('A','1','2','')
select distinct col1,y.value
from @tab outer apply (select * from string_split(concat(col2,',',col3,',',col4),',') where value > '') y
HTTPS連線,不管是在寫sql clr或者powershell,每次遇到以下二類SSL錯誤,都忘了要改啥。這次記錄下,以後可以參考。
System.Net.WebException: 基礎連接已關閉: 接收時發生未預期的錯誤。 ---> System.ComponentModel.Win32Exception: 用戶端和伺服器無法溝通,因為它們沒有公用的演算法
加入以下
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12| SecurityProtocolType.Tls13;
System.Net.Http.HttpRequestException: An error occurred while sending the request. ---> System.Net.WebException: 基礎連接已關閉: 無法為 SSL/TLS 安全通道建立信任關係。 ---> System.Security.Authentication.AuthenticationException: 根據驗證程序,遠端憑證是無效的。
加入以下:
ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
順便再加一段sql clr assembly,單純的呼叫GET方法 WEB URL,回傳respone內容。
設定Database Mail時,顯示
Database Mail depends on Service Broker. Service Broker is not active in msdb. Do you want to activate Service Broker in msdb? If you do not activate Service Broker, Database Mail will queue e-mail messages, but will not be able to deliver the messages.
有一天一台SQL 2019 主機安裝CU27後,SQL AGENT無法啟動,查看SQLAGENT.OUT記錄檔錯誤如下
2024-08-06 12:00:08 - ! [298] SQLServer 錯誤: 208,無效的物件名稱 'syssubsystems'。 [SQLSTATE 42S02] (ConnCacheSubsystems)
2024-08-06 12:00:08 - ! [449] 無法列舉子系統 (原因: 無效的物件名稱 'syssubsystems'。 [SQLSTATE 42S02] (錯誤 208))
再安裝CU28也是一樣問題無法啟動。
於是找了另外一台正常的DB查看,確實有syssubsystems這個資料表存在。
直接轉出create語法在有問題的那台DB把資料表建起來,重啟SQL AGENT服務就正常了。
CREATE TABLE [dbo].[syssubsystems](
[subsystem_id] [int] NOT NULL,
[subsystem] [nvarchar](40) NOT NULL,
[description_id] [int] NULL,
[subsystem_dll] [nvarchar](255) NULL,
[agent_exe] [nvarchar](255) NULL,
[start_entry_point] [nvarchar](30) NULL,
[event_entry_point] [nvarchar](30) NULL,
[stop_entry_point] [nvarchar](30) NULL,
[max_worker_threads] [int] NULL
) ON [PRIMARY]
GO
重啟後,這個資料表就會自動長出一些資料。
看了二篇文章似乎都跟msdb有做什麼變動造成的。回想一下為什麼有這個錯,我有改過msdb嗎?? 好像也沒有...
https://www.dbaservices.com.au/the-ssis-subsystem-failed-to-load/
The problem is most likely that the location of your SQL Server installation directory differs from that of the old serve
https://byronhu.wordpress.com/2011/07/04/sql-agent-job-%E6%9A%AB%E5%81%9Csuspend/
因為從原來全部安裝在 C:\ 的 SQL Server 備份 msdb 後,restore 到安裝在 D:\ 的 SQL Server,除要注意 SQL Server 的 Build No 外,若有 Job 呼叫到外部子系統(例如 SSIS、Replication…等),也要一併注意 msdb.dbo.syssubsystems 的設定
use msdb go delete from msdb.dbo.syssubsystems exec msdb.dbo.sp_verify_subsystems 1 go
套用GCB後,原本使用UNC方式還原DB時,顯示錯誤訊訊
\\192.168.0.123\dbbackup\ ...作業系統錯誤 5(存取被拒。)
主要是SQL SERVER 服務改用了local system,導致SSMS中要讀取UNC的目錄檔案時無權限。
重設SQL SERVER 服務帳號為本機一組帳號,重啟服務再執行SQL還原。
之前在已安裝Microsoft Access Database Engine 64位元主機上要再安裝32位元的exe只需要
Microsoft Access Database Engine.exe /passive
現在還得要多加一個安裝參數
Microsoft Access Database Engine.exe /passive /quiet
SSIS Designer及SQL SERVER中的匯出入資料都需要安裝Microsoft Access Database Engine32位元。
使用UNC(例\\172.12.12.1\dbbackup\test.bak) 目錄還原資料庫,出現錯誤訊息【 作業系統錯誤 5(存取被拒。)】
將SQL Server服務啟動帳號由Network Services改為具目錄操作權限的使用者後,重啟服務即可順利還原資料庫。
次要主機windows update 後自已重開機,然後資料庫狀態就顯示【復原暫止】
但主要主機資料庫狀態仍是【已同步處理】,查看Always on 可用性複本下,次要主機顯示(解析中)
嚐試在次要主機上執行 ALTER DATABASE mydb SET HADR RESUME;
顯示以下訊息,
無法處理此作業。Always On 可用性群組複本管理員正在等候主機電腦啟動 Windows Server 容錯移轉叢集 (WSFC) 叢集並加入叢集。本機電腦不是叢集節點,或者本機叢集節點未上線。若電腦是叢集節點,請等候其加入叢集。若電腦不是叢集節點,請將電腦加入 WSFC 叢集中,然後重試此作業。
在容錯移轉叢集管理員下,連線到叢集後,次要可用性複本就恢復正常了。
對openrowset又愛又恨.........
愛的是讀外部資料檔很方便...恨的是不預期的卡住永世不得翻身....
終於找到一個可以解決卡住的方法...但為什麼會不預期卡住仍待努力。
參考這篇
去https://docs.microsoft.com/en-us/sysinternals/downloads/sysinternals-suite
下載Sysinternals Suite,裡面真的好物...
找到Process Explorer(procexp64.exe)工具打開後,刪除dllhost.exe 是OLE DB Core Services的,且CPU狀態是Suspend的(但有遇到狀態沒有Suspend也是卡住的狀況)。
之前為了測試如何刪除openrowset session,已將連結的伺服器linked server中的microsoft.ACE.OLEDB.16.0 的允許InProcess停用,所以不確定是否得要這麼設才有dllhost.exe可刪。
借用截圖
2022/10/02 今天測試了一會,由事件檢視器訊息來看,
失敗的應用程式名稱: DllHost.exe,版本: 10.0.17763.1,時間戳記: 0x5d3b6f40
失敗的模組名稱: mso20win32client.dll,版本: 16.0.5254.1001,時間戳記: 0x61aca05e
例外狀況代碼: 0xc0000005
錯誤位移: 0x00000000000c57f2
失敗的處理程序識別碼: 0x920c
失敗的應用程式開始時間: 0x01d8d5b4a1a5e9b1
失敗的應用程式路徑: C:\Windows\system32\DllHost.exe
失敗的模組路徑: C:\Program Files\Common Files\Microsoft Shared\Office16\mso20win32client.dll
報告識別碼: a950796e-1eb0-49b8-b76b-4145e6c8b4c9
失敗的套件完整名稱:
失敗的套件相關應用程式識別碼:
今天剛好測到一次讀三個外部檔,終於遇到了客戶常發生的狀況,openrowset的查詢又hang住了。
反覆測了好幾回,分別在WEB AP 及SSMS環境測試,發現在SSMS成功機率較高,在AP沒有一次查詢成功? 同樣的SQL在連線的DB,唯一的差別就是執行環境了。
瞎測一番後,好像在每個openrowset查詢間加了waitfor delay '00:00:10' 停個10秒再執行下一段openrowset,結果執行了幾次,竟然都可正常回傳結果。
怪哉~~~~~
2022/11/24
這個問題看來無解
https://blog.sqlauthority.com/2017/03/08/sql-server-queries-killedrollback-state-wait-preemptive_oledb_release/
唯一能做的是重啟SQL SERVER服務釋放SPID。
所以設成 InProcess停用後,就直接執行exec xp_cmdshell 'taskkill /f /im dllhost.exe'
把卡住的dllhosrt kill掉,通常再執行一次openrowset又可正常回傳資料了。
sql sever 2019 15.0.4178.1做了1個複本的always on,設定手動容錯及可讀取。
問題來了,在複本DB可正常的讀取資料本,但無法使用CLR function
一般還原DB後都要執行以下語法,就可使用CLR方法(DB還原時trustworthy預設為off)
use testdb
go
alter database testdb set trustworthy on;
go
exec sp_changedbowner 'sa'
go
但複本唯讀根本也無法設定trustworthy
google了大半天結論就是要failover後,將次要變主要後再執行設定。
巴特,我failover後次要變主要,然後順利地把次要的trustworthy設定為on ,並也測試了CLR方法可以正常使用
但再failover切回主要後,結果CLR方法還是沒法用,顯示的訊息就是沒設過trustworthy一樣.......
訊息 10314,層級 16,狀態 11,行 6
嘗試載入組件識別碼 65676 時,Microsoft .NET Framework 發生錯誤。可能是伺服器資源不足,或未信任組件。請重新執行查詢,或查看文件了解如何解決組件信任問題。如需此錯誤的詳細資訊:
System.IO.FileLoadException: 無法載入檔案或組件 'aesclr4, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' 或其相依性的其中之一。 發生例外狀況於 HRESULT: 0x80FC80F1
System.IO.FileLoadException:
於 System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)
於 System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef, Evidence assemblySecurity, RuntimeAssembly reqAssembly, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)
於 System.Reflection.RuntimeAssembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean forIntrospection)
於 System.Reflection.RuntimeAssembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection)
於 System.Reflection.Assembly.Load(String assemblyString)
select name,is_trustworthy_on from sys.databases
複本DB也is_trustworthy_on 確實是1了啊
期間也嚐試切換重建複本DB的組件assembly,但也是主要時一切正常,但failoverv變回複本時就沒法執行,不過訊息會變成
訊息 596,層級 21,狀態 1,行 4
工作階段為清除狀態,無法繼續執行。
訊息 0,層級 20,狀態 0,行 4
在目前的命令上發生嚴重錯誤。如果有任何結果,都必須捨棄。
Msg 596, Level 21, State 1, Line 0
Cannot continue the execution because the session is in the kill state.
Msg 0, Level 20, State 0, Line 0
A severe error occurred on the current command. The results, if any, should be discarded.
直到我把複本DB重啟後,再執行一次CLR方法,錯誤訊息才又會是嘗試載入組件識別碼 65676 時...
反覆的測試了幾次DB failover,似乎有那麼一次是部份CLR 方法是可用的, 但某次重做一次後就死光光了。
always on failover倒覺得挺簡單的,就好像一個開關切換一下就成了,但CLR這關怎麼就過不了。
google了大半天,找不到什麼資訊 .......挫折
2021/12/27 建了一個簡單的DB裡面只有CLR 相關的assembly及方法, 結果不管主要還是次要複本如何切換,怎麼測怎麼OK....這樣看來正式環境上的AGG只能打掉重練了。
2022/09/25 最後主機整個打掉重建AGG後,CLR奇怪的問題就解決了。
SQ L2019 建立CLR Assembly時失敗,執行
use myDB
go
alter database myDB set trustworthy on;
go
exec sp_changedbowner 'myuser' ;
go
顯示以下訊息。
Msg 15110, Level 16, State 1, Line 5
建議的新資料庫擁有者已經是資料庫的使用者或別名。
執行以下
use myDB
go
drop user myuser
go
alter authorization on database::myDB to myuser
go
可以把assembly建立起來,但安全性下的使用者卻不見了? 實在不解?
最後把登入下的同名使用者先刪除再重建。
這個DB是由另一個DB還原另命名建立的,是錯亂了嗎?
如果要匯入外部檔案資料會使用 openrowset方式,匯入excel(xls、xlsx)、csv、txt都可以,使用前先安裝AccessDatabaseEngine.exe (64位元SQL SERVER請下載64bit)
再執行以下TSQL指令
USE [master]
GO
EXEC master . dbo. sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.16.0' , N'AllowInProcess' , 1
GO
EXEC master . dbo. sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.16.0' , N'DynamicParameters' , 1
GO
現有個特殊需求是,建一個唯讀使用者後,執行openrowset有如下訊息
Msg 7415, Level 16, State 1, Line 2
Ad hoc access to OLE DB provider 'Microsoft.ACE.OLEDB.16.0' has been denied. You must access this provider through a linked server.
select * from openrowset('Microsoft.ACE.OLEDB.16.0','Text; HDR=NO; CharacterSet=65001;Database=d:\SQLFiles\',
'select * from [test1.txt]')
若要開放一般使用者使用,則再執行以下指令(以SQL2019 DB為例)
EXEC master . dbo. sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.16.0' , N'DisallowAdHocAccess' , 1
GO
再使用regedit到機碼修改DisallowAdHocAccess=0
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL15.MSSQLSERVER\Providers\Microsoft.ACE.OLEDB.16.0]
如果讀取的txt、csv delimiter 非逗點相隔,則需在來源檔案同目錄下定義Schema.ini檔,內容如下,例如來源檔名為test1.csv,分隔符號為 !,則Schema.ini需定義如下,若有多個檔名需各別定義在.ini中。
[test1.csv]
ColNameHeader=False
Format=Delimited(!)
[test2.csv]
ColNameHeader=False
Format=Delimited(!)
[test3.csv]
ColNameHeader=False
Format=Delimited(!)
CREATE ASSEMBLY [NCrontab]
FROM 'c:\temp\NCrontab.dll'
GO
CREATE ASSEMBLY [SQLCLR]
FROM 'c:\temp\SQLCLR.dll'
GO
網址+中文檔案名稱方式下載檔案顯示 404 - 找不到檔案或目錄。 但英數字檔案名稱則可下載。 因為設定GCB IIS,其中1項 將高位元字元預設取消勾選了。 27 TWGCB-04-014-0028 要求篩選與其他限制模組 允許高位元字元 這項原則設定決定查詢...