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
- Um tempo de execução de contêiner instalado, como Docker ou Podman
- Instalar o sqlcmd mais recente
- Requisitos do sistema do SQL Server em Linux
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
Abra um terminal bash no Linux.
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
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 porta1401
. O parâmetro-v sql1data:/var/opt/mssql
opcional cria um contêiner de volume de dados chamadosql1data
. 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.
Para exibir seus contêineres, use o comando
docker ps
.sudo docker ps -a
Se a coluna
STATUS
mostrar o statusUp
, o SQL Server estará em execução no contêiner e será escutado na porta especificada na colunaPORTS
. Se a colunaSTATUS
do contêiner do SQL Server mostrarExited
, 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
Abra um terminal bash no Linux.
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
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 porta1401
. O parâmetro-v sql1data:/var/opt/mssql
opcional cria um contêiner de volume de dados chamadosql1data
. 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.
Para exibir seus contêineres, use o comando
docker ps
.sudo docker ps -a
Se a coluna
STATUS
mostrar o statusUp
, o SQL Server estará em execução no contêiner e será escutado na porta especificada na colunaPORTS
. Se a colunaSTATUS
do contêiner do SQL Server mostrarExited
, 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
Abra um terminal bash no Linux.
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
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 porta1401
. O parâmetro-v sql1data:/var/opt/mssql
opcional cria um contêiner de volume de dados chamadosql1data
. 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.
Para exibir seus contêineres, use o comando
docker ps
.sudo docker ps -a
Se a coluna
STATUS
mostrar o statusUp
, o SQL Server estará em execução no contêiner e será escutado na porta especificada na colunaPORTS
. Se a colunaSTATUS
do contêiner do SQL Server mostrarExited
, 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:
Escolha uma senha forte para usar no usuário de SA.
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. UseMSSQL_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.
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
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'
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.
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
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.
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
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.
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).
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.
Pare o contêiner
sql1
.sudo docker stop sql1
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
Crie um novo contêiner,
sql2
, e reutilize o contêiner de volume de dadossql1data
.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
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 desql1
, 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.
Pare o contêiner
sql1
.sudo docker stop sql1
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
Crie um novo contêiner,
sql2
, e reutilize o contêiner de volume de dadossql1data
.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
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 desql1
, 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.
Pare o contêiner
sql1
.sudo docker stop sql1
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
Crie um novo contêiner,
sql2
, e reutilize o contêiner de volume de dadossql1data
.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
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 desql1
, 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