AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 122262
Accepted
Jefferson B. Elias
Jefferson B. Elias
Asked: 2015-11-28 01:46:24 +0800 CST2015-11-28 01:46:24 +0800 CST 2015-11-28 01:46:24 +0800 CST

Executando sp_AskBrent com @ExpertMode = 1 no PowerShell

  • 772

Estou tentando executar sp_AskBrentdo PowerShell usando Invoke-SQLCmde capturar sua saída em uma variável:

$query = "EXEC SAIDBA.monitoring.sp_AskBrent @Seconds=10;"
$check = Invoke-Sqlcmd -ServerInstance $ServerInstance -Query $query 
             -ErrorAction Stop -ConnectionTimeout 3

Ao executar com ExpertMode = 0 , não há problema.

Mas ao executar com ExpertMode = 1 , notamos três coisas:

  1. Ele gera todos os dados para o shell
  2. $checké nulo
  3. Termina com o seguinte erro:

    Invoke-Sqlcmd : nomes de coluna duplicados não são permitidos no SQL PowerShell. Para repetir uma coluna, use um alias de coluna para a coluna duplicada no formato Column_Name AS New_Name.
    Na linha:1 caractere:18

    • $check = Invoke-Sqlcmd -ServerInstance $ServerInstance -Query $query -Er ...
    • CategoryInfo: SyntaxError: (:) [Invoke-Sqlcmd], SqlPowerShellSqlExecutionException
    • FullyQualifiedErrorId: DuplicateColumnNameErrorMessage, Microsoft.SqlServer.Management.PowerShell.GetScriptCommand

Acho que há uma solução alternativa para fornecer parâmetros para sp_AskBrentarmazenar os dados do ExpertMode em tabelas e selecionar essas tabelas posteriormente, mas quero ter certeza de que não há como recuperar tudo de uma vez no PowerShell.

sql-server powershell
  • 2 2 respostas
  • 1180 Views

