缓慢导入到Google Cloud SQL



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

按照文档,使用公共IP地址完成连接,但位于相同的区域和区域。我完全承认我做错了什么事。有没有什么事情是我应该马上改变的?

我们一直在通过云存储从包含SQL语句的zip文件中导入~30Gb,这花费了超过24小时。一个重要的因素是给定表上索引的数量。

为了便于管理,我们将文件分割成块,每个200K的sql语句被插入到一个事务中。这使我们能够在错误的情况下重试单个块。

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

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

#!/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

最新更新