缓慢导入Google Cloud SQL

时间:2014-08-13 20:54:13

标签: google-cloud-sql google-compute-engine

Google Cloud SQL是我作为服务在MySQL上的第一次真正评估。我创建了一个D32实例,将复制设置为异步,并禁用了二进制日志记录。从同一区域中的GCE n1-standard-1实例的转储文件中导入5.5 GB需要97分钟。

根据文档,连接是使用公共IP地址完成的,但是在同一区域和区域中。我对我做错了事的事实完全敞开了。有什么明显的东西我应该做的不同吗?

1 个答案:

答案 0 :(得分:2)

我们已经从包含SQL语句的zip文件通过云存储导入~30Gb,这需要24小时。 一个重要因素是您在给定表上拥有的索引数。

为了保持可管理性,我们将文件拆分为每个200K sql语句的块,这些语句将插入到一个事务中。这使我们能够在出现错误时重试单个块。

我们也尝试通过计算引擎(mysql命令行)来实现,根据我们的经验,这甚至更慢。

以下是如何导入1个块并等待它完成。您无法并行执行此操作,因为cloudSql一次只允许1次导入操作。

#!/bin/bash

function refreshAccessToken() {
    echo "getting access token..."
    ACCESSTOKEN=`curl -s "http://metadata/computeMetadata/v1/instance/service-accounts/default/token" -H "X-Google-Metadata-Request: True" | jq ".access_token" | sed 's/"//g'`
    echo "retrieved access token $ACCESSTOKEN"
}

START=`date +%s%N`

DB_INSTANCE=$1
GCS_FILE=$2
SLEEP_SECONDS=$3

refreshAccessToken

CURL_URL="https://www.googleapis.com/sql/v1beta1/projects/myproject/instances/$DB_INSTANCE/import"
CURL_OPTIONS="-s --header 'Content-Type: application/json' --header 'Authorization: OAuth $ACCESSTOKEN' --header 'x-goog-project-id:myprojectId' --header 'x-goog-api-version:1'"
CURL_PAYLOAD="--data '{ \"importContext\": {  \"database\": \"mydbname\", \"kind\": \"sql#importContext\", \"uri\": [ \"$GCS_FILE\" ]}}'"
CURL_COMMAND="curl --request POST $CURL_URL $CURL_OPTIONS $CURL_PAYLOAD"

echo "executing $CURL_COMMAND"

CURL_RESPONSE=`eval $CURL_COMMAND`
echo "$CURL_RESPONSE"
OPERATION=`echo $CURL_RESPONSE | jq ".operation" | sed 's/"//g'`

echo "Import operation $OPERATION started..."
CURL_URL="https://www.googleapis.com/sql/v1beta1/projects/myproject/instances/$DB_INSTANCE/operations/$OPERATION"
STATE="RUNNING"
while [[ $STATE == "RUNNING" ]]
do
        echo "waiting for $SLEEP_SECONDS seconds for the import to finish..."
        sleep $SLEEP_SECONDS
        refreshAccessToken
        CURL_OPTIONS="-s --header 'Content-Type: application/json' --header 'Authorization: OAuth $ACCESSTOKEN' --header 'x-goog-project-id:myprojectId' --header 'x-goog-api-version:1'"
        CURL_COMMAND="curl --request GET $CURL_URL $CURL_OPTIONS"
        CURL_RESPONSE=`eval $CURL_COMMAND`
        STATE=`echo $CURL_RESPONSE | jq ".state" | sed 's/"//g'`
        END=`date +%s%N`
        ELAPSED=`echo "scale=8; ($END - $START) / 1000000000" | bc`
        echo "Import process $OPERATION for $GCS_FILE : $STATE, elapsed time $ELAPSED"
done