Exitem outras formas de ver essa informação mas, quero motrar usando uma DMV.
Por que? –Porque é legal,,,
Exitem outras formas de ver essa informação mas, quero motrar usando uma DMV.
Por que? –Porque é legal,,,
ATENÇÃO: apenas para constar que NÃO me responsabilizo se você testar isso em seu ambiente e apresentar problemas
Vamos pelo básico,,,
Para listar os comandos DBCC: DBCC HELP(‘?’)
Para uma ajuda mais específica sobre um comando: DBCC HELP(‘SQLPERF’)
Bom,,, agora vem a parte divertida,,,
Para exibir os não documentados você precisa habilitar um TRACEON: DBCC TRACEON(2588) — O 2588 é para 2005 e 2008, para 7 e 2000 é 2520
Depois de habilitar o traceon execute um: DBCC HELP(‘?’) WITH NO_INFOMSGS
Agora vem um esquema camarada legal,,, Continue reading
Recentemente um cliente me pediu ajuda para identificar um problema bem interessante.
O time de desenvolvimento dele havia instalado uma aplicação ERP em 4 servidores, desses 4 servidores apenas 1 estava apresentando lentidão e as vezes erro enquanto executava qualquer tipo de acesso ao servidor SQL. Ele comentou que já havia pedido ao time de SO reinstalar o Windows mas, mesmo depois de reinstalar não fez nenhuma diferença.
Como teste simples, criei um arquivo de 1GB vazio usando o FSUTIL:
fsutil file createnew c:\teste.txt 1073741824
Copiamos esse arquivo para os 4 servidores, em tempos diferentes e ao mesmo tempo, nos testes não notamos diferenças de tempo entre as cópias.
Este script irá retornar uma lista de tabelas do banco que, desde o último restart do SQL, não tiveram um SELECT executado contra elas. Isto pode ser usado para determinar se a tabela é usada ou não.
ATENÇÃO: As estatísticas do SQL são apagadas toda a vez que o serviço do SQL é reiniciado. Então, não é porque o script esta informando que a tabela não teve uso que ela não é importante, ela apenas não teve uso desde o último restart. Então não saia apagando tabelas ao seu bel prazer, vai que uma delas é usada pelo sistema fiscal apenas a vez por mês e você reinicia o SQL a cada Windows Update, você sempre vai ver essa tabela com esse script.
WITH LastActivity (ObjectID, LastAction) AS
(
SELECT object_id AS TableName,
last_user_seek as LastAction
FROM sys.dm_db_index_usage_stats u
WHERE database_id = db_id(db_name())
UNION
SELECT object_id AS TableName,
last_user_scan as LastAction Continue reading
Bom,,, o script abaixo analisa todos os objetos de índices da instância do SQL e mostra a fragmentação dos índices… em teoria, quanto maior a coluna fragmentation mais fragmentado estará o índice.
|
SELECT CONVERT(NVARCHAR(130), SERVERPROPERTY(‘servername’)) AS instancename , |
Esse script relaciona as tabelas existentes em um banco de dados com o nome da chave extrangeira e a “tabela pai”
|
SELECT b.name AS ‘Tabela’ , c.name AS ‘Tabela Pai’ FROM sys.foreign_keys A INNER JOIN sys.objects B ON a.parent_object_id = b.object_id JOIN sys.objects C ON c.object_id = a.referenced_object_id ORDER BY b.name ASC |
Em alguns casos, o arquivo de ERRORLOG cresce muito e você precisa reciclar esse arquivo de log.
USE master;
EXEC sp_cycle_errorlog;
GO
Para localizar onde está esse arquivo, veja o parâmetro de inicialização do SQL Server.
Nesse post vou falar como movimentar os arquivos de um banco de dados de uma unidade/diretório para outra unidade/diretório.
Ai você pensa:
“Pra que? Já sei como faz isso. Não tem nenhuma novidade.” ou
“Aaahh,,, isso é facil, uso o bom e velho backup/restore ou o detach/attach…”
Isso é verdade, não tem nenhuma grande novidade em fazer a movimentação mas, ai vem a parte divertida, pra que fazer do método fácil se podemos fazer do método interessante?
1.- Backup/Restore
Se executarmos o bom e velho backup/restore, no momento do restore podemos alterar o caminho onde os arquivos irão ser gravados, isso é simples.
Apenas precisaremos executar o processo de backup que, dependendo do tamanho da base, pode demorar alguns minutos ou até umas horas. Além de ter que ter um espaço para armazenar o backup ou executá-lo através de uma unidade de backup.
2.- Detach/Attach
Usando o Detach ganhamos algum tempo, você vai apenas mover os arquivos de log e dados para outro lugar e anexar a base novamente.
O problema disso é se você usar o Service Broker ou até o Mirror, você terá que refazer o processo.
3.- Alter Database (o “método interessante”)
Esse “método” a seguir cria uma procedure para executar a movimentação do banco para outro local usando o Alter database, mas é possível executá-lo em diversos bancos como vou demonstrar:
Vamos criar 2 bases de dados para testar:
| create database banco1
create database banco2 |
Agora execute o scritp abaixo para criar a procedure que irá executar a movimentação dos arquivos:
| IF ( OBJECT_ID(‘dbo.sp_MoveDatabase’) IS NOT NULL ) begin DROP PROCEDURE dbo.sp_MoveDatabase end GO create procedure sp_MoveDatabase @NewDataFolder nvarchar(1000), as set nocount on; if right(@DbList,1) = ‘,’ Begin End set @String = @DbList BEGIN END Begin exec sp_configure ‘xp_cmdshell’ , ‘1’ print ‘NewMdfFolder is ‘ + @NewDataFolder SET @RowNum = 1 Begin — Derruba todas as conexoes configurando como single user with immediate — configura db off line begin –move arquivos files begin set @NewPath = @NewLogFolder + @FileName — altera caminho dos arquivos set @sql = ‘ALTER DATABASE [‘ + @DbName + ‘] SET ONLINE;’ — aceita multi user novamente. reconfigure RECONFIGURE |
** ATENÇÃO **
Os diretórios de destino já devem estar criados, caso você execute a procedure sem criar o destino o script vai alterar o caminho da base e não vai movimentar os arquivos e quando ela foi trazida online ela vai apresentar erro.
** ATENÇÃO 2 **
Esse script é do tipo “Vai filhão”, quando ele for executado todos os usuários conectados serão desconectados sem dó nem piedade, todas as transações que eles estiverem executando serão dropadas. As conexões apenas poderão ser reestabelecidas após o termino da movimentação.
Para executar a procedure execute-a da seguinte forma:
| exec sp_MoveDatabase @NewDataFolder = ‘c:\teste\’, @NewLogFolder = ‘d:\teste\’, @sDbList = ‘banco1, banco2’ |
Se tudo der certo, as bases banco1 e banco2 estarão seus novos destinos.
Muitos já sabem que se utilizar o:
| select @@version |
terá as informações sobre a versão do SQL onde você está executando este select.
Mas se você executar:
| SELECT CAST( SERVERPROPERTY( ‘MachineName’ ) AS varchar( 30 ) ) AS MachineName , CAST( SERVERPROPERTY( ‘InstanceName’ ) AS varchar( 30 ) ) AS Instance , CAST( SERVERPROPERTY( ‘ProductVersion’ ) AS varchar( 30 ) ) AS ProductVersion , CAST( SERVERPROPERTY( ‘ProductLevel’ ) AS varchar( 30 ) ) AS ProductLevel , CAST( SERVERPROPERTY( ‘Edition’ ) AS varchar( 30 ) ) AS Edition , ( CASE SERVERPROPERTY( ‘EngineEdition’) WHEN 1 THEN ‘Personal or Desktop’ WHEN 2 THEN ‘Standard’ WHEN 3 THEN ‘Enterprise’ END ) AS EngineType , CAST( SERVERPROPERTY( ‘LicenseType’ ) AS varchar( 30 ) ) AS LicenseType , SERVERPROPERTY( ‘NumLicenses’ ) AS #Licenses;SELECT @@VERSION AS [SQL Server Details]; |