Большой запрос делает быстрое резервное копирование со многими таблицами

В настоящее время я копирую таблицы примерно так:

#!/bin/sh
export SOURCE_DATASET = "BQPROJECTID:BQSOURCEDATASET"
export DEST_PREFIX = "TARGETBQPROJECTID:TARGETBQDATASET._YOUR_PREFIX"
for f in `bq ls -n TOTAL_NUMBER_OF_TABLES $SOURCE_DATASET |grep TABLE | awk '{print $1}'`
do
  export CLONE_CMD = "bq --nosync cp $SOURCE_DATASET.$f $DEST_PREFIX$f"
  echo $CLONE_CMD
  echo `$CLONE_CMD`
done

(скрипт из здесь), но это занимает ~20мин (из-за ~600 таблиц). Может есть другой способ (желательно более быстрый), сделать бэкап?

Просто для справки: насколько велики эти 600 таблиц?

Felipe Hoffa 29.05.2019 03:11

Различается. Большинство из них небольшие (<100 МБ).

user2820173 29.05.2019 09:29
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
372
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В качестве предложения вы можете использовать Планирование запросов для планирования повторяющихся запросов в BigQuery. С помощью этой опции вы сможете планировать резервное копирование ежедневно, еженедельно, ежемесячно или с определенной периодичностью, оставляя резервные копии ваших таблиц на ночь или выходные. Вы можете найти больше информации об этом в следующем связь.

Но помните, что время резервного копирования будет зависеть от размера ваших таблиц.

Что ж, из-за того, что вы упомянули, что Планирование запросов не вариант для вас, другой вариант, который вы можете попробовать, — это запустить команду ср в фоновом режиме, потому что вы работаете с циклом for и ждете завершения каждого процесса вместо этого вы можете запустить несколько процессов в фоновом режиме, чтобы повысить производительность. Я сделал простой скрипт, чтобы проверить его, и он работает! Сначала я сделал тест без фонового процесса:

#!/bin/bash
start_global=$(date +'%s');
for ((i=0;i<100;i++))
do
    start=$(date +'%s');
    bq --location=US cp -a -f -n [SOURCE_PROJECT_ID]:[DATASET].[TABLE] 
    [TARGET_PROJECT_ID]:[DATASET].[TABLE] 
    echo "It took  $(($(date +'%s') - $start)) seconds to iteration umber: 
    $i"
done
echo "It took $(($(date +'%s') - $start_global)) seconds to the entire 
process"

На каждую скопированную таблицу у меня уходит около 5 секунд (примерно 160 МБ), поэтому я трачу меньше 10 минут на этот процесс, поэтому я изменил скрипт, чтобы использовать фоновый процесс:

#!/bin/bash
start_global=$(date +'%s');
for ((i=0;i<100;i++))
do
    bq --location=US cp -a -f -n [SOURCE_PROJECT_ID]:[DATASET].[TABLE] 
    [TARGET_PROJECT_ID]:[DATASET].[TABLE]  &
    pid_1=$!  # Get background process id
done
if  wait $pid_1
then
    echo -e "Processes termination successful"
else
    echo -e "Error"
fi
echo "It took $(($(date +'%s') - $start_global)) seconds to the entire 
process"

Таким образом, я трачу всего 3 минуты, чтобы закончить выполнение.

Вы можете адаптировать эту идею к своей реализации, просто учтите квоты для Копировать задания, вы можете проверить это здесь.

Мне нужны резервные копии только при определенных условиях, поэтому я не уверен, что планирование является правильным вариантом. В моем случае я запускаю все задания cp для асинхронного выполнения, и сумма времени отдельных запросов намного больше, чем время любого отдельного задания (на общую продолжительность резервного копирования не так сильно влияют самые большие таблицы, как количество столов).

user2820173 29.05.2019 09:35

Другие вопросы по теме