Wiederherstellen einer SQL Server-Datenbank in einem Docker-Container in LinuxRestore a SQL Server database in a Linux Docker container

Gilt für: JaSQL Server (nur Linux) NeinAzure SQL-Datenbank NeinAzure Synapse Analytics (SQL DW) NeinParallel Data Warehouse APPLIES TO: yesSQL Server (Linux only) noAzure SQL Database noAzure Synapse Analytics (SQL DW) noParallel Data Warehouse

In diesem Tutorial erfahren Sie, wie Sie eine SQL Server-Sicherungsdatei in ein Linux-Containerimage von SQL Server 2017 in Docker verschieben und dort wiederherstellen.This tutorial demonstrates how to move and restore a SQL Server backup file into a SQL Server 2017 Linux container image running on Docker.

In diesem Tutorial erfahren Sie, wie Sie eine SQL Server-Sicherungsdatei in ein Linux-Containerimage von SQL Server 2019 in Docker verschieben und dort wiederherstellen.This tutorial demonstrates how to move and restore a SQL Server backup file into a SQL Server 2019 Linux container image running on Docker.

  • Übertragen Sie das neueste Linux-Containerimage von SQL Server per Pull, und führen Sie es aus.Pull and run the latest SQL Server Linux container image.
  • Kopieren Sie die Datenbankdatei von Wide World Importers in den Container.Copy the Wide World Importers database file into the container.
  • Stellen Sie die Datenbank im Container wieder her.Restore the database in the container.
  • Führen Sie Transact-SQL-Anweisungen aus, um die Datenbank anzuzeigen und zu ändern.Run Transact-SQL statements to view and modify the database.
  • Sichern Sie die geänderte Datenbank.Backup the modified database.

VoraussetzungenPrerequisites

Übertragen mithilfe von Pull und Ausführen von ContainerimagesPull and run the container image

  1. Öffnen Sie unter Linux/Mac ein Bash-Terminal oder unter Windows eine PowerShell-Sitzung mit erhöhten Rechten.Open a bash terminal on Linux/Mac or an elevated PowerShell session on Windows.

  2. Übertragen Sie das Linux-Containerimage von SQL Server 2017 mithilfe von Pull aus dem Docker-Hub.Pull the SQL Server 2017 Linux container image from Docker Hub.

    sudo docker pull mcr.microsoft.com/mssql/server:2017-latest
    
    docker pull mcr.microsoft.com/mssql/server:2017-latest
    

    Tipp

    Die in diesem Tutorial verwendeten Beispiele für Docker-Befehle werden jeweils für die Bash-Shell (Linux/Mac) und für PowerShell (Windows) aufgeführt.Throughout this tutorial, docker command examples are given for both the bash shell (Linux/Mac) and PowerShell (Windows).

  3. Verwenden Sie zum Ausführen des Containerimages mit Docker den folgenden Befehl:To run the container image with Docker, you can use the following command:

    sudo docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' \
       --name 'sql1' -p 1401:1433 \
       -v sql1data:/var/opt/mssql \
       -d mcr.microsoft.com/mssql/server:2017-latest
    
    docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" `
       --name "sql1" -p 1401:1433 `
       -v sql1data:/var/opt/mssql `
       -d mcr.microsoft.com/mssql/server:2017-latest
    

    Mit diesem Befehl wird ein Container von SQL Server 2017 erstellt, der standardmäßig die Developer Edition enthält.This command creates a SQL Server 2017 container with the Developer edition (default). Der SQL Server-Port 1433 wird auf dem Host als Port 1401 bereitgestellt.SQL Server port 1433 is exposed on the host as port 1401. Mit dem optionalen Parameter -v sql1data:/var/opt/mssql wird ein Datenvolumecontainer namens sql1ddata erstellt.The optional -v sql1data:/var/opt/mssql parameter creates a data volume container named sql1ddata. Dieser wird verwendet, um die von SQL Server erstellten Daten permanent zu speichern.This is used to persist the data created by SQL Server.

    Hinweis

    Die Vorgehensweise zum Ausführen von SQL Server-Produktionseditionen in Containern weicht hiervon minimal ab.The process for running production SQL Server editions in containers is slightly different. Weitere Informationen finden Sie unter Run production container images (Ausführen von Containerimages für Produktionsumgebungen).For more information, see Run production container images. Bei Verwendung derselben Containernamen und Ports können Sie die restlichen Schritte dieser exemplarischen Vorgehensweise auch mit Containern für Produktionsumgebungen ausführen.If you use the same container names and ports, the rest of this walkthrough still works with production containers.

  4. Verwenden Sie den Befehl docker ps, um Ihre Docker-Container anzeigen zu lassen.To view your Docker containers, use the docker ps command.

    sudo docker ps -a
    
    docker ps -a
    
  5. Wenn in der Spalte STATUS Up (Aktiv) eingetragen ist, wird SQL Server im Container ausgeführt und überwacht den Port, der in der Spalte PORTS angegeben ist.If the STATUS column shows a status of Up, then SQL Server is running in the container and listening on the port specified in the PORTS column. Wenn in der Spalte STATUS Ihres SQL Server-Containers Exited (Beendet) steht, lesen Sie bitte im Abschnitt „Problembehebung“ im Konfigurationshandbuch nach.If the STATUS column for your SQL Server container shows Exited, see the Troubleshooting section of the configuration guide.

