Как восстановить таблицу BigQuery?

Я случайно удалил одну из моих таблиц BigQuery. Можно ли вернуть его? API, похоже, не поддерживает восстановление.

Ответ 1

Восстановить в BigQuery можно с помощью декораторов столов и снимков. То есть вы можете скопировать моментальный снимок таблицы перед удалением таблицы.

Есть несколько предостережений:

  • Вы должны сделать это в два этапа; сначала скопируйте снимок таблицы во вторую таблицу. Затем вы можете скопировать эту вторую таблицу обратно в исходное местоположение.
  • Вы можете восстановить только удаленные таблицы за последние 2 дня.
  • Если вы с тех пор воссоздали таблицу с тем же именем, вы не сможете восстановить старый файл.

Вот пример использования bq, но вы можете сделать то же самое с веб-интерфейсом BigQuery.

Сначала создайте фиктивный массив данных и таблицу, которые мы собираемся удалить:

$ 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 |
+----+

Теперь возьмите текущую временную метку unix с момента, когда таблица была в живых.

$ date +%s
1418864998

Обратите внимание, что это время в секундах, нам понадобятся миллисекунды.

Удалите таблицу "случайно"

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

Теперь мы можем восстановить таблицу путем копирования моментального снимка:

$ 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'

(обратите внимание, что мы умножили время на 1000, так как мы хотим миллисекунды) Это скопировал старый снимок таблицы на dataset1.temp. Скопируйте его обратно в прежнее место и удалите временную таблицу.

$ 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

Теперь проверьте, что таблица была восстановлена:

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

Ответ 2

Вы можете использовать CLI BigQuery, указав имя старых таблиц, желаемую дату во времени EPOCH и новое имя таблицы:

<project>:<dataset>.<table>@<DESIRED_EPOCH_TIME> <project>:<dataset>.<table>

Например:

bq cp [email protected] my_project.new_dataset.new_table_name

Скопирует содержимое, которое было 9 марта 2019 года (EPOCH: 1551880188000), в новую таблицу

Ответ 3

Как выражено в других ответах, "undelete" не будет работать после CREATE OR REPLACE table.

Если вам нужно восстановить таблицу, которая была заменена, пожалуйста, поставьте следующую проблему:

Тем не менее, вот как вы можете получить более раннюю версию таблицы только С#standardSQL:

SELECT *
FROM 'project.dataset.table' 
FOR SYSTEM TIME AS OF '2019-06-05 18:10:00'

Ответ 4

Как изменился ваш стол 1 час назад (время @-3600000 в миллисекундах):

bq cp my_project:[email protected] my_project:new_dataset.new_table_name