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-268813

Matthias L's questions

Martin Hope
Matthias L
Asked: 2024-09-09 20:04:22 +0800 CST

Como obter o esquema de partição para dados de fluxo de arquivos?

  • 5

Versão curta: existe uma maneira de obter o esquema de partição para os dados FILESTREAM usados ​​por um índice clusterizado criado em uma tabela particionada?

Versão mais longa: digamos que você queira particionar uma tabela que armazena dados FILESTREAM, então a documentação diz:

CRIAR ÍNDICE (Transact-SQL)

Se a tabela for particionada, a cláusula FILESTREAM_ON deve ser incluída e deve especificar um esquema de partição de grupos de arquivos FILESTREAM que use a mesma função de partição e colunas de partição que o esquema de partição para a tabela. Caso contrário, um erro será gerado.

Então você cria grupos de arquivos para linhas e dados de fluxo de arquivos, uma função de partição e dois esquemas de partição (novamente um para as linhas e dados de fluxo de arquivos, respectivamente), assim:

USE [master]
GO

CREATE DATABASE [FSPartitionTest]
 ON  PRIMARY 
( NAME = N'FSPartitionTest', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\FSPartitionTest.mdf'), 
 FILEGROUP [DataPartitionA] 
( NAME = N'Data_A', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\Data_A.ndf'), 
 FILEGROUP [DataPartitionB] 
( NAME = N'Data_B', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\Data_B.ndf'), 
 FILEGROUP [FSPartitionA] CONTAINS FILESTREAM  DEFAULT
( NAME = N'FS_A', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\FS_A'), 
 FILEGROUP [FSPartitionB] CONTAINS FILESTREAM 
( NAME = N'FS_B', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\FS_B')
 LOG ON 
( NAME = N'FSPartitionTest_log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\FSPartitionTest_log.ldf')
GO

USE [FSPartitionTest]
GO

CREATE PARTITION FUNCTION [APartitionFunction] (INT)  
AS RANGE LEFT FOR VALUES (1);
GO

CREATE PARTITION SCHEME [DataPartitionScheme]
AS PARTITION [APartitionFunction]
TO ([DataPartitionA], [DataPartitionB]);
GO

CREATE PARTITION SCHEME [FSPartitionScheme]
AS PARTITION [APartitionFunction]
TO ([FSPartitionA], [FSPartitionB]);
GO

CREATE TABLE [FilestreamTable] (
    [Partition] INT NOT NULL
    , [Id] [uniqueidentifier] ROWGUIDCOL NOT NULL
        CONSTRAINT [UX_FilestreamTable_Id] UNIQUE NONCLUSTERED ON [PRIMARY]
    , [FilestreamData] VARBINARY(MAX) FILESTREAM NULL
    , INDEX [UX_FilestreamTable_Partition_Id] UNIQUE CLUSTERED  (
                [Partition],
                [Id]
            ) ON [DataPartitionScheme]([Partition]) FILESTREAM_ON [FSPartitionScheme]
)  ON [DataPartitionScheme]([Partition]) FILESTREAM_ON [FSPartitionScheme]
GO

Então você pode consultar os esquemas de partição e os índices assim:

SELECT *
FROM sys.partition_schemes

SELECT T.[name], I.[name], I.[data_space_id]
FROM sys.tables AS T
JOIN sys.indexes AS I
    ON T.[object_id] = I.[object_id] 

Ambos os esquemas de partição aparecem, ambos usam a mesma função de partição e o índice clusterizado faz referência ao DataPartitionSchemein sys.indexes. No entanto, o esquema de partição usado para os dados FILESTREAM não é referenciado. Neste caso, há apenas um outro esquema de partição usando a mesma função de partição e tendo grupos de arquivos filestream como alvos. Para qualquer cenário prático, estaríamos prontos. Ninguém adicionaria outro esquema de partição, certo?

CREATE PARTITION SCHEME [FSPartitionSchemeB]
AS PARTITION [APartitionFunction]
TO ([FSPartitionB], [FSPartitionA]);
GO

CREATE TABLE [FilestreamTableB] (
    [Partition] INT NOT NULL
    , [Id] [uniqueidentifier] ROWGUIDCOL NOT NULL
        CONSTRAINT [UX_FilestreamTableB_Id] UNIQUE NONCLUSTERED ON [PRIMARY]
    , [FilestreamData] VARBINARY(MAX) FILESTREAM NULL
    , INDEX [UX_FilestreamTableB_Partition_Id] UNIQUE CLUSTERED  (
                [Partition],
                [Id]
            ) ON [DataPartitionScheme]([Partition]) FILESTREAM_ON [FSPartitionSchemeB]
)  ON [DataPartitionScheme]([Partition]) FILESTREAM_ON [FSPartitionSchemeB]
GO

CREATE PARTITION SCHEME [FSPartitionSchemeC]
AS PARTITION [APartitionFunction]
ALL TO ([FSPartitionA]);
GO

CREATE TABLE [FilestreamTableC] (
    [Partition] INT NOT NULL
    , [Id] [uniqueidentifier] ROWGUIDCOL NOT NULL
        CONSTRAINT [UX_FilestreamTableC_Id] UNIQUE NONCLUSTERED ON [PRIMARY]
    , [FilestreamData] VARBINARY(MAX) FILESTREAM NULL
    , INDEX [UX_FilestreamTableC_Partition_Id] UNIQUE CLUSTERED  (
                [Partition],
                [Id]
            ) ON [DataPartitionScheme]([Partition]) FILESTREAM_ON [FSPartitionSchemeC]
)  ON [DataPartitionScheme]([Partition]) FILESTREAM_ON [FSPartitionSchemeC]
GO

Como podemos determinar qual tabela usa qual esquema de partição? Há alguma view que faça referência direta ao data_space_idusado por um índice para dados FILESTREAM?

Solução alternativa: Há uma coisa que notei, mas não tenho certeza se funciona 100% do tempo. A sys.partitionsvisualização tem uma filestream_filegroup_idcoluna:

SELECT T.[name]
    , I.[name]
    , I.[data_space_id]
    , P.[partition_number]
    , FG.[name]
FROM sys.tables AS T
JOIN sys.indexes AS I
    ON T.[object_id] = I.[object_id]
JOIN sys.partitions AS P
    ON I.[object_id] = P.[object_id]
        AND I.[index_id] = P.[index_id]
JOIN sys.filegroups AS FG
    ON P.[filestream_filegroup_id] = FG.[data_space_id]

A visualização destination_data_spacestambém tem uma coluna destination_id, que - suponho - corresponde a partition_number:

SELECT PS.[name]
    , DDS.[destination_id]
    , FG.[name]
FROM sys.partition_schemes AS PS
JOIN sys.destination_data_spaces AS DDS
    ON PS.[data_space_id] = DDS.[partition_scheme_id]
JOIN sys.filegroups AS FG
    ON DDS.[data_space_id] = FG.[data_space_id]

Então, acho que é possível verificar se os grupos de arquivos referenciados por destination_data_spacescorrespondem aos referenciados por partitionspara cada partição:

WITH A AS (
    SELECT T.[name] AS [Table]
        , I.[name] AS [Index]
        , PS.[name] AS [PartitionScheme] -- for row data
        , FSPS.[name] AS [FS_PartitionScheme] -- candidate
        , FG.[name] AS [FS_DestinationFilegroup] -- referenced by partition scheme
        , PFG.[name] AS [FS_PartitionFilegroup] -- referenced by partition
        , CASE WHEN FG.[name] = PFG.[name] THEN 1 ELSE 0 END AS [FilegorupsMatch]
        , COUNT(*) OVER (PARTITION BY T.[object_id], I.[index_id], FSPS.[data_space_id]) AS [NumPartitions]
        , SUM(CASE WHEN FG.[name] = PFG.[name] THEN 1 ELSE 0 END)  OVER (PARTITION BY T.[object_id], I.[index_id], FSPS.[data_space_id]) AS [SumMatches]
    FROM sys.tables AS T
    JOIN sys.indexes AS I
        ON T.[object_id] = I.[object_id]
    --partition scheme used for row data
    JOIN sys.partition_schemes AS PS
        ON I.[data_space_id] = PS.[data_space_id]
    --look for candidate partition schemes, that are used for FILESTREAM data
    --must use the same partition function
    JOIN sys.partition_schemes AS FSPS
        ON PS.[function_id] = FSPS.[function_id]
            AND PS.[data_space_id] <> FSPS.[data_space_id]
    --destination must be a FILESTREAM filegroup
    JOIN sys.destination_data_spaces AS DDS
        ON FSPS.[data_space_id] = DDS.[partition_scheme_id]
    JOIN sys.filegroups AS FG
        ON DDS.[data_space_id] = FG.[data_space_id]
            AND FG.[type_desc] = 'FILESTREAM_DATA_FILEGROUP'
    --get the partition where partition_number matches desination_id
    JOIN sys.partitions AS P
        ON I.[object_id] = P.[object_id]
            AND I.[index_id] = P.[index_id]
            AND P.[partition_number] = DDS.[destination_id]
    --find the filegroup referenced by the partition
    LEFT JOIN sys.filegroups AS PFG
        ON P.[filestream_filegroup_id] = PFG.[data_space_id]
)
SELECT [Table], [Index], [PartitionScheme], [FS_PartitionScheme]
FROM A
WHERE [NumPartitions] = [SumMatches]
GROUP BY [Table], [Index], [PartitionScheme], [FS_PartitionScheme]

Deve haver uma linha por Índice, a menos que algum palhaço faça isso:

CREATE PARTITION SCHEME [FSPartitionSchemeB2]
AS PARTITION [APartitionFunction]
TO ([FSPartitionB], [FSPartitionA]);
GO

Então, se alguém puder confirmar que de fato o partition_numbersempre corresponde ao destination_id, podemos pelo menos identificar o esquema de partição até uma definição única (excluindo NEXT USED), mas ainda não um . definitivo data_space_id.

sql-server
  • 1 respostas
  • 38 Views
Martin Hope
Matthias L
Asked: 2023-11-07 15:05:31 +0800 CST

Como os relatórios do Query Store do SQL Server podem mostrar dados em intervalos de minutos, quando o "Intervalo de coleta de estatísticas" está definido como 1 hora?

  • 8

Nas propriedades do banco de dados em Query Store, o "Intervalo de coleta de estatísticas" é definido como 1 hora. Isso também é confirmado consultando a visualização query_store_runtime_stats_interval- todos os intervalos abrangem exatamente 1 hora. No entanto, ao visualizar relatórios como “Consumo geral de recursos”, é possível selecionar “Minuto” no menu suspenso “Tamanho da agregação” e mostra dados que parecem plausíveis.

Consegui capturar uma consulta usada no "Relatório de principais consultas que consomem recursos" e parece que ele exibe todos os planos, que também foram executados no intervalo selecionado de 1 minuto, mas as estatísticas ainda parecem se referir ao intervalo completo de coleta. Portanto, meu palpite seria não confiar em nada para intervalos menores que o intervalo de coleta. Estou correto ou os relatórios mostram dados confiáveis?

SELECT TOP (@results_row_count)      
    p.query_id query_id
    , q.object_id object_id
    , ISNULL(OBJECT_NAME(q.object_id),'') object_name
    , qt.query_sql_text query_sql_text
    , ROUND(CONVERT(float, SUM(rs.avg_duration*rs.count_executions))*0.001,2) total_duration
    , SUM(rs.count_executions) count_executions
    , COUNT(distinct p.plan_id) num_plans 
FROM sys.query_store_runtime_stats rs      
JOIN sys.query_store_plan p ON p.plan_id = rs.plan_id      
JOIN sys.query_store_query q ON q.query_id = p.query_id      
JOIN sys.query_store_query_text qt ON q.query_text_id = qt.query_text_id  
WHERE NOT (rs.first_execution_time > @interval_end_time OR rs.last_execution_time < @interval_start_time)  
GROUP BY p.query_id, qt.query_sql_text, q.object_id  
HAVING COUNT(distinct p.plan_id) >= 1  
ORDER BY total_duration DESC

Propriedades do banco de dados/armazenamento de consultas

Relatar o consumo geral de recursos

sql-server
  • 2 respostas
  • 87 Views
Martin Hope
Matthias L
Asked: 2023-02-11 08:41:22 +0800 CST

Durante uma restauração fragmentada online, é possível restaurar para um ponto no tempo?

  • 9

Eu tenho um banco de dados (modelo de recuperação completa) com vários grupos de arquivos, cada um com backups completos e diferentes. Sou capaz de replicar uma restauração fragmentada online (SQl Server 2019 Enterprise Edition), conforme descrito aqui: Exemplo: restauração fragmentada do banco de dados (modelo de recuperação completa)

No entanto, quando adiciono uma cláusula STOPAT ao restaurar o último backup de log, isso funciona apenas para o grupo de arquivos primário. Para todos os grupos de arquivos a seguir, recebo esta mensagem:

Msg 4342, Nível 16, Estado 1, Linha 161 A recuperação pontual não é possível, a menos que o grupo de arquivos primário faça parte da sequência de restauração. Omita a cláusula pontual ou restaure o grupo de arquivos primário.

Quando tento restaurar o log sem a cláusula STOPAT, recebo isto:

O backup fornecido não está no mesmo caminho de recuperação do banco de dados e não é elegível para uso em uma restauração de arquivo online.

Não consegui encontrar nenhuma restrição sobre recuperação pontual durante restaurações fragmentadas online, exceto esta parte (encontrada em Restaurações fragmentadas (SQL Server) ):

Se uma sequência de restauração parcial excluir qualquer grupo de arquivos FILESTREAM, a restauração pontual não será suportada. Você pode forçar a continuação da sequência de restauração. No entanto, os grupos de arquivos FILESTREAM que são omitidos de sua instrução RESTORE nunca podem ser restaurados. Para forçar uma restauração pontual, especifique a opção CONTINUE_AFTER_ERROR juntamente com a opção STOPAT, STOPATMARK ou STOPBEFOREMARK, que você também deve especificar em suas instruções RESTORE LOG subsequentes. Se você especificar CONTINUE_AFTER_ERROR, a sequência de restauração parcial será bem-sucedida e o grupo de arquivos FILESTREAM se tornará irrecuperável.

Como o banco de dados não contém nenhum grupo de arquivos de fluxo de arquivos, isso não se aplica. Alguém sabe se a recuperação pontual é possível no meu cenário?

Obrigado

Editar 3: Obrigado a Paul White pela solução: faça um backup de log após restaurar o grupo de arquivos primário para um ponto no tempo e use-o para avançar os grupos de arquivos restantes:

----------------------------------------------------------------------
--  ONLINE PIECEMEAL RESTORE WITH POINT-IN-TIME RECOVERY
------------------------------------------------------------------------

---------------------------------
-- CREATE DB
-- log, 2 filegroups (primary + A) and one table each
---------------------------------
USE [master]
GO

CREATE DATABASE [RestoreTest]
ON PRIMARY(
    NAME = 'PRIMARY',
    FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\RestoreTest.mdf'
),
FILEGROUP A(
    NAME = 'RestoreTest_A',
    FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\RestoreTest_A.ndf'
)
LOG ON(
    NAME = 'RestoreTest_log',
    FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\RestoreTest_Log.ldf'
)
GO

USE [RestoreTest]
GO

CREATE TABLE [Table1](
    [X] INT
)
ON [PRIMARY];

CREATE TABLE [Table2](
    [X] INT
)
ON [A];
GO


---------------------------------
-- Backups
---------------------------------

-- full backups of each filegorup
BACKUP DATABASE [RestoreTest]
    FILEGROUP = 'PRIMARY'
    TO DISK = 'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\Backup\RestoreTest_Full.bak'
    WITH INIT

BACKUP DATABASE [RestoreTest]
    FILEGROUP = 'A'
    TO DISK = 'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\Backup\RestoreTest_A_Full.bak'
    WITH INIT
GO

-- store current time for later point-in-time recovery
WAITFOR DELAY '00:00:01'
DECLARE @now DATETIME = (SELECT GETDATE())
EXEC sp_set_session_context 'stopat', @now; 
WAITFOR DELAY '00:00:01'

--insert some data
INSERT INTO [Table1]
VALUES (1)

INSERT INTO [Table2]
VALUES (1)
GO

-- then take log backup
BACKUP LOG [RestoreTest]
    TO DISK= 'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\Backup\RestoreTest_Log.bak'
    WITH INIT
GO


---------------------------------
-- RESTORE (point-in-time)
---------------------------------
    
-- drop database
USE [master]
DROP DATABASE [RestoreTest]
GO

-- restore primary filegorup
DECLARE @stopat DATETIME = (SELECT CAST(SESSION_CONTEXT(N'stopat') AS DATETIME))

RESTORE DATABASE [RestoreTest]
    FILEGROUP = 'PRIMARY'
    FROM DISK = 'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\Backup\RestoreTest_Full.bak'
    WITH PARTIAL, NORECOVERY

RESTORE LOG [RestoreTest]
    FILEGROUP = 'PRIMARY'
    FROM DISK = 'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\Backup\RestoreTest_Log.bak'
    WITH RECOVERY, STOPAT = @stopat
GO

BACKUP LOG [RestoreTest]
    TO DISK= 'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\Backup\RestoreTest_Redo_Log.bak'
    WITH INIT
GO

-- test
SELECT [name], [state_desc]
FROM sys.master_files
WHERE [database_id] = DB_ID('RestoreTest')
GO

-- restore filegorup A
RESTORE DATABASE [RestoreTest]
    FILEGROUP = 'A'
    FROM DISK = 'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\Backup\RestoreTest_A_Full.bak'
    WITH NORECOVERY
GO

RESTORE LOG [RestoreTest]
    FROM DISK = 'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\Backup\RestoreTest_Redo_Log.bak'
    WITH RECOVERY

-- test
SELECT [name], [state_desc]
FROM sys.master_files
WHERE [database_id] = DB_ID('RestoreTest')
GO

Editar 1: aqui está um exemplo mínimo para brincar (não está funcionando):

------------------------------------------------------------------------
--  ONLINE PIECEMEAL RESTORE WITH POINT-IN-TIME RECOVERY
------------------------------------------------------------------------

---------------------------------
-- CREATE DB
-- log, 2 filegroups (primary + A) and one table each
---------------------------------
USE [master]
GO

CREATE DATABASE [RestoreTest]
ON PRIMARY(
    NAME = 'PRIMARY',
    FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\RestoreTest.mdf'
),
FILEGROUP A(
    NAME = 'RestoreTest_A',
    FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\RestoreTest_A.ndf'
)
LOG ON(
    NAME = 'RestoreTest_log',
    FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\RestoreTest_Log.ldf'
)
GO

USE [RestoreTest]
GO

CREATE TABLE [Table1](
    [X] INT
)
ON [PRIMARY];

CREATE TABLE [Table2](
    [X] INT
)
ON [A];
GO


---------------------------------
-- Backups
---------------------------------

-- full backups of each filegroup
BACKUP DATABASE [RestoreTest]
    FILEGROUP = 'PRIMARY'
    TO DISK = 'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\Backup\RestoreTest_Full.bak'
    WITH INIT

BACKUP DATABASE [RestoreTest]
    FILEGROUP = 'A'
    TO DISK = 'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\Backup\RestoreTest_A_Full.bak'
    WITH INIT
GO

-- store current time for later point-in-time recovery
WAITFOR DELAY '00:00:01'
DECLARE @now DATETIME = (SELECT GETDATE())
EXEC sp_set_session_context 'stopat', @now; 
WAITFOR DELAY '00:00:01'

--insert some data
INSERT INTO [Table1]
VALUES (1)

INSERT INTO [Table2]
VALUES (1)
GO

-- then take log backup
BACKUP LOG [RestoreTest]
    TO DISK= 'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\Backup\RestoreTest_Log.bak'
    WITH INIT
GO


---------------------------------
-- RESTORE (point-in-time)
---------------------------------

-- drop database
USE [master]
DROP DATABASE [RestoreTest]
GO

-- restore primary filegroup
DECLARE @stopat DATETIME = (SELECT CAST(SESSION_CONTEXT(N'stopat') AS DATETIME))

RESTORE DATABASE [RestoreTest]
    FILEGROUP = 'PRIMARY'
    FROM DISK = 'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\Backup\RestoreTest_Full.bak'
    WITH PARTIAL, NORECOVERY

RESTORE LOG [RestoreTest]
    FILEGROUP = 'PRIMARY'
    FROM DISK = 'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\Backup\RestoreTest_Log.bak'
    WITH RECOVERY, STOPAT = @stopat
GO

-- test
SELECT [name], [state_desc]
FROM sys.master_files
WHERE [database_id] = DB_ID('RestoreTest')
GO

-- restore filegroup A (with STOPAT)
DECLARE @stopat DATETIME = (SELECT CAST(SESSION_CONTEXT(N'stopat') AS DATETIME))

RESTORE DATABASE [RestoreTest]
    FILEGROUP = 'A'
    FROM DISK = 'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\Backup\RestoreTest_A_Full.bak'
    WITH NORECOVERY

RESTORE LOG [RestoreTest]
    FILEGROUP = 'A'
    FROM DISK = 'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\Backup\RestoreTest_Log.bak'
    WITH RECOVERY, STOPAT = @stopat

-- test
SELECT [name], [state_desc]
FROM sys.master_files
WHERE [database_id] = DB_ID('RestoreTest')
GO


-- try again, restore filegroup A (without STOPAT)
RESTORE DATABASE [RestoreTest]
    FILEGROUP = 'A'
    FROM DISK = 'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\Backup\RestoreTest_A_Full.bak'
    WITH NORECOVERY

RESTORE LOG [RestoreTest]
    FILEGROUP = 'A'
    FROM DISK = 'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\Backup\RestoreTest_Log.bak'
    WITH RECOVERY

-- test
SELECT [name], [state_desc]
FROM sys.master_files
WHERE [database_id] = DB_ID('RestoreTest')
GO

USE [master]
DROP DATABASE [RestoreTest]
GO

Saída:

Processed 360 pages for database 'RestoreTest', file 'PRIMARY' on file 1.
Processed 7 pages for database 'RestoreTest', file 'RestoreTest_log' on file 1.
BACKUP DATABASE...FILE=<name> successfully processed 367 pages in 0.021 seconds (136.346 MB/sec).
Processed 8 pages for database 'RestoreTest', file 'RestoreTest_A' on file 1.
Processed 3 pages for database 'RestoreTest', file 'RestoreTest_log' on file 1.
BACKUP DATABASE...FILE=<name> successfully processed 11 pages in 0.011 seconds (7.457 MB/sec).

(1 row affected)

(1 row affected)
Processed 14 pages for database 'RestoreTest', file 'RestoreTest_log' on file 1.
BACKUP LOG successfully processed 14 pages in 0.005 seconds (21.093 MB/sec).
Processed 360 pages for database 'RestoreTest', file 'PRIMARY' on file 1.
Processed 7 pages for database 'RestoreTest', file 'RestoreTest_log' on file 1.
RESTORE DATABASE ... FILE=<name> successfully processed 367 pages in 0.020 seconds (143.164 MB/sec).
Processed 0 pages for database 'RestoreTest', file 'PRIMARY' on file 1.
Processed 14 pages for database 'RestoreTest', file 'RestoreTest_log' on file 1.
RESTORE LOG successfully processed 14 pages in 0.006 seconds (17.578 MB/sec).

(3 rows affected)
Processed 8 pages for database 'RestoreTest', file 'RestoreTest_A' on file 1.
RESTORE DATABASE ... FILE=<name> successfully processed 8 pages in 0.006 seconds (10.416 MB/sec).
Msg 4342, Level 16, State 1, Line 116
Point-in-time recovery is not possible unless the primary filegroup is part of the restore sequence. Omit the point-in-time clause or restore the primary filegroup.
Msg 3013, Level 16, State 1, Line 116
RESTORE LOG is terminating abnormally.

(3 rows affected)
Processed 8 pages for database 'RestoreTest', file 'RestoreTest_A' on file 1.
RESTORE DATABASE ... FILE=<name> successfully processed 8 pages in 0.005 seconds (12.500 MB/sec).
Msg 3116, Level 16, State 1, Line 134
The supplied backup is not on the same recovery path as the database, and is ineligible for use for an online file restore.
Msg 3013, Level 16, State 1, Line 134
RESTORE LOG is terminating abnormally.

(3 rows affected)
sql-server
  • 2 respostas
  • 98 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