Restaurar um banco de dados SQL Server em um contêiner do Linux

Aplica-se a:SQL Server – Linux

Este tutorial demonstra como mover e restaurar um arquivo de backup do SQL Server para uma imagem de contêiner do SQL Server 2017 (14.x) em Linux em execução no Docker.

Este tutorial demonstra como mover e restaurar um arquivo de backup do SQL Server para uma imagem de contêiner do SQL Server 2019 (15.x) em Linux em execução no Docker.

Este tutorial demonstra como mover e restaurar um arquivo de backup do SQL Server para uma imagem de contêiner do SQL Server 2022 (16.x) em Linux em execução no Docker.

  • Efetuar pull e executar a imagem de contêiner mais recente do SQL Server em Linux.
  • Copie o arquivo de banco de dados da Wide World Importers para o contêiner.
  • Restaure o banco de dados no contêiner.
  • Execute instruções Transact-SQL para exibir e modificar o banco de dados.
  • Faça backup do banco de dados modificado.

Pré-requisitos

Opções de implantação

Esta seção fornece opções de implantação para seu ambiente.

No momento, o sqlcmd não oferece suporte ao parâmetro MSSQL_PID ao criar contêineres. Se usar as instruções sqlcmd neste tutorial, você cria um contêiner com a edição Developer do SQL Server. Use as instruções da interface de linha de comando (CLI) para criar um contêiner usando a licença de sua escolha. Para obter mais informações, consulte Implantar contêineres do SQL Server no Linux e conectar-se a eles.

Efetuar o pull e executar a imagem de contêiner

  1. Abra um terminal bash no Linux.

  2. Efetue pull da imagem de contêiner do SQL Server 2017 (14.x) Linux no Microsoft Container Registry.

    sudo docker pull mcr.microsoft.com/mssql/server:2017-latest
    
  3. Para executar a imagem de contêiner com o Docker, você pode usar o seguinte comando:

    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
    

    Esse comando cria um contêiner do SQL Server 2017 (14.x) com a Developer Edition (padrão). A porta do SQL Server 1433 é exposta no host como a porta 1401. O parâmetro -v sql1data:/var/opt/mssql opcional cria um contêiner de volume de dados chamado sql1data. Isso é usado para persistir os dados criados pelo SQL Server.

    Importante

    Este exemplo usa um contêiner de volume de dados no Docker. Para obter mais informações, confira Configurar imagens de contêiner do SQL Server no Docker.

  4. Para exibir seus contêineres, use o comando docker ps.

    sudo docker ps -a
    
  5. Se a coluna STATUS mostrar o status Up, o SQL Server estará em execução no contêiner e será escutado na porta especificada na coluna PORTS. Se a coluna STATUS do contêiner do SQL Server mostrar Exited, confira Solução de problemas de contêineres do SQL Server no Docker.

$ 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. Abra um terminal bash no Linux.

  2. Efetue pull da imagem de contêiner do SQL Server 2019 (15.x) Linux no Microsoft Container Registry.

    sudo docker pull mcr.microsoft.com/mssql/server:2019-latest
    
  3. Para executar a imagem de contêiner com o Docker, você pode usar o seguinte comando:

    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
    

    Esse comando cria um contêiner do SQL Server 2019 (15.x) com a Developer Edition (padrão). A porta do SQL Server 1433 é exposta no host como a porta 1401. O parâmetro -v sql1data:/var/opt/mssql opcional cria um contêiner de volume de dados chamado sql1data. Isso é usado para persistir os dados criados pelo SQL Server.

    Importante

    Este exemplo usa um contêiner de volume de dados no Docker. Para obter mais informações, confira Configurar imagens de contêiner do SQL Server no Docker.

  4. Para exibir seus contêineres, use o comando docker ps.

    sudo docker ps -a
    
  5. Se a coluna STATUS mostrar o status Up, o SQL Server estará em execução no contêiner e será escutado na porta especificada na coluna PORTS. Se a coluna STATUS do contêiner do SQL Server mostrar Exited, confira Solução de problemas de contêineres do SQL Server no Docker.

    $ 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. Abra um terminal bash no Linux.

  2. Efetue pull da imagem de contêiner do SQL Server 2022 (16.x) Linux no Registro de Contêiner da Microsoft.

    sudo docker pull mcr.microsoft.com/mssql/server:2022-latest
    
  3. Para executar a imagem de contêiner com o Docker, você pode usar o seguinte comando:

    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
    

    Esse comando cria um contêiner do SQL Server 2022 (16.x) com a Developer Edition (padrão). A porta do SQL Server 1433 é exposta no host como a porta 1401. O parâmetro -v sql1data:/var/opt/mssql opcional cria um contêiner de volume de dados chamado sql1data. Isso é usado para persistir os dados criados pelo SQL Server.

    Importante

    Este exemplo usa um contêiner de volume de dados no Docker. Para obter mais informações, confira Configurar imagens de contêiner do SQL Server no Docker.

  4. Para exibir seus contêineres, use o comando docker ps.

    sudo docker ps -a
    
  5. Se a coluna STATUS mostrar o status Up, o SQL Server estará em execução no contêiner e será escutado na porta especificada na coluna PORTS. Se a coluna STATUS do contêiner do SQL Server mostrar Exited, confira Solução de problemas de contêineres do SQL Server no Docker.

    $ 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
    

