Estou reduzindo os bancos de dados que já estão em um SQL Elastic Pool.
O objetivo é encaixar o máximo possível de bancos de dados em um Elastic Pool exclusivo.
Para fazer isso, encontrei um blog que sugere executar esta consulta que basicamente faz 3 coisas:
- -- Etapa 1: reconstruir todos os índices
- -- Etapa 2: reduzir o banco de dados
- -- Etapa 3: reconstruir todos os índices
Aí vem a consulta:
create or alter procedure [#ForEachTable](@inputStmt nvarchar(max))
as
begin
set nocount, xact_abort on;
drop table if exists [#Tables];
select concat(quotename([S].[name]), N'.', quotename([T].[name])) as [table]
into [#Tables]
from [sys].[schemas] as [S]
inner join [sys].[tables] as [T]
on [S].[schema_id] = [T].[schema_id]
where [T].[is_ms_shipped] = 0;
declare tables cursor local fast_forward for select [table] from [#Tables];
open tables;
declare @table nvarchar(max);
fetch next from tables into @table;
declare @total integer = (select count(*) from [#Tables]);
declare @space integer = len(cast(@total as nvarchar(max)));
declare @current integer = 1;
while @@fetch_status = 0
begin
declare @stmt nvarchar(max) = replace(@inputStmt, N'?', @table);
declare @msg nvarchar(max) = concat(
sysutcdatetime(), N' - ',
N'[', right(concat(N'000', @current), @space), N'/', @total, N']: ',
N'Executing command: "', @stmt, N'".'
);
raiserror(@msg, 10, 1) with nowait;
execute [sys].[sp_executesql] @stmt = @stmt;
fetch next from tables into @table;
set @current += 1;
end;
close tables;
deallocate tables;
end;
go
-- Step 1: Rebuild all the indexes
raiserror(N'First rebuild...', 10, 1) with nowait;
execute [#ForEachTable] N'alter index all on ? rebuild with (online = on);';
go
-- Step 2: Shrink the database
raiserror(N'Shrink...', 10, 1) with nowait;
declare @stmt nvarchar(max) = concat(N'dbcc shrinkdatabase (', db_id(), N')');
execute [sys].[sp_executesql] @stmt = @stmt;
go
-- Step 3: Rebuild all the indexes
raiserror(N'Final rebuild...', 10, 1) with nowait;
execute [#ForEachTable] N'alter index all on ? rebuild with (online = on);';
Mas depois de várias horas, recebo esta mensagem de aviso e, em seguida, o SSMS é desligado:
First rebuild...
2023-06-06 07:39:50.2128129 - [0001/1467]: Executing command: "alter index all on [dbo].[xhisto_2018] rebuild with (online = on);".
2023-06-06 07:39:50.2440440 - [0002/1467]: Executing command: "alter index all on [dbo].[Affiliate] rebuild with (online = on);".
2023-06-06 07:39:50.2596849 - [0003/1467]: Executing command: "alter index all on [dbo].[template_step] rebuild with (online = on);".
2023-06-06 07:39:50.2753131 - [0004/1467]: Executing command: "alter index all on [dbo].[mapping_monthly] rebuild with (online = on);".
2023-06-06 07:39:50.7596876 - [0005/1467]: Executing command: "alter index all on [dbo].[statement] rebuild with (online = on);".
2023-06-06 07:39:50.7753120 - [0006/1467]: Executing command: "alter index all on [dbo].[history] rebuild with (online = on);".
2023-06-06 07:39:50.7753120 - [0007/1467]: Executing command: "alter index all on [dbo].[formula_items] rebuild with (online = on);".
2023-06-06 07:39:50.7909373 - [0008/1467]: Executing command: "alter index all on [dbo].[monthly_staging] rebuild with (online = on);".
2023-06-06 07:39:50.8221873 - [0009/1467]: Executing command: "alter index all on [dbo].[sales] rebuild with (online = on);".
Msg 121, Level 20, State 0, Line 82
A transport-level error has occurred when receiving results from the server. (provider: TCP Provider, error: 0 - The semaphore timeout period has expired.)
Completion time: 2023-06-06T15:21:35.2092836+02:00
Estou executando a consulta do SSMS instalado em uma VM no Azure. Certeza que não pode ser problemas de conectividade. Isso acontece 1 vez em 2.
O problema do semáforo foi causado pelo corte de conexão do VDI, no qual eu tinha o SSMS, e o Banco de Dados SQL do Azure.
não adianta reinventar a roda. A Microsoft propõe uma solução pronta para uso para o banco de dados SQL do Azure: redução automática
Isso fez o truque.
Se você quiser reconstruir os índices, mais uma vez, não adianta reinventar a roda. A Microsoft propõe a reconstrução de índices do Banco de Dados SQL usando a Automação do Azure