Blog

Wie exportiere ich Sql Server-Tabellen in einen Cloud-Speicher?

Laurens Knoll

Laurens Knoll

Aktualisiert Oktober 16, 2025
3 Minuten

Vor kurzem musste ich Tabellendaten aus einer Sql Server-Sicherung exportieren. Da Cloud Sql für Sql Server keine Funktion dafür hat, zeigt dieser Blog, wie man Tabellen mit einem Cloud Build-Auftrag exportiert.

Den Extraktionsauftrag verstehen

Der Exportprozess nimmt eine Sql Server-Sicherung (BAK-Datei), stellt die Sicherung wieder her und fragt die Datenbank ab, um alle Tabellendaten zu exportieren. Die Tabellendaten werden schließlich zur weiteren Verwendung in den Cloud-Speicher kopiert.

Cloud Build Job Implementierung

source:
  repoSource:
    projectId: your-google-project
    repoName: cloudbuild
    branchName: main
steps:
  # Copy the backup to the Cloud Build instance
  - name: 'google/cloud-sdk:slim'
    entrypoint: gsutil
    args: [ 'cp', '${_GCS_BACKUP_FILE}', '/workspace/snapshot.bak' ]

  # Run a Sql Server instance to facilitate the export
  - name: gcr.io/cloud-builders/docker
    entrypoint: bash
    args:
      - '-c'
      - |
        docker run -d --name mssql --net cloudbuild 
          -e "ACCEPT_EULA=Y" 
          -e "MSSQL_PID=Express" 
          -e "SA_PASSWORD=S3cuReMe!N0W" 
          -v "/workspace:/workspace" 
          -d mcr.microsoft.com/mssql/server:2019-latest

        n=0
        while :
        do
          curl -s -S -v telnet://mssql:1433 && break

          if [[ $n -lt 5 ]]; then
            ((n++))
            echo "Command failed. Attempt $n/5:"
            sleep 5;
          else
            echo "The command has failed after 5 attempts."
            exit 1
          fi
        done

  # Restore the database
  - name: 'mcr.microsoft.com/powershell:lts-7.2-ubuntu-20.04'
    entrypoint: pwsh
    args:
      - '-nologo'
      - '-l'
      - '-c'
      - >
        Write-Host "Installing SqlServer module.."
        Install-Module -Name SqlServer -Force

        Write-Host "Restoring database.."
        $$Moves = Invoke-Sqlcmd -ServerInstance mssql -Username SA -Password S3cuReMe!N0W -Query "RESTORE FILELISTONLY FROM DISK = '/workspace/snapshot.bak'" `
          | ForEach-Object { "MOVE '" + $$_.LogicalName + "' TO '/var/opt/mssql/data/" + (Split-Path $$_.PhysicalName -Leaf) + "'" } `
          | Join-String -Separator ", "

        Invoke-Sqlcmd -ServerInstance mssql -Username SA -Password S3cuReMe!N0W -Query "RESTORE DATABASE snapshot FROM DISK = '/workspace/snapshot.bak' WITH $$Moves"

  # Extract database table data
  - name: 'mcr.microsoft.com/powershell:lts-7.2-ubuntu-20.04'
    entrypoint: pwsh
    args:
      - '-nologo'
      - '-l'
      - '-c'
      - >
        New-Item -Path /workspace -Name "export" -ItemType "directory"

        Write-Host "Installing SqlServer module.."
        Install-Module -Name SqlServer -Force

        Write-Host "Extracting database tables.."
        $$Tables = Invoke-Sqlcmd -ServerInstance mssql -Username SA -Password S3cuReMe!N0W -Query "SELECT table_schema+'.'+table_name as [Table] FROM snapshot.INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE'" `
            | ForEach-Object { $$_.Table }

        foreach ($$Table in $$Tables)
        {
            Write-Host "Extracting table: $$Table.."
            Invoke-Sqlcmd -ServerInstance mssql -Username SA -Password S3cuReMe!N0W -Query "select * from snapshot.$$Table" `
                | Export-Csv (Join-Path -Path "/workspace/export" -ChildPath "$$Table.csv")
        }

  # Copy table data to destination bucket
  - name: 'google/cloud-sdk:slim'
    entrypoint: gsutil
    args: [ '-m', 'cp', '/workspace/export/*', '${_GCS_DESTINATION_PATH}' ]
timeout: 1800s

Nutzung von Cloud Build Jobs

Setzen Sie den Cloud Build Trigger wie oben beschrieben ein. Verknüpfen Sie ein Dienstkonto mit der Berechtigung zum Lesen aus dem Quell-Bucket (roles/storage.objectViewer) und zum Schreiben in den Ziel-Bucket (roles/storage.objectAdmin). Geben Sie schließlich die Parameter _GCS_BACKUP_FILE und _GCS_DESTINATION_PATH an, um die eingegebene Sicherungsdatei im Ziel-Bucket wiederherzustellen.

Beachten Sie, dass Sie ein Cloud Source Repository benötigen, um manuelle Auslöser zu konfigurieren. Erstellen Sie zu diesem Zweck einfach ein leeres cloudbuild Quell-Repository.

Diskussion

Diese Auftragsimplementierung verwendet eine Express-Version von Sql Server. Bitte beachten Sie die Einschränkungen dieser Version. Für größere Datenbanken (10GB+) benötigen Sie eine Web/Standard oder Enterprise Lizenz. Für diese Szenarien würde ich Cloud Sql verwenden und einen Leerlaufmonitor implementieren, der den Datenbankserver nach n Minuten Inaktivität anhält.

In diesem Fall werden die Tabellen als CSV-Dateien exportiert. Diese Dateien enthalten keine Spalten-Metadaten. Wenn Sie diese benötigen, ändern Sie einfach den Export, um eine Daten- und Schemadatei zu exportieren. Für alternative Dateiformate sollten Sie ein anderes Exporttool in Betracht ziehen.

Fazit

Beginnen Sie mit dem Export Ihrer Sql Server-Tabellendaten mit Hilfe von Cloud Build-Aufträgen, indem Sie diese Vorlage wiederverwenden. Sie können die Vorlage nach Belieben an Ihre Bedürfnisse (Ausgabeformate) oder Ihr Szenario (größere Datenbanken, inkrementelle Exporte) anpassen.

Bild von annca aus Pixabay

Verfasst von

Laurens Knoll

As a cloud consultant I enjoy improving what your company does best. I enable your business using cloud technology and enable your engineers by applying software engineering practices to your infrastructure domain.

Contact

Let’s discuss how we can support your journey.