Восстановление базы данных SQL Server в контейнере Docker на базе LinuxRestore a SQL Server database in a Linux Docker container

ОБЛАСТЬ ПРИМЕНЕНИЯ: даSQL Server (только в Linux) нетБаза данных SQL Azure нетAzure Synapse Analytics (хранилище данных SQL) нетParallel Data Warehouse APPLIES TO: yesSQL Server (Linux only) noAzure SQL Database noAzure Synapse Analytics (SQL DW) noParallel Data Warehouse

В этом руководстве показано, как переместить файл резервной копии SQL Server в образ контейнера Linux SQL Server 2017, запущенный в Docker, и восстановить его.This tutorial demonstrates how to move and restore a SQL Server backup file into a SQL Server 2017 Linux container image running on Docker.

В этом руководстве показано, как переместить файл резервной копии SQL Server в образ контейнера Linux SQL Server 2019, запущенный в Docker, и восстановить его.This tutorial demonstrates how to move and restore a SQL Server backup file into a SQL Server 2019 Linux container image running on Docker.

  • Извлеките и запустите образ контейнера Linux SQL Server.Pull and run the latest SQL Server Linux container image.
  • Скопируйте файл базы данных Wide World Importers в контейнер.Copy the Wide World Importers database file into the container.
  • Восстановите базу данных в контейнере.Restore the database in the container.
  • Запустите инструкции Transact-SQL для просмотра и изменения базы данных.Run Transact-SQL statements to view and modify the database.
  • Создайте резервную копию измененной базы данных.Backup the modified database.

предварительные требованияPrerequisites

Извлечение и запуск образа контейнераPull and run the container image

  1. Откройте терминал bash в Linux или Mac либо сеанс PowerShell с повышенными привилегиями в Windows.Open a bash terminal on Linux/Mac or an elevated PowerShell session on Windows.

  2. Извлеките образ контейнера Linux с SQL Server 2017 из центра Docker.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
    

    Совет

    В рамках этого руководства примеры команд Docker приводятся как для оболочки bash (Linux/Mac), так и для PowerShell (Windows).Throughout this tutorial, docker command examples are given for both the bash shell (Linux/Mac) and PowerShell (Windows).

  3. Чтобы запустить образ контейнера с помощью Docker, выполните следующую команду: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
    

    Эта команда создает контейнер SQL Server 2017 с выпуском Developer (по умолчанию).This command creates a SQL Server 2017 container with the Developer edition (default). Порт SQL Server 1433 доступен на узле как порт 1401.SQL Server port 1433 is exposed on the host as port 1401. Необязательный параметр -v sql1data:/var/opt/mssql создает контейнер томов данных с именем sql1ddata.The optional -v sql1data:/var/opt/mssql parameter creates a data volume container named sql1ddata. Он используется для сохранения данных, созданных SQL Server.This is used to persist the data created by SQL Server.

    Примечание

    Процесс запуска контейнера с рабочими выпусками SQL Server немного отличается.The process for running production SQL Server editions in containers is slightly different. Дополнительные сведения см. в разделе Запуск образов контейнеров с производственными выпусками.For more information, see Run production container images. Если вы используете те же имена и порты контейнеров, действия в оставшейся части этого руководства будут актуальны и для рабочих контейнеров.If you use the same container names and ports, the rest of this walkthrough still works with production containers.

  4. Для просмотра ваших контейнеров Docker используйте команду docker ps.To view your Docker containers, use the docker ps command.

    sudo docker ps -a
    
    docker ps -a
    
  5. Если в столбце STATUS (состояние) отображается состояние Up (запущен), то SQL Server выполняется в контейнере и прослушивает порт, указанный в столбце PORTS (порты).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. Если в столбце STATUS контейнера с SQL Server отображается Exited (завершен), см.руководство Устранение неполадок конфигурации.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. Откройте терминал bash в Linux или Mac либо сеанс PowerShell с повышенными привилегиями в Windows.Open a bash terminal on Linux/Mac or an elevated PowerShell session on Windows.

  2. Извлеките образ контейнера Linux с SQL Server 2019 из центра Docker.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
    

    Совет

    В рамках этого руководства примеры команд Docker приводятся как для оболочки bash (Linux/Mac), так и для PowerShell (Windows).Throughout this tutorial, docker command examples are given for both the bash shell (Linux/Mac) and PowerShell (Windows).

  3. Чтобы запустить образ контейнера с помощью Docker, выполните следующую команду: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
    

    Эта команда создает контейнер SQL Server 2019 с выпуском Developer (по умолчанию).This command creates a SQL Server 2019 container with the Developer edition (default). Порт SQL Server 1433 доступен на узле как порт 1401.SQL Server port 1433 is exposed on the host as port 1401. Необязательный параметр -v sql1data:/var/opt/mssql создает контейнер томов данных с именем sql1ddata.The optional -v sql1data:/var/opt/mssql parameter creates a data volume container named sql1ddata. Он используется для сохранения данных, созданных SQL Server.This is used to persist the data created by SQL Server.

  4. Для просмотра ваших контейнеров Docker используйте команду docker ps.To view your Docker containers, use the docker ps command.

    sudo docker ps -a
    
    docker ps -a
    
  5. Если в столбце STATUS (состояние) отображается состояние Up (запущен), то SQL Server выполняется в контейнере и прослушивает порт, указанный в столбце PORTS (порты).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. Если в столбце STATUS контейнера с SQL Server отображается Exited (завершен), см.руководство Устранение неполадок конфигурации.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
    