$ 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
  1. Öffnen Sie unter Linux/Mac ein Bash-Terminal oder unter Windows eine PowerShell-Sitzung mit erhöhten Rechten.Open a bash terminal on Linux/Mac or an elevated PowerShell session on Windows.

  2. Übertragen Sie das Linux-Containerimage von SQL Server 2019 mithilfe von Pull aus dem Docker Hub.Pull the SQL Server 2019 Linux container image from Docker Hub.

    sudo docker pull mcr.microsoft.com/mssql/server:2019-GA-ubuntu-16.04
    
    docker pull mcr.microsoft.com/mssql/server:2019-GA-ubuntu-16.04
    

    Tipp

    Die in diesem Tutorial verwendeten Beispiele für Docker-Befehle werden jeweils für die Bash-Shell (Linux/Mac) und für PowerShell (Windows) aufgeführt.Throughout this tutorial, docker command examples are given for both the bash shell (Linux/Mac) and PowerShell (Windows).

  3. Verwenden Sie zum Ausführen des Containerimages mit Docker den folgenden Befehl:To run the container image with Docker, you can use the following command:

    sudo docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' \
       --name 'sql1' -p 1401:1433 \
       -v sql1data:/var/opt/mssql \
       -d mcr.microsoft.com/mssql/server:2019-GA-ubuntu-16.04
    
    docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" `
       --name "sql1" -p 1401:1433 `
       -v sql1data:/var/opt/mssql `
       -d mcr.microsoft.com/mssql/server:2019-GA-ubuntu-16.04
    

    Mit diesem Befehl wird ein Container von SQL Server 2019 erstellt, der standardmäßig die Developer-Edition enthält.This command creates a SQL Server 2019 container with the Developer edition (default). Der SQL Server-Port 1433 wird auf dem Host als Port 1401 bereitgestellt.SQL Server port 1433 is exposed on the host as port 1401. Mit dem optionalen Parameter -v sql1data:/var/opt/mssql wird ein Datenvolumecontainer namens sql1ddata erstellt.The optional -v sql1data:/var/opt/mssql parameter creates a data volume container named sql1ddata. Dieser wird verwendet, um die von SQL Server erstellten Daten permanent zu speichern.This is used to persist the data created by SQL Server.

  4. Verwenden Sie den Befehl docker ps, um Ihre Docker-Container anzeigen zu lassen.To view your Docker containers, use the docker ps command.

    sudo docker ps -a
    
    docker ps -a
    
  5. Wenn in der Spalte STATUS Up (Aktiv) eingetragen ist, wird SQL Server im Container ausgeführt und überwacht den Port, der in der Spalte PORTS angegeben ist.If the STATUS column shows a status of Up, then SQL Server is running in the container and listening on the port specified in the PORTS column. Wenn in der Spalte STATUS Ihres SQL Server-Containers Exited (Beendet) steht, lesen Sie bitte im Abschnitt „Problembehebung“ im Konfigurationshandbuch nach.If the STATUS column for your SQL Server container shows Exited, see the Troubleshooting section of the configuration guide.

    $ 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
    

