2014-12-18 8 views

risposta

22

Undelete in BigQuery è possibile tramite decoratori di copia su tabella e istantanee. Cioè, puoi copiare un'istantanea della tabella prima che la tabella venisse cancellata.

Ci sono un paio di avvertimenti:

  1. È necessario farlo in due fasi; per prima cosa, copia un'istantanea della tabella in una seconda tabella. Quindi è possibile copiare la seconda tabella nella posizione originale.
  2. È possibile annullare l'eliminazione delle tabelle eliminate negli ultimi giorni.
  3. Se è stata ricreata una tabella con lo stesso nome, potrebbe non essere possibile ripristinare la precedente.

Ecco un esempio utilizzando bq, ma è possibile fare la stessa cosa con l'interfaccia utente Web di BigQuery.

Prima creiamo un set di dati BigQuery manichino e tabella che stiamo andando a eliminare:

$ bq mk -d dataset1 
Dataset 'helixdata2:dataset1' successfully created. 
$ bq query --destination_table=dataset1.table1 "SELECT 17 as a" 
Waiting on bqjob_ra0dedbee5cb4228_0000014a5af133d6_1 ... (0s) 
Current status: DONE 
+----+ 
| a | 
+----+ 
| 17 | 
+----+ 

Ora, afferrare la corrente timestamp Unix da un periodo in cui la tavola era vivo.

$ date +%s 
1418864998 

Si noti che questa volta è in secondi, avremo bisogno di millisecondi.

Rimuovere la tabella 'accidentalmente'

$ bq rm dataset1.table1 
rm: remove table 'helixdata2:dataset1.table1'? (y/N) y 

Ora possiamo annullare l'eliminazione della tabella copiando un'istantanea:

$ bq cp [email protected] dataset1.temp 
Waiting on bqjob_r4d8174e2e41ae73_0000014a5af2a028_1 ... (0s) 
    Current status: DONE  
Tables 'helixdata2:[email protected]' successfully copied to  
    'helixdata2:dataset1.temp' 

(notare abbiamo moltiplicato il tempo del 1000 dal momento che vogliamo millisecondi) Questo copiata una vecchia istantanea della tabella su dataset1.temp. Ricollociamolo nella vecchia posizione e quindi rimuovere la tabella temporanea.

$ bq cp dataset1.temp dataset1.table1 
Waiting on bqjob_r3c0bb9302fb81d59_0000014a5af2dc7b_1 ... (0s) 
    Current status: DONE  
Tables 'helixdata2:dataset1.temp' successfully copied to 
    'helixdata2:dataset1.table1' 
$ bq rm dataset1.temp 
rm: remove table 'helixdata2:dataset1.temp'? (y/N) y 

Diamo ora verificare che la tabella è stata restaurata:

$ bq query "select * from dataset1.table1" 
Waiting on bqjob_r5967bea49ed9e97f_0000014a5af34dec_1 ... (0s) 
    Current status: DONE 
+----+ 
| a | 
+----+ 
| 17 | 
+----+ 
+0

Solo un po 'Inoltre, se si ottiene questo errore "errore di funzionamento Query: Impossibile avviare un lavoro senza un ID di progetto". Aggiungi l'ID del tuo progetto. Per shell bq: - [bq shell --project_id = myprojectid] – shiva

+0

@ Jordan Tigani Posso ottenere l'istantanea di un set di dati? Voglio sapere quali tabelle sono presenti in un determinato timestamp perché non sono sicuro di quali tabelle ho cancellato accidentalmente. – shiva

+1

Nota importante: non è possibile * annullare l'eliminazione delle tabelle se sono state ricreate. Ciò significa che questo recupero dell'istantanea non può essere utilizzato per recuperare dagli errori in combinazione con le funzionalità delle tabelle modello "crea tabelle su richiesta durante lo streaming". L'abbiamo imparato nel modo più duro: abbiamo cancellato per errore una tabella di produzione, che è stata immediatamente ricreata in modo da non poter recuperare dall'istantanea. –

Problemi correlati