Delen via


Een momentopname van een database maken (Transact-SQL)

van toepassing op:SQL Server-

De enige manier om een momentopname van een SQL Server-database te maken, is door Transact-SQL te gebruiken. SQL Server Management Studio biedt geen ondersteuning voor het maken van databasemomentopnamen.

Voorwaarden

De brondatabase, die elk herstelmodel kan gebruiken, moet voldoen aan de volgende vereisten:

  • De serverexemplaren moeten een editie van SQL Server draaien die momentopnamen van de database ondersteunt. Zie Editions en ondersteunde functies van SQL Server 2022voor meer informatie over ondersteuning voor databasemomentopnamen in SQL Server.

  • De brondatabase moet online zijn, tenzij de database een gespiegelde database is binnen een databasespiegelingssessie.

  • Als u een momentopname van een database wilt maken in een gespiegelde database, moet de database de gesynchroniseerde status van spiegeling hebben.

  • De brondatabase kan niet worden geconfigureerd als een schaalbare gedeelde database.

  • Vóór SQL Server 2019 (15.x) kon de brondatabase geen MEMORY_OPTIMIZED_DATA bestandsgroep bevatten. Ondersteuning voor momentopnamen van databases in het geheugen is toegevoegd in SQL Server 2019 (15.x).

Belangrijk

Zie Database Snapshots (SQL Server)voor meer informatie over andere belangrijke overwegingen.

Aanbevelingen

In deze sectie worden de volgende aanbevolen procedures besproken:

Best practice: momentopnamen van databases een naam geven

Voordat u momentopnamen maakt, is het belangrijk om te overwegen hoe u deze een naam kunt geven. Voor elke momentopname van de database is een unieke databasenaam vereist. Voor beheergemak kan de naam van een momentopname informatie bevatten die de database identificeert, zoals:

  • De naam van de brondatabase.

  • Een aanwijzing dat de nieuwe naam bedoeld is voor een momentopname.

  • De aanmaakdatum en -tijd van de momentopname, een volgnummer of andere informatie, zoals tijdstip van de dag, om sequentiële momentopnamen in een bepaalde database te onderscheiden.

Denk bijvoorbeeld aan een reeks momentopnamen voor de AdventureWorks2022-database. Er worden drie dagelijkse momentopnamen gemaakt met een interval van 6 uur tussen 6:00 en 18:00 uur, op basis van een 24-uursklok. Elke dagelijkse momentopname wordt 24 uur bewaard voordat deze wordt verwijderd en vervangen door een nieuwe momentopname van dezelfde naam. Elke naam van de momentopname geeft het uur aan, maar niet de dag:

AdventureWorks_snapshot_0600
AdventureWorks_snapshot_1200
AdventureWorks_snapshot_1800

Als de aanmaaktijd van deze dagelijkse momentopnamen varieert van dag tot dag, kan een minder nauwkeurige naamconventie de voorkeur hebben, bijvoorbeeld:

AdventureWorks_snapshot_morning
AdventureWorks_snapshot_noon
AdventureWorks_snapshot_evening

Best practice: het aantal momentopnamen van databases beperken

Door een reeks momentopnamen in de loop van de tijd te maken, worden opeenvolgende momentopnamen van de brondatabase vastgelegd. Elke momentopname blijft behouden totdat deze expliciet wordt verwijderd. Omdat elke momentopname blijft groeien naarmate de oorspronkelijke pagina's worden bijgewerkt, kunt u schijfruimte besparen door een oudere momentopname te verwijderen nadat u een nieuwe momentopname hebt gemaakt.

Notitie

Als u wilt terugkeren naar een momentopname van een database, moet u eventuele andere momentopnamen uit die database verwijderen.

Best practice: clientverbindingen met een momentopname van een database

Als u een momentopname van een database wilt gebruiken, moeten clients weten waar ze deze kunnen vinden. Gebruikers kunnen lezen uit de ene momentopname van de database terwijl een andere wordt gemaakt of verwijderd. Wanneer u echter een nieuwe momentopname vervangt door een bestaande, moet u clients omleiden naar de nieuwe momentopname. Gebruikers kunnen handmatig verbinding maken met een momentopname van een database met SQL Server Management Studio of Azure Data Studio. Als u echter een productieomgeving wilt ondersteunen, moet u een programma-oplossing maken zodat rapportage-clients automatisch worden omgeleid naar de nieuwe momentopname van de database.