2 respostas

  • Voted
  1. Brent Ozar
    2015-11-28T08:48:29+08:002015-11-28T08:48:29+08:00

    Brent aqui. Correto, @ExpertMode = 1 ativa vários conjuntos de resultados - diagnósticos, estatísticas de espera, estatísticas de arquivo e contadores de perfmon.

    Se você deseja apenas um conjunto de resultados, não ative @ExpertMode.

    Se você deseja vários conjuntos de resultados, mas seu aplicativo (neste caso, PoSH) não pode consumi-los, você precisará registrá-los nas tabelas. É aí que entram esses parâmetros:

    • @OutputDatabaseName - o nome do banco de dados no qual você deseja gravar. Já deve existir.
    • @OutputSchemaName - o esquema onde suas tabelas ficarão, como dbo. Já deve existir.
    • @OutputTableName - o nome da tabela para o conjunto de resultados superior (diagnóstico). Este parâmetro também requer os dois acima. Se a tabela ainda não existir, ela será criada.
    • @OutputTableNameFileStats, @OutputTableNamePerfmonStats, @OutputTableNameWaitStats - o resto dos conjuntos de resultados serão escritos aqui. Se cada tabela ainda não existir, ela será criada. Cada um deles é totalmente opcional - você pode passar em nenhum, alguns ou todos eles.

    Se você deseja que funcione de maneira diferente, descreva o que precisa e verei se consigo encontrar uma maneira de obtê-lo. Espero que ajude!

    De um comentário:

    Na verdade, eu estava pensando em escrever um script de verificação de integridade que executaria em caso de incidente ou para monitoramento e que analisaria a saída de arquivos sp_AskBrent.

    OK legal. Apenas algumas coisas a serem lembradas - as tabelas não se limpam sozinhas e podem ficar grandes se você usar o @SkipChecksQueries = 0parâmetro, por exemplo. O sp_AskBrent®licenciamento também proíbe a distribuição, portanto, certifique-se de não empacotar o script ou instalá-lo em servidores que não são seus. Caso contrário, vá em frente! Se houver algo que eu possa fazer para ajudar a tornar isso mais fácil, grite.

    Há um campo de data em todas as tabelas de saída para ajudá-lo a manter as tabelas de histórico.

    • 10
  2. Best Answer
    user507
    2015-11-29T22:12:07+08:002015-11-29T22:12:07+08:00

    Para não descartar a resposta de Brent (embora às vezes ele dê algumas boas em seu treinamento) ...

    No PowerShell, você pode executar consultas que retornam vários conjuntos de dados, mas não pode fazer isso Invoke-Sqlcmd, pois não foi criado para isso atualmente.

    Você teria duas opções de fazer isso com o código nativo .NET (por exemplo System.Data.SqlClient) ou usando o confiável SMO. Costumo escolher SMOsimplesmente no caso de querer incluir propriedades do servidor ou qualquer outra coisa que SMOtenha acesso.

    No contexto de sp_AskBrent, fui em frente e passei alguns minutos apenas construindo a saída em um relatório HTML. Os principais pontos de interesse neste script é que, para lidar com vários conjuntos de dados, você executará sua consulta com o ExecuteWithResultsmétodo disponível nos seguintes namespaces:

    • Microsoft.SqlServer.Management.Smo.Server
    • Microsoft.SqlServer.Management.Smo.Database

    Você pode ver um exemplo de uso do database namespace no MSDN aqui . No meu script, estou usando o Servernamespace. Funcionará de qualquer maneira, mas se você revisar o artigo do MSDN ExecuteWithResults, retornará um DataSetobjeto e esse objeto conterá um arquivo DataTable. O número de DataTablesé baseado no número de conjuntos de dados retornados pelo seu código. No caso do procedimento de Brent você receberá de volta 5 DataTables. Você pode verificar isso no código abaixo adicionando $results.Count, logo antes do foreachloop.

    Agora, uma outra observação neste script é que escolhi enviar para HTML. Você pode escolher outro formato, se desejar, mas enviar tudo para o console não é legível. Também observarei que adicionei informações de ajuda para que você possa usar Get-Helpno script se precisar ver detalhes sobre os parâmetros ou lembrar-se de como chamá-lo.

    Usei um pequeno trecho de código de Pinal Dave apenas para gerar algum uso de CPU em minha instância local para este exemplo. (Caso contrário, o procedimento não retornou muitas informações).

    insira a descrição da imagem aqui

    insira a descrição da imagem aqui

    Roteiro

    <#
        .SYNOPSIS
            Executes sp_AskBrent and outputs to HTML
        .DESCRIPTION
            Execute sp_AskBrent in normal or expert mode and outputs to an HTML.
        .PARAMETER server
            String. [REQUIRED] The SQL Server instance you wish to get results on.
        .PARAMETER timelimit
            Integer. Time used for @seconds parameter of sp_AskBrent
        .PARAMETER expertMode
            Switch. Just opts to have @ExpertMode = 1 for the query
        .PARAMETER sqlversion
            Integer. If on machine with multiple SQL Server tool versions installed, specify version.
        .PARAMETER outfile
            String. Set output file to generate HTML
        .EXAMPLE
        Run command in normal mode, which returns one dataset
        .\Script.ps1 -server MANATARMS\SQL12 -timelimit 5 -sqlversion 11 -outfile 'C:\temp\MyServer.html'
        .EXAMPLE
        Run command in expert mode, which returns multiple datasets
        .\Script.ps1 -server MANATARMS\SQL12 -timelimit 5 -expertMode -sqlversion 11 -outfile 'C:\temp\MyServer.html'
        .NOTES
        Does not check if sp_AskBrent is on the server before executing the query.
    #>
    [cmdletbinding()]
    param(
        [Parameter(Mandatory=$true,Position=0)]
        [Alias("instance")]
        [string]
        $server,
    
        [Parameter(Mandatory=$false,Position=1)]
        [int]
        $timelimit = 10,
    
        [Parameter(Mandatory=$false,Position=2)]
        [switch]
        $expertMode,
    
        [Parameter(Mandatory=$false,Position=3)]
        [int]
        $sqlversion = 11,
    
        [Parameter(Mandatory=$false,Position=4)]
        [string]
        $outfile= 'C:\temp\Testing.html'
    )
    
    $HtmlTop = @"
    <!DOCTYPE html>
    <html>
    <head>
    <style>
        body { 
            background-color:white;
            font-family:Tahoma,Arial;
            font-size:10pt;
        }
        table {
            border-collapse: collapse;
        }
        th { 
            border:2px solid black;
            color:white;
            background-color: #0066FF;
            padding: 4px;
        }
            th.subhead {
                color:black;
                background-color: #8dbafc
            }
        td {
            border: 1px solid black;
            padding: 2px;
        }
    
    </style>
    </head>
    <body>
    <h2>Server Name: $($server)</h2>
    <h3>Run Date: $(Get-Date)</h3>
    "@
    
    $HtmlTop | Out-File -FilePath $outfile -Force
    
    if ($expertMode) {
        $askBrent = "EXEC sp_AskBrent @Seconds=$($timelimit), @ExpertMode=1"
    }
    else {
        $askBrent = "EXEC sp_AskBrent @Seconds=$($timelimit), @ExpertMode=0"
    }
    
    try { 
        Add-Type -AssemblyName "Microsoft.SqlServer.Smo,Version=$($sqlversion).0.0.0,Culture=neutral,PublicKeyToken=89845dcd8080cc91"
    }
    catch {
        Add-Type -AssemblyName "Microsoft.SqlServer.Smo"
    }
    
    $srv = New-Object 'Microsoft.SqlServer.Management.Smo.Server' $server
    
    $results = $srv.ConnectionContext.ExecuteWithResults($askBrent);
    
    foreach ($t in $results.Tables) {
        $t | Select-Object * -ExcludeProperty RowError, RowState, HasErrors, Table, ItemArray | ConvertTo-Html -As Table -Fragment | Out-String | Out-File -FilePath $outfile -Append
        ## This is just to get a break between tables ##
        "<hr>" | Out-File -FilePath $outfile -Append
    }
    
    • 7

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve