Рубрики
Uncategorized

Восстановление резервного копирования SQL Server в контейнере Docker

В нашей компании мы хотели пройти тесты как можно более E2E, как в наших локальных компьютерах DEV работает … Теги с докером, дежоптом.

В нашей компании мы хотели проводить тесты как можно максимально, как в наших локальных компьютерах DEV, работающие на Windows, так и в нашем трубопроводе: действие GitHub с последним Ubuntu ( https://github.com/virt/virtual-environments/BLOB/MAIN/Images/linux/ubuntu2004-radme.md ), и это включает в себя достижение на реальный SQL Server DB, поэтому мы могли бы проверить наши запросы, а таблицы работают нормально.

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

Это все шаги, которые мы следили:

Резервное копирование БД обычно огромен, и нам нужно хранить его в Github и переместить его вокруг, поэтому мы хотим, чтобы он сжал. Команда TAR соответствует требованию и работает в Windows 10 из коробки ( https://superuser.com/a/1515028):

tar -cvzf mvc_db_2021-08-25.tar.gz mvc_db.bak

Чтобы иметь возможность делиться доступом к нему, мы создали папку с именем «SQL_SERVER_BACKUP».

Что затем совместно используются по объему в Docker-Compose, упрощенном примере:

version: '3.9'
services:
  tests:
    image: my-special-web-project-with-db-backup
    depends_on:
      - db
    volumes:
      - ./sql_server_backup:/sql_server_backup

  db:
    image: mcr.microsoft.com/mssql/server:2019-latest
    volumes:
      - ./sql_server_backup:/sql_server_backup
volumes:
  sql_server_backup:

В нашем корневой папке Reppo мы создали Set-local-environment.sh:

#!/bin/bash -e

docker-compose -f docker-compose-infra.yml up -d

cd sql_server_backup
tar -xzvf *.tar.gz 

# docker attach allow us to the logs inside the container, VERY useful for debugging
#docker attach db_1

echo "Docker compose finished running"

Порядок порядка команд вполне важен, мы хотим, чтобы Docker составлял сначала поступить, как запуск экземпляра SQL Server может занять некоторое время, тем временем мы распадаемся резервным копированием

Этот шаг был самым сложным, так как существует проблема с синхронизацией, SQL Server может предпринять некоторое время, чтобы быть готовым к использованию, а рекомендации использовать сценарии, такие как wait-for-it.sh, не работали на нас. То, что работало использовало механизм проверки здоровья, который регулярно проходит регулярно, если БД не готов начать восстановление, он снова старается немного позже. Вот соответствующий раздел в Docker-Compose:

version: '3.9'

services:
  db:
    image: mcr.microsoft.com/mssql/server:2019-latest
    environment:
      MSSQL_SA_PASSWORD: Password123
      ACCEPT_EULA: Y
      MSSQL_PID: Express
    healthcheck: # copied / adapted from https://github.com/Microsoft/mssql-docker/issues/133, leveraging https://docs.docker.com/engine/reference/builder/#healthcheck
      test: sh /sql_server_backup/RestoreDb.sh
      interval: 10s
      timeout: 10s
      retries: 10
      start_period: 45s
    ports:
      - "1433:1433"
    volumes:
      - ./sql_server_backup:/sql_server_backup

RESTOREDB.SH:

#!/bin/bash -e

/opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P "Password123" -i /sql_server_backup/RestoreDb.sql

RESTOREDB.SQL (с небольшим количеством отладки логики):

-- this file will be called from the docker compose health check

if exists ( select 1  from sys.databases  where [name] = 'MvcDocker' )
    begin
    EXEC xp_logevent 60000, 'RestoreDb.sql: MvcDocker database already exists, no need to run again', informational;
    return -- already run
    end

EXEC xp_logevent 60000, 'RestoreDb.sql: Started script', informational;

-- begin write to log the list of files in our folder of interest
declare @ss table ([filename] varchar(1000), depth int, [file] int)

insert into @ss
EXEC xp_dirtree '/sql_server_backup/', 2, 1 -- list all files in our folder of interest (https://stackoverflow.com/a/13594903)

declare @msg        varchar(2000) = 'RestoreDb.sql: Files found in /sql_server_backup/: '

select @msg = @msg + [filename] + ',' from @ss

EXEC xp_logevent 60000, @msg, informational;
-- end write to log the list of files in our folder of interest

GO
-- restore the backup, to names and folder that make sense here
RESTORE DATABASE MvcDocker FROM DISK='/sql_server_backup/mvc_db.bak'
WITH MOVE 'OriginalFileName' TO '/var/opt/mssql/data/MvcDocker.mdf',
     MOVE 'OriginalFileName_log' TO '/var/opt/mssql/data/MvcDocker_log.ldf'
GO
use MvcDocker
GO
-- check if the restored DB works as expected
select top 5 DisplayName from [SomeTableFromYourDb]

В нашем случае мы использовали .NET И только наши тесты интеграции нуждались в БД, поэтому мы проводим его последний, упрощенный пример:

jobs:
  build_and_test_and_publish:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v2

      - name: Create folder BuildReports
        run:  mkdir BuildReports

      - name: DotNet restore
        run:  dotnet restore --verbosity m > BuildReports/Restore.txt

      - name: DotNet build
        run: dotnet build --no-restore  --verbosity m --configuration Release /nowarn:CS1591 /p:Version=$NUGET_PACKAGE_VERSION > BuildReports/Build.txt

      - name: DotNet unit tests
        run: dotnet test --no-build --configuration Release --filter=Type=Unit > BuildReports/UnitTests.txt

      - name: Docker setup
        run: sh ./set-local-environment.sh  > BuildReports/DockerSetup.txt

      - name: DotNet integration tests
        run: dotnet test --no-build --configuration Release --filter=Type=Integration > BuildReports/IntegrationTests.txt

Попробуйте это окно на своем докере, это то, что вы должны увидеть, если каждый работает как ожидается

Вы заметите, что база данных сообщений уже существует, когда будет отображаться, это потому, что Concept Check Compose Compose продолжает работать без остановки. Сначала наша команда проверки здоровья не будет работать, потому что, пока сам контейнер «готов», сервер SQL внутри него все еще загружается, поэтому команда не работает. Когда SQL Server готов, следующая итерация команды проверки здоровья будет работать, и БД будет восстановлен. В следующей итерации проверки здоровья, БД будет уже восстановлен, поэтому мы начнем видеть базу данных сообщения уже существующей ».

Мы ищем талантливых программных инженеров, пожалуйста, посмотрите на https://clientapps.jobadder.com/30580/bizward.

Оригинал: «https://dev.to/alansarligithub/restoring-an-sql-server-backup-in-a-docker-container-1knb»