处理 gcloud sql 实例创建期间的超时



我正在使用gcloud sql instances create来创建CloudSQL实例。通常情况下,该命令会超时,但会提供一个命令来等待 databse 创建完成。

$ gcloud sql instances create mydb
Creating Cloud SQL instance...failed.
ERROR: (gcloud.sql.instances.create) Operation https://www.googleapis.com/sql/v1beta4/projects/foobar/operations/abcd is taking longer than expected. 
You can continue waiting for the operation by running `gcloud sql operations wait --project foobar abcd`
$ gcloud sql operations wait --project foobar abcd
Waiting for [https://www.googleapis.com/sql/v1beta4/projects/foobar/operations/abcd]...done.
NAME  TYPE    START                          END                            ERROR  STATUS
abcd  CREATE  2018-03-19T15:04:29.477+00:00  2018-03-19T15:10:08.561+00:00  -      DONE

我想知道是否可以配置gcloud sql instances create超时?我似乎在文档中找不到任何东西,甚至没有默认使用的超时。

另一种选择是异步启动实例创建,列出挂起的操作并等待其完成:

$ gcloud sql instances create mydb --async
$ PENDING_OPERATIONS=$(gcloud sql operations list --instance=mydb --filter='status!=DONE' --format='value(name)')
$ gcloud sql operations wait "${PENDING_OPERATIONS}"

但话又说回来,gcloud sql operations wait会在某个时候超时吗?文档也没有提到任何超时。

我认为它会超时,因为我正在最小的可用机器上创建MySQL实例:db-f1-micro这对于我的开发平台来说已经足够了。

我已经尝试了几个选项来捕获命令输出并运行建议的命令,但找不到获取它的方法。就好像输出是印在标准或标准输出的其他东西上一样。

我尝试了以下方法:

MyVAR=$($COMMAND)
$COMMAND | tee command.log
$COMMAND 2>&1 > command.log

如果我们可以捕获命令的输出,那么我的脚本 bellow 就可以工作了。

gcloud sql instances create ${MYSQL_INSTANCE}    
        --assign-ip                              
        ${BACKUP}                                
        ${BACKUP_START_TIME}                     
        ${BACKUP_ENABLE_BIN_LOG}                 
        --database-flags=${MYSQL_FLAGS}          
        --database-version=${MYSQL_DB_VERSION}   
        --gce-zone=${MYSQL_ZONE}                 
        --maintenance-release-channel=production 
        --maintenance-window-day=MON             
        --maintenance-window-hour=4              
        --pricing-plan=PER_USE                   
        --storage-auto-increase                  
        --storage-size=${MYSQL_STORAGE}          
        --storage-type=${MYSQL_STORAGE_TYPE}     
        --tier=${MYSQL_TIER}                     
        --format=json                            | tee logs/${COUNTRY}-${ENV}.log
GCLOUD_CREATE_INSTANCE_RETURN_CODE=$?
if [ ${GCLOUD_CREATE_INSTANCE_RETURN_CODE} -eq 0 ]
then
  echo "Successfully created DB"
else
  echo "Error returned while creating the DB"
  TIMEOUT_ERROR=$(cat logs/${COUNTRY}-${ENV}.log | tail -1 | grep "gcloud beta sql operations wait" | wc -l)
  if [ "${TIMEOUT_ERROR}" = "1" ]
  then
    echo "It's a timeout error, continue waiting"
    FOLLOW_UP_COMMAND=$(cat logs/${COUNTRY}-${ENV}.log | tail -1 |cut -d '`' -f2)
    ${FOLLOW_UP_COMMAND}
  else
    echo "It's NOT a timeout error"
    echo "return code : ${GCLOUD_CREATE_INSTANCE_RETURN_CODE}"
    echo  ${GCLOUD_CREATE_INSTANCE_OUTPUT}
    exit 1
  fi
fi

gCloud SQL Users set-password root --instance=${MYSQL_INSTANCE} --password=${MYSQL_ROOT} --host "%">

最后,我最终在创建实例命令之后睡了一个大觉,以便我可以设置 root 密码。

对于 db-f1-micro,完成创建需要 2 分 53 秒的时间。

wait 命令中有一个 --timeout 标志(不确定它是否是最近添加的(。默认值为 300s。

https://cloud.google.com/sdk/gcloud/reference/sql/operations/wait

所以你可以做gcloud sql operations wait "${PENDING_OPERATIONS}" --timeout=unlimited

相关内容

  • 没有找到相关文章

最新更新