Ändern des SystemadministratorkennwortsChange the SA password

Das SA-Konto ist ein Systemadministrator für die SQL Server-Instanz, der während des Setups erstellt wird.The SA account is a system administrator on the SQL Server instance that's created during setup. Nach dem Erstellen Ihres SQL Server-Containers können Sie die von Ihnen festgelegte Umgebungsvariable MSSQL_SA_PASSWORD ermitteln, indem Sie echo $MSSQL_SA_PASSWORD im Container ausführen.After you create your SQL Server container, the MSSQL_SA_PASSWORD environment variable you specified is discoverable by running echo $MSSQL_SA_PASSWORD in the container. Ändern Sie aus Sicherheitsgründen Ihr SA-Kennwort:For security purposes, change your SA password:

  1. Wählen Sie ein sicheres Kennwort für den SA-Benutzer aus.Choose a strong password to use for the SA user.

  2. Verwenden Sie docker exec zum Ausführen des Hilfsprogramms sqlcmd, um das Kennwort über eine Transact-SQL-Anweisung zu ändern.Use docker exec to run the sqlcmd utility to change the password through a Transact-SQL statement. Ersetzen Sie <YourStrong!Passw0rd> und <YourNewStrong!Passw0rd> durch Ihre eigenen Kennwortwerte:Replace <YourStrong!Passw0rd> and <YourNewStrong!Passw0rd> with your own password values:

    sudo docker exec -it sql1 /opt/mssql-tools/bin/sqlcmd \
       -S localhost -U SA -P '<YourStrong!Passw0rd>' \
       -Q 'ALTER LOGIN SA WITH PASSWORD="<YourNewStrong!Passw0rd>"'
    
    docker exec -it sql1 /opt/mssql-tools/bin/sqlcmd `
       -S localhost -U SA -P "<YourStrong!Passw0rd>" `
       -Q "ALTER LOGIN SA WITH PASSWORD='<YourNewStrong!Passw0rd>'"
    

Kopieren einer Sicherungsdatei in den ContainerCopy a backup file into the container

In diesem Tutorial wird die Beispieldatenbank von Wide World Importers verwendet.This tutorial uses the Wide World Importers sample database. Führen Sie die folgenden Schritte aus, um die Sicherungsdatei der Datenbank von Wide World Importers in Ihren SQL Server-Container herunterzuladen und zu kopieren:Use the following steps to download and copy the Wide World Importers database backup file into your SQL Server container.

  1. Erstellen Sie zunächst mit dem Befehl docker exec einen Sicherungsordner.First, use docker exec to create a backup folder. Mit dem folgenden Befehl wird im SQL Server-Container ein Verzeichnis vom Typ /var/opt/mssql/backup erstellt:The following command creates a /var/opt/mssql/backup directory inside the SQL Server container.

    sudo docker exec -it sql1 mkdir /var/opt/mssql/backup
    
    docker exec -it sql1 mkdir /var/opt/mssql/backup
    
  2. Laden Sie nun die Datei WideWorldImporters-Full.bak auf Ihren Hostcomputer herunter.Next, download the WideWorldImporters-Full.bak file to your host machine. Mit den folgenden Befehlen wechseln Sie zum Basis-/Benutzerverzeichnis und laden die Sicherungsdatei als wwi.bak herunter.The following commands navigate to the home/user directory and downloads the backup file as 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'
    
    curl -OutFile "wwi.bak" "https://github.com/Microsoft/sql-server-samples/releases/download/wide-world-importers-v1.0/WideWorldImporters-Full.bak"
    
  3. Kopieren Sie mit dem Befehl docker cp die Sicherungsdatei in den Container im Verzeichnis /var/opt/mssql/backup.Use docker cp to copy the backup file into the container in the /var/opt/mssql/backup directory.

    sudo docker cp wwi.bak sql1:/var/opt/mssql/backup
    
    docker cp wwi.bak sql1:/var/opt/mssql/backup
    

