Aracılığıyla paylaş


Linux üzerinde SQL Server için SQL Değerlendirme API'sini kullanma

Şunlar için geçerlidir:Linux üzerinde SQL Server

SQL Değerlendirme API', en iyi yöntemler için SQL Server yapılandırmasını değerlendirmeye yönelik bir mekanizma sağlar. API, SQL Server ekibi tarafından önerilen en iyi yöntemleri içeren bir kural kümesiyle teslim edilir. Bu kural kümesi, yeni sürümlerin yayımlanmasıyla geliştirilmiştir. SQL Server yapılandırmanızın önerilen en iyi yöntemlerle uyumlu olduğundan emin olmak yararlı olur.

Microsoft'un gönderilen kural kümesi GitHub'da kullanılabilir. tüm kural kümesiniörnekleri deposundagörüntüleyebilirsiniz.

Bu makalede, Linux ve kapsayıcılarda SQL Server için SQL Değerlendirme API'sini çalıştırmanın iki yolunu inceleyeceğiz:

Azure Data Studio için SQL Değerlendirme uzantısı (önizleme)

Azure Data Studio (önizleme) için SQL Değerlendirme uzantısı, SQL Server'ın yapılandırmasını en iyi yöntemler için değerlendirmeye yönelik bir mekanizma sağlar.

Bu önizleme sürümüyle şunları yapabilirsiniz:

  • Yerleşik kurallarla SQL Server, Azure SQL veritabanı veya Azure SQL Yönetilen Örneği ve veritabanlarını değerlendirme
  • Bir örnek ve veritabanları için geçerli olan tüm yerleşik kuralların listesini alma
  • Değerlendirme sonuçlarını ve geçerli kuralların listesini sql tablosunda depolamak için betik olarak dışarı aktarma
  • Değerlendirme sonuçlarıyla ilgili HTML raporları oluşturma

Azure Data Studio'da SQL Değerlendirme uzantısını gösteren ekran görüntüsü.

SQL Değerlendirmesi Başlatma

  • SQL Değerlendirmesi uzantısını yükledikten sonra sunucu listenizi genişletin, değerlendirmek istediğiniz bir sunucuya veya veritabanına sağ tıklayın ve Yönetseçin.
  • Ardından, Genel bölümünde SQL Değerlendirmesiöğesini seçin. Seçilen SQL Server veya Azure SQL veritabanının değerlendirmesini gerçekleştirmek için Değerlendirme sekmesinde Değerlendirmeyi Çağır seçin. Sonuçlar kullanıma sunulduktan sonra filtreleme ve sıralama özelliklerini kullanabilirsiniz.
  • Sonuçları tabloya ekle biçiminde almak için Betik olarak dışarı aktar seçin. Değerlendirme sonuçlarını HTML dosyası olarak kaydetmek için HTML Raporu Oluştur de seçebilirsiniz. Bazı değerlendirme kuralları belirli SQL Server yapılandırmalarına, bazıları ise diğerlerine yöneliktir. Veritabanı kuralları için de aynı durum geçerlidir. Örneğin, yalnızca SQL Server 2016 (13.x) veya tempdb veritabanı için geçerli kurallar vardır.
  • Geçerli kuralları görüntüle düğmesi, değerlendirmeyi çağır seçtikten sonra sunucularınızın ve veritabanlarınızın değerlendirmesini gerçekleştirmek için kullanılan değerlendirme kurallarını görüntüler. SQL Server ve SQL Değerlendirme API'si hakkında bilgi görüntülemek için Bilgiseçin. Değerlendirme oturumu sonuçları Geçmiş sekmesinde gözden geçirilebilir.

PowerShell ile SQL Değerlendirme API'si

İkinci seçenek, SQL Değerlendirme API'sinin betiğini çalıştırmak için PowerShell kullanmaktır.

Önkoşullar

  1. Linux üzerine PowerShell'i yüklediğinizden emin olun.

  2. SqlServer kullanıcısı olarak çalışan PowerShell Galerisi'nden mssql PowerShell modülünü yükleyin.

    su mssql -c "/usr/bin/pwsh -Command Install-Module SqlServer"
    

Değerlendirmeyi ayarlama

SQL Değerlendirme API'sinin çıkışı JSON biçiminde kullanılabilir. SQL Değerlendirme API'sini yapılandırmak için aşağıdaki adımları aşağıdaki gibi gerçekleştirmeniz gerekir:

  1. Değerlendirmek istediğiniz örnekte, SQL Kimlik Doğrulamasını kullanarak SQL Server değerlendirmeleri için oturum açma bilgileri oluşturun. Oturum açma ve güçlü parola oluşturmak için aşağıdaki Transact-SQL (T-SQL) betiğini kullanabilirsiniz. Parolanız, SQL Server varsayılanparola ilkesine uygun olmalıdır. Varsayılan olarak, parola en az sekiz karakter uzunluğunda olmalı ve şu dört kümeden üçünün karakterlerini içermelidir: büyük harfler, küçük harfler, 10 tabanındaki basamaklar ve simgeler. Parolalar en çok 128 karakter uzunluğunda olabilir. Mümkün olduğunca uzun ve karmaşık parolalar kullanın.

    USE [master];
    GO
    
    CREATE LOGIN [assessmentLogin]
        WITH PASSWORD = N'<password>';
    
    ALTER SERVER ROLE [CONTROL SERVER] ADD MEMBER [assessmentLogin];
    GO
    

    CONTROL SERVER rolü değerlendirmelerin çoğunluğunda kullanılır. Ancak, sysadmin ayrıcalıkları gerektirebilecek birkaç değerlendirme vardır. Bu kuralları çalıştırmıyorsanız CONTROL SERVER izinlerini kullanmanızı öneririz.

  2. Sistemde oturum açmak için kimlik bilgilerini aşağıda gösterildiği gibi depolayın ve <password> önceki adımda kullandığınız parolayla değiştirin.

    echo "assessmentLogin" > /var/opt/mssql/secrets/assessment
    echo "<password>" >> /var/opt/mssql/secrets/assessment
    
  3. Kimlik bilgilerine yalnızca mssql kullanıcının erişebilmesini sağlayarak yeni değerlendirme kimlik bilgilerinin güvenliğini sağlayın.

    chmod 600 /var/opt/mssql/secrets/assessment
    chown mssql:mssql /var/opt/mssql/secrets/assessment
    

Değerlendirme betiğini indirme

Aşağıda, önceki adımlarda oluşturulan kimlik bilgilerini kullanarak SQL Değerlendirme API'sini çağıran örnek bir betik verilmiştir. Betik şu konumda JSON biçiminde bir çıkış dosyası oluşturur: /var/opt/mssql/log/assessments.

Not

SQL Değerlendirme API'si, CSV ve XML biçimlerinde de çıkış oluşturabilir.

Bu betik, GitHubüzerinden indirilebilir.

Bu dosyayı /opt/mssql/bin/runassessment.ps1olarak kaydedebilirsiniz.

[CmdletBinding()] param ()

$Error.Clear()

# Create output directory if not exists

$outDir = '/var/opt/mssql/log/assessments'
if (-not ( Test-Path $outDir )) { mkdir $outDir }
$outPath = Join-Path $outDir 'assessment-latest'

$errorPath = Join-Path $outDir 'assessment-latest-errors'
if ( Test-Path $errorPath ) { remove-item $errorPath }

function ConvertTo-LogOutput {
    [CmdletBinding()]
    param (
        [Parameter(ValueFromPipeline = $true)]
        $input
    )
    process {
        switch ($input) {
            { $_ -is [System.Management.Automation.WarningRecord] } {
                $result = @{
                    'TimeStamp' = $(Get-Date).ToString("O");
                    'Warning'   = $_.Message
                }
            }
            default {
                $result = @{
                    'TimeStamp'      = $input.TimeStamp;
                    'Severity'       = $input.Severity;
                    'TargetType'     = $input.TargetType;
                    'ServerName'     = $serverName;
                    'HostName'       = $hostName;
                    'TargetName'     = $input.TargetObject.Name;
                    'TargetPath'     = $input.TargetPath;
                    'CheckId'        = $input.Check.Id;
                    'CheckName'      = $input.Check.DisplayName;
                    'Message'        = $input.Message;
                    'RulesetName'    = $input.Check.OriginName;
                    'RulesetVersion' = $input.Check.OriginVersion.ToString();
                    'HelpLink'       = $input.HelpLink
                }

                if ( $input.TargetType -eq 'Database') {
                    $result['AvailabilityGroup'] = $input.TargetObject.AvailabilityGroupName
                }
            }
        }

        $result
    }
}

function Get-TargetsRecursive {

    [CmdletBinding()]
    Param (
        [Parameter(ValueFromPipeline = $true)]
        [Microsoft.SqlServer.Management.Smo.Server] $server
    )

    $server
    $server.Databases
}

function Get-ConfSetting {
    [CmdletBinding()]
    param (
        $confFile,
        $section,
        $name,
        $defaultValue = $null
    )

    $inSection = $false

    switch -regex -file $confFile {
        "^\s*\[\s*(.+?)\s*\]" {
            $inSection = $matches[1] -eq $section
        }
        "^\s*$($name)\s*=\s*(.+?)\s*$" {
            if ($inSection) {
                return $matches[1]
            }
        }
    }

    return $defaultValue
}

try {
    Write-Verbose "Acquiring credentials"

    $login, $pwd = Get-Content '/var/opt/mssql/secrets/assessment' -Encoding UTF8NoBOM -TotalCount 2
    $securePassword = ConvertTo-SecureString $pwd -AsPlainText -Force
    $credential = New-Object System.Management.Automation.PSCredential ($login, $securePassword)
    $securePassword.MakeReadOnly()

    Write-Verbose "Acquired credentials"

    $serverInstance = '.'

    if (Test-Path /var/opt/mssql/mssql.conf) {
        $port = Get-ConfSetting /var/opt/mssql/mssql.conf network tcpport

        if (-not [string]::IsNullOrWhiteSpace($port)) {
            Write-Verbose "Using port $($port)"
            $serverInstance = "$($serverInstance),$($port)"
        }
    }

    # IMPORTANT: If the script is run in trusted environments and there is a prelogin handshake error,
    # add -TrustServerCertificate flag in the commands for $serverName, $hostName and Get-SqlInstance lines below.
    $serverName = (Invoke-SqlCmd -ServerInstance $serverInstance -Credential $credential -Query "SELECT @@SERVERNAME")[0]
    $hostName = (Invoke-SqlCmd -ServerInstance $serverInstance -Credential $credential -Query "SELECT HOST_NAME()")[0]

    # Invoke assessment and store results.
    # Replace 'ConvertTo-Json' with 'ConvertTo-Csv' to change output format.
    # Available output formats: JSON, CSV, XML.
    # Encoding parameter is optional.

    Get-SqlInstance -ServerInstance $serverInstance -Credential $credential -ErrorAction Stop
    | Get-TargetsRecursive
    | ForEach-Object { Write-Verbose "Invoke assessment on $($_.Urn)"; $_ }
    | Invoke-SqlAssessment 3>&1
    | ConvertTo-LogOutput
    | ConvertTo-Json -AsArray
    | Set-Content $outPath -Encoding UTF8NoBOM
}
finally {
    Write-Verbose "Error count: $($Error.Count)"

    if ($Error) {
        $Error
        | ForEach-Object { @{ 'TimeStamp' = $(Get-Date).ToString("O"); 'Message' = $_.ToString() } }
        | ConvertTo-Json -AsArray
        | Set-Content $errorPath -Encoding UTF8NoBOM
    }
}

Not

Bu betiği güvenilir ortamlarda çalıştırdığınızda ve bir ön oturum açma görüşme hatası aldığınızda, koddaki -TrustServerCertificate, $serverName ve $hostName satırları komutlarına Get-SqlInstance bayrağını ekleyin.

Değerlendirmeyi çalıştırma

  1. Betiğin mssqltarafından sahiplenildiğinden ve yürütülebilir olduğundan emin olun.

    chown mssql:mssql /opt/mssql/bin/runassessment.ps1
    chmod 700 /opt/mssql/bin/runassessment.ps1
    
  2. Günlük klasörü oluşturun ve klasördeki mssql kullanıcıya uygun izinleri atayın:

    mkdir /var/opt/mssql/log/assessments/
    chown mssql:mssql /var/opt/mssql/log/assessments/
    chmod 0700 /var/opt/mssql/log/assessments/
    
  3. Artık ilk değerlendirmenizi oluşturabilirsiniz, ancak bunu mssql kullanıcı olarak yaptığınızdan emin olun; böylece sonraki değerlendirmeler cron veya systemd daha güvenli bir şekilde otomatik olarak çalıştırılabilir.

    su mssql -c "pwsh -File /opt/mssql/bin/runassessment.ps1"
    
  4. Komut tamamlandıktan sonra çıkış JSON biçiminde oluşturulur. Bu çıkış, JSON dosyalarını ayrıştırma işlemini destekleyen herhangi bir araçla tümleştirilebilir. Bu tür örnek araçlardan biri Red Hat Insights .