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

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.
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.
Unsere Ideen
Weitere Blogs
Contact