Wiederherstellen der DatenbankRestore the database

Die Sicherungsdatei befindet sich nun im Container.The backup file is now located inside the container. Bevor Sie die Sicherung wiederherstellen können, müssen Sie die logischen Dateinamen und Dateitypen in der Sicherung kennen.Before restoring the backup, it is important to know the logical file names and file types inside the backup. Mit den folgenden Transact-SQL-Befehlen überprüfen Sie die Sicherung und führen die Wiederherstellung aus, indem Sie den Befehl sqlcmd im Container verwenden.The following Transact-SQL commands inspect the backup and perform the restore using sqlcmd in the container.

Tipp

In diesem Tutorial wird der Befehl sqlcmd im Container verwendet, da er dieses vorinstallierte Tool bereits enthält.This tutorial uses sqlcmd inside the container, because the container comes with this tool pre-installed. Sie können Transact-SQL-Anweisungen jedoch auch außerhalb des Containers mit anderen Clienttools wie Visual Studio Code oder SQL Server Management Studio ausführen.However, you can also run Transact-SQL statements with other client tools outside of the container, such as Visual Studio Code or SQL Server Management Studio. Verwenden Sie zum Herstellen einer Verbindung den Hostport, der Port 1433 im Container zugeordnet wurde.To connect, use the host port that was mapped to port 1433 in the container. In diesem Beispiel ist dies localhost, 1401 auf dem Hostcomputer und Host_IP_Address,1401 für den Remotezugriff.In this example, that is localhost,1401 on the host machine and Host_IP_Address,1401 remotely.

  1. Führen Sie im Container den Befehl sqlcmd aus, um die logischen Dateinamen und Pfade in der Sicherung aufzulisten.Run sqlcmd inside the container to list out logical file names and paths inside the backup. Dies geschieht über die Transact-SQL-Anweisung RESTORE FILELISTONLY.This is done with the RESTORE FILELISTONLY Transact-SQL statement.

    sudo docker exec -it sql1 /opt/mssql-tools/bin/sqlcmd -S localhost \
       -U SA -P '<YourNewStrong!Passw0rd>' \
       -Q 'RESTORE FILELISTONLY FROM DISK = "/var/opt/mssql/backup/wwi.bak"' \
       | tr -s ' ' | cut -d ' ' -f 1-2
    
    docker exec -it sql1 /opt/mssql-tools/bin/sqlcmd -S localhost `
       -U SA -P "<YourNewStrong!Passw0rd>" `
       -Q "RESTORE FILELISTONLY FROM DISK = '/var/opt/mssql/backup/wwi.bak'"
    

    Die Ausgabe sollte etwa folgendermaßen aussehen:You should see output similar to the following:

    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
    
  2. Rufen Sie den Befehl RESTORE DATABASE auf, um die Datenbank im Container wiederherzustellen.Call the RESTORE DATABASE command to restore the database inside the container. Geben Sie für jede der Dateien aus dem vorherigen Schritt einen neuen Pfad an.Specify new paths for each of the files in the previous step.

    sudo docker exec -it sql1 /opt/mssql-tools/bin/sqlcmd \
       -S localhost -U SA -P '<YourNewStrong!Passw0rd>' \
       -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"'
    
    docker exec -it sql1 /opt/mssql-tools/bin/sqlcmd `
       -S localhost -U SA -P "<YourNewStrong!Passw0rd>" `
       -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'"
    

    Die Ausgabe sollte etwa folgendermaßen aussehen:You should see output similar to the following:

    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).
    

Überprüfen der wiederhergestellten DatenbankVerify the restored database

Führen Sie die folgende Abfrage aus, um eine Liste der Datenbanknamen in Ihrem Container anzuzeigen:Run the following query to display a list of database names in your container:

sudo docker exec -it sql1 /opt/mssql-tools/bin/sqlcmd \
   -S localhost -U SA -P '<YourNewStrong!Passw0rd>' \
   -Q 'SELECT Name FROM sys.Databases'
docker exec -it sql1 /opt/mssql-tools/bin/sqlcmd `
   -S localhost -U SA -P "<YourNewStrong!Passw0rd>" `
   -Q "SELECT Name FROM sys.Databases"

Die Liste der Datenbanken sollte den Eintrag WideWorldImporters enthalten.You should see WideWorldImporters in the list of databases.

Vornehmen einer ÄnderungMake a change

Führen Sie die folgenden Schritte aus, um in der Datenbank eine Änderung vorzunehmen:The following steps make a change in the database.

  1. Führen Sie eine Abfrage aus, um die obersten zehn Elemente der Tabelle Warehouse.StockItems anzuzeigen.Run a query to view the top 10 items in the Warehouse.StockItems table.

    sudo docker exec -it sql1 /opt/mssql-tools/bin/sqlcmd \
       -S localhost -U SA -P '<YourNewStrong!Passw0rd>' \
       -Q 'SELECT TOP 10 StockItemID, StockItemName FROM WideWorldImporters.Warehouse.StockItems ORDER BY StockItemID'
    
    docker exec -it sql1 /opt/mssql-tools/bin/sqlcmd `
       -S localhost -U SA -P "<YourNewStrong!Passw0rd>" `
       -Q "SELECT TOP 10 StockItemID, StockItemName FROM WideWorldImporters.Warehouse.StockItems ORDER BY StockItemID"
    

    Es sollte eine Liste mit den Bezeichnern und Namen der Elemente angezeigt werden:You should see a list of item identifiers and names:

    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
    
  2. Aktualisieren Sie mit der folgenden UPDATE-Anweisung die Beschreibung des ersten Elements:Update the description of the first item with the following UPDATE statement:

    sudo docker exec -it sql1 /opt/mssql-tools/bin/sqlcmd \
       -S localhost -U SA -P '<YourNewStrong!Passw0rd>' \
       -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'
    
    docker exec -it sql1 /opt/mssql-tools/bin/sqlcmd `
       -S localhost -U SA -P "<YourNewStrong!Passw0rd>" `
       -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"
    

    Die Ausgabe sollte etwa folgendermaßen aussehen:You should see output similar to the following text:

    (1 rows affected)
    StockItemID StockItemName
    ----------- ------------------------------------
              1 USB missile launcher (Dark Green)
    

Erstellen einer neuen SicherungCreate a new backup

Nachdem Sie Ihre Datenbank in einem Container wiederhergestellt haben, können Sie auch regelmäßige Datenbanksicherungen im ausgeführten Container erstellen.After you've restored your database into a container, you might also want to regularly create database backups inside the running container. Die dafür erforderlichen Schritte ähneln den vorherigen, jedoch in umgekehrter Reihenfolge.The steps follow a similar pattern to the previous steps but in reverse.

  1. Erstellen Sie mit dem Transact-SQL-Befehl BACKUP DATABASE eine Datenbanksicherung im Container.Use the BACKUP DATABASE Transact-SQL command to create a database backup in the container. In diesem Tutorial wird im zuvor erstellten Verzeichnis /var/opt/mssql/backup eine neue Sicherungsdatei namens wwi_2.bak erstellt.This tutorial creates a new backup file, wwi_2.bak, in the previously created /var/opt/mssql/backup directory.

    sudo docker exec -it sql1 /opt/mssql-tools/bin/sqlcmd \
       -S localhost -U SA -P '<YourNewStrong!Passw0rd>' \
       -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"
    
    docker exec -it sql1 /opt/mssql-tools/bin/sqlcmd `
       -S localhost -U SA -P "<YourNewStrong!Passw0rd>" `
       -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"
    

    Die Ausgabe sollte etwa folgendermaßen aussehen:You should see output similar to the following:

    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).
    
  2. Kopieren Sie nun die Sicherungsdatei aus dem Container auf den Hostcomputer.Next, copy the backup file out of the container and onto your host machine.

    cd ~
    sudo docker cp sql1:/var/opt/mssql/backup/wwi_2.bak wwi_2.bak
    ls -l wwi*
    
    cd ~
    docker cp sql1:/var/opt/mssql/backup/wwi_2.bak wwi_2.bak
    ls -l wwi*
    

