Quem nunca foi acionado ou recebeu um alerta de falta de espaço em disco e não fazia ideia de onde estava a ocupação do disco?
Existem várias formas de ocupar espaço no disco e dar dor de cabeça para o administrador Windows, nesse post vou comentar da que, no meu ponto de vista, é a mais chata o diretório do “System Volume Information”.
Quem é esse tal de “System Volume Information”?
Esse diretório contém informações sobre a indexação do disco
Informação de Quota NTFS
Dados do sistema de ponto de restauração e backup usando Windows Server Backup
Dados para backup usando algumas ferramentas de backup
Se você usa “Shadow copy” cada nova versão de VSS snapshot salva dados nesse diretório
etc.
Você não deveria se preocupar com os dados desse diretório, onde a ferramenta que está gerando os dados e versionamentos de arquivos nesse diretório deveriam limpar os dados e tocar a vida, mas como trabalhamos com TI e não necessariamente as ferramentas fazem o que deveriam fazer, vamos fazer o trabalho de identificar e limpar essa estrutura.
Pelo “Windows Explorer” originalmente esse diretório não é exibido, você precisa alterar as configurações de exibição para mostrar arquivo e diretórios ocultos do sistema.
Quando tentar acessar vai receber erro de acesso negado mesmo você sendo o administrador do sistema.
Agora que você já sabe quem é esse diretório, já sabe que ele existe, já viu onde ele está, para calcular o espaço ocupado por ele você vai abrir o prompt de comando em modo administrador e vai digitar:
vssadmin list shadowstorage
Se tiver alguma coisa configurada com o ” System Volume Information” ele deve apresentar um resultado parecido com:
Legal, agora temos informações de quanto o espaço máximo pode ser alocado para os recursos e o quanto está realmente alocado.
Se o valor estiver com configuração “UNBOUNDED” quer dizer que o céu é o limite, ou o espaço total do disco, o que acabar primeiro…
Para exemplificar, vamos colocar o limite para a letra C: em 2GB
Ele vai escrever que redimensionou o espaço para o serviço de shadow copy.
Você pode trocar o /maxsize=XGB para porcentagem também, ai fica /maxsize=10%
Se você cria backups de “system state” o windows também cria essa estrutura na letra C:, para apagar eles você pode rodar:
wbadmin delete systemstatebackup -keepversions:0
Isso deve ser o suficiente para limpar esses diretórios das suas unidades, agora entender por que eles estão sendo alimentados para evitar que isso ocorra novamente? corre atrás do pessoal de backup…
Como DBA´s estamos sujeitos a jobs, alertas, sistemas, coisas do além, gerentes, desenvolvedores, intervenções místicas, etc. executando ações no banco de dados.
Não da pra ficar olhando de perto o ambiente a todo o momento analisando cada ação, monitorando tudo o que ocorre, se preparando para o pior.
Sendo um bom DBA, você deve ter um monte de Jobs, Alertas, Operadores, Sistemas de Monitoração, aquele estagiário sendo escalpelado, entre outras formas de monitorar seus bancos, a ideia aqui é trazer mais uma opção para atazanar sua vida monótona.
Vamos a receita do desastre,,, Para isso vamos precisar:
Que você tenha uma conta no Telegram
Instale o aplicativo do Telegram no seu Windows
Crie um Bot
Configure o Bot
Crie um canal e adicione esse Bot como administrador a um canal
Mande uma mensagem para esse canal para criar um ID
Acesse uma URL do Telegram com a chave do BOT para pegar o ID do canal
Crie uma função no Powershell
Declare a variável com o nome do Bot e a chave
Mande uma mensagem
Vamos começar,,,
Conta do Telegram
PQ está lendo essa parte? vai para a próxima,,, se não sabe fazer isso nem adianta continuar…
Instale o aplicativo do Telegram no seu Windows
Esse ponto é interessante, acesse o cliente web do Telegram e baixe a versão para seu SO, as configurações do Bot serão feitas através do cliente e não pelo celular ou Web
Crie um Bot
Com sua contra criada e app instalado, acesse essa URL https://t.me/BotFather . Ele é o Bot que cria os Bot´s
Para criar digite /start
Depois digite /newbot
De um nome para seu Bot
Agora crie um username para seu bot, ele tem que terminar com bot
Você vai receber uma mensagem de resposta com um textão e a parte que interessa que é o TOKEN. ANOTA ISSO!
Aqui vale uma dica, o Bot vai aparecer em pesquisa para qualquer pessoa que use o Telegram, mas só quem tem o token vai poder realmente usar ele.
Configure o Bot
Adicione uma descrição para ele, uma hora você ou alguém vai fazer manutenção e vai ter que lembrar para que ele serve
Usando /setdescription adicione uma descrição
Crie um canal e adicione esse Bot como administrador a um canal
Agora usando o cliente do SO, Web ou o app do celular, crie um canal no Telegram e deixe como privado.
Adicione um novo membro para esse canal, nesse caso o seu Bot, vai aparecer um alerta de que o Bot precisa ser administrador do canal e bla bla bla
Mande uma mensagem para esse canal para criar um ID
Só o fato de criar um canal não efetiva cria o canal, até esse momento ele não tem um ID
Mande uma mensagem qualquer para o canal para ele criar a estrutura com o ID
Acesse uma URL do Telegram com a chave do BOT para pegar o ID do canal
Após mandar a mensagem acesse a URL com o token do seu Bot
a URL é alguma coisa assim: https://api.telegram.org/bot<aquele token do seu Bot>/getUpdates
deixa escrito o nome bot, remove o < e o > e cola o token
deve abrir uma página com alguma coisa parecida com:
O que interessa para nós é um desses últimos “id” que estão com um símbolo de menos na frente “id”:-XXXX
Crie uma função no Powershell
Agora a parte mágica, vamos usar um powershell para criar a função que vai conectar na API do Telegram e mandar a mensagem…
<#
.Synopsis
Sends Telegram text message via Bot API
.DESCRIPTION
Uses Telegram Bot API to send text message to specified Telegram chat. Several options can be specified to adjust message parameters.
.EXAMPLE
$bot = "#########:xxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxx"
$chat = "-#########"
Send-TelegramTextMessage -BotToken $bot -ChatID $chat -Message "Hello"
.EXAMPLE
$bot = "#########:xxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxx"
$chat = "-#########"
Send-TelegramTextMessage `
-BotToken $bot `
-ChatID $chat `
-Message "Hello *chat* _channel_, check out this link: [TechThoughts](http://techthoughts.info/)" `
-ParseMode Markdown `
-Preview $false `
-Notification $false `
-Verbose
.PARAMETER BotToken
Use this token to access the HTTP API
.PARAMETER ChatID
Unique identifier for the target chat
.PARAMETER Message
Text of the message to be sent
.PARAMETER ParseMode
Send Markdown or HTML, if you want Telegram apps to show bold, italic, fixed-width text or inline URLs in your bot's message. Default is Markdown.
.PARAMETER Preview
Disables link previews for links in this message. Default is $false
.PARAMETER Notification
Sends the message silently. Users will receive a notification with no sound. Default is $false
.OUTPUTS
System.Boolean
.NOTES
Author: Jake Morrison - @jakemorrison - http://techthoughts.info/
This works with PowerShell Versions 5.1, 6.0, 6.1
For a description of the Bot API, see this page: https://core.telegram.org/bots/api
How do I get my channel ID? Use the getidsbot https://telegram.me/getidsbot
How do I set up a bot and get a token? Use the BotFather https://t.me/BotFather
.COMPONENT
PoshGram - https://github.com/techthoughts2/PoshGram
.FUNCTIONALITY
https://core.telegram.org/bots/api#sendmessage
Parameters Type Required Description
chat_id Integer or String Yes Unique identifier for the target chat or username of the target channel (in the format @channelusername)
text String Yes Text of the message to be sent
parse_mode String Optional Send Markdown or HTML, if you want Telegram apps to show bold, italic, fixed-width text or inline URLs in your bot's message.
disable_web_page_preview Boolean Optional Disables link previews for links in this message
disable_notification Boolean Optional Sends the message silently. Users will receive a notification with no sound.
reply_to_message_id Integer Optional If the message is a reply, ID of the original message
#>
function Send-TelegramTextMessage {
[CmdletBinding()]
Param
(
[Parameter(Mandatory = $true,
HelpMessage = '#########:xxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxx')]
[ValidateNotNull()]
[ValidateNotNullOrEmpty()]
[string]$BotToken, #you could set a token right here if you wanted
[Parameter(Mandatory = $true,
HelpMessage = '-#########')]
[ValidateNotNull()]
[ValidateNotNullOrEmpty()]
[string]$ChatID, #you could set a Chat ID right here if you wanted
[Parameter(Mandatory = $true,
HelpMessage = 'Text of the message to be sent')]
[ValidateNotNull()]
[ValidateNotNullOrEmpty()]
[string]$Message,
[Parameter(Mandatory = $false,
HelpMessage = 'HTML vs Markdown for message formatting')]
[ValidateSet("Markdown", "HTML")]
[string]$ParseMode = "Markdown", #set to Markdown by default
[Parameter(Mandatory = $false,
HelpMessage = 'Disables link previews')]
[bool]$Preview = $false, #set to false by default
[Parameter(Mandatory = $false,
HelpMessage = 'Sends the message silently')]
[bool]$Notification = $false #set to false by default
)
#------------------------------------------------------------------------
$results = $true #assume the best
#------------------------------------------------------------------------
$payload = @{
"chat_id" = $ChatID;
"text" = $Message
"parse_mode" = $ParseMode;
"disable_web_page_preview" = $Preview;
"disable_notification" = $Notification
}#payload
#------------------------------------------------------------------------
try {
Write-Verbose -Message "Sending message..."
$eval = Invoke-RestMethod `
-Uri ("https://api.telegram.org/bot{0}/sendMessage" -f $BotToken) `
-Method Post `
-ContentType "application/json" `
-Body (ConvertTo-Json -Compress -InputObject $payload) `
-ErrorAction Stop
if (!($eval.ok -eq "True")) {
Write-Warning -Message "Message did not send successfully"
$results = $false
}#if_StatusDescription
}#try_messageSend
catch {
Write-Warning "An error was encountered sending the Telegram message:"
Write-Error $_
$results = $false
}#catch_messageSend
return $results
#------------------------------------------------------------------------
}#function_Send-TelegramTextMessage
Declare a variável com o nome do Bot e a chave
Sendo simplista você vai precisar agora criar duas variáveis a com o nome do Token e o ID do chat
$bot = "token"
$chat = "-ID_do_chat"
Mande uma mensagem
Agora é só chamar a função e mandar a mensagem…
AAHH a máquina precisa ter acesso a internet.
Qualquer mensagem de erro a função vai tentar trazer a mensagem para te ajudar no troubleshooting.
Com isso agora temos um powershell que acessa uma API do Telegram e manda mensagem, junta isso em um JOB que é acionado por um alerta e vc tem o SQL ou outro sistema de monitoração mandando mensagens para seu celular.
Nessa época de pandemia estamos tendo que nos reinventar em muitas coisas que não dávamos importância, que eram tratadas como corriqueiras e bla bla bla… essa história triste todos já sabemos, estamos vivendo ela…
Quem tem criança sabe como está “interessante” ajustar a rotina para acompanhar os estudos, terem aulas online não significa facilidade para os pais, cada um tem seu horário, aulas em horários diferentes e esperar que a criança entenda que ela tem que entrar no link certo para a aula certa, dependendo da idade, pode ser complicado as vezes eles ainda nem sabem os dias da semana.
No nosso caso, a escola manda um arquivo pdf com uma grade para a semana, o mesmo link do zoom para as aulas recorrentes e links destintos para aulas “complementares”, o problema fica que a cada semana eles alteram o horário de inicio das aulas, essa falta de constante complica em se ajustar ao quadro de aula, como temos 2 peças raras e cada um tem uma agenda de inicio de aula diferente com quadro de aulas diferente no inicio da manhã fica uma correria em abrir o link para um em um computador e esperar até a hora do outro para abrir o link para o outro em outro computador, sair de uma “aula” para abrir o link para a outra e ter certeza que abriu o da semana certa no dia certo.
Com essa enrolação de contexto, agora vem a solução, afinal a TI veio para resolver problemas que não tínhamos que ela mesma causou.
O script abaixo ainda é um protótipo, basicamente é um powershell para ler a URL da reunião do Zoom, converter para um padrão usado pelo cliente do Zoom e criar uma tarefa no “Agendador de Tarefas” para que no horário específico ele abra o Zoom e entre na reunião automaticamente.
Como as aulas recorrentes acontecem com o mesmo link de reunião não tive que me importar em conseguir colocar várias execuções para a mesma tarefa do agendador, fica mais prático para organização, eu poderia ter seguido a mesma lógica para as aulas adicionais, mas ficaria um serviço mau feito.
As aulas adicionais são tratadas como tarefas individuais no agendador.
* Comentário 1: eu poderia ter feito um replace mais simples e direto, mas preferi serializar para ficar mais didático.
* Comentário 2: Esse script funciona no Windows 8 para cima, para o Windows 7 estou trabalhando nas modificações de agendamento, pois no 7 os comandos no powershell são diferentes.
* Comentário 3: No “Agendador de Tarefas” crie um diretório chamado “Aulas”, fica mais fácil de organizar
Tenho no meu note o Windows 10 (Version 200514-1410 Build 19631.1) e uso como virtualizador o VMWare Workstation 15 (15.5.2 build-15785246)
Esse Windows 10 faz parte do programa insider, então toda a semana tem uma atualização.
Por que não usar o Hyper-V ? A resposta é simples: Não quero e pronto. A maquina é minha e gosto mais do vmware.
Alinhados quanto a isso, depois que o Windows atualizou para o Build 19000+ o VMWare resolveu parar de funcionar e não iniciava nenhuma máquina. Ele começou a apresentar a mensagem abaixo para qualquer máquina virtual:
Você tem sua rotina de backup (FULL, DIFF, LOG) que gera os arquivos de saída como por exemplo BKPFULL_BASE_XPTO_01_DE_04_20181105.bak e coisas parecidas com isso.
Sua ferramenta de backup copia esses arquivos para uma área de staging todos os dias, marcando os arquivo com o bit de arquivado, no dia seguinte você tem um step do job que procura por esses arquivos e apaga ele, afinal, já foram marcados como arquivados pelo software de backup.
Em um certo momento, alguma coisa aconteceu nessa rotina da ferramenta e ela não marcou os arquivos ou simplesmente não rodou.
Para não ficar sem espaço em disco você resolve apagar o arquivo mais antigo do backup deixando pelo menos o mais recente no disco, para um ambiente com poucas bases isso é tranquilo, imagine isso para um ambiente com algumas centenas de bases, em um final de semana prolongado, algumas bases com 3 ou 4 arquivos de backup, outras com apenas 1 arquivo.
O PowerShell abaixo faz um parse no nome do arquivo para agrupar pelo tipo do backup e o nome do banco, procura onde tem mais de uma entrada (imaginando que você separa isso por discos), remove do resultado o mais recente e apaga os mais antigos.
O script não é perfeito, ainda faltam alguns detalhes à serem melhorados, mas já é uma ajuda em casos como esse:
Get-ChildItem "X:\Backup\Disk02\" -file | where Name -match "._(\d{4})(\d{2})(\d{2})" | Where-Object {$_.Attributes -Eq "Normal"} | #Esse Atributo é o que o software de backup marca como retido, retire este Where-Object caso queira desconsiderar isso
select fullname, #@{N="DtFile";E={[DateTime]$_.BaseName.substring($_.BaseName.length -10).replace("_", "-")}},
@{N="FileWithoutDate";E={$_.BaseName.substring(0, $_.BaseName.length -18)}} |
group FileWithoutDate |
where Count -GE 2 |
%{ $_.Group | sort fullname,DtFile -Descending | select -skip 1} | %{Remove-Item $_.FullName -WhatIf}
Não sei se é de conhecimento de todos mas, já faz alguns anos que você pode usar o SHIFT + Botão Direito e vai aparecer uma opção de “Abrir o prompt de comando aqui” e ele vai abrir uma tela do DOS dentro daquela estrutura de diretório.
A mesma coisa vale para qualquer parte vazia na janela de conteúdo.
Isso ajuda? ajuda, mas tem um detalhe chato, ele não abre o prompt elevado e mesmo nas versões mais recentes não tem a opção de powershell. Fora que para abrir tem que pressionar o SHIFT junto.
É possível melhorar isso? claro, senão não estaria escrevendo este post…
Só testei no Windows 10, se alguém testar em outras versões deixa um comentário dizendo se funcionou ou não e em qual versão.
Para isso vamos ter que adicionar algumas linhas de registro.
Sempre vale um ATENÇÃO !!! Se você não sabe alterar, ou tem medinho, de alterar o registro clique aqui.
Para os outros, abaixo tem o que vocês precisam copiar e salvar em um arquivo .reg, após importar o arquivo vocês terão 2 novos menus com o Botão Direito:
Aí fiquei pensando se algum deles tinha uma API para trazer a informação do status da linha e descobri que, claro, nenhum deles tem isso…
Mas, a Viaquatro, que opera a linha 4 do metrô tem uma API, que apenas trás as informações do metrô e por curiosidade não trás informações sobre a própria linha 4,,, mas já está valendo….
Tenho alguns clusters que estão em Multi-site, usando um Quorum em File Share para melhorar a disponibilidade.
Como o “Cluster Core” conta como voto na contagem do cluster, tenho preferencia na localização do recurso, já que todos os nós estão votando ele trabalha como voto de desempate.
Eu precisava monitorar um evento bem particular do cluster, quando o “Cluster Core Resource” alterasse de site ele deveria alarmar pelo SCOM, até ai tranquilo,,, faço um script no POSH o pessoal coloca para monitorar e pronto….
Enquanto testava o script percebi que o Powershell ISE estava retornando mensagem de erro, fiquei revendo argumento, variável, comObject, mas não encontrei o erro…
Powershell ISE SCOM Script Error
Exception calling “Return” with “1” argument(s): “The handle is invalid. (Exception from HRESULT: 0x80070006 (E_HANDLE))”
At line:15 char:1
+ $API.Return($bag)
+ ~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : ComMethodTargetInvocation
A solução é bem simples:
Salve o arquivo em script e execute ele… o ISE não consegue interpretar o retorno do comObject.
Para quem leu meu post anterior de Gerar DACPAC usando Powershell percebeu que é um código muito simples, passível de erros como:
digitar o nome do banco errado,
símbolos nos nomes dos bancos,
não escolher um local ou o nome do servidor ele gera erro no script…
coisas bem primárias…
Dessa vez fiz algumas melhorias,,, como:
Tela mais simpática
conecta no servidor de banco e lista as bases
multi seleção de bases
não deixa você continuar se não selecionar um destino e colocar o nome do servidor
Não fecha sozinho
deixa na tela do posh o código para, caso precise, você copie e execute novamente
coloca o mouse como ampulheta
abre o diretório de destino quando acaba a tarefa
e localiza o executável do gerador de dacpac,,, desde que esteja no C:\
Uma coisa muito importante, o código é livre para modificação, sinta-se a vontade de fazer qualquer modificação que queira,, se achar que sua versão ficou melhor, ou achou algum problema e corrigiu, mande o código, vamos melhorar,,,,
O ciclo de vida da maioria dos bancos envolve desenvolvedores e DBA´s compartilhando scripts para atualização de objetos e atividades de manutenção.
Existem algumas formas de fazer isso:
gerar scripts de objetos
Proporcionar acesso as partes interessadas (piada… eu sei…) para gerar os scripts
DACPAC´s
Backup/Restore
etc..
Um pouco de contexto antes,,,
Um DAC (aplicativo da camada de dados) é uma entidade lógica de gerenciamento de banco de dados que define todos os objetos do SQL Server, como tabelas, exibições e objetos de instância, incluindo logons, associados a um banco de dados de usuário.
Todos tem seus prós e contras… não é a intenção deste post tratar isso…
Para quem gosta de gerar scripts dos objetos lembra que tem um outro post que faz isso…
A vantagem do DACPAC é que você pode usa-lo para comparação entre um projeto do TFS e esse pacote extraído da produção ou, caso você seja o DBA, você pode comparar esse pacote contra a sua base de produção ou uma base em homologação. Gerar os scripts para igualar os ambientes ou apenas conseguir ter ideia das diferenças.
Quando clicar no “…” para mapear o caminho, se não aparecer uma janela pop-up, movimenta a janela do app um pouco para o lado, ela ficou atrás da janela inicial,,, isso é um bug que acontece de vez em quando,,,
se vc clicar diversas vezes no “…” ele vai ficar abrindo diversas vezes…
ainda não estou tratando outros tipos de entrada no campo texto,,,, você deve colocar um banco abaixo do outro,,,
e sim,,, ele fecha a janela quando você clica em OK,,,
Ele ficou até que bem simpático…
Com os campos preenchidos
E tem até barra de status… olha que chique…
Manage Cookie Consent
To provide the best experiences, we use technologies like cookies to store and/or access device information. Consenting to these technologies will allow us to process data such as browsing behavior or unique IDs on this site. Not consenting or withdrawing consent, may adversely affect certain features and functions.
Functional
Always active
The technical storage or access is strictly necessary for the legitimate purpose of enabling the use of a specific service explicitly requested by the subscriber or user, or for the sole purpose of carrying out the transmission of a communication over an electronic communications network.
Preferences
The technical storage or access is necessary for the legitimate purpose of storing preferences that are not requested by the subscriber or user.
Statistics
The technical storage or access that is used exclusively for statistical purposes.The technical storage or access that is used exclusively for anonymous statistical purposes. Without a subpoena, voluntary compliance on the part of your Internet Service Provider, or additional records from a third party, information stored or retrieved for this purpose alone cannot usually be used to identify you.
Marketing
The technical storage or access is required to create user profiles to send advertising, or to track the user on a website or across several websites for similar marketing purposes.