Восстановление базы данных SQL Server в контейнере Linux

Применимо к:SQL Server — Linux

В этом руководстве показано, как переместить и восстановить файл резервного копирования SQL Server в образ контейнера SQL Server 2017 (14.x), запущенный в Docker.

В этом руководстве показано, как переместить и восстановить файл резервного копирования SQL Server в образ контейнера SQL Server 2019 (15.x) Linux, запущенный в Docker.

В этом руководстве показано, как переместить и восстановить файл резервного копирования SQL Server в образ контейнера SQL Server 2022 (16.x) Linux, работающий в Docker.

  • Извлеките и запустите образ контейнера Linux SQL Server.
  • Скопируйте файл базы данных Wide World Importers в контейнер.
  • Восстановите базу данных в контейнере.
  • Запустите инструкции Transact-SQL для просмотра и изменения базы данных.
  • Создайте резервную копию измененной базы данных.

Необходимые компоненты

Параметры развертывания

В этом разделе приведены варианты развертывания для вашей среды.

Sqlcmd в настоящее время не поддерживает MSSQL_PID параметр при создании контейнеров. Если вы используете инструкции sqlcmd в этом руководстве, создайте контейнер с выпуском SQL Server для разработчиков. Используйте инструкции по интерфейсу командной строки (CLI), чтобы создать контейнер с помощью выбранной лицензии. Дополнительные сведения см. в статье "Развертывание и подключение к контейнерам SQL Server Linux".

Извлечение и запуск образа контейнера

  1. Откройте терминал bash в Linux.

  2. Извлеките образ контейнера SQL Server 2017 (14.x) на Linux из Реестра контейнеров Майкрософт.

    sudo docker pull mcr.microsoft.com/mssql/server:2017-latest
    
  3. Чтобы запустить образ контейнера с помощью Docker, выполните следующую команду:

    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
    

    Эта команда создает контейнер SQL Server 2017 (14.x) с выпуском Developer (по умолчанию). Порт 1433 SQL Server предоставляется на узле в качестве порта 1401. Необязательный -v sql1data:/var/opt/mssql параметр создает контейнер тома данных с именем sql1data. Он используется для сохранения данных, созданных SQL Server.

    Внимание

    В этом примере используется контейнер томов данных в DOCKER. Дополнительные сведения см. в статье Настройка образов контейнеров SQL Server в Docker.

  4. Чтобы просмотреть контейнеры, используйте docker ps команду.

    sudo docker ps -a
    
  5. STATUS Если столбец отображает состояниеUp, SQL Server выполняется в контейнере и прослушивает порт, указанный в столбцеPORTS. Если отображается STATUSExitedстолбец контейнера SQL Server, см. статью "Устранение неполадок контейнеров Docker 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
  1. Откройте терминал bash в Linux.

  2. Извлеките образ контейнера SQL Server 2019 (15.x) на Linux из Реестра контейнеров Майкрософт.

    sudo docker pull mcr.microsoft.com/mssql/server:2019-latest
    
  3. Чтобы запустить образ контейнера с помощью Docker, выполните следующую команду:

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

    Эта команда создает контейнер SQL Server 2019 (15.x) с выпуском Developer (по умолчанию). Порт 1433 SQL Server предоставляется на узле в качестве порта 1401. Необязательный -v sql1data:/var/opt/mssql параметр создает контейнер тома данных с именем sql1data. Он используется для сохранения данных, созданных SQL Server.

    Внимание

    В этом примере используется контейнер томов данных в DOCKER. Дополнительные сведения см. в статье Настройка образов контейнеров SQL Server в Docker.

  4. Чтобы просмотреть контейнеры, используйте docker ps команду.

    sudo docker ps -a
    
  5. STATUS Если столбец отображает состояниеUp, SQL Server выполняется в контейнере и прослушивает порт, указанный в столбцеPORTS. Если отображается STATUSExitedстолбец контейнера SQL Server, см. статью "Устранение неполадок контейнеров Docker 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
    
  1. Откройте терминал bash в Linux.

  2. Извлеките образ контейнера SQL Server 2022 (16.x) на Linux из Реестра контейнеров Майкрософт.

    sudo docker pull mcr.microsoft.com/mssql/server:2022-latest
    
  3. Чтобы запустить образ контейнера с помощью Docker, выполните следующую команду:

    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:2022-latest
    

    Эта команда создает контейнер SQL Server 2022 (16.x) с выпуском Developer (по умолчанию). Порт 1433 SQL Server предоставляется на узле в качестве порта 1401. Необязательный -v sql1data:/var/opt/mssql параметр создает контейнер тома данных с именем sql1data. Он используется для сохранения данных, созданных SQL Server.

    Внимание

    В этом примере используется контейнер томов данных в DOCKER. Дополнительные сведения см. в статье Настройка образов контейнеров SQL Server в Docker.

  4. Чтобы просмотреть контейнеры, используйте docker ps команду.

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