Machtigingen

Elke gebruiker die een database kan maken, kan een momentopname van een database maken; Als u echter een momentopname van een gespiegelde database wilt maken, moet u lid zijn van de sysadmin vaste serverfunctie.

Een momentopname van een database maken met behulp van Transact-SQL

  1. Op basis van de huidige grootte van de brondatabase moet u ervoor zorgen dat u voldoende schijfruimte hebt voor het opslaan van de momentopname van de database. De maximale grootte van een momentopname van een database is de grootte van de brondatabase bij het maken van een momentopname. Zie De grootte van het Sparse-bestand van een momentopname van een database (Transact-SQL) weergevenvoor meer informatie.

  2. Geef een CREATE DATABASE verklaring uit voor de bestanden met behulp van de AS SNAPSHOT OF clausule. Voor het maken van een momentopname moet u de logische naam opgeven van elk databasebestand van de brondatabase. De syntaxis is als volgt:

    CREATE DATABASE database_snapshot_name
    ON
    (
        NAME = logical_file_name
        , FILENAME = 'os_file_name'
    ) [ , ...n ]
    
    AS SNAPSHOT OF source_database_name
    [;]
    

    De argumenten zijn als volgt:

    Argument Beschrijving
    database_snapshot_name De naam van de momentopname waarnaar u de database wilt terugzetten.
    logical_file_name De logische naam die de brondatabase in SQL Server gebruikt bij het verwijzen naar het bestand.
    os_file_name Het pad en de bestandsnaam die door het besturingssysteem worden gebruikt bij het maken van het bestand.
    source_database_name De brondatabase.

    Zie CREATE DATABASE (SQL Server Transact-SQL)voor een volledige beschrijving van deze syntaxis.

    Notitie

    Wanneer u een momentopname van een database maakt, worden logboekbestanden, offlinebestanden, het herstellen van bestanden en defunctbestanden niet toegestaan in de instructie CREATE DATABASE.

Voorbeelden

De .ss extensie die in deze voorbeelden wordt gebruikt, is voor het gemak en is niet vereist. In databases met meerdere bestanden moeten alle bestanden worden opgegeven, in overeenstemming met de syntaxis. Bestandsgroepen worden niet opgegeven.

Een. Een momentopname maken in de AdventureWorks-database

In dit voorbeeld wordt een momentopname van de database gemaakt op de AdventureWorks-database. De naam van de momentopname, AdventureWorks_dbss_1800, en de bestandsnaam van het uitgedunde bestand, AdventureWorks_data_1800.ss, geven de aanmaaktijd aan van 18.00 uur (6 uur 's avonds).

CREATE DATABASE AdventureWorks_dbss1800 ON (
    NAME = AdventureWorks,
    FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\Data\AdventureWorks_data_1800.ss'
    ) AS SNAPSHOT OF AdventureWorks;
GO

B. Een momentopname maken in de verkoopdatabase

In dit voorbeeld wordt een momentopname van een database gemaakt, sales_snapshot1200, op de Sales database. Dit is dezelfde voorbeelddatabase uit Een database maken met bestandsgroepen in CREATE DATABASE-.

--Create sales_snapshot1200 as snapshot of the Sales database:
CREATE DATABASE sales_snapshot1200 ON (
    NAME = SPri1_dat,
    FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\data\SPri1dat_1200.ss'
    ),
    (
    NAME = SPri2_dat,
    FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\data\SPri2dt_1200.ss'
    ),
    (
    NAME = SGrp1Fi1_dat,
    FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\mssql\data\SG1Fi1dt_1200.ss'
    ),
    (
    NAME = SGrp1Fi2_dat,
    FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\data\SG1Fi2dt_1200.ss'
    ),
    (
    NAME = SGrp2Fi1_dat,
    FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\data\SG2Fi1dt_1200.ss'
    ),
    (
    NAME = SGrp2Fi2_dat,
    FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\data\SG2Fi2dt_1200.ss'
    ) AS SNAPSHOT OF Sales;
GO