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 / 306663
Accepted
Davide De Pretto
Davide De Pretto
Asked: 2022-01-28 03:31:13 +0800 CST2022-01-28 03:31:13 +0800 CST 2022-01-28 03:31:13 +0800 CST

Por que o shrinkdatabase e o shrinkfile do dbcc não estão funcionando?

  • 772

OK, entendi. Encolher seu banco de dados está errado . Você odeia . Mas deixe-me explicar.

Eu tenho um banco de dados SQL do Azure P1 de 1 TB em produção com ~ 50 tabelas, onde ~ 5 delas são contêineres JSON. Esse era o design original e rapidamente percebi seus limites, então agora estou no processo de descarregar o armazenamento desses JSONs para uma conta de armazenamento do Azure mais apropriada.

Esse processo levará tempo (JSONs são usados ​​em diferentes processos de negócios e estou migrando um de cada vez), então estou excluindo intervalos de linhas após uma migração bem-sucedida. Ainda assim, não consigo truncar ou descartar a tabela inteira.

Depois de migrar muitos processos de negócios, agora tenho 868,64 GB de espaço alocado versus 390,82 GB de espaço usado. Obviamente, gostaria de reduzir o tamanho do meu armazenamento para a camada de 400 GB para reduzir custos, mas quando tento fazer isso no Portal do Azure, recebo a seguinte mensagem de erro:

O tamanho de armazenamento do seu banco de dados não pode ser menor que o tamanho alocado no momento. Para reduzir o tamanho do banco de dados, o banco de dados primeiro precisa recuperar o espaço não utilizado executando DBCC SHRINKDATABASE (<db_name>). Observe que essa operação pode afetar o desempenho durante a execução e pode levar várias horas para ser concluída.

Ok, bastante justo. Então eu prossigo para executar o comando (claro, com o nome correto do banco de dados) e depois de algumas horas e execução bem-sucedida, a situação é exatamente a mesma. Nenhum espaço recuperado.