Смена пароля администратора

Учетная запись системного администратора (SA) обладает правами администратора на экземпляре SQL Server, создаваемом во время установки. После создания контейнера SQL Server указанную вами переменную среды MSSQL_SA_PASSWORD можно обнаружить, запустив echo $MSSQL_SA_PASSWORD в контейнере. В целях безопасности смените пароль системного администратора.

  1. Назначьте для пользователя SA надежный пароль.

  2. Используйте docker exec для запуска программы sqlcmd, чтобы изменить пароль с помощью инструкции Transact-SQL. Замените <YourStrong!Passw0rd> и <YourNewStrong!Passw0rd> собственными значениями пароля.

    Внимание

    Переменная среды SA_PASSWORD является нерекомендуемой. Вместо этого используйте MSSQL_SA_PASSWORD.

    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>'"
    

Копирование файла резервной копии в контейнер

В этом руководстве используются примеры баз данных Wide World Importers для Microsoft SQL. Выполните следующие действия, чтобы скачать файл резервной копии базы данных Wide World Importers и скопировать его в контейнер SQL Server.

  1. Во-первых, создайте docker exec папку резервного копирования. Следующая команда создает /var/opt/mssql/backup каталог в контейнере SQL Server.

    sudo docker exec -it sql1 mkdir /var/opt/mssql/backup
    
  2. Затем скачайте файл WideWorldImporters-Full.bak на хост-компьютер. В следующих командах перейдите в каталог home/user и скачивает файл резервной копии как 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'
    
  3. Используется docker cp для копирования файла резервной копии в контейнер в каталоге /var/opt/mssql/backup .

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

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

Теперь файл резервной копии находится в контейнере. Перед восстановлением резервной копии важно узнать логические имена и типы файлов в резервной копии. Следующие команды Transact-SQL проверяют резервную копию и выполняют восстановление с помощью sqlcmd в контейнере.

Совет

В этом руководстве средство sqlcmd используется в контейнере, так как оно предустановлено в этом контейнере. Однако можно также запускать инструкции Transact-SQL с другими клиентскими средствами за пределами контейнера, такими как расширение SQL Server для Visual Studio Code или использование SQL Server Management Studio в Windows для управления SQL Server на Linux. Для подключения используйте порт узла, сопоставленный с портом 1433 в контейнере. В этом примере на localhost,1401 хост-компьютере и Host_IP_Address,1401 удаленно.

  1. Запустите sqlcmd внутри контейнера, чтобы вывести список логических имен файлов и путей внутри резервной копии. Это делается с помощью инструкции RESTORE FILELISTONLY Transact-SQL.

    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
    

    Должен отобразиться результат, аналогичный приведенному ниже:

    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 Вызовите команду для восстановления базы данных внутри контейнера. Укажите новые пути для каждого из файлов в предыдущем шаге.

    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"'
    

    Должен отобразиться результат, аналогичный приведенному ниже:

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

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

Выполните следующий запрос, чтобы отобразить список имен баз данных в контейнере:

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

Вы увидите WideWorldImporters в списке баз данных.

Внесение изменения

Чтобы внести изменения в базу данных, выполните следующие действия.

  1. Запустите запрос, чтобы просмотреть первые 10 элементов в Warehouse.StockItems таблице.

    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'
    

    Вы увидите список идентификаторов и имен элементов:

    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 инструкции:

    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'
    

    Должен отобразиться результат, аналогичный приведенному ниже:

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

Создание резервной копии

После восстановления базы данных в контейнере вам может потребоваться регулярно создавать резервные копии базы данных в работающем контейнере. Соответствующие действия выполняются по той же схеме, что и в предыдущих шагах, только в обратном порядке.

  1. BACKUP DATABASE Используйте команду Transact-SQL для создания резервной копии базы данных в контейнере. В этом руководстве создается новый файл резервной копии в wwi_2.bakранее созданном /var/opt/mssql/backup каталоге.

    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"
    

    Вы должны увидеть результат, аналогичный приведенному ниже:

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

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

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

