В качестве рекомендации вы можете использовать Планирование запросов для планирования повторяющихся запросов в BigQuery, с помощью этой опции вы сможете планировать резервные копии на ежедневную, еженедельную, ежемесячную или произвольную периодичность, оставляя резервные копииваши столы на ночь или выходные.Вы можете найти больше информации об этом в следующей ссылке .
Но помните, что время резервного копирования будет зависеть от размера ваших таблиц.
Что ж, из-заВы упомянули, что Планирование запросов не вариант для вас, другой вариант, который вы можете попробовать, это запустить вашу команду cp в фоновом режиме, потому что вы работаете с циклом 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 минуты, чтобы завершить выполнение.
Вы можете адаптировать эту идею к своей реализации, просто рассмотрите квоты для Заданий копирования, вы можете проверить это здесь .