Смена пароля администратораChange the SA password

Учетная запись системного администратора (SA) обладает правами администратора на экземпляре SQL Server, создаваемом во время установки.The SA account is a system administrator on the SQL Server instance that's created during setup. После создания контейнера SQL Server указанную вами переменную среды MSSQL_SA_PASSWORD можно обнаружить, запустив echo $MSSQL_SA_PASSWORD в контейнере.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. В целях безопасности смените пароль системного администратора.For security purposes, change your SA password:

  1. Назначьте для пользователя SA надежный пароль.Choose a strong password to use for the SA user.

  2. Используйте docker exec для запуска программы sqlcmd, чтобы изменить пароль с помощью инструкции Transact-SQL.Use docker exec to run the sqlcmd utility to change the password through a Transact-SQL statement. Замените <YourStrong!Passw0rd> и <YourNewStrong!Passw0rd> собственными значениями пароля.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>'"
    

Копирование файла резервной копии в контейнерCopy a backup file into the container

В этом руководстве используется образец базы данных Wide World Importers.This tutorial uses the Wide World Importers sample database. Выполните следующие действия, чтобы скачать файл резервной копии базы данных Wide World Importers и скопировать его в контейнер SQL Server.Use the following steps to download and copy the Wide World Importers database backup file into your SQL Server container.

  1. Сначала используйте команду docker exec для создания папки резервного копирования.First, use docker exec to create a backup folder. Следующая команда создает каталог /var/opt/mssql/backup внутри контейнера SQL Server.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. Затем скачайте файл WideWorldImporters-Full.bak на хост-компьютер.Next, download the WideWorldImporters-Full.bak file to your host machine. Приведенные ниже команды переходят в каталог home/user и скачивают файл резервной копии в виде wwi.bak.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. Используйте docker cp, чтобы скопировать файл резервной копии в контейнер в каталог /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
    

Восстановление базы данныхRestore the database

Теперь файл резервной копии находится в контейнере.The backup file is now located inside the container. Перед восстановлением резервной копии важно узнать логические имена и типы файлов в резервной копии.Before restoring the backup, it is important to know the logical file names and file types inside the backup. Следующие команды Transact-SQL проверяют резервную копию и выполняют восстановление с помощью sqlcmd в контейнере.The following Transact-SQL commands inspect the backup and perform the restore using sqlcmd in the container.

Совет

В этом руководстве средство sqlcmd используется в контейнере, так как оно предустановлено в этом контейнере.This tutorial uses sqlcmd inside the container, because the container comes with this tool pre-installed. Однако вы также можете запустить инструкции Transact-SQL с помощью других клиентских сред извне контейнера, таких как Visual Studio Code или SQL Server Management Studio.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. Для подключения используйте порт узла, сопоставленный с портом 1433 в контейнере.To connect, use the host port that was mapped to port 1433 in the container. В нашем примере это localhost,1401 на хост-компьютере и удаленный Host_IP_Address,1401.In this example, that is localhost,1401 on the host machine and Host_IP_Address,1401 remotely.

  1. Запустите sqlcmd внутри контейнера, чтобы вывести список логических имен файлов и путей внутри резервной копии.Run sqlcmd inside the container to list out logical file names and paths inside the backup. Для этого используется инструкция RESTORE FILELISTONLY Transact-SQL.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'"
    

    Выходные данные должны иметь следующий вид: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. Вызовите команду RESTORE DATABASE, чтобы восстановить базу данных внутри контейнера.Call the RESTORE DATABASE command to restore the database inside the container. Укажите новые пути для каждого из файлов в предыдущем шаге.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'"
    

    Выходные данные должны иметь следующий вид: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).
    

Проверка восстановленной базы данныхVerify the restored database

Выполните следующий запрос, чтобы отобразить список имен баз данных в контейнере: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"

Вы должны увидеть WideWorldImporters в списке баз данных.You should see WideWorldImporters in the list of databases.

Внесение измененияMake a change

Следующие шаги вносят изменение в базу данных.The following steps make a change in the database.

  1. Выполните запрос, чтобы просмотреть 10 первых элементов в таблице Warehouse.StockItems.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"
    

    Вы увидите список идентификаторов и имен элементов: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. Обновите описание первого элемента с помощью следующей инструкции UPDATE: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"
    

    Выходные данные должны иметь следующий вид:You should see output similar to the following text:

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

Создание резервной копииCreate a new backup