Кроме создания резервных копий базы данных для защиты данных, можно также использовать контейнеры томов данных. В начале этого руководства был создан sql1 контейнер с параметром -v sql1data:/var/opt/mssql . Контейнер sql1data тома данных сохраняет /var/opt/mssql данные даже после удаления контейнера. Следующие шаги полностью удаляют sql1 контейнер, а затем создают новый контейнер sql2с сохраненными данными.

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

    sudo docker stop sql1
    
  2. Удалите контейнер. Это не удаляет ранее созданный sql1data контейнер тома данных и сохраненные в нем данные.

    sudo docker rm sql1
    
  3. Создайте контейнер sql2и повторно используйте контейнер тома sql1data данных.

    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
    
  4. Теперь база данных Wide World Importers находится в новом контейнере. Выполните запрос, чтобы проверить внесенное ранее изменение.

    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'
    

    Примечание.

    Пароль SA не является паролем, указанным для sql2 контейнера MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>. Все данные SQL Server были восстановлены из sql1, включая измененный пароль, приведенный ранее в руководстве. По сути, некоторые параметры, подобные этому, игнорируются из-за восстановления данных в /var/opt/mssql. По этой причине пароль имеет значение <YourNewStrong!Passw0rd>, как показано здесь.

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

    sudo docker stop sql1
    
  2. Удалите контейнер. Это не удаляет ранее созданный sql1data контейнер тома данных и сохраненные в нем данные.

    sudo docker rm sql1
    
  3. Создайте контейнер sql2и повторно используйте контейнер тома sql1data данных.

    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-latest
    
  4. Теперь база данных Wide World Importers находится в новом контейнере. Выполните запрос, чтобы проверить внесенное ранее изменение.

    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'
    

    Примечание.

    Пароль SA не является паролем, указанным для sql2 контейнера MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>. Все данные SQL Server были восстановлены из sql1, включая измененный пароль, приведенный ранее в руководстве. По сути, некоторые параметры, подобные этому, игнорируются из-за восстановления данных в /var/opt/mssql. По этой причине пароль имеет значение <YourNewStrong!Passw0rd>, как показано здесь.

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

    sudo docker stop sql1
    
  2. Удалите контейнер. Это не удаляет ранее созданный sql1data контейнер тома данных и сохраненные в нем данные.

    sudo docker rm sql1
    
  3. Создайте контейнер sql2и повторно используйте контейнер тома sql1data данных.

    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:2022-latest
    
  4. Теперь база данных Wide World Importers находится в новом контейнере. Выполните запрос, чтобы проверить внесенное ранее изменение.

    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'
    

    Примечание.

    Пароль SA не является паролем, указанным для sql2 контейнера MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>. Все данные SQL Server были восстановлены из sql1, включая измененный пароль, приведенный ранее в руководстве. По сути, некоторые параметры, подобные этому, игнорируются из-за восстановления данных в /var/opt/mssql. По этой причине пароль имеет значение <YourNewStrong!Passw0rd>, как показано здесь.

Следующий шаг

В этом руководстве вы узнали, как создать резервную копию базы данных в Windows и переместить ее на сервер Linux под управлением SQL Server 2017 (14.x) в контейнере. Вы научились выполнять следующие задачи:

В этом руководстве вы узнали, как создать резервную копию базы данных в Windows и переместить ее на сервер Linux под управлением SQL Server 2019 (15.x) в контейнере. Вы научились выполнять следующие задачи:

В этом руководстве вы узнали, как создать резервную копию базы данных в Windows и переместить ее на сервер Linux под управлением SQL Server 2022 (16.x) в контейнере. Вы научились выполнять следующие задачи:

  • Создание образов контейнеров Linux SQL Server.
  • Копирование резервных копий базы данных SQL Server в контейнер.
  • Запустите инструкции Transact-SQL с помощью sqlcmd.
  • Создание файлов резервных копий и извлечение их из контейнера.
  • Используйте контейнеры томов данных для сохранения рабочих данных SQL Server.

Затем ознакомьтесь с другими сценариями конфигурации контейнеров и устранения неполадок:

Примите участие в разработке документации по SQL

Знаете ли вы, что содержимое SQL можно изменить самостоятельно? Это не только улучшит нашу документацию, но и даст вам статус участника в создании этой страницы.

Дополнительные сведения см. в разделе Участие в работе над документацией по SQL Server.