Depois disso, continuei com as seguintes tentativas:

  • Talvez eu tenha que forçar a reorganização + truncamento, então executei dbcc shrinkdatabase(<db_name>, notruncate)seguido de dbcc shrinkdatabase(<db_name>, truncateonly): sem resultados.
  • Talvez eu tenha que reduzir os arquivos únicos, então executei dbcc shrinkfile(<file_name>): ainda o mesmo.
  • Talvez eu tenha que reduzir os arquivos para um valor específico, então executei `dbcc shrinkfile(<file_name>, <free_space_on_file_in_mb>): novamente, sem sorte.

Esta consulta

with
    [BaseData] as (
        select
            [DF].[type_desc]                            as [Type],
            [DF].[name]                                 as [FileName],
            [DF].[size] / 131072.0                      as [TotalSpaceInGB],
            [UP].[size] / 131072.0                      as [UsedSpaceInGB],
            ([DF].[size] - [UP].[size]) / 131072.0      as [FreeSpaceInGB],
            [DF].[max_size]                             as [MaxSize]
        from [sys].[database_files] as [DF]
            cross apply (
                select fileproperty([DF].[name], 'spaceused') as [size]
            ) as [UP]
    )
select
    [BD].[Type]                                         as [Type],
    [BD].[FileName]                                     as [FileName],
    format([BD].[TotalSpaceInGB], N'N2')                as [TotalSpaceInGB],
    format([BD].[UsedSpaceInGB], N'N2')                 as [UsedSpaceInGB],
    format([BD].[FreeSpaceInGB], N'N2')                 as [FreeSpaceInGB],
    case [BD].[MaxSize]
        when 0 then N'Disabled'
        when -1 then N'Unrestricted'
        else format(([BD].[MaxSize] / 131072.0), N'N2')
    end                                                 as [MaxSizeInGB]
from [BaseData] as [BD]
order by [BD].[Type] asc, [BD].[FileName];

sempre retorna o mesmo resultado:

Modelo Nome do arquivo TotalSpaceInGB Espaço usado em GB FreeSpaceInGB MaxSizeInGB
FILESTREAM XTP 2.03 NULO NULO Sem restrições
REGISTRO registro 1,63 0,60 1,03 250,00
LINHAS data_0 509,47 231,58 277,89 512,00
LINHAS dfa_data_3 359,17 159,27 199,91 512,00

Além disso, esta consulta:

with
    [BaseData] as (
        select
            [TB].[object_id]                            as [ObjectId],
            max([PT].[rows])                            as [RowCount],
            count(distinct [IX].[index_id])             as [IndexCount],
            sum([PS].[used_page_count]) / 131072.0      as [UsedSpaceInGB],
            sum([PS].[reserved_page_count]) / 131072.0  as [ReservedSpaceInGB]
        from [sys].[schemas] as [SC]
            inner join [sys].[tables] as [TB]
                on [SC].[schema_id] = [TB].[schema_id]
            inner join [sys].[indexes] as [IX]
                on [TB].[object_id] = [IX].[object_id]
            inner join [sys].[partitions] as [PT]
                on [TB].[object_id] = [PT].[object_id]
                    and [IX].[index_id] = [PT].[index_id]
            left join [sys].[dm_db_index_usage_stats] as [IS]
                on [TB].[object_id] = [IS].[object_id]
                    and [IX].[index_id] = [IS].[index_id]
            left join [sys].[dm_db_partition_stats] as [PS]
                on [PT].[partition_id] = [PS].[partition_id]
                    and [IX].[index_id] = [PS].[index_id]
                    and [TB].[object_id] = [PS].[object_id]
        group by [TB].[object_id]
    )
select top 5
    [BD].[ObjectId]                                     as [ObjectId],
    [BD].[RowCount]                                     as [RowCount],
    [BD].[IndexCount]                                   as [IndexCount],
    format([BD].[UsedSpaceInGB], N'N2')                 as [UsedSpaceInGB],
    format([BD].[ReservedSpaceInGB], N'N2')             as [ReservedSpaceInGB]
from [BaseData] as [BD]
order by [BD].[ReservedSpaceInGB] desc;

mostra claramente que as tabelas não estão ocupando mais espaço do que o necessário:

ObjectId Contagem de linhas IndexCount Espaço usado em GB ReservedSpaceInGB
108579475 2892280 1 254,34 254,37
1952114095 834306760 1 79,73 79,74
418204640 20233590 1 23,52 23,53
1599396817 6346104 1 6,63 6,74
1939590048 596471 1 4,75 4,75

Também fiz as seguintes considerações:

  • Encontrei esta postagem explicando um truque usando grupos de arquivos, mas até onde sei, não é possível gerenciá-los no Banco de Dados SQL do Azure.
  • O problema pode estar relacionado ao fato de eu ter deletado muitos LOBs. Encontrei o dbcc forceghostcleanup (<db_id>, 'visit_all_pages')comando, mas estou hesitante em experimentá-lo.
  • Para experimentar os comandos do dbcc, criei um clone do banco de dados a partir de um backup. Acho que isso exclui qualquer possível problema relacionado a transações ativas que mantêm versões de linha do armazenamento de versão da recuperação acelerada do banco de dados.
  • Idealmente, eu gostaria de evitar o máximo possível (use como último recurso) o processo de copiar dados e descartar a tabela original ou coisas assim.

A maioria das tabelas no banco de dados são índices clusterizados de armazenamento de linhas, exceto o de 6,63 GB, que é um índice clusterizado de armazenamento de colunas, e sete heaps que se enquadram na marca de 40 MB, tanto alocados quanto usados. Todas as tabelas submetidas à exclusão se enquadram na primeira categoria e também não possuem índices não clusterizados.

Acabei de tentar 'DBCC UPDATEUSAGE , but it doesn't seem to change anything; sp_spaceused' retorna os mesmos valores.

Você tem alguma percepção?

azure-sql-database shrink
  • 2 2 respostas
  • 556 Views

2 respostas

  • Voted
  1. Best Answer
    Davide De Pretto
    2022-02-09T15:34:50+08:002022-02-09T15:34:50+08:00

    Resolvi o problema executando um ALTER INDEX ALL ON ... REBUILDem todas as minhas tabelas e , em seguida, executando DBCC SHRINKDATABASE.

    Eu detalhei toda a solução de problemas em um post no meu blog, aqui .

    • 1
  2. Dimitri Furman
    2022-01-29T13:55:50+08:002022-01-29T13:55:50+08:00

    Por favor, tente ALTER INDEX ... REORGANIZE WITH (LOB_COMPACTION = ON), seguido por outro psiquiatra.

    Como um aparte, o artigo de documentação de redução do Azure SQL DB foi atualizado recentemente e alguns deles podem ser relevantes, ou seja, reduzir vários arquivos simultaneamente e diminuir em etapas.

    • -1

relate perguntas

  • Implementando uma tabela criptografada no SQL Azure

  • Encolher banco de dados após remover dados extras [duplicado]

  • Encolher banco de dados após descartar tabela?

  • Servidor vinculado ao SQL Azure muito lento

  • Como posso alterar uma chave primária existente no SQL Azure?

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