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 / user-222555

Davide De Pretto's questions

Martin Hope
Davide De Pretto
Asked: 2022-01-28 03:31:13 +0800 CST

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

  • 2

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 respostas
  • 556 Views
Martin Hope
Davide De Pretto
Asked: 2021-04-20 01:38:00 +0800 CST

Erro de lançamento do Banco de Dados SQL do Azure 1132 Erro "O pool elástico atingiu seu limite de armazenamento", mesmo que não esteja cheio

  • 4

Estou tentando executar o seguinte lote (amostra) em um banco de dados SQL do Azure dentro de um pool elástico:

drop table if exists [dbo].[InsertTest];
create table [dbo].[InsertTest] (
    [id] uniqueidentifier,
    [filler] nvarchar(max)
);

insert into [dbo].[InsertTest] ([id], [filler])
select top 1000 newid(), replicate('X', 2048)
from [sys].[objects] as [T1]
    cross join [sys].[objects] as [T2];

/* drop table if exists [dbo].[InsertTest]; */

Mas a insertinstrução falha com a mensagem de erro:

Msg 1132, Level 16, State 1, Line 1
The elastic pool has reached its storage limit. The storage used for the elastic pool cannot exceed (51200) MBs.

Tentei ver se fiquei sem espaço executando a consulta

select
    [type_desc]         as [file_type],
    [size] / 128        as [size_in_MB],
    [max_size] / 128    as [max_size_in_MB]
from [sys].[database_files];

mas parece que ainda tenho espaço.

tipo de arquivo size_in_MB max_size_in_MB
LINHAS 320 256000
REGISTRO 584 1048576
FILESTREAM 0 0

O que posso fazer sobre isso? Estou esquecendo de algo?

sql-server t-sql
  • 1 respostas
  • 2010 Views
Martin Hope
Davide De Pretto
Asked: 2021-03-02 01:48:27 +0800 CST

Troca de partição vs transferência de esquema

  • 0

Estou projetando um banco de dados cujos dados serão gerados diariamente por um ETL. Depois de algumas pesquisas, descobri que é possível usar a troca de partição ou a transferência de esquema para maximizar o tempo de atividade dos dados "ao vivo". Apenas para completar as informações, esse banco de dados será implantado no Banco de Dados SQL do Azure e desenvolvido no SQL Server 2019 Developer Edition no Docker. Consiste em ~ 20 tabelas, cada uma com menos de 10 milhões de linhas (esperado).

Então agora no meu design existem dois esquemas:

  • [App]: contendo várias tabelas (sem chaves estrangeiras) com os dados ativos usados ​​pelo aplicativo.
  • [AppShadow]: contendo exatamente as mesmas tabelas do [App]esquema (mas com chaves estrangeiras), geralmente vazias, usadas como destino para o ETL.

Meu fluxo está assim:

  • Execute o ETL usando as tabelas no [AppShadow]esquema como destino. As chaves estrangeiras garantem que meus dados sejam consistentes.
  • set transaction isolation level serializable; begin transaction;
  • Desabilite todas as restrições nas tabelas no [AppShadow]esquema usandoalter table [AppShadow].[<table_name>] nockeck constraint all;
  • Truncar todas as tabelas no [App]esquema
  • Mude a partição de todas as tabelas de [AppShadow]para[App]
  • Reative todas as restrições nas tabelas no [AppShadow]esquema usandoalter table [AppShadow].[<table_name>] with check check constraint all;
  • commit transaction;

Essas soluções parecem funcionar bem e o tempo de inatividade é mínimo, mas não consigo descobrir nenhuma vantagem ou desvantagem sobre a transferência de tabelas inteiras entre esquemas usando um [Swap]esquema e a alter schema <schema_name> transfer <table_name>instrução. Como o SQL Server é o SQL Server, tenho certeza de que existem algumas advertências ocultas que desconheço que devem me permitir preferir uma solução à outra.

Você tem algum conselho ou sugestão?

