BigQuery становится все более популярным инструментом для работы с данными. С ростом его распространенности все более ценными становятся и знания о нем. При этом в повседневной практике могут возникать совершенно разные ситуаций, от которых невозможно перестраховаться на 100%. Можно в частности случайно повредить, неверно дозаполнить, а может быть и вовсе уничтожить не те партиции или целую таблицу. В этой заметке мы рассмотрим способы, с помощью которых можно исправить допущенные недоразумения.
Если вы накосячили с данными, то первое о чем нужно помнить, это:
Если вы повредили таблицу. BigQuery хранит состояние вашей существующей таблицы на любой момент времени в течение прошедших 7 дней. Так что вы можете откатиться.
Если вы удалили таблицу. У вас есть 2 суток, чтобы восстановить уничтоженную таблицу с помощью специальной команды.
Можно обратиться и к официальной справке по этому вопросу, а именно к разделу "BigQuery for data warehouse practitioners" >> "Backup and recovery" - ссылка.
После осознания того, что все не так плохо, у вас есть 2 способа восстановить ваши данные: с помощью SQL запроса и с помощью специальной команды в консоли.
Ситуация 1. Таблица была повреждена неуместной операцией
Если вы не удалили таблицу, а лишь повредили ее, применив ненужную операцию, то можно восстановить ее состояние на любой момент времени в течение последних 7 дней, как мы и писали ранее. Для этого нужно всего лишь написать довольно простой SQL запрос.
Пример для случая, когда вы уверены, что еще 1 час назад таблица была “нормальной”.
CREATE OR REPLACE TABLE
`имя_проекта.имя_датасета.имя_таблицы`
AS
SELECT
*
FROM
`имя_проекта.имя_датасета.имя_таблицы`
FOR SYSTEM_TIME AS OF
TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 HOUR)
Вместо `INTERVAL 1 HOUR` конечно можно написать любое число часов в пределах 168 или, например, `INTERVAL 1 DAY` , если ваши повреждения замечены поздно. Можно также и не восстанавливать таблицу сразу, а посмотреть на результат выдачи, само собой не используя первую часть запроса `CREATE OR REPLACE`.
Ситуация 2. Партицированная таблица была повреждена неуместной операцией
Если вам нужно восстановить состояние партицированной таблицы, где обязательным условием является указание некоего значения колонки, по которой таблица партицирована, то и с таким кейсом можно справиться. В этом случае вам нужно написать запрос вот такого вида:
CREATE OR REPLACE TABLE
`имя_проекта.имя_датасета.имя_таблицы`
PARTITION BY
event_date
OPTIONS (require_partition_filter=TRUE) AS
SELECT
*
FROM
`имя_проекта.имя_датасета.имя_таблицы`
FOR SYSTEM_TIME AS OF
TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 DAY)
WHERE
event_date <= CURRENT_DATE()
Ситуация 3. Таблица была случайно удалена
Помните, что у вас есть 2 суток, чтобы исправить эту ситуацию. Чтобы восстановить удаленную таблицу, нужно открыть консоль, нажав ‘Activate Cloud Shell’ в правом верхнем углу, как это показано на картинке ниже.
После этого в нижней части экрана откроется консоль, где можно будет писать команды для восстановления таблиц. При возврате удаленной таблицы, нужно указать момент, когда эта таблица существовала, но в микросекундах. Также у вас есть выбор: или просто восстановить таблицу или сохранить ее в какую-то новую без восстановления старой. Например, можно потренироваться сохраняя ее в виде тестовой, прежде чем точно правильно восстановить старую на ее прежнем месте.
При простом восстановлении ваша команда в консоли будет выглядеть примерно так:
bq cp имя_датасета.имя_таблицы@1665946435000 имя_датасета.имя_таблицы
где цифры 1665946435000 будут обозначать ваш момент времени в соответствии с Unix Timestamp.
Если вы хотите сохранить старую восстановленную таблицу под новым именем, то ваша команда будет выглядеть как:
bq cp имя_датасета.имя_таблицы@1665946435000 имя_датасета.имя_новой_таблицы
где цифры 1665946435000 будут обозначать ваш момент времени в соответствии с Unix Timestamp.
После ввода этой команды у вас появится строка, где нужно нажать ‘y’, что означает что вы подтверждаете операцию.
Вот пример того, как это может выглядеть в вашей консоли:
Вот и все, ваша удаленная таблица успешно восстановлена.
Подводя итог, хочется сказать, что удаление или повреждение вашей таблицы не такая критичная проблема, если вы успели уложиться в 7 дней для таблицы, которую повредили, и в 2 дня для таблицы, которую по ошибке удалили. Все эти команды выручали нас не один раз. Надеюсь, что они помогут и вам восстановить все без потерь.