Återställa en SQL Server-databas i en Linux-container
gäller för:SQL Server – Linux
Den här självstudien visar hur du flyttar och återställer en SQL Server-säkerhetskopieringsfil till en SQL Server 2017(14.x) Linux-containeravbildning som körs på Docker.
Den här självstudien visar hur du flyttar och återställer en SQL Server-säkerhetskopieringsfil till en SQL Server 2019(15.x) Linux-containeravbildning som körs på Docker.
Den här självstudien visar hur du flyttar och återställer en SQL Server-säkerhetskopieringsfil till en SQL Server 2022(16.x) Linux-containeravbildning som körs på Docker.
- Hämta och kör den senaste SQL Server Linux-containeravbildningen.
- Kopiera wide world importers-databasfilen till containern.
- Återställ databasen i containern.
- Kör Transact-SQL-instruktioner för att visa och ändra databasen.
- Säkerhetskopiera den ändrade databasen.
Förutsättningar
- En containerdrivrutin är installerad, till exempel Docker eller Podman
- Installera den senaste sqlcmd
- Systemkrav för SQL Server på Linux
Distribueringsalternativ
Det här avsnittet innehåller distributionsalternativ för din miljö.
sqlcmd stöder för närvarande inte parametern MSSQL_PID
när containrar skapas. Om du använder instruktionerna sqlcmd i den här handledningen skapar du en container med utvecklarversionen av SQL Server. Använd cli-instruktionerna (kommandoradsgränssnittet) för att skapa en container med valfri licens. Mer information finns i Distribuera och ansluta till SQL Server Linux-containrar.
Hämta och kör containeravbildningen
Öppna en bash-terminal i Linux.
Hämta LINUX-containeravbildningen SQL Server 2017 (14.x) från Microsoft Container Registry.
sudo docker pull mcr.microsoft.com/mssql/server:2017-latest
Om du vill köra containeravbildningen med Docker kan du använda följande kommando:
sudo docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<password>' \ --name 'sql1' -p 1401:1433 \ -v sql1data:/var/opt/mssql \ -d mcr.microsoft.com/mssql/server:2017-latest
Försiktighet
Lösenordet bör följa SQL Server-standardprincipen för lösenord. Lösenordet måste som standard vara minst åtta tecken långt och innehålla tecken från tre av följande fyra uppsättningar: versaler, gemener, bas-10 siffror och symboler. Lösenord kan vara upp till 128 tecken långa. Använd lösenord som är så långa och komplexa som möjligt.
Det här kommandot skapar en SQL Server 2017-container (14.x) med Developer Edition (standard). SQL Server-port
1433
exponeras på värdmaskinen som port1401
. Den valfria-v sql1data:/var/opt/mssql
-parametern skapar en datavolymcontainer med namnetsql1data
. Detta används för att bevara data som skapats av SQL Server.Viktig
I det här exemplet används en datavolymcontainer i Docker. Mer information finns i Konfigurera SQL Server-containeravbildningar på Docker.
Om du vill visa containrarna använder du kommandot
docker ps
.sudo docker ps -a
Om kolumnen
STATUS
visar statusenUp
körs SQL Server i containern och lyssnar på porten som anges i kolumnenPORTS
. Om kolumnenSTATUS
för din SQL Server-container visarExited
, se Felsöka SQL Server Docker-containrar.
$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
941e1bdf8e1d mcr.microsoft.com/mssql/server/mssql-server-linux "/bin/sh -c /opt/m..." About an hour ago Up About an hour 0.0.0.0:1401->1433/tcp sql1
Öppna en bash-terminal i Linux.
Hämta LINUX-containeravbildningen SQL Server 2019 (15.x) från Microsoft Container Registry.
sudo docker pull mcr.microsoft.com/mssql/server:2019-latest
Om du vill köra containeravbildningen med Docker kan du använda följande kommando:
sudo docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<password>' \ --name 'sql1' -p 1401:1433 \ -v sql1data:/var/opt/mssql \ -d mcr.microsoft.com/mssql/server:2019-latest
Försiktighet
Lösenordet bör följa SQL Server-standardprincipen för lösenord. Lösenordet måste som standard vara minst åtta tecken långt och innehålla tecken från tre av följande fyra uppsättningar: versaler, gemener, bas-10 siffror och symboler. Lösenord kan vara upp till 128 tecken långa. Använd lösenord som är så långa och komplexa som möjligt.
Det här kommandot skapar en SQL Server 2019-container (15.x) med Developer Edition (standard). SQL Server-port
1433
är exponerad på värden som port1401
. Den valfria-v sql1data:/var/opt/mssql
-parametern skapar en datavolymcontainer med namnetsql1data
. Detta används för att bevara data som skapats av SQL Server.Viktig
I det här exemplet används en datavolymcontainer i Docker. Mer information finns i Konfigurera SQL Server-containeravbildningar på Docker.
Om du vill visa containrarna använder du kommandot
docker ps
.sudo docker ps -a
Om kolumnen
STATUS
visar statusenUp
körs SQL Server i containern och lyssnar på porten som anges i kolumnenPORTS
. Om kolumnenSTATUS
för din SQL Server-container visarExited
, se Felsökning av SQL Server Docker-containrar.$ sudo docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 941e1bdf8e1d mcr.microsoft.com/mssql/server/mssql-server-linux "/bin/sh -c /opt/m..." About an hour ago Up About an hour 0.0.0.0:1401->1433/tcp sql1
Öppna en bash-terminal i Linux.
Hämta LINUX-containeravbildningen SQL Server 2022 (16.x) från Microsoft Container Registry.
sudo docker pull mcr.microsoft.com/mssql/server:2022-latest
Om du vill köra containeravbildningen med Docker kan du använda följande kommando:
sudo docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<password>' \ --name 'sql1' -p 1401:1433 \ -v sql1data:/var/opt/mssql \ -d mcr.microsoft.com/mssql/server:2022-latest
Försiktighet
Lösenordet bör följa SQL Server-standardprincipen för lösenord. Lösenordet måste som standard vara minst åtta tecken långt och innehålla tecken från tre av följande fyra uppsättningar: versaler, gemener, bas-10 siffror och symboler. Lösenord kan vara upp till 128 tecken långa. Använd lösenord som är så långa och komplexa som möjligt.
Det här kommandot skapar en SQL Server 2022-container (16.x) med Developer Edition (standard). SQL Server-port
1433
exponeras på värddatorn som port1401
. Den valfria-v sql1data:/var/opt/mssql
-parametern skapar en datavolymcontainer med namnetsql1data
. Detta används för att bevara data som skapats av SQL Server.Viktig
I det här exemplet används en datavolymcontainer i Docker. Mer information finns i Konfigurera SQL Server-containeravbildningar på Docker.
Om du vill visa containrarna använder du kommandot
docker ps
.sudo docker ps -a
Om kolumnen
STATUS
visar statusenUp
körs SQL Server i containern och lyssnar på porten som anges i kolumnenPORTS
. Om kolumnenSTATUS
för din SQL Server-container visarExited
, se Felsöka Docker-containrar för SQL Server.$ sudo docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 941e1bdf8e1d mcr.microsoft.com/mssql/server/mssql-server-linux "/bin/sh -c /opt/m..." About an hour ago Up About an hour 0.0.0.0:1401->1433/tcp sql1
Ändra systemadministratörslösenordet (SA)
sa
-kontot är systemadministratör på SQL Server-instansen som skapas under installationen. När du har skapat din SQL Server-container kan du identifiera den MSSQL_SA_PASSWORD
miljövariabel som du angav genom att köra echo $MSSQL_SA_PASSWORD
i containern. I säkerhetssyfte ändrar du ditt sa
lösenord:
Välj ett starkt lösenord som ska användas för
sa
-kontot. Lösenordet bör följa SQL Server-standardprincipen för lösenord. Lösenordet måste som standard vara minst åtta tecken långt och innehålla tecken från tre av följande fyra uppsättningar: versaler, gemener, bas-10 siffror och symboler. Lösenord kan vara upp till 128 tecken långa. Använd lösenord som är så långa och komplexa som möjligt.Använd
docker exec
för att köra verktyget sqlcmd för att ändra lösenordet via en Transact-SQL-instruktion. Ersätt<old-password>
och<new-password>
med dina egna lösenordsvärden:Viktig
Miljövariabeln
SA_PASSWORD
är inaktuell. AnvändMSSQL_SA_PASSWORD
i stället.sudo docker exec -it sql1 /opt/mssql-tools/bin/sqlcmd \ -S localhost -U sa -P '<old-password>' \ -Q 'ALTER LOGIN sa WITH PASSWORD="<new-password>"'
docker exec -it sql1 /opt/mssql-tools/bin/sqlcmd ` -S localhost -U sa -P "<old-password>" ` -Q "ALTER LOGIN sa WITH PASSWORD='<new-password>'"
Kopiera en säkerhetskopia till containern
I denna handledning använder sig av exempeldatabaserna Wide World Importers för Microsoft SQL Server. Följ stegen nedan för att ladda ned och kopiera säkerhetskopieringsfilen för Wide World Importers-databasen till din SQL Server-container.
Använd först
docker exec
för att skapa en säkerhetskopieringsmapp. Följande kommando skapar en/var/opt/mssql/backup
katalog i SQL Server-containern.sudo docker exec -it sql1 mkdir /var/opt/mssql/backup
Ladda sedan ned WideWorldImporters-Full.bak-filen till värddatorn. Följande kommandon navigerar till katalogen home/user och hämtar säkerhetskopieringsfilen som
wwi.bak
.cd ~ curl -L -o wwi.bak 'https://github.com/Microsoft/sql-server-samples/releases/download/wide-world-importers-v1.0/WideWorldImporters-Full.bak'
Använd
docker cp
för att kopiera säkerhetskopieringsfilen till containern i katalogen/var/opt/mssql/backup
.sudo docker cp wwi.bak sql1:/var/opt/mssql/backup
Återställa databasen
Säkerhetskopieringsfilen finns nu i containern. Innan du återställer säkerhetskopian är det viktigt att känna till de logiska filnamnen och filtyperna i säkerhetskopian. Följande Transact-SQL kommandon inspekterar säkerhetskopieringen och utför återställningen med hjälp av sqlcmd- i containern.
Tips
I den här handledningen används sqlcmd i containern, eftersom verktyget är förinstallerat i containern. Du kan dock också köra Transact-SQL-instruktioner med andra klientverktyg utanför containern, till exempel SQL Server-tillägg för Visual Studio Code eller Använd SQL Server Management Studio i Windows för att hantera SQL Server på Linux. För att ansluta använder du värdporten som mappades till port 1433 i containern. I det här exemplet är värden och porten localhost,1401
på värddatorn och Host_IP_Address,1401
på fjärranslutningen.
Kör sqlcmd inuti containern för att visa en lista över logiska filnamn och sökvägar i säkerhetskopian. Detta görs med instruktionen
RESTORE FILELISTONLY
Transact-SQL.sudo docker exec -it sql1 /opt/mssql-tools18/bin/sqlcmd -S localhost \ -U sa -P '<new-password>' \ -Q 'RESTORE FILELISTONLY FROM DISK = "/var/opt/mssql/backup/wwi.bak"' \ | tr -s ' ' | cut -d ' ' -f 1-2
Resultatet bör se ut ungefär så här:
LogicalName PhysicalName ------------------------------------------ WWI_Primary D:\Data\WideWorldImporters.mdf WWI_UserData D:\Data\WideWorldImporters_UserData.ndf WWI_Log E:\Log\WideWorldImporters.ldf WWI_InMemory_Data_1 D:\Data\WideWorldImporters_InMemory_Data_1
Anropa kommandot
RESTORE DATABASE
för att återställa databasen i containern. Ange nya sökvägar för var och en av filerna i föregående steg.sudo docker exec -it sql1 /opt/mssql-tools18/bin/sqlcmd \ -S localhost -U sa -P '<new-password>' \ -Q 'RESTORE DATABASE WideWorldImporters FROM DISK = "/var/opt/mssql/backup/wwi.bak" WITH MOVE "WWI_Primary" TO "/var/opt/mssql/data/WideWorldImporters.mdf", MOVE "WWI_UserData" TO "/var/opt/mssql/data/WideWorldImporters_userdata.ndf", MOVE "WWI_Log" TO "/var/opt/mssql/data/WideWorldImporters.ldf", MOVE "WWI_InMemory_Data_1" TO "/var/opt/mssql/data/WideWorldImporters_InMemory_Data_1"'
Resultatet bör se ut ungefär så här:
Processed 1464 pages for database 'WideWorldImporters', file 'WWI_Primary' on file 1. Processed 53096 pages for database 'WideWorldImporters', file 'WWI_UserData' on file 1. Processed 33 pages for database 'WideWorldImporters', file 'WWI_Log' on file 1. Processed 3862 pages for database 'WideWorldImporters', file 'WWI_InMemory_Data_1' on file 1. Converting database 'WideWorldImporters' from version 852 to the current version 869. Database 'WideWorldImporters' running the upgrade step from version 852 to version 853. Database 'WideWorldImporters' running the upgrade step from version 853 to version 854. Database 'WideWorldImporters' running the upgrade step from version 854 to version 855. Database 'WideWorldImporters' running the upgrade step from version 855 to version 856. Database 'WideWorldImporters' running the upgrade step from version 856 to version 857. Database 'WideWorldImporters' running the upgrade step from version 857 to version 858. Database 'WideWorldImporters' running the upgrade step from version 858 to version 859. Database 'WideWorldImporters' running the upgrade step from version 859 to version 860. Database 'WideWorldImporters' running the upgrade step from version 860 to version 861. Database 'WideWorldImporters' running the upgrade step from version 861 to version 862. Database 'WideWorldImporters' running the upgrade step from version 862 to version 863. Database 'WideWorldImporters' running the upgrade step from version 863 to version 864. Database 'WideWorldImporters' running the upgrade step from version 864 to version 865. Database 'WideWorldImporters' running the upgrade step from version 865 to version 866. Database 'WideWorldImporters' running the upgrade step from version 866 to version 867. Database 'WideWorldImporters' running the upgrade step from version 867 to version 868. Database 'WideWorldImporters' running the upgrade step from version 868 to version 869. RESTORE DATABASE successfully processed 58455 pages in 18.069 seconds (25.273 MB/sec).
Verifiera den återställde databasen
Kör följande fråga för att visa en lista över databasnamn i containern:
sudo docker exec -it sql1 /opt/mssql-tools18/bin/sqlcmd \
-S localhost -U sa -P '<new-password>' \
-Q 'SELECT name FROM sys.databases'
Du bör se WideWorldImporters
i listan över databaser.
Gör en ändring
Följ de här stegen för att göra en ändring i databasen.
Kör en fråga för att visa de 10 översta objekten i tabellen
Warehouse.StockItems
.sudo docker exec -it sql1 /opt/mssql-tools18/bin/sqlcmd \ -S localhost -U sa -P '<new-password>' \ -Q 'SELECT TOP 10 StockItemID, StockItemName FROM WideWorldImporters.Warehouse.StockItems ORDER BY StockItemID'
Du bör se en lista över objektidentifierare och namn:
StockItemID StockItemName ----------- ----------------- 1 USB missile launcher (Green) 2 USB rocket launcher (Gray) 3 Office cube periscope (Black) 4 USB food flash drive - sushi roll 5 USB food flash drive - hamburger 6 USB food flash drive - hot dog 7 USB food flash drive - pizza slice 8 USB food flash drive - dim sum 10 drive variety pack 9 USB food flash drive - banana 10 USB food flash drive - chocolate bar
Uppdatera beskrivningen av det första objektet med följande
UPDATE
-instruktion:sudo docker exec -it sql1 /opt/mssql-tools18/bin/sqlcmd \ -S localhost -U sa -P '<new-password>' \ -Q 'UPDATE WideWorldImporters.Warehouse.StockItems SET StockItemName="USB missile launcher (Dark Green)" WHERE StockItemID=1; SELECT StockItemID, StockItemName FROM WideWorldImporters.Warehouse.StockItems WHERE StockItemID=1'
Du bör se ett resultat som liknar följande text:
(1 rows affected) StockItemID StockItemName ----------- ------------------------------------ 1 USB missile launcher (Dark Green)
Skapa en ny säkerhetskopia
När du har återställt databasen till en container kanske du också regelbundet vill skapa säkerhetskopior av databaser i containern som körs. Stegen följer ett liknande mönster som föregående steg, men i omvänd ordning.
Använd kommandot
BACKUP DATABASE
Transact-SQL för att skapa en databassäkerhetskopia i containern. Den här handledningen skapar en ny säkerhetskopia,wwi_2.bak
, i den tidigare skapade katalogen/var/opt/mssql/backup
.sudo docker exec -it sql1 /opt/mssql-tools18/bin/sqlcmd \ -S localhost -U sa -P '<new-password>' \ -Q "BACKUP DATABASE [WideWorldImporters] TO DISK = N'/var/opt/mssql/backup/wwi_2.bak' WITH NOFORMAT, NOINIT, NAME = 'WideWorldImporters-full', SKIP, NOREWIND, NOUNLOAD, STATS = 10"
Resultatet bör se ut ungefär så här:
10 percent processed. 20 percent processed. 30 percent processed. 40 percent processed. 50 percent processed. 60 percent processed. 70 percent processed. Processed 1200 pages for database 'WideWorldImporters', file 'WWI_Primary' on file 1. Processed 53096 pages for database 'WideWorldImporters', file 'WWI_UserData' on file 1. 80 percent processed. Processed 3865 pages for database 'WideWorldImporters', file 'WWI_InMemory_Data_1' on file 1. Processed 938 pages for database 'WideWorldImporters', file 'WWI_Log' on file 1. 100 percent processed. BACKUP DATABASE successfully processed 59099 pages in 25.056 seconds (18.427 MB/sec).
Kopiera sedan säkerhetskopieringsfilen från containern och till värddatorn.
cd ~ sudo docker cp sql1:/var/opt/mssql/backup/wwi_2.bak wwi_2.bak ls -l wwi*
Använda beständiga data
Förutom att göra databassäkerhetskopior för att skydda dina data kan du även använda datavolymcontainrar. I början av den här självstudien skapades containern sql1
med parametern -v sql1data:/var/opt/mssql
. Data-volymcontainern sql1data
bevarar /var/opt/mssql
data även efter att den har borttagits. Följande steg tar helt bort sql1
-containern och skapar sedan en ny container, sql2
, med bevarade data.
Stäng av containern
sql1
.sudo docker stop sql1
Ta bort containern. Detta tar inte bort den tidigare skapade
sql1data
datavolymcontainern och de bevarade data i den.sudo docker rm sql1
Skapa en ny container,
sql2
, och återanvänd datavolymcontainernsql1data
.sudo docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<password>' \ --name 'sql2' -e 'MSSQL_PID=Developer' -p 1401:1433 \ -v sql1data:/var/opt/mssql -d mcr.microsoft.com/mssql/server:2017-latest
Wide World Importers-databasen finns nu i den nya containern. Kör en fråga för att verifiera den tidigare ändringen du gjorde.
sudo docker exec -it sql2 /opt/mssql-tools/bin/sqlcmd \ -S localhost -U sa -P '<new-password>' \ -Q 'SELECT StockItemID, StockItemName FROM WideWorldImporters.Warehouse.StockItems WHERE StockItemID=1'
Det
sa
lösenordet är inte det lösenord som du angav försql2
-containern,MSSQL_SA_PASSWORD=<password>
. Alla SQL Server-data återställdes frånsql1
, inklusive det ändrade lösenordet från tidigare i självstudien. I själva verket ignoreras vissa alternativ som detta på grund av återställning av data i /var/opt/mssql. Av den anledningen är lösenordet<new-password>
som visas här.
Stoppa
sql1
-containern.sudo docker stop sql1
Ta bort containern. Detta tar inte bort den tidigare skapade
sql1data
datavolymcontainern och de bevarade data i den.sudo docker rm sql1
Skapa en ny container,
sql2
, och återanvänd datavolymcontainernsql1data
.sudo docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<password>' \ --name 'sql2' -e 'MSSQL_PID=Developer' -p 1401:1433 \ -v sql1data:/var/opt/mssql -d mcr.microsoft.com/mssql/server:2019-latest
Wide World Importers-databasen finns nu i den nya containern. Kör en fråga för att verifiera den tidigare ändringen du gjorde.
sudo docker exec -it sql2 /opt/mssql-tools18/bin/sqlcmd \ -S localhost -U sa -P '<new-password>' \ -Q 'SELECT StockItemID, StockItemName FROM WideWorldImporters.Warehouse.StockItems WHERE StockItemID=1'
Det
sa
lösenordet är inte det lösenord som du angav försql2
-containern,MSSQL_SA_PASSWORD=<password>
. Alla SQL Server-data återställdes frånsql1
, inklusive det ändrade lösenordet från tidigare i självstudien. I själva verket ignoreras vissa alternativ som detta på grund av återställning av data i /var/opt/mssql. Av den anledningen är lösenordet<new-password>
som visas här.
Stoppa containern
sql1
.sudo docker stop sql1
Ta bort containern. Detta tar inte bort den tidigare skapade
sql1data
datavolymcontainern och de bevarade data i den.sudo docker rm sql1
Skapa en ny container,
sql2
, och återanvänd datavolymcontainernsql1data
.sudo docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<password>' \ --name 'sql2' -e 'MSSQL_PID=Developer' -p 1401:1433 \ -v sql1data:/var/opt/mssql -d mcr.microsoft.com/mssql/server:2022-latest
Wide World Importers-databasen finns nu i den nya containern. Kör en fråga för att verifiera den tidigare ändringen du gjorde.
sudo docker exec -it sql2 /opt/mssql-tools18/bin/sqlcmd \ -S localhost -U sa -P '<new-password>' \ -Q 'SELECT StockItemID, StockItemName FROM WideWorldImporters.Warehouse.StockItems WHERE StockItemID=1'
Det
sa
lösenordet är inte det lösenord som du angav försql2
-containern,MSSQL_SA_PASSWORD=<password>
. Alla SQL Server-data återställdes frånsql1
, inklusive det ändrade lösenordet från tidigare i självstudien. I själva verket ignoreras vissa alternativ som detta på grund av återställning av data i/var/opt/mssql
. Av den anledningen är lösenordet<new-password>
som visas här.
Försiktighet
Lösenordet bör följa SQL Server-standardprincipen för lösenord. Lösenordet måste som standard vara minst åtta tecken långt och innehålla tecken från tre av följande fyra uppsättningar: versaler, gemener, bas-10 siffror och symboler. Lösenord kan vara upp till 128 tecken långa. Använd lösenord som är så långa och komplexa som möjligt.
Nästa steg
I den här självstudien har du lärt dig hur du säkerhetskopierar en databas i Windows och flyttar den till en Linux-server som kör SQL Server 2017 (14.x) i en container. Du har lärt dig att:
I den här självstudien har du lärt dig hur du säkerhetskopierar en databas i Windows och flyttar den till en Linux-server som kör SQL Server 2019 (15.x) i en container. Du har lärt dig att:
I den här självstudien har du lärt dig hur du säkerhetskopierar en databas i Windows och flyttar den till en Linux-server som kör SQL Server 2022 (16.x) i en container. Du har lärt dig att:
- Skapa SQL Server Linux-containeravbildningar.
- Kopiera SQL Server-databassäkerhetskopior till en container.
- Kör instruktionerna för Transact-SQL med sqlcmd.
- Skapa och extrahera säkerhetskopierade filer från en container.
- Använd datavolymcontainrar för att spara SQL Server-produktionsdata.
Granska sedan andra scenarier för containerkonfiguration och felsökning:
Bidra till SQL-dokumentation
Visste du att du kan redigera SQL-innehåll själv? Om du gör det hjälper du inte bara till att förbättra vår dokumentation, utan du får även kredit som deltagare på sidan.
Mer information finns i Så här bidrar du till SQL Server-dokumentationen