Anexando / restaurando bancos de dados dentro de um contêiner – SQLBlog

Anexando / restaurando bancos de dados dentro de um contêiner – SQLBlog

Anexando / restaurando bancos de dados dentro de um contêiner - SQLBlog


Vou resolver isso primeiro: sou um cara do Mac. Se você não estiver usando um Mac, provavelmente o final desta postagem é a única coisa de interesse.

Sei que muitos de nós estamos prestes a enfrentar longos períodos de tempo em casa, talvez sem o luxo de nossas poderosas máquinas de desktop – e sua proximidade com instâncias ainda mais poderosas do SQL Server – no escritório.

Estou usando contêineres do Docker para desenvolvimento e teste local há algum tempo; Eu escrevi primeiro sobre meus passos nesse mundo novo e corajoso no final de 2016. Na maioria das vezes, só preciso criar um banco de dados descartável, com uma tabela descartável, para provar um ponto ou validar uma resposta que eu forneço.

Às vezes, porém, preciso trabalhar com um banco de dados real. É um pouco mais complicado fazer isso em um contêiner, porque é isolado – não posso simplesmente anexar ou restaurar da minha pasta Downloads. Eu poderia iniciar uma VM e conectar lá, mas na verdade nem uso o Parallels no meu laptop de trabalho, e acho que o uso de VMs leva a tempos de resposta muito mais lentos.

Não é muito difícil colocar arquivos em seus contêineres, desde que sua instância tenha um tamanho total menor que o tamanho do contêiner, e este tutorial rápido provou ser muito útil.

Ter um banco de dados para anexar / restaurar

Neste exemplo, baixei a versão de 50 GB do banco de dados Stack Overflow; Brent Ozar gentilmente os forneceu e também explica como fazer o download em Como baixar o banco de dados de estouro de pilha. Pra mim eu costumava curl para baixar o arquivo, com a seguinte sintaxe (-L significa seguir se o arquivo foi movido; -o mostra o progresso):

cd /Users/aaronbertrand/Downloads
curl -L -o "so.7z" "http://downloads.brentozar.com.s3.amazonaws.com/StackOverflow2013_201809117.7z"

Para extrair os arquivos, você pode precisar do 7-Zip, mas no Mac isso é suportado nativamente. Isso coloca 1 arquivo mdf, 3 arquivos ndf, 1 arquivo ldf e um arquivo leia-me em uma pasta chamada StackOverflow2013_201809117. Renomeei a pasta so Pela simplicidade.

Leia Também  Atualizar estatísticas faz com que o farejamento de parâmetros.

Coloque um contêiner em funcionamento

Nem sempre nomeio meus contêineres, mas quando o faço, uso nomes realmente descritivos.

docker run --name MyContainer1 -p 2019:1433 -i -d -e ACCEPT_EULA=Y -e [email protected] mcr.microsoft.com/mssql/server:2019-latest

Dar um nome ao contêiner ajuda no meu cenário atual, porque eu posso usá-lo para copiar facilmente arquivos do host para o contêiner sem precisar procurar o identificador hexadecimal ao qual ele foi atribuído.

Se você tiver apenas pequenos arquivos para anexar ou restaurar, poderá inseri-los no contêiner em algumas etapas rápidas.

Copie os arquivos no contêiner

Primeiro, crie uma pasta. (Você não precisa fazer isso se estiver copiando .mdf arquivos que deveriam estar em uma pasta que já existe, digamos, /var/opt/mssql/data.)

docker exec -it MyContainer1 mkdir "/var/opt/mssql/backup"

Em seguida, copie os arquivos lá (docker cp não suporta caracteres curinga, mas você pode usar . para copiar todos os arquivos da pasta de origem):

cd /Users/aaronbertrand/Downloads/so
docker cp . MyContainer1:/var/opt/mssql/data/

Anexar / restaurar o banco de dados

Quando os arquivos estiverem lá, você poderá se conectar através do Azure Data Studio e anexar o banco de dados:

cupom com desconto - o melhor site de cupom de desconto cupomcomdesconto.com.br
CREATE DATABASE StackOverflow 
ON 
  (name = so1,   filename = N'/var/opt/mssql/data/StackOverflow2013_1.mdf'),
  (name = so2,   filename = N'/var/opt/mssql/data/StackOverflow2013_2.ndf'),
  (name = so3,   filename = N'/var/opt/mssql/data/StackOverflow2013_3.ndf'),
  (name = so4,   filename = N'/var/opt/mssql/data/StackOverflow2013_4.ndf')
LOG ON
  (name = solog, filename = N'/var/opt/mssql/data/StackOverflow2013_log.ldf')
FOR ATTACH;

É uma coincidência que a versão de 50 GB do banco de dados Stack Overflow apenas mal cabe em um contêiner padrão. Eu ficaria com problemas assim que fizesse alguma coisa para aumentar qualquer um desses arquivos ou criar / anexar / aumentar qualquer outro banco de dados.

E se eu tiver arquivos grandes?

Se você precisar criar, restaurar ou anexar bancos de dados maiores (ou serão) maiores que cerca de 40 GB, precisará mexer nas opções de armazenamento de contêiner em um nível superior. Vou guardar isso para outro post. Mas se for apenas o arquivo de backup muito grande para o contêiner ou o arquivo de backup mais Como a cópia restaurada é muito grande, você pode adicionar um volume montado usando -v:

docker run --name MyContainer2 -v /Users/aaronbertrand/Downloads/whatever/:/whatever -p 2020:1433 -i -d -e ACCEPT_EULA=Y -e [email protected] mcr.microsoft.com/mssql/server:2019-latest

Você pode ser solicitado por um destes:

Leia Também  Exportação do SQL Server para Excel

Anexando / restaurando bancos de dados dentro de um contêiner - SQLBlog 1

Depois de instalado, você pode se conectar através do ADS e restaurar a partir dessa fonte:

RESTORE DATABASE whatever 
  FROM DISK = N'/whatever/whatever.bak'
  WITH MOVE whatever_data TO N'/var/opt/mssql/data/whatever.mdf', 
       MOVE ...

Você não pode anexar arquivos de lá (pelo menos não em uma configuração padrão), pois o contêiner precisaria ser capaz de escrever para esse local. A mensagem de erro que você recebe nesse caso não é clara:

Mensagem 5120, Nível 16, Estado 101
Não foi possível abrir o arquivo físico “/whatever/so1.mdf”. Erro do sistema operacional 87: “87 (o parâmetro está incorreto.)”.
Msg 1802, Nível 16, Estado 7
CREATE DATABASE falhou. Alguns nomes de arquivo listados não puderam ser criados. Verifique os erros relacionados.

Conclusão

Espero que isso ajude qualquer pessoa que esteja tentando obter um banco de dados real em um contêiner, sem ter que escrever manualmente o esquema e os dados, o que é uma solução realmente tediosa. Mas tudo isso é apenas para desenvolvimento local – para casos de uso mais sérios, como dados persistentes, veja Anthony Nocentino, que provavelmente esqueceu mais sobre contêineres do que eu jamais saberei:

Como um aparte, não use [email protected] como sua senha. Seu contêiner parece começar bem, mas será encerrado logo em seguida com o seguinte erro (e se você usar -d, você não verá):

ERRO: Não foi possível definir a senha do administrador do sistema: Falha na validação da senha. A senha não atende aos requisitos de diretiva de senha do SQL Server porque não é complexa o suficiente. A senha deve ter pelo menos 8 caracteres e conter caracteres de três dos quatro conjuntos a seguir: letras maiúsculas, minúsculas, dígitos da Base 10 e símbolos.

Leia Também  Junte-se a mim em Londres para o workshop pré-con My SQLbits: dominando o ajuste do índice

cupom com desconto - o melhor site de cupom de desconto cupomcomdesconto.com.br