Alterar a senha SA

A conta SA é um administrador do sistema na instância do SQL Server que é criada durante a instalação. Depois de criar o contêiner do SQL Server, a variável de ambiente MSSQL_SA_PASSWORD especificada é detectável executando echo $MSSQL_SA_PASSWORD no contêiner. Para fins de segurança, altere sua senha SA:

  1. Escolha uma senha forte para usar no usuário de SA.

  2. Use docker exec para executar o utilitário sqlcmd para alterar a senha por meio de uma instrução Transact-SQL. Substituir <YourStrong!Passw0rd> e <YourNewStrong!Passw0rd> com seus próprios valores de senha:

    Importante

    A variável de ambiente SA_PASSWORD foi preterida. Use MSSQL_SA_PASSWORD em vez disso.

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

Copiar um arquivo de backup para o contêiner

Este tutorial usa os bancos de dados de exemplo da Wide World Importers para Microsoft SQL. Use as etapas a seguir para baixar e copiar o arquivo de backup do banco de dados da Wide World Importers para seu contêiner do SQL Server.

  1. Primeiro, use o docker exec para criar uma pasta de backup. O comando a seguir cria um diretório /var/opt/mssql/backup dentro do contêiner do SQL Server.

    sudo docker exec -it sql1 mkdir /var/opt/mssql/backup
    
  2. Em seguida, baixe o arquivo WideWorldImporters-Full.bak no computador host. Os comandos a seguir navegam até o diretório home/user e baixam o arquivo de backup como 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. Use o docker cp para copiar o arquivo de backup para o contêiner no diretório /var/opt/mssql/backup.

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

Restaurar o banco de dados

O arquivo de backup agora está localizado dentro do contêiner. Antes de restaurar o backup, é importante saber os nomes do arquivo lógico e os tipos de arquivo dentro do backup. Os comandos Transact-SQL a seguir inspecionam o backup e executam a restauração usando sqlcmd no contêiner.

Dica

Este tutorial usa o sqlcmd dentro do contêiner, pois o contêiner vem com essa ferramenta pré-instalada. No entanto, você também pode executar instruções do Transact-SQL com outras ferramentas de cliente fora do contêiner, como Extensão do SQL Server para Visual Studio Code ou Usar o SQL Server Management Studio no Windows para gerenciar o SQL Server no Linux. Para conectar-se, use a porta do host que foi mapeada para a porta 1433 no contêiner. Neste exemplo, é localhost,1401 no computador host e Host_IP_Address,1401 remotamente.

  1. Execute o sqlcmd dentro do contêiner para listar nomes de arquivos lógicos e caminhos dentro do backup. Isso é feito com a instrução RESTORE FILELISTONLY do 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
    

    Você deverá ver um resultado semelhante ao seguinte:

    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. Chame o comando RESTORE DATABASE para restaurar o banco de dados dentro do contêiner. Especifique novos caminhos para cada um dos arquivos na etapa anterior.

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

    Você deverá ver um resultado semelhante ao seguinte:

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

Verifique o banco de dados restaurado

Execute a consulta a seguir para exibir uma lista de nomes de banco de dados em seu contêiner:

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

Você deve ver WideWorldImporters na listagem dos dados na tabela.

Fazer uma alteração

Siga estas etapas para fazer uma alteração no banco de dados.

  1. Execute uma consulta para exibir os 10 principais itens na tabela 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'
    

    Você deverá ver uma lista de identificadores e nomes de itens:

    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. Atualize a descrição do primeiro item com a seguinte instrução 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'
    

    Você deverá ver um resultado semelhante ao texto abaixo:

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

Criar um novo backup

Depois de restaurar o banco de dados para um contêiner, talvez você também queira criar regularmente backups de banco de dados dentro do contêiner em execução. As etapas seguem um padrão semelhante aos das etapas anteriores, mas na ordem inversa.

  1. Use o comando do Transact-SQL BACKUP DATABASE para criar um backup de banco de dados no contêiner. Este tutorial cria um novo arquivo de backup, wwi_2.bak, no diretório /var/opt/mssql/backup criado anteriormente.

    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"
    

    Você deverá ver uma saída semelhante à seguinte:

    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. Em seguida, copie o arquivo de backup do contêiner para o computador host.

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