Verwenden der persistenten DatenUse the persisted data

Zum Schutz Ihrer Daten können Sie neben Datenbanksicherungen auch Datenvolumecontainer verwenden.In addition to taking database backups for protecting your data, you can also use data volume containers. Zu Beginn dieses Tutorials haben Sie mit dem Parameter -v sql1data:/var/opt/mssql den Container sql1 erstellt.The beginning of this tutorial created the sql1 container with the -v sql1data:/var/opt/mssql parameter. Im Datenvolumecontainer sql1data werden die Daten aus /var/opt/mssql auch dann weiterhin gespeichert, wenn der Container gelöscht wird.The sql1data data volume container persists the /var/opt/mssql data even after the container is removed. Führen Sie die folgenden Schritte aus, um den Container sql1 vollständig zu entfernen und anschließend einen neuen Container namens sql2 mit den persistenten Daten zu erstellen.The following steps completely remove the sql1 container and then create a new container, sql2, with the persisted data.

  1. Beenden Sie den Container sql1.Stop the sql1 container.

    sudo docker stop sql1
    
    docker stop sql1
    
  2. Entfernen Sie den Container.Remove the container. Durch diesen Vorgang werden der zuvor erstellte Datenvolumecontainer sql1data und die darin enthaltenen persistenten Daten nicht gelöscht.This does not delete the previously created sql1data data volume container and the persisted data in it.

    sudo docker rm sql1
    
    docker rm sql1
    
  3. Erstellen Sie einen neuen Container namens sql2, und verwenden Sie den Datenvolumecontainer sql1data erneut.Create a new container, sql2, and reuse the sql1data data volume container.

    sudo docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' \
       --name 'sql2' -e 'MSSQL_PID=Developer' -p 1401:1433 \
       -v sql1data:/var/opt/mssql -d mcr.microsoft.com/mssql/server:2017-latest
    
    docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" `
       --name "sql2" -e "MSSQL_PID=Developer" -p 1401:1433 `
       -v sql1data:/var/opt/mssql -d mcr.microsoft.com/mssql/server:2017-latest
    
  4. Die Datenbank von Wide World Importers befindet sich nun im neuen Container.The Wide World Importers database is now in the new container. Führen Sie eine Abfrage aus, um die vorherige Änderung zu überprüfen.Run a query to verify the previous change you made.

    sudo docker exec -it sql2 /opt/mssql-tools/bin/sqlcmd \
       -S localhost -U SA -P '<YourNewStrong!Passw0rd>' \
       -Q 'SELECT StockItemID, StockItemName FROM WideWorldImporters.Warehouse.StockItems WHERE StockItemID=1'
    
    docker exec -it sql2 /opt/mssql-tools/bin/sqlcmd `
       -S localhost -U SA -P "<YourNewStrong!Passw0rd>" `
       -Q "SELECT StockItemID, StockItemName FROM WideWorldImporters.Warehouse.StockItems WHERE StockItemID=1"
    

    Hinweis

    Das SA-Kennwort ist nicht mit dem Kennwort identisch, das Sie für den Container sql2 angegeben haben (MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>).The SA password is not the password you specified for the sql2 container, MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>. Alle SQL Server-Daten aus sql1 wurden wiederhergestellt, einschließlich des zuvor in diesem Tutorial geänderten Kennworts.All of the SQL Server data was restored from sql1, including the changed password from earlier in the tutorial. Einige Optionen wie diese werden aufgrund der Wiederherstellung der Daten in „/var/opt/mssql“ ignoriert.In effect, some options like this are ignored due to restoring the data in /var/opt/mssql. Daher lautet das Kennwort wie hier gezeigt <YourNewStrong!Passw0rd>.For this reason, the password is <YourNewStrong!Passw0rd> as shown here.

  1. Beenden Sie den Container sql1.Stop the sql1 container.

    sudo docker stop sql1
    
    docker stop sql1
    
  2. Entfernen Sie den Container.Remove the container. Durch diesen Vorgang werden der zuvor erstellte Datenvolumecontainer sql1data und die darin enthaltenen persistenten Daten nicht gelöscht.This does not delete the previously created sql1data data volume container and the persisted data in it.

    sudo docker rm sql1
    
    docker rm sql1
    
  3. Erstellen Sie einen neuen Container namens sql2, und verwenden Sie den Datenvolumecontainer sql1data erneut.Create a new container, sql2, and reuse the sql1data data volume container.

    sudo docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' \
       --name 'sql2' -e 'MSSQL_PID=Developer' -p 1401:1433 \
       -v sql1data:/var/opt/mssql -d mcr.microsoft.com/mssql/server:2019-GA-ubuntu-16.04
    
    docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" `
       --name "sql2" -e "MSSQL_PID=Developer" -p 1401:1433 `
       -v sql1data:/var/opt/mssql -d mcr.microsoft.com/mssql/server:2019-GA-ubuntu-16.04
    
  4. Die Datenbank von Wide World Importers befindet sich nun im neuen Container.The Wide World Importers database is now in the new container. Führen Sie eine Abfrage aus, um die vorherige Änderung zu überprüfen.Run a query to verify the previous change you made.

    sudo docker exec -it sql2 /opt/mssql-tools/bin/sqlcmd \
       -S localhost -U SA -P '<YourNewStrong!Passw0rd>' \
       -Q 'SELECT StockItemID, StockItemName FROM WideWorldImporters.Warehouse.StockItems WHERE StockItemID=1'
    
    docker exec -it sql2 /opt/mssql-tools/bin/sqlcmd `
       -S localhost -U SA -P "<YourNewStrong!Passw0rd>" `
       -Q "SELECT StockItemID, StockItemName FROM WideWorldImporters.Warehouse.StockItems WHERE StockItemID=1"
    

    Hinweis

    Das SA-Kennwort ist nicht mit dem Kennwort identisch, das Sie für den Container sql2 angegeben haben (MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>).The SA password is not the password you specified for the sql2 container, MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>. Alle SQL Server-Daten aus sql1 wurden wiederhergestellt, einschließlich des zuvor in diesem Tutorial geänderten Kennworts.All of the SQL Server data was restored from sql1, including the changed password from earlier in the tutorial. Einige Optionen wie diese werden aufgrund der Wiederherstellung der Daten in „/var/opt/mssql“ ignoriert.In effect, some options like this are ignored due to restoring the data in /var/opt/mssql. Daher lautet das Kennwort wie hier gezeigt <YourNewStrong!Passw0rd>.For this reason, the password is <YourNewStrong!Passw0rd> as shown here.

Nächste SchritteNext steps

In diesem Tutorial haben Sie erfahren, wie Sie eine Datenbank unter Windows sichern und auf einen Linux-Server mit SQL Server 2017 verschieben.In this tutorial, you learned how to back up a database on Windows and move it to a Linux server running SQL Server 2017. Sie haben Folgendes gelernt:You learned how to:

In diesem Tutorial haben Sie gelernt, wie Sie eine Datenbank unter Windows sichern und auf einen Linux-Server mit SQL Server 2019 verschieben.In this tutorial, you learned how to back up a database on Windows and move it to a Linux server running SQL Server 2019. Sie haben Folgendes gelernt:You learned how to:

  • Erstellen von Linux-Containerimages in SQL ServerCreate SQL Server Linux container images.
  • Kopieren von SQL Server-Datenbanksicherungen in einen ContainerCopy SQL Server database backups into a container.
  • Ausführen von Transact-SQL-Anweisungen im Container mit sqlcmdRun Transact-SQL statements inside the container with sqlcmd.
  • Erstellen und Extrahieren von Sicherungsdateien aus einem ContainerCreate and extract backup files from a container.
  • Permanentes Speichern von SQL Server-Daten mithilfe von Datenvolumecontainern in DockerUse data volume containers in Docker to persist SQL Server data.

Erfahren Sie nun mehr zu weiteren Szenarios für Docker-Konfigurationen und -Problembehandlung:Next, review other Docker configuration and troubleshooting scenarios: