В настоящее время я копирую таблицы примерно так:
#!/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 таблиц). Может есть другой способ (желательно более быстрый), сделать бэкап?
Различается. Большинство из них небольшие (<100 МБ).
В качестве предложения вы можете использовать Планирование запросов для планирования повторяющихся запросов в 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 для асинхронного выполнения, и сумма времени отдельных запросов намного больше, чем время любого отдельного задания (на общую продолжительность резервного копирования не так сильно влияют самые большие таблицы, как количество столов).
Просто для справки: насколько велики эти 600 таблиц?