当前,我正在复制具有以下内容的表:
#!/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
(来自here的脚本),但是大约需要20分钟(因为大约有600张表格)。也许还有另一种方法(最好更快)来进行备份?
答案 0 :(得分:0)
建议您使用安排查询来安排BigQuery中的重复查询,使用此选项,您将能够按每天,每周,每月或自定义的周期安排备份,而无需备份晚上或周末的餐桌上。您可以在以下link中找到有关此信息的更多信息。
但是请记住,备份花费的时间将取决于表的大小。
好吧,由于您提到安排查询不是您的选择,因此您可以尝试的另一种选择是在后台运行 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 Mb),因此在此过程中我花费的时间少了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分钟即可完成执行。
您可以将这种想法适应您的实现,只需考虑复制作业的配额,就可以here进行检查。