DBAtlas · Atlas de operaciones de bases de datos

Export/import por tablas en SQL Server (bcp, sqlpackage)

SQL ServerNivel: IntermedioDuración: 20–60 min

No es una copia de seguridad, sino traslado lógico de datos: exportar tablas con bcp y cargarlas en otra base de datos (formato nativo o de caracteres, archivo de formato, batch, TABLOCK, columna de identidad, UTF-8), volcar el resultado de una consulta a un archivo CSV/de texto (queryout), trasladar esquema + datos con sqlpackage (.bacpac Export/Import, p. ej. migración a Azure SQL Database) y solo esquema (.dacpac Extract, Script, Publish). Incluye la instalación de mssql-tools18 y sqlpackage en Linux. El resultado son tablas en el destino con el número de filas verificado frente al origen, o un archivo que se puede compartir.

Si va a trasladar la base de datos completa a un SQL Server de la misma versión o más reciente, la copia/restauración es más rápida y coherente: Copia de seguridad y restauración de SQL Server.

Topología: 1 servidor (los comandos se ejecutan en SQL Server o en un servidor de administración)

Escenarios

  • Trasladar tablas: bcp out → bcp in — Copiar una o varias tablas a otra base de datos de SQL Server; las tablas deben existir previamente en el destino.
  • Volcar el resultado de una consulta a un archivo: bcp queryout (CSV/texto) — Escribir el resultado de una consulta en un archivo CSV/de texto que se entregará a otro sistema (Excel, ETL, informes).
  • Esquema + datos: sqlpackage Export / Import (.bacpac) — Trasladar esquema y datos en un solo archivo; especialmente para migrar a Azure SQL Database o para bases de datos pequeñas/medianas.
  • Solo esquema: sqlpackage Extract / Script / Publish (.dacpac) — Extraer solo el esquema, compararlo con el destino y generar un script de cambios, o crear el esquema vacío en un entorno nuevo.

Antes de empezar

  • Se ha elegido la herramienta correcta: - bcp (nativo): trasladar una o varias tablas grandes de SQL Server a SQL Server; la más rápida. Las tablas de destino deben existir previamente. - bcp (caracteres) / queryout: entregar texto/CSV a otros sistemas (ETL, informes, Excel). - .bacpac (Export/Import): trasladar esquema + datos en un solo archivo; especialmente para migrar a Azure SQL Database. Es lento en bases de datos grandes (cientos de GB); en ese caso prefiera copia/restauración o bcp. - .dacpac (Extract): solo esquema (tablas, vistas, procedimientos); comparación de esquemas y creación del esquema vacío en un entorno nuevo.
  • … tiene permiso de lectura en el origen (SELECT en las tablas; para Export/Extract se recomienda db_owner) y de escritura en el destino (INSERT + ALTER TABLE para bcp in; dbcreator o db_owner para Import/Publish). Indique la contraseña antes del script: read -rsp 'Contraseña: ' SQLCMDPASSWORD; export SQLCMDPASSWORD y sudo --preserve-env=SQLCMDPASSWORD bash <script>.sh.
  • PowerShell se ha abierto como administrador (Inicio → "PowerShell" → clic derecho → Run as administrator). …La cuenta de Windows que abrió PowerShell tiene…El login … tiene… permiso de lectura en el origen y de escritura en el destino (INSERT + ALTER TABLE para bcp in; dbcreator o db_owner para Import/Publish).
  • Desde el servidor de comandos se llega por TCP al SQL Server de origen (…)… y al de destino (…)….
  • Desde el servidor de comandos se llega por TCP al SQL Server de origen (…)… y al de destino (…)…; bcp y sqlcmd están en el PATH (vienen con la instalación de SQL Server o con "Microsoft Command Line Utilities for SQL Server").
  • El disco del directorio de export (…) tiene tanto espacio libre como el tamaño de los datos que se van a trasladar (el archivo nativo ocupa aproximadamente lo mismo que los datos de la tabla; el de caracteres puede ser mayor; el .bacpac está comprimido).
  • La unidad del directorio de export (…) tiene tanto espacio libre como el tamaño de los datos que se van a trasladar.
  • En la base de datos de destino (…) se han creado las tablas con la misma estructura (bcp no crea tablas). La forma sencilla de trasladar el esquema es la opción Solo esquema (.dacpac) de esta guía. En cargas grandes se pueden deshabilitar los índices nonclustered y los triggers de la tabla de destino, y comprobar las foreign keys después.
  • No se escribe en el origen durante el export (la aplicación está detenida) o se usa como origen una copia de la base de datos (restaurada desde una copia COPY_ONLY o un database snapshot). bcp y sqlpackage Export no son transactionally consistent: las tablas que cambien durante el export pueden quedar incoherentes entre sí.

Fases de la guía

  • Herramientas y preparación — Instalar las herramientas sqlcmd y bcp (mssql-tools18) · Instalar sqlpackage · Comprobar las herramientas bcp y sqlcmd · Instalar sqlpackage · Crear el directorio de export · Crear el directorio de export
  • Traslado de tablas (bcp out / in) — Registrar el número de filas y el tamaño de las tablas de origen · Generar los archivos de formato · Generar los archivos de formato · Exportar las tablas (bcp out) · Exportar las tablas (bcp out) · Comprobar las tablas de destino …
  • Exportar el resultado de una consulta (queryout) — Escribir el resultado de la consulta en un archivo (bcp queryout) · Escribir el resultado de la consulta en un archivo (bcp queryout)
  • Esquema + datos (.bacpac) — Exportar la base de datos como .bacpac (Export) · Exportar la base de datos como .bacpac (Export) · Crear la base de datos de destino (si no existe) · Cargar el .bacpac en el destino (Import) · Cargar el .bacpac en el destino (Import) · Comprobar las tablas y el número de filas en la base de datos de destino
  • Solo esquema (.dacpac) — Extraer el esquema como .dacpac (Extract) · Extraer el esquema como .dacpac (Extract) · Crear la base de datos de destino (si no existe) · Generar un script de cambios respecto al destino (Script) · Generar un script de cambios respecto al destino (Script) · Aplicar el esquema al destino (Publish) …
  • Después — Limpiar los archivos de export · Limpiar los archivos de export
Abrir el plan paso a paso para su entorno →