Usar os dados persistentes

Além de usar os backups de banco de dados para proteger seus dados, você também pode usar contêineres de volume de dados. O início deste tutorial criou o contêiner sql1 com o parâmetro -v sql1data:/var/opt/mssql. O contêiner de volume de dados sql1data persiste os dados de /var/opt/mssql mesmo depois que o contêiner é removido. As etapas a seguir removem completamente o contêiner sql1 e, em seguida, criam um novo contêiner, sql2, com os dados persistentes.

  1. Pare o contêiner sql1.

    sudo docker stop sql1
    
  2. Remova o contêiner. Isso não exclui o contêiner de volume de dados sql1data criado anteriormente nem os dados persistentes nele.

    sudo docker rm sql1
    
  3. Crie um novo contêiner, sql2, e reutilize o contêiner de volume de dados 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. O banco de dados de Importadores Mundiais agora está no novo contêiner. Execute uma consulta para verificar a alteração anterior feita.

    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'
    

    Observação

    A senha SA não é a senha especificada para o contêiner sql2, MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>. Todos os dados do SQL Server foram restaurados de sql1, incluindo a senha alterada de antes no tutorial. Na verdade, algumas opções como essa são ignoradas devido à restauração dos dados em /var/opt/mssql. Por esse motivo, a senha é <YourNewStrong!Passw0rd>, como mostrado aqui.

  1. Pare o contêiner sql1.

    sudo docker stop sql1
    
  2. Remova o contêiner. Isso não exclui o contêiner de volume de dados sql1data criado anteriormente nem os dados persistentes nele.

    sudo docker rm sql1
    
  3. Crie um novo contêiner, sql2, e reutilize o contêiner de volume de dados 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. O banco de dados de Importadores Mundiais agora está no novo contêiner. Execute uma consulta para verificar a alteração anterior feita.

    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'
    

    Observação

    A senha SA não é a senha especificada para o contêiner sql2, MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>. Todos os dados do SQL Server foram restaurados de sql1, incluindo a senha alterada de antes no tutorial. Na verdade, algumas opções como essa são ignoradas devido à restauração dos dados em /var/opt/mssql. Por esse motivo, a senha é <YourNewStrong!Passw0rd>, como mostrado aqui.

  1. Pare o contêiner sql1.

    sudo docker stop sql1
    
  2. Remova o contêiner. Isso não exclui o contêiner de volume de dados sql1data criado anteriormente nem os dados persistentes nele.

    sudo docker rm sql1
    
  3. Crie um novo contêiner, sql2, e reutilize o contêiner de volume de dados 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. O banco de dados de Importadores Mundiais agora está no novo contêiner. Execute uma consulta para verificar a alteração anterior feita.

    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'
    

    Observação

    A senha SA não é a senha especificada para o contêiner sql2, MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>. Todos os dados do SQL Server foram restaurados de sql1, incluindo a senha alterada de antes no tutorial. Na verdade, algumas opções como essa são ignoradas devido à restauração dos dados em /var/opt/mssql. Por esse motivo, a senha é <YourNewStrong!Passw0rd>, como mostrado aqui.

Próxima etapa

Neste tutorial, você aprendeu como fazer backup de um banco de dados no Windows e movê-lo para um servidor Linux executando o SQL Server 2017 (14.x) em um contêiner. Você aprendeu a:

Neste tutorial, você aprendeu como fazer backup de um banco de dados no Windows e movê-lo para um servidor Linux executando o SQL Server 2019 (15.x) em um contêiner. Você aprendeu a:

Neste tutorial, você aprendeu como fazer backup de um banco de dados no Windows e movê-lo para um servidor Linux executando o SQL Server 2022 (16.x) em um contêiner. Você aprendeu a:

  • Crie imagens de contêiner do Linux do SQL Server.
  • Copie backups de banco de dados do SQL Server para um contêiner.
  • Execute instruções Transact-SQL com sqlcmd.
  • Crie e extraia arquivos de backup de um contêiner.
  • Use contêineres de volume de dados para persistir os dados de produção do SQL Server.

Em seguida, examine outros cenários de configuração e solução de problemas de contêiner:

Contribua com a documentação do SQL

Você sabia que pode editar conteúdo do SQL por conta própria? Ao fazer isso, além de melhorar nossa documentação, você também será creditado como um colaborador da página.

Para obter mais informações, confira Como contribuir para a documentação do SQL Server