2023年7月3日 星期一

Microsoft Access Database Engine 32bit安裝

之前在已安裝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位元。

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年10月13日 星期四

restore database 作業系統錯誤 5(存取被拒。)

使用UNC(例\\172.12.12.1\dbbackup\test.bak)  目錄還原資料庫,出現錯誤訊息【 作業系統錯誤 5(存取被拒。)】

將SQL Server服務啟動帳號由Network Services改為具目錄操作權限的使用者後,重啟服務即可順利還原資料庫。

 

2022年10月5日 星期三

重開機後Always on 復原暫止

次要主機windows update 後自已重開機,然後資料庫狀態就顯示【復原暫止】 

但主要主機資料庫狀態仍是【已同步處理】,查看Always on 可用性複本下,次要主機顯示(解析中)

嚐試在次要主機上執行 ALTER DATABASE mydb SET HADR RESUME;

顯示以下訊息,

無法處理此作業。Always On 可用性群組複本管理員正在等候主機電腦啟動 Windows Server 容錯移轉叢集 (WSFC) 叢集並加入叢集。本機電腦不是叢集節點,或者本機叢集節點未上線。若電腦是叢集節點,請等候其加入叢集。若電腦不是叢集節點,請將電腦加入 WSFC 叢集中,然後重試此作業。

在容錯移轉叢集管理員下,連線到叢集後,次要可用性複本就恢復正常了。

2022年9月14日 星期三

powershell CRLF斷行換回LF

 
bcp產出的資料中,若欄位為空會寫入NUL,故利用powershell將NUL置換掉。

但因檔案是要給linux系統使用,故原本bcp產出的資料是以LF斷行,但經過powershell處理後,會自動將斷行符號換成CRLF。

所以改寫ps檔如下,最後再還原LF斷行.....一波好幾折...


 ((Get-Content c:\temp\test.txt)  -join "`n") + "`n"| ForEach-Object { $_ -replace "`0", "" } | Set-Content -NoNewline c:\temp\test.new
 

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,事件檢視器就再無稽核失敗問題了。


pdf.js 無法顯示部份字

有個檔案在pdf viewer套件中無法顯示內容,但下載檔案後使用工具又可以正常顯示。 本來以為是套件版本太舊的原因,於是去下載pdf viewer套件 https://github.com/mozilla/pdf.js 更新後還是一樣。 覺得應是字型缺漏的問題,於是用PDF-X...