Подробная инструкция, которая поможет восстановить случайно удаленные данные и не поседеть раньше срока

Вы когда-нибудь случайно удаляли важную таблицу, представление или весь набор данных в Google BigQuery? Если да, то вы знаете, что не можете продолжать работу с таблицами и запросами, содержащими удаленные данные.

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

Вы можете восстановить удаленную таблицу, если с момента ее удаления не прошло более семи дней и если вы знаете ее имя и имя набора данных, из которого она была удалена.

Чтобы восстановить таблицу, откройте командную строку Cloud Shell в интерфейсе Google BigQuery:

Введите следующую команду:

bq cp mydataset.mytable@-3600000 mydataset.newtable

Пример той же команды с именами таблиц и наборов данных:

bq cp OWOXBI_Reports.123_Transactions_withModels@-13600000 OWOXBI_Reports_Restore.123_Transactions_withModels

Где:

  • OWOXBI_Reports.123_Transactions_withModels — набор данных и таблица, которые были удалены.
  • OWOXBI_Reports_Restore.123_Transactions_withModels — набор данных и имя таблицы в нем, в которую вы хотите восстановить данные.
  • @-13600000 — расстояние в прошлом (13 600 000 миллисекунд назад), когда искомая таблица еще существовала. Например, если таблица была удалена 30 минут назад, достаточно задать временной интервал @-3600000, то есть час назад (60 секунд × 60 минут × 1000).

После ввода запроса требуется авторизация. Нажмите кнопку Авторизоваться:

После успешного выполнения команды таблица будет восстановлена:

Вы увидите текст, похожий на этот:

Waiting on bqjob_r4ca30008c2e3147d_0000017af0d58e5e_1 ... (0s) Current status: DONE Table 'summer-drive-112011:OWOXBI_Reports_Restore.test_table@-600000' successfully copied to 'summer-drive-112011:OWOXBI_Reports_Restore.test_table'

Как восстановить удаленный вид

Вы не можете восстановить удаленный просмотр описанным выше способом. Этот метод подходит только для таблиц.

Служба поддержки Google рекомендует использовать Logs Explorer для восстановления удаленного представления.

Чтобы найти запросы, которые обновили удаленное представление, выполните следующий запрос в журналах Google Cloud Platform:

resource.type="bigquery_resource" protoPayload.methodName="tableservice.update" protoPayload.serviceData.tableUpdateRequest.resource.tableName.tableId="custom_events_attribution_VIEW"

Где:

  • tableservice.update — команда для отображения обновления представления в логах
  • custom_events_attribution_VIEW — название представления

В настройках Выбрать временной диапазон задайте период, в течение которого можно вносить изменения в представление (например, один год):

При выполнении команды будут отображены все запросы, обновившие искомое представление. Выберите последний запрос метки времени:

Скопируйте запрос из журнала и заново создайте представление.

Кроме того, вы можете найти запрос, создавший искомое представление (до этого мы искали запросы, обновляющие представление). Для этого используйте следующую команду:

resource.type="bigquery_resource" protoPayload.methodName="tableservice.insert" protoPayload.serviceData.tableInsertRequest.resource.tableName.tableId="query_name_VIEW"

Мы рекомендуем установить максимально длительный период для поиска в журналах необходимой записи.

Если представление было создано до начала записи логов, восстановить его будет невозможно. В этом случае может помочь описанная выше команда tableservice.update.

Как восстановить удаленный набор данных

Если вы удалите набор данных, вы не сможете его восстановить. Вы должны создать новый набор данных с тем же именем, восстановить таблицы и представления, которые были в удаленном наборе данных, и переместить их в новый набор данных.

В первые 24 часа после удаления набора данных вы не можете создать новый набор данных с тем же именем, но вы можете найти имена таблиц и представлений, которые были частью удаленного набора данных. Однако сами таблицы и представления больше не будут видны.

Вы можете найти представления из удаленного набора данных по имени, выполнив поиск в BigQuery:

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

Чтобы найти имя таблицы в удаленном наборе данных, используйте следующий SQL-запрос. В запросе укажите период, в течение которого таблицы могут быть изменены (creation_time BETWEEN). В результате запрос вернет таблицы, в которые были внесены изменения в течение какого периода времени. Это будут таблицы из удаленного набора данных.

SELECT 
  * 
FROM ( 
  SELECT 
    query, 
    user_email,         CONCAT(destination_table.project_id,".",destination_table.dataset_id,".",destination_table.table_id) AS destination_table, 
COUNT(job_id) AS job_ids, 
MAX(creation_time) AS lastUpdateDate 
FROM 
  region-us.INFORMATION_SCHEMA.JOBS_BY_PROJECT 
WHERE 
  creation_time BETWEEN TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 180 DAY) 
  AND TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 0 DAY) 
  AND state = 'DONE' 
AND CONCAT(destination_table.project_id,".",destination_table.dataset_id,".",destination_table.table_id) LIKE "%OWOXBI_Reports.%" 
GROUP BY 
  1, 
  2, 
  3 
ORDER BY 
  5 DESC)

В результате запроса вы получите следующую информацию:

  • query — текст запроса, который внес изменение в target_table
  • user_email — пользователь, который инициировал запрос на обновление таблицы target_table
  • назначение_таблица — таблица, которая была обновлена
  • job_ids — количество запусков запроса за указанный интервал времени (creation_time BETWEEN …)
  • lastUpdateDate — время последнего запуска запроса (MAX(creation_time) AS lastUpdateDate)

Через двадцать четыре часа после удаления набора данных вы можете создать новый набор данных с тем же именем и приступить к восстановлению таблиц и представлений.

Что делать, чтобы предотвратить подобные проблемы в будущем

  1. Включите сбор логов в своем проекте Google BigQuery, когда начнете работать с проектом.
  2. Не называйте таблицу и просматривайте ее так же, как набор данных.
  3. Дважды проверьте имя любой таблицы, которую вы хотите удалить из Google BigQuery.
  4. Удаляйте таблицы с помощью запросов, а не через пользовательский интерфейс.
  5. Добавьте тип объекта к именам наборов данных, таблиц и представлений. Например:
  • OWOXBI_report_dataset
  • OWOXBI_report_table
  • OWOXBI_report_view

Вы можете удалить таблицу с помощью запроса:

DROP TABLE `summer-drive-112011.OWOXBI_Reports_Restore.test_table`

Вы также можете удалить представление с помощью запроса:

DROP VIEW `summer-drive-112011.OWOXBI_Reports_Restore.test_VIEW`

Что делать, чтобы уменьшить масштаб проблемы, если она повторится

  • Не меняйте запросы в Schedule и Google Apps Script; на следующий день восстановить все представления и таблицы, после чего Schedule и Google Apps Script будут работать корректно.
  • Если представление или таблица участвовали в настройке модели атрибуции, вам потребуется перезапустить расчет атрибуции после восстановления данных в прежнее место.

Полезные ссылки по теме:

Восстановление удаленных таблиц

Удаление таблицы

Управление представлениями

Как мгновенно восстановить таблицу в Google BigQuery