Sådan sikkerhedskopieres en BigQuery-tabel (eller datasæt) til Google Cloud Storage og gendannes fra den

String sammen opkald til kommandolinjeværktøjet bq

BigQuery er fuldt styret og tager sig af styring af overflødige sikkerhedskopier i lager. Det understøtter også ”tidsrejse”, muligheden for at forespørge et øjebliksbillede fra en dag siden. Så hvis et ETL-job går dårligt, og du vil vende tilbage til gårsdagens data, kan du blot gøre:

Opret eller udskift tabellen dataset.table_restored AS SELECT * FRA dataset.table FOR SYSTEMTID AS OF TIMESTAMP_ADD (CURRENT_TIMESTAMP (), INTERVAL -1 DAY)

Men tidsrejser er begrænset til 7 dage. Der er situationer (afspilning, lovgivningsmæssig overholdelse osv.), Hvor du muligvis skal gendanne en tabel, da den eksisterede for 30 dage siden eller for 1 år siden.

Python-scripts til sikkerhedskopiering og gendannelse

For nemheds skyld har jeg sammensat et par Python-programmer til sikkerhedskopiering og gendannelse af BigQuery-tabeller og datasæt. Hent dem fra dette GitHub-lager: https://github.com/GoogleCloudPlatform/bigquery-oreilly-book/tree/master/blogs/bigquery_backup

Sådan bruger du scripts:

Sådan sikkerhedskopieres en tabel til GCS

./bq_backup.py - inputput.tablename --output gs: // BUCKET / backup

Scriptet gemmer et schema.json, en tabledef.json og ekstraherede data i AVRO-format til GCS.

Du kan også sikkerhedskopiere alle tabeller i et datasæt:

./bq_backup.py - inputdatasæt --output gs: // BUCKET / backup

Gendan tabeller en for en ved at specificere et destinationsdatasæt

./bq_restore.py - input gs: // BUCKET / backup / fromdataset / fromtable --output destdataset

Sådan fungerer Python-scripterne

Scripterne bruger kommandolinjefunktionen BigQuery bq til at sammensætte en sikkerhedskopierings- og gendannelsesløsning.

bq_backup.py påkalder følgende kommandoer:

bq show - skema datasæt.tabel. # schema.json bq - format = json show dataset.table. # tbldef.json bq-ekstrakt - destination_format = AVRO \ dataset.table gs: //.../data_*.avro # AVRO filer

Det gemmer JSON-filerne i Google Cloud Storage sammen med AVRO-filerne.

bq_restore.py bruger tabeldefinitionen til at finde karakteristika som om tabellen er tidsopdelt, rækkeviddeopdelt eller klynget og påkalder derefter kommandoen:

bq load --source_format = AVRO \ - time_partitioning_expiration ... \ --time_partitioning_field ... \ - time_partitioning_type ... \ --clustering_fields ... \ - skema ... \ todataset.table_name \ gs: / /.../data_*.avro

I tilfælde af visninger gemmer og gendanner scripts visningsdefinitionen. Visningsdefinitionen er en del af tabeldefinitionen JSON, og for at gendanne den skal scriptet blot påberåbe sig:

bq mk - vis forespørgsel - nouse_legacy_sql todataset.table_name

God fornøjelse!

1. Skal du sikkerhedskopiere til Google Cloud Storage?

Efter at jeg havde offentliggjort denne artikel, svarede Antoine Cas på Twitter:

Han har helt ret. Denne artikel antager, at du ønsker en sikkerhedskopi i form af filer på Cloud Storage. Dette kan skyldes, at din overholdelsesrevisor ønsker, at dataene eksporteres til et bestemt sted, eller det kan være fordi du ønsker, at sikkerhedskopierne skal kunne behandles af andre værktøjer.

Hvis du ikke har brug for sikkerhedskopien for at være i form af filer, er en meget enklere måde at sikkerhedskopiere din BigQuery-tabel ved at bruge bq cp til at oprette / gendanne sikkerhedskopien:

# backup date = ... bq mk datasæt _ $ {date} bq cp dataset.table datasæt _ $ {date} .table
# gendanne bq cp dataset_20200301.table dataset_restore.table

2. Komprimeres sikkerhedskopifilerne?

Ja! Dataene gemmes i Avro-format, og Avro-formatet bruger komprimering. De to JSON-filer (tabeldefinition og skema) er ikke komprimeret, men de er relativt små.

Som et eksempel sikkerhedskopierede jeg et BigQuery-bord med 400 millioner rækker, der tog 11,1 GB i BigQuery. Når du gemte den som Avro på GCS, blev den samme tabel gemt som 47 filer, der hver var 174,2 MB, så 8,2 GB. De to JSON-filer besatte i alt 1,3 MB, stort set bare afrunding. Dette giver mening, fordi BigQuery-lagring er optimeret til interaktiv forespørgsel, mens Avro-formatet ikke er det.

3. Kan du faktisk rundrejse fra BigQuery til Avro og tilbage?

BigQuery kan eksportere mest primitive typer og indlejrede og gentagne felter til Avro. For detaljerede oplysninger om Avro-repræsentationen, se dokumentationen. Sikkerhedskopieringsværktøjet specificerer use_avro_logical_types, så DATE og TIME gemmes som henholdsvis dato og klokkemikro.

Når det er sagt, skal du kontrollere, at sikkerhedskopien / gendannelsen fungerer på dit bord.