2026年4月13日 星期一
SSAS 作業已因鎖定衝突而取消
SSAS在process 與 mdx query並存應用時,如果mdx 語法含crossjoin或維度member很多時,就容易顯示錯誤【作業已因鎖定衝突而取消。】
當然,SSAS應是process與 query分開時段執行,但因種種先知後知原因,專案就是有需要這樣應用,即使是已將cube 切割到最小範圍的Partition,但複雜的mdx語法就容易跑不出來。
也是透過claude一問一答後,對於這個需求造成的問題有了較明白的理解。
Cube 開始處理 (Process) >> 需要取得 Write Lock >> 等待 CommitTimeout 秒 → MDX 查詢仍在執行 (Read Lock 未釋放) >> ForceCommitTimeout 到期 >> 強制取消 MDX 查詢 >> 看到丟出來的錯 >> 取得 Write Lock,Cube 處理繼續。
在以process為優先完成的考量下,決定給予mdx查詢較多等待的時間。
在 SSMS 連線 Analysis Services >> 右鍵屬性 Properties>>勾選顯示進階(全部)屬性Show Advanced Properties 。
將ForceCommitTimeout 改為 90000 (90秒) 給查詢更多時間完成再強制取消(毫秒) ,原先為0表示立即取消。
2024年7月19日 星期五
SSAS Restore vs Detach & Attach 大資料庫
因為要重裝某台DB 作業系統,但其中有個較大的SSAS OLAP DB,每每備份後再還原到另外一台備援機時,都要三天三夜...三更半夜....然後還不一定成功?
先用一個小DB試著在主機1用Deatch 卸離後,複製OLAP Data目錄下的資料庫資料夾到主機2 OLAP Data目錄下,然後在主機2 Attach掛載起來,看來大大節省時間。
(後來也有試過用mklink做過UNC 目錄的Attach看來也是可以瀏覽,不過沒有做後續process 測試,故也不確定有沒有問題)
就像用資料庫的 Detach & Attach一樣,用來刪掉重建.ldf檔,不用費力去瘦身ldf檔,快速又方便。,
最後在重安裝的主機上,因只format掉C:\ 故重安裝好SQL SERVER後再由原來的SSAS Data目錄Attach檔案,所以必需開啟其他目錄可讀取Data目錄。
在SSAS 主機按右鍵進入屬性後,於一般下勾選顯示進階,調整AllowedBrowsingFolder,用 | 破折號相隔加入可瀏覽目錄,如下紅字。
G:\OLAP\Backup\|G:\OLAP\Log\|G:\OLAP\Data\|F:\OLAP\Data\
2023年10月13日 星期五
查看及更改SSAS Server Mode
如何查看已安裝的SSAS Server Mode?
目前為 Multidimensional
2023年3月25日 星期六
powershell 備份及還原SSAS多資料庫
想用powershell撰寫SSAS多個資料庫的備份及還原到備援機。
詢問https://chat.openai.com 大概產出了85%的script,剩下的就自已依想要的需求再調整,在工作上很有幫助。
借助一點科技力量再加上自已七拼八湊土法練鋼後,備份及還原大致可以滿足目前的需要,踏出成功的第一步。
備份:
$srv="10.10.1.100" #要備份的主機
$tomail="myemail@mail.com" #通知對象EMAIL
$psfolder="D:\Schedule" #powershell目錄
$abffolder="E:\OLAP\Backup" #備份的主機目錄
$dblist=@("BIDB1","BIDB2","BIDB13","BIDB4")
$body= -join ("執行poweshell目錄:$psfolder\backup_asdb.ps1", "`n")
$body= -join ($body,"開始時間:",(Get-Date -Format "yyyy/MM/dd HH:mm:ss"),"`n","Server:",$srv , "`n")
$body= -join ($body,"========================================================`n")
foreach($db in $dblist)
{
try
{
$body= -join ($body,"Backup database $db.....to $abffolder .....")
Backup-ASDatabase "$abffolder\$db.abf" $db -ApplyCompression -AllowOverwrite -Server $srv
if ($LASTEXITCODE -eq 0)
{
$body= -join ($body,"successed.`n")
}
else
{
$body= -join ($body,"failed!! `n Error Message:`n`n $($_.Exception.Message) `n`n" )
}
}
catch {
$body= -join ($body,"failed!! `n Error Message:`n`n $($_.Exception.Message) `n`n" )
}
}
$body= -join ($body,"========================================================`n")
$body = -join($body,"結束時間:",(Get-Date -Format "yyyy/MM/dd HH:mm:ss"),"`n")
#write-host $body
Send-MailMessage -Encoding "utf8" -SmtpServer "urmailServer" -From '管理員<myadm@mail.com>' -To "$tomail" -Subject "($srv)每月備份AS資料庫處理結果通知...." -Body $body
還原:
## Set the variables
$serverName = "10.10.1.102" # Replace with your server name and instance name
$backupFolder = "\\10.10.1.100\OLAP\Backup" # Replace with your backup folder path
$databases = @("BIDB1","BIDB2","BIDB13","BIDB4") # Replace with your database names
$tomail="myemail@mail.com" #email to
$psfolder="D:\Schedule\powershell"
$body= -join ("執行poweshell目錄:$psfolder\resretor_asdb.ps1", "`n")
$body= -join ($body,"開始時間:",(Get-Date -Format "yyyy/MM/dd HH:mm:ss"),"`n","Server:",$serverName, "`n")
$body= -join ($body,"========================================================`n")
# Restore the databases
foreach ($database in $databases) {
try {
$backupFile = Join-Path $backupFolder "$database.abf"
$body= -join ($body,"Restore database $database.....from $backupFile .....")
if (Test-Path $backupFile) #check backup file exist
{
Restore-ASDatabase -Server $serverName -Name $database -RestoreFile $backupFile -AllowOverwrite
$body= -join ($body," successfully.`n")
}
else
{
$body= -join ($body," failed!! File not exist!! `n")
}
#變更連線字串(因為要將備援機的連線切到唯讀的always on)
$xmla2 = @"
<Alter ObjectExpansion="ExpandFull" xmlns="http://schemas.microsoft.com/analysisservices/2003/engine">
<Object>
<DatabaseID>$database</DatabaseID>
<DataSourceID>$database</DataSourceID>
</Object>
<ObjectDefinition>
<DataSource xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ddl2="http://schemas.microsoft.com/analysisservices/2003/engine/2" xmlns:ddl2_2="http://schemas.microsoft.com/analysisservices/2003/engine/2/2" xmlns:ddl100_100="http://schemas.microsoft.com/analysisservices/2008/engine/100/100" xmlns:ddl200="http://schemas.microsoft.com/analysisservices/2010/engine/200" xmlns:ddl200_200="http://schemas.microsoft.com/analysisservices/2010/engine/200/200" xmlns:ddl300="http://schemas.microsoft.com/analysisservices/2011/engine/300" xmlns:ddl300_300="http://schemas.microsoft.com/analysisservices/2011/engine/300/300" xmlns:ddl400="http://schemas.microsoft.com/analysisservices/2012/engine/400" xmlns:ddl400_400="http://schemas.microsoft.com/analysisservices/2012/engine/400/400" xmlns:ddl500="http://schemas.microsoft.com/analysisservices/2013/engine/500" xmlns:ddl500_500="http://schemas.microsoft.com/analysisservices/2013/engine/500/500" xsi:type="RelationalDataSource">
<ID>$database</ID>
<Name>$database</Name>
<ConnectionString>Provider=SQLNCLI11.1;Data Source=$urserver;Persist Security Info=True;User ID=urname;Password=urpwd;Initial Catalog=$database</ConnectionString>
<ImpersonationInfo>
<ImpersonationMode>Default</ImpersonationMode>
</ImpersonationInfo>
<Timeout>PT0S</Timeout>
</DataSource>
</ObjectDefinition>
</Alter>
"@
# Execute the XMLA command using Invoke-ASCmd
Invoke-ASCmd -Server $asServer -Database $database -Query $xmla2
if ($LASTEXITCODE -eq 0)
{
$body= -join ($body,"alert db ($database) connection string successfully.`n" )
}else {
$body= -join ($body,"alert db ($database) connection string failed!!. Error Message:`n`n $($_.Exception.Message) `n`n" )
}
}
catch
{
$body= -join ($body,"failed!! `n Error Message:`n`n $($_.Exception.Message) `n`n" )
}
}
$body= -join ($body,"========================================================`n")
$body= -join($body,"結束時間:",(Get-Date -Format "yyyy/MM/dd HH:mm:ss"),"`n")
write-host $body
Send-MailMessage -Encoding "utf8" -SmtpServer "urmailServer" -From '管理員<myadm@mail.com>' -To "$tomail" -Subject "($serverName)每月還原SSAS DB處理結果通知...." -Body $body
2022年9月13日 星期二
稽核失敗eventid 4625 msmdsrv.exe
主機事件檢視器在dimension或cube process時,一直不斷出現安全性下的稽核失敗。造成3分鐘內20筆稽核失敗被視為資安警認通報,訊息摘要如下:
帳戶無法登入
登入失敗的帳戶
安全性識別碼:NULL SID
帳號名稱:admin
帳號網域:TESTBI
失敗原因:未將這台機器上要求的登入類型授與使用者。
The user has not been granted the requested logon type (aka logon right) at this machine
登入類型:8
呼叫者理程序名稱: "C:\Program Files\Microsoft SQL Server\MSAS15.SQL2019\OLAP\bin\msmdsrv.exe"
依照登入類型=8,查到NetworkCleartext 使用者從網路登入此電腦。 使用者的密碼已傳遞至其未顯示表單的驗證套件。 內建的驗證會先封裝所有雜湊認證,再傳送給整個網路。 認證不會以純文字或純文字 (稱為 cleartext) 。
但並無任何排程有使用到明碼作認證?而且OLAP查詢或處理也都很正常?
找了好久,最後在OLAP 資料庫的資料來源中看到安全性設定,原本使用ImpersonateAccount 以系統帳號做認證,不知為何,在此台主機如此設定就會有eventid 4625 稽核失敗的紀錄,但另外一台主機同樣的設定則沒有問題。
將模擬資訊改為繼承後,重新處理dimension或cube,事件檢視器就再無稽核失敗問題了。
IIS 網站無法下載中文檔名檔案因為取消高位元字元
網址+中文檔案名稱方式下載檔案顯示 404 - 找不到檔案或目錄。 但英數字檔案名稱則可下載。 因為設定GCB IIS,其中1項 將高位元字元預設取消勾選了。 27 TWGCB-04-014-0028 要求篩選與其他限制模組 允許高位元字元 這項原則設定決定查詢...
-
一個老舊的aspx web form專案,調了一些功能建置成功,但進行部署時顯示以下錯誤。 在應用程式層級之外使用註冊為 allowDefinition='MachineToApplication' 的區段發生錯誤。錯誤的原因可能是虛擬目錄尚未在 IIS 中設定為...
-
Row.Cells[2].Text == "abc" ? "ok" : "not ok" ; 或加入Microsoft. VisualBasic 參考使用 vb namespace using Microsoft...
-
freeFTPd是套免費的SFTP SERVER支援22 port SFTP及21port FTP,一般找到免費的都不支援SFTP只有技援FTPS。 之前一直有個困擾在幾台主機安裝後,有幾台重開機後,SFTP SERVER必須手動去啟動,一直以來老是搞不懂為什麼,今天看到一篇文...