Restauración de una base de datos de SQL Server en un contenedor para Linux
Se aplica a: SQL Server - Linux
En este tutorial se muestra cómo mover y restaurar un archivo de copia de seguridad de SQL Server en una imagen de contenedor de Linux de SQL Server 2017 (14.x) que se ejecuta en Docker.
En este tutorial se muestra cómo mover y restaurar un archivo de copia de seguridad de SQL Server en una imagen de contenedor de Linux de SQL Server 2019 (15.x) que se ejecuta en Docker.
En este tutorial se muestra cómo mover y restaurar un archivo de copia de seguridad de SQL Server en una imagen de contenedor de Linux de SQL Server 2022 (16.x) que se ejecuta en Docker.
- Extraiga y ejecute la imagen de contenedor de Linux de SQL Server más reciente.
- Copie el archivo de base de datos de Wide World Importers en el contenedor.
- Restaure la base de datos en el contenedor.
- Ejecute instrucciones de Transact-SQL para ver y modificar la base de datos.
- Realice una copia de seguridad de la base de datos modificada.
Requisitos previos
- Un entorno de ejecución de contenedor instalado, como Docker o Podman
- Instalar la versión más reciente de sqlcmd
- Requisitos del sistema para SQL Server en Linux
Opciones de implementación
En esta sección se proporcionan opciones de implementación para su entorno.
Actualmente, sqlcmd no admite el parámetro MSSQL_PID
al crear contenedores. Si usa las instrucciones de sqlcmd de este tutorial, creará un contenedor con la edición para desarrolladores de SQL Server. Use las instrucciones de la interfaz de la línea de comandos (CLI) para crear un contenedor mediante la licencia que prefiera. Para obtener más información, consulte Implementación y conexión a contenedores de Linux de SQL Server.
Extracción y ejecución de la imagen de contenedor
Abra un terminal de Bash en Linux.
Extraiga la imagen de contenedor de Linux de SQL Server 2017 (14.x) desde Microsoft Container Registry.
sudo docker pull mcr.microsoft.com/mssql/server:2017-latest
Para ejecutar la imagen de contenedor con Docker, puede usar el siguiente 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
Este comando crea un contenedor de SQL Server 2017 (14.x) con la edición Developer (valor predeterminado). El puerto
1433
de SQL Server se expone en el host como puerto1401
. El parámetro-v sql1data:/var/opt/mssql
opcional crea un contenedor de volúmenes de datos denominadosql1data
. Se usa para almacenar los datos creados por SQL Server.Importante
En este ejemplo se usa un contenedor de volúmenes de datos dentro de Docker. Para obtener más información, consulte Configuración de imágenes de contenedor de SQL Server en Docker.
Para ver los contenedores, use el comando
docker ps
.sudo docker ps -a
Si la columna
STATUS
muestra el estadoUp
, esto indica que SQL Server se está ejecutando en el contenedor y que está escuchando en el puerto especificado en la columnaPORTS
. Si en la columnaSTATUS
del contenedor de SQL Server se muestraExited
, vea Solución de problemas de contenedores de Docker de SQL Server.
$ 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 un terminal de Bash en Linux.
Extraiga la imagen de contenedor de Linux de SQL Server 2019 (15.x) desde Microsoft Container Registry.
sudo docker pull mcr.microsoft.com/mssql/server:2019-latest
Para ejecutar la imagen de contenedor con Docker, puede usar el siguiente 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
Este comando crea un contenedor de SQL Server 2019 (15.x) con la edición Developer (valor predeterminado). El puerto
1433
de SQL Server se expone en el host como puerto1401
. El parámetro-v sql1data:/var/opt/mssql
opcional crea un contenedor de volúmenes de datos denominadosql1data
. Se usa para almacenar los datos creados por SQL Server.Importante
En este ejemplo se usa un contenedor de volúmenes de datos dentro de Docker. Para obtener más información, consulte Configuración de imágenes de contenedor de SQL Server en Docker.
Para ver los contenedores, use el comando
docker ps
.sudo docker ps -a
Si la columna
STATUS
muestra el estadoUp
, esto indica que SQL Server se está ejecutando en el contenedor y que está escuchando en el puerto especificado en la columnaPORTS
. Si en la columnaSTATUS
del contenedor de SQL Server se muestraExited
, vea Solución de problemas de contenedores de Docker de SQL Server.$ 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 un terminal de Bash en Linux.
Extraiga la imagen de contenedor de Linux de SQL Server 2022 (16.x) desde Microsoft Container Registry.
sudo docker pull mcr.microsoft.com/mssql/server:2022-latest
Para ejecutar la imagen de contenedor con Docker, puede usar el siguiente 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
Este comando crea un contenedor de SQL Server 2022 (16.x) con la edición Developer (valor predeterminado). El puerto
1433
de SQL Server se expone en el host como puerto1401
. El parámetro-v sql1data:/var/opt/mssql
opcional crea un contenedor de volúmenes de datos denominadosql1data
. Se usa para almacenar los datos creados por SQL Server.Importante
En este ejemplo se usa un contenedor de volúmenes de datos dentro de Docker. Para obtener más información, consulte Configuración de imágenes de contenedor de SQL Server en Docker.
Para ver los contenedores, use el comando
docker ps
.sudo docker ps -a
Si la columna
STATUS
muestra el estadoUp
, esto indica que SQL Server se está ejecutando en el contenedor y que está escuchando en el puerto especificado en la columnaPORTS
. Si en la columnaSTATUS
del contenedor de SQL Server se muestraExited
, vea Solución de problemas de contenedores de Docker de SQL Server.$ 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
Cambiar la contraseña de SA
La cuenta SA
es un administrador del sistema en la instancia de SQL Server que se crea durante la instalación. Después de crear el contenedor de SQL Server, la variable de entorno MSSQL_SA_PASSWORD
especificada se reconoce mediante la ejecución de echo $MSSQL_SA_PASSWORD
en el contenedor. Por motivos de seguridad, cambie la contraseña de administrador del sistema:
Elija una contraseña segura que se usará para el usuario SA.
Use
docker exec
para ejecutar la utilidad sqlcmd a fin de cambiar la contraseña a través de una instrucción Transact-SQL. Reemplace<YourStrong!Passw0rd>
y<YourNewStrong!Passw0rd>
con valores de contraseña propios:Importante
La variable de entorno
SA_PASSWORD
está en desuso. En su lugar, useMSSQL_SA_PASSWORD
.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>'"
Copia de un archivo de copia de seguridad en el contenedor
En este tutorial se usan las bases de datos de ejemplo Wide World Importers para Microsoft SQL. Siga estos pasos para descargar y copiar el archivo de copia de seguridad de base de datos de Wide World Importers en el contenedor de SQL Server.
En primer lugar, use
docker exec
para crear una carpeta de copia de seguridad. El siguiente comando crea un directorio/var/opt/mssql/backup
dentro del contenedor de SQL Server.sudo docker exec -it sql1 mkdir /var/opt/mssql/backup
Luego, descargue el archivo WideWorldImporters-Full.bak en el equipo host. Los siguientes comandos llevan al directorio home/user y descargan el archivo de copia de seguridad 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
docker cp
para copiar el archivo de copia de seguridad en el contenedor, en el directorio/var/opt/mssql/backup
.sudo docker cp wwi.bak sql1:/var/opt/mssql/backup
Restauración de la base de datos
El archivo de copia de seguridad ahora se encuentra dentro del contenedor. Antes de restaurar la copia de seguridad, es importante conocer los nombres de archivo lógicos y los tipos de archivo que hay dentro de la copia de seguridad. Los siguientes comandos de Transact-SQL examinan la copia de seguridad y realizan la restauración con sqlcmd en el contenedor.
Sugerencia
En este tutorial se usa sqlcmd dentro del contenedor, ya que este incluye esta herramienta preinstalada. Pero también puede ejecutar instrucciones de Transact-SQL con otras herramientas de cliente fuera del contenedor, como la extensión de SQL Server para Visual Studio Code o utilizar SQL Server Management Studio en Windows para administrar SQL Server en Linux. Para conectarse, use el puerto de host que se ha asignado al puerto 1433 en el contenedor. En este ejemplo es localhost,1401
en el equipo host y Host_IP_Address,1401
de forma remota.
Ejecute sqlcmd dentro del contenedor para enumerar los nombres de archivo lógicos y las rutas de acceso que hay dentro de la copia de seguridad. Esto se hace con la instrucción de Transact-SQL
RESTORE FILELISTONLY
.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
Debería ver una salida similar a la siguiente:
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
Llame al comando
RESTORE DATABASE
para restaurar la base de datos dentro del contenedor. Especifique nuevas rutas de acceso para cada uno de los archivos del paso 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"'
Debería ver una salida similar a la siguiente:
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).
Comprobar la base de datos restaurada
Ejecute la consulta siguiente para mostrar una lista de nombres de bases de datos del contenedor:
sudo docker exec -it sql1 /opt/mssql-tools/bin/sqlcmd \
-S localhost -U SA -P '<YourNewStrong!Passw0rd>' \
-Q 'SELECT Name FROM sys.Databases'
Debería ver WideWorldImporters
en la lista de bases de datos.
Realización de cambios
Siga estos pasos para realizar un cambio en la base de datos.
Ejecute una consulta para ver los diez elementos principales de la tabla
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'
Debería ver una lista de identificadores y nombres de elemento:
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
Actualice la descripción del primer elemento con la siguiente instrucción
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'
Debería ver una salida similar al siguiente texto:
(1 rows affected) StockItemID StockItemName ----------- ------------------------------------ 1 USB missile launcher (Dark Green)
Crear una nueva copia de seguridad
Después de haber restaurado la base de datos en un contenedor, puede que también quiera crear periódicamente copias de seguridad de base de datos dentro del contenedor en ejecución. Los pasos siguen un patrón similar a los pasos anteriores, pero en orden inverso.
Use el comando de Transact-SQL
BACKUP DATABASE
para crear una copia de seguridad de base de datos en el contenedor. En este tutorial se crea un nuevo archivo de copia de seguridadwwi_2.bak
en el directorio/var/opt/mssql/backup
creado previamente.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"
Debería ver una salida similar a esta:
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).
Luego, copie el archivo de copia de seguridad del contenedor en el equipo host.
cd ~ sudo docker cp sql1:/var/opt/mssql/backup/wwi_2.bak wwi_2.bak ls -l wwi*
Uso de los datos almacenados
Además de realizar copias de seguridad de las bases de datos para proteger los datos, puede usar contenedores de volúmenes de datos. Al principio de este tutorial se ha creado el contenedor sql1
con el parámetro -v sql1data:/var/opt/mssql
. El contenedor de volúmenes de datos sql1data
almacena los datos de /var/opt/mssql
incluso después de quitar el contenedor. En los pasos siguientes se quita por completo el contenedor sql1
y, luego, se crea un nuevo contenedor, sql2
, con los datos almacenados.
Detención del contenedor
sql1
.sudo docker stop sql1
Quite el contenedor. Esto no elimina el contenedor de volúmenes de datos
sql1data
creado previamente ni los datos almacenados en él.sudo docker rm sql1
Cree un nuevo contenedor,
sql2
, y vuelva a usar el contenedor de volúmenes de datossql1data
.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
La base de datos Wide World Importers está ahora en el nuevo contenedor. Ejecute una consulta para comprobar el cambio anterior que ha realizado.
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'
Nota:
La contraseña de administrador del sistema no es la que ha especificado para el contenedor
sql2
,MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>
. Todos los datos de SQL Server se han restaurado desdesql1
, incluida la contraseña modificada anteriormente en el tutorial. En efecto, algunas opciones como esta se omiten debido a la restauración de los datos de /var/opt/mssql. Por esta razón, la contraseña es<YourNewStrong!Passw0rd>
, como se muestra aquí.
Detención del contenedor
sql1
.sudo docker stop sql1
Quite el contenedor. Esto no elimina el contenedor de volúmenes de datos
sql1data
creado previamente ni los datos almacenados en él.sudo docker rm sql1
Cree un nuevo contenedor,
sql2
, y vuelva a usar el contenedor de volúmenes de datossql1data
.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
La base de datos Wide World Importers está ahora en el nuevo contenedor. Ejecute una consulta para comprobar el cambio anterior que ha realizado.
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'
Nota:
La contraseña de administrador del sistema no es la que ha especificado para el contenedor
sql2
,MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>
. Todos los datos de SQL Server se han restaurado desdesql1
, incluida la contraseña modificada anteriormente en el tutorial. En efecto, algunas opciones como esta se omiten debido a la restauración de los datos de /var/opt/mssql. Por esta razón, la contraseña es<YourNewStrong!Passw0rd>
, como se muestra aquí.
Detención del contenedor
sql1
.sudo docker stop sql1
Quite el contenedor. Esto no elimina el contenedor de volúmenes de datos
sql1data
creado previamente ni los datos almacenados en él.sudo docker rm sql1
Cree un nuevo contenedor,
sql2
, y vuelva a usar el contenedor de volúmenes de datossql1data
.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
La base de datos Wide World Importers está ahora en el nuevo contenedor. Ejecute una consulta para comprobar el cambio anterior que ha realizado.
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'
Nota:
La contraseña de administrador del sistema no es la que ha especificado para el contenedor
sql2
,MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>
. Todos los datos de SQL Server se han restaurado desdesql1
, incluida la contraseña modificada anteriormente en el tutorial. En efecto, algunas opciones como esta se omiten debido a la restauración de los datos de /var/opt/mssql. Por esta razón, la contraseña es<YourNewStrong!Passw0rd>
, como se muestra aquí.
Paso siguiente
En este tutorial ha aprendido a realizar una copia de seguridad de una base de datos en Windows y a moverla a un servidor de Linux con la versión preliminar de SQL Server 2017 (14.x). Ha aprendido a:
En este tutorial ha aprendido a realizar una copia de seguridad de una base de datos en Windows y a moverla a un servidor de Linux con la versión preliminar de SQL Server 2019 (15.x). Ha aprendido a:
En este tutorial ha aprendido a realizar una copia de seguridad de una base de datos en Windows y a moverla a un servidor de Linux con la versión preliminar de SQL Server 2022 (16.x) en un contenedor. Ha aprendido a:
- Crear imágenes de contenedor de Linux de SQL Server.
- Copiar copias de seguridad de base de datos de SQL Server en un contenedor.
- Ejecutar instrucciones de Transact-SQL con sqlcmd.
- Crear y extraer archivos de copia de seguridad desde un contenedor.
- Use los contenedores de volúmenes de datos para almacenar datos de producción de SQL Server.
Después, revise otros escenarios de configuración y solución de problemas del contenedor:
Contribuya a la documentación de SQL
¿Sabía que puede editar el contenido de SQL usted mismo? Si lo hace, no solo contribuirá a mejorar la documentación, sino que también se le reconocerá como colaborador de la página.
Para más información, vea Cómo colaborar en la documentación de SQL Server.