A partir da semana passada comecei a migração do banco de dados da Amazon RDS para Microsoft SQL Azure. Após a migração da estrutura do banco e alguns dados básicos para o teste (não estamos em produção ainda), precisei resolver algumas limitações do SQL Azure e um deles é a falta de SQL JOBS.
Para realizar um trabalho INDEX REBUILD, eu tive que usar as TAREFAS AUTOMATIZADAS do Microsoft Azure, usando um script baseado em PowerShell.
Este é o rascunho do que eu fiz:
workflow IndexRebuild
{
inlinescript {
# Define the connection to the SQL Database
$server = "informeURLSQLAzure"
$db = "informeNomedoBanco"
$usr = "informeUsuarioBanco"
$psw = "informeSenhaBanco"
$Conn = New-Object System.Data.SqlClient.SqlConnection("Server=$server;Database=$db;User ID=$usr;Password=$psw;Trusted_Connection=False;Encrypt=True;Connection Timeout=30;")
# Open the SQL connection
$Conn.Open()
# Here you can add your defrag proc... I added one bellow...
$Cmd=new-object system.Data.SqlClient.SqlCommand("Exec SpDefragAllIndex;", $Conn)
$Cmd.CommandTimeout=120
# Execute the SQL command
$Ds=New-Object system.Data.DataSet
$Da=New-Object system.Data.SqlClient.SqlDataAdapter($Cmd)
[void]$Da.fill($Ds)
# Output the count
$Ds.Tables.Column1
# Close the SQL connection
$Conn.Close()
}
}
O script acima é apenas para a tarefa. Abaixo o script da procedure de REBUILD que estou usando no AZURE:
ALTER PROC Spdefragallindex
AS
BEGIN
DECLARE @TableName VARCHAR(255)
DECLARE tablecursor CURSOR FOR
(SELECT '[' + IST.table_schema + '].[' + IST.table_name
+ ']' AS [TableName]
FROM information_schema.tables IST
WHERE IST.table_type = 'BASE TABLE')
OPEN tablecursor
FETCH next FROM tablecursor INTO @TableName
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT( 'Rebuilding Indexes on ' + @TableName )
BEGIN try
EXEC('ALTER INDEX ALL ON ' + @TableName +
' REBUILD with (ONLINE=ON)')
--PRINT 'ALTER INDEX ALL ON ' + @TableName + ' REBUILD with (ONLINE=ON)'
END try
BEGIN catch
PRINT( 'Rebuild with Online=On ' + @TableName
+ ' UnSuccessful, removing ONLINE' )
EXEC('ALTER INDEX ALL ON ' + @TableName + ' REBUILD')
END catch
FETCH next FROM tablecursor INTO @TableName
END
CLOSE tablecursor
DEALLOCATE tablecursor
SELECT Cast(1 AS INT) AS [Success]
END
Como não estamos em produção ainda, não estou usando uma lista de tabelas baseado no tamanho ou na média de fragmentação, o que seria mais adequado. Altere a procedure como for melhor a sua necessidade.
Check out my new book on MariaDB http://www.amazon.com/dp/B00MQC06HC
Nenhum comentário:
Postar um comentário
Leave your comment here!