Linux Docker 컨테이너에서 SQL Server 데이터베이스 복원Restore a SQL Server database in a Linux Docker container

적용 대상:Applies to: 예SQL ServerSQL Server(지원되는 모든 버전)yesSQL ServerSQL Server (all supported versions) - Linux적용 대상:Applies to: 예SQL ServerSQL Server(지원되는 모든 버전)yesSQL ServerSQL Server (all supported versions) - Linux

이 자습서에서는 SQL Server 백업 파일을 Docker에서 실행되는 SQL Server 2017 Linux 컨테이너 이미지로 이동하고 복원하는 방법을 보여 줍니다.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 백업 파일을 Docker에서 실행되는 SQL Server 2019 Linux 컨테이너 이미지로 이동하고 복원하는 방법을 보여 줍니다.This tutorial demonstrates how to move and restore a SQL Server backup file into a SQL Server 2019 Linux container image running on Docker.

  • 최신 SQL Server Linux 컨테이너 이미지를 가져오고 실행합니다.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. Linux/Mac에서 Bash 터미널을 열거나 Windows에서 관리자 권한 PowerShell 세션을 엽니다.Open a bash terminal on Linux/Mac or an elevated PowerShell session on Windows.

  2. Docker Hub를 사용하여 SQL Server 2017 Linux 컨테이너 이미지를 끌어오기.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
    

    이 자습서 전체에서 Bash 셸(Linux/Mac) 및 PowerShell(Windows)에 대한 docker 명령 예제가 제공됩니다.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
    

    이 명령은 Developer Edition(기본값)을 사용하여 SQL Server 2017 컨테이너를 만듭니다.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.

    중요

    이 예제에서는 Docker 내의 데이터 볼륨 컨테이너를 사용합니다.This example uses a data volume container within Docker. 대신 호스트 디렉터리를 매핑하도록 선택한 경우, Mac 및 Windows용 Docker에서는 이 방법에 제한 사항이 있습니다.If you instead chose to map a host directory, note that there are limitations for this approach on Docker for Mac and Windows. 자세한 내용은 Docker에서 SQL Server 컨테이너 이미지 구성을 참조하세요.For more information, see Configure SQL Server container images on Docker.

  4. Docker 컨테이너를 보려면 docker ps 명령을 사용합니다.To view your Docker containers, use the docker ps command.

    sudo docker ps -a
    
    docker ps -a
    
  5. 상태 열이 Up의 상태를 표시하는 경우, SQL Server는 컨테이너에서 실행되며 포트 열의 지정된 포트에서 수신 대기합니다.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. 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. Linux/Mac에서 Bash 터미널을 열거나 Windows에서 관리자 권한 PowerShell 세션을 엽니다.Open a bash terminal on Linux/Mac or an elevated PowerShell session on Windows.

  2. Docker Hub에서 SQL Server 2019 Linux 컨테이너 이미지를 끌어옵니다.Pull the SQL Server 2019 Linux container image from Docker Hub.

    sudo docker pull mcr.microsoft.com/mssql/server:2019-CU3-ubuntu-18.04
    
    docker pull mcr.microsoft.com/mssql/server:2019-CU3-ubuntu-18.04
    

    이 자습서 전체에서 Bash 셸(Linux/Mac) 및 PowerShell(Windows)에 대한 docker 명령 예제가 제공됩니다.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-CU3-ubuntu-18.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-CU3-ubuntu-18.04
    

    이 명령은 Developer Edition(기본값)을 사용하여 SQL Server 2019 컨테이너를 만듭니다.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. 상태 열이 Up의 상태를 표시하는 경우, SQL Server는 컨테이너에서 실행되며 포트 열의 지정된 포트에서 수신 대기합니다.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. 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
    

SA 암호 변경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 컨테이너를 만든 후 컨테이너에서 echo $MSSQL_SA_PASSWORD를 실행하여 지정한 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. 보안을 위해 다음과 같이 SA 암호를 변경합니다.For security purposes, change your SA password:

  1. SA 사용자에게 사용할 강력한 암호를 선택합니다.Choose a strong password to use for the SA user.

  2. Transact-SQL 문을 통해 암호를 변경하려면 docker exec을 사용하여 sqlcmd 유틸리티를 실행합니다.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. 다음 명령은 SQL Server 컨테이너 내부에 /var/opt/mssql/backup 디렉터리를 만듭니다.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. 그러나 컨테이너 외부에서 Visual Studio Code 또는 SQL Server Management Studio와 같은 다른 클라이언트 도구를 사용하여 Transact-SQL 문을 실행할 수도 있습니다.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. 쿼리를 실행하여 Warehouse.StockItems 테이블의 상위 10개 항목을 확인합니다.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. 이 자습서에서는 이전에 만든 /var/opt/mssql/backup 디렉터리에 새 백업 파일인 wwi_2.bak를 만듭니다.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 wwi*
    

지속형 데이터 사용Use the persisted data

데이터를 보호하기 위해 데이터베이스 백업을 수행할 뿐 아니라 데이터 볼륨 컨테이너를 사용할 수도 있습니다.In addition to taking database backups for protecting your data, you can also use data volume containers. 이 자습서의 시작 부분에서는 -v sql1data:/var/opt/mssql 매개 변수를 사용하여 sql1 컨테이너를 만들었습니다.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"
    

    참고

    SA 암호는 sql2 컨테이너인 MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>에 대해 지정한 암호가 아닙니다.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-CU3-ubuntu-18.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-CU3-ubuntu-18.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"
    

    참고

    SA 암호는 sql2 컨테이너인 MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>에 대해 지정한 암호가 아닙니다.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에서 데이터베이스를 백업하고 SQL Server 2017을 실행하는 Linux 서버로 이동하는 방법을 알아보았습니다.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에서 데이터베이스를 백업하고 SQL Server 2019를 실행하는 Linux 서버로 이동하는 방법을 알아보았습니다.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:

  • SQL Server Linux 컨테이너 이미지를 만듭니다.Create SQL Server Linux container images.
  • SQL Server 데이터베이스 백업을 컨테이너에 복사합니다.Copy SQL Server database backups into a container.
  • sqlcmd를 사용하여 컨테이너 내에서 Transact-SQL 문을 실행합니다.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: