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