sql-server t-sql
  • 1 respostas
  • 238 Views
Martin Hope
Davide De Pretto
Asked: 2021-01-24 16:04:16 +0800 CST

sys.dm_tran_version_store_space_usage relata sempre zero espaço usado

  • 4

Eu estava aprendendo sobre RCSI quando descobri algo estranho no Banco de Dados SQL do Azure.

O DMV sys.dm_tran_version_store_space_usagesempre relata 0 como o espaço usado pelo armazenamento de versão, mesmo se eu executar uma carga de trabalho CRUD antes.

Para demonstrar esse comportamento, criei um pequeno teste.

-- Server info
select @@version as sql_version;

-- Database info
select
    is_read_committed_snapshot_on,
    snapshot_isolation_state_desc
from sys.databases
where database_id = db_id();

-- Just to be sure the current database has its version store empty
select reserved_page_count as pre_workload_space_count
from sys.dm_tran_version_store_space_usage
where database_id = db_id();

-- Test workload
drop table if exists RCSI_TEST;

create table RCSI_TEST (
    id uniqueidentifier default newid()
);
go

insert into RCSI_TEST default values;
go 100

update RCSI_TEST
set id = newid();

delete from RCSI_TEST;

-- Metrics
select reserved_page_count as post_workload_page_count
from sys.dm_tran_version_store_space_usage
where database_id = db_id();

waitfor delay '00:01:30'; -- Just to be sure! ;)

select reserved_page_count as post_cleaning_space_count
from sys.dm_tran_version_store_space_usage
where database_id = db_id();

Executei este script no SQL Server 2019 Developer Edition (no Docker) e em um Banco de Dados SQL do Azure (camada S0, 10DTU) e aqui estão os resultados.

SQL Server 2019

sql_version
Microsoft SQL Server 2019 (RTM-CU8) (KB4577194) - 15.0.4073.23 (X64)Sep 23 2020 16:03:08    Copyright (C) 2019 Microsoft Corporation    Developer Edition (64-bit) on Linux (Ubuntu 18.04.5 LTS) <X64>

is_read_committed_snapshot_on   snapshot_isolation_state_desc
1                               ON

pre_workload_space_count
0

post_workload_page_count
8

post_cleaning_space_count
0

Banco de Dados SQL do Azure

sql_version
Microsoft SQL Azure (RTM) - 12.0.2000.8     Oct  1 2020 18:48:35    Copyright (C) 2019 Microsoft Corporation

is_read_committed_snapshot_on   snapshot_isolation_state_desc
1                               ON

pre_workload_space_count
0

post_workload_page_count
0

post_cleaning_space_count
0

O SQL Server 2019 parece se comportar corretamente, relatando 8 páginas de dados no armazenamento de versão logo após a carga de trabalho e, em seguida, limpo após um minuto ou mais. No Banco de Dados SQL do Azure, no entanto, o espaço usado é sempre zero! Isso é um comportamento correto? O que isso significa?

Books Online relata que esse DMV é compatível com o SQL Server e o Banco de Dados SQL do Azure, mas também diz "A consulta a seguir pode ser usada para determinar o espaço consumido em tempdb, por armazenamento de versão de cada banco de dados em uma instância do SQL Server. " . Tanto quanto sei, os Bancos de Dados SQL do Azure têm um escopo limitado para sua instância pai por design. Essa pode ser a causa raiz?

https://learn.microsoft.com/it-it/sql/relational-databases/system-dynamic-management-views/sys-dm-tran-version-store-space-usage?view=sql-server-ver15

Eu sei que os Bancos de Dados SQL do Azure são executados em RCSI por padrão e também que eles têm uma quantidade fixa de espaço tempdb com base na camada que você obtém, então eu estava preocupado em preencher isso com transações de longa duração ou outros processos mantendo muitos registros no armazenamento de versão por muito tempo. Mas eu não posso gerenciar algo que não posso medir, certo?

azure-sql-database tempdb
  • 1 respostas
  • 165 Views

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