После восстановления базы данных в контейнере вам может потребоваться регулярно создавать резервные копии базы данных в работающем контейнере.After you've restored your database into a container, you might also want to regularly create database backups inside the running container. Соответствующие действия выполняются по той же схеме, что и в предыдущих шагах, только в обратном порядке.The steps follow a similar pattern to the previous steps but in reverse.

  1. Используйте команду BACKUP DATABASE Transact-SQL, чтобы создать резервную копию базы данных в контейнере.Use the BACKUP DATABASE Transact-SQL command to create a database backup in the container. В этом руководстве создается файл резервной копии wwi_2.bak в ранее созданном каталоге /var/opt/mssql/backup.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"
    

    Выходные данные должны иметь следующий вид: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. Затем скопируйте файл резервной копии из контейнера на хост-компьютер.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*
    

Использование хранимых данныхUse the persisted data

Кроме создания резервных копий базы данных для защиты данных, можно также использовать контейнеры томов данных.In addition to taking database backups for protecting your data, you can also use data volume containers. В начале этого учебника был создан контейнер sql1 с параметром -v sql1data:/var/opt/mssql.The beginning of this tutorial created the sql1 container with the -v sql1data:/var/opt/mssql parameter. Контейнер томов данных sql1data хранит данные /var/opt/mssql даже после удаления контейнера.The sql1data data volume container persists the /var/opt/mssql data even after the container is removed. Следующие шаги полностью удаляют контейнер sql1, а затем создают новый контейнер — sql2 — с хранимыми данными.The following steps completely remove the sql1 container and then create a new container, sql2, with the persisted data.

  1. Остановите контейнер sql1.Stop the sql1 container.

    sudo docker stop sql1
    
    docker stop sql1
    
  2. Удалите контейнер.Remove the container. Это не приводит к удалению ранее созданного контейнера томов данных sql1data и хранимых в нем данных.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. Создайте новый контейнер sql2 и повторно используйте контейнера томов данных sql1data.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. Теперь база данных Wide World Importers находится в новом контейнере.The Wide World Importers database is now in the new container. Выполните запрос, чтобы проверить внесенное ранее изменение.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"
    

    Примечание

    Пароль системного администратора не является паролем MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>, указанным для контейнера sql2.The SA password is not the password you specified for the sql2 container, MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>. Все данные SQL Server были восстановлены из sql1, включая измененный пароль, описанный ранее в этом руководстве.All of the SQL Server data was restored from sql1, including the changed password from earlier in the tutorial. По сути, некоторые параметры, подобные этому, игнорируются из-за восстановления данных в /var/opt/mssql.In effect, some options like this are ignored due to restoring the data in /var/opt/mssql. По этой причине пароль имеет значение <YourNewStrong!Passw0rd>, как показано здесь.For this reason, the password is <YourNewStrong!Passw0rd> as shown here.

  1. Остановите контейнер sql1.Stop the sql1 container.

    sudo docker stop sql1
    
    docker stop sql1
    
  2. Удалите контейнер.Remove the container. Это не приводит к удалению ранее созданного контейнера томов данных sql1data и хранимых в нем данных.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. Создайте новый контейнер sql2 и повторно используйте контейнера томов данных sql1data.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. Теперь база данных Wide World Importers находится в новом контейнере.The Wide World Importers database is now in the new container. Выполните запрос, чтобы проверить внесенное ранее изменение.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"
    

    Примечание

    Пароль системного администратора не является паролем MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>, указанным для контейнера sql2.The SA password is not the password you specified for the sql2 container, MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>. Все данные SQL Server были восстановлены из sql1, включая измененный пароль, описанный ранее в этом руководстве.All of the SQL Server data was restored from sql1, including the changed password from earlier in the tutorial. По сути, некоторые параметры, подобные этому, игнорируются из-за восстановления данных в /var/opt/mssql.In effect, some options like this are ignored due to restoring the data in /var/opt/mssql. По этой причине пароль имеет значение <YourNewStrong!Passw0rd>, как показано здесь.For this reason, the password is <YourNewStrong!Passw0rd> as shown here.

Дальнейшие действияNext steps

В этом руководстве вы узнали, как создать резервную копию базы данных в Windows и переместить ее на сервер Linux под управлением SQL Server 2017.In this tutorial, you learned how to back up a database on Windows and move it to a Linux server running SQL Server 2017. Вы ознакомились с выполнением следующих задач:You learned how to:

В этом руководстве вы узнали, как создать резервную копию базы данных в Windows и переместить ее на сервер Linux под управлением SQL Server 2019.In this tutorial, you learned how to back up a database on Windows and move it to a Linux server running SQL Server 2019. Вы ознакомились с выполнением следующих задач:You learned how to:

  • Создание образов контейнеров Linux SQL Server.Create SQL Server Linux container images.
  • Копирование резервных копий базы данных SQL Server в контейнер.Copy SQL Server database backups into a container.
  • Выполнение инструкций Transact-SQL в контейнере с помощью sqlcmd.Run Transact-SQL statements inside the container with sqlcmd.
  • Создание файлов резервных копий и извлечение их из контейнера.Create and extract backup files from a container.
  • Использование контейнеров томов данных в Docker для сохранения данных SQL Server.Use data volume containers in Docker to persist SQL Server data.

Затем ознакомьтесь с другими сценариями настройки и устранения неполадок Docker:Next, review other Docker configuration and troubleshooting scenarios: