接續上一篇文章,相信您已經做好前置作業與環境設置了。現在,Google Cloud 架構師將為您示範如何使用 Cloud Scheduler 和 Cloud Functions 將 MySQL 類型的 Cloud SQL 服務,定期匯出至 Cloud Storage,快來看看怎麼操作吧!

 

如何建立 Cloud Storage bucket 和 Cloud SQL 實例?

Step 1

建立 Cloud Storage bucket

執行指令 gsutil mb -l ${REGION} gs://${BUCKET_NAME}

Step 2

建立一個 Cloud SQL 實例並賦予權限

  • 執行下方指令,建立適用於 MySQL 5.7 實例的 Cloud SQL,此操作需要花幾分鐘的時間完成。

gcloud sql instances create ${SQL_INSTANCE} –database-version MYSQL_5_7 –region ${REGION}

  • 驗證 Cloud SQL 實例是否正常運行

gcloud sql instances list –filter name=${SQL_INSTANCE}

  • 若成功建立會顯示下方結果

Creating Cloud SQL instance…done.

Created [https://sqladmin.googleapis.com/sql/v1beta4/projects/direct-archery-297617/instances/sql-export-tutorial-sql].

NAME                 DATABASE_VERSION  LOCATION TIER          PRIMARY_ADDRESS  PRIVATE_ADDRESS  STATUS

sql-export-tutorial-sql  MYSQL_5_7     us-west2-a  db-n1-standard-1  35.236.117.157   –            RUNNABLE

  • 賦予啟用 Cloud SQL 服務的帳戶權限,並將資料導出至 Cloud Storage

export SQL_SA=(`gcloud sql instances describe ${SQL_INSTANCE} \

      –project ${PROJECT_ID} \

      –format “value(serviceAccountEmailAddress)”`)

   

gsutil iam ch serviceAccount:${SQL_SA}:projects/${PROJECT_ID}/roles/${STORAGE_ROLE} gs://${BUCKET_NAME}

 

Step 3

資料存入 Cloud SQL 實例

  • 接著,您可以將文件上傳到 Cloud Storage bucket,存入建立的資料庫。請切換至先前於遠端下載 Google 官方所提供之範例資料儲存庫。

cd training-data-analyst/CPB100/lab3a/cloudsql

  • 將目錄中的文件上傳到新的 Cloud Storage bucket

gsutil cp * gs://${BUCKET_NAME}

  • 查看結果

Copying file://accommodation.csv [Content-Type=text/csv]…

Copying file://rating.csv [Content-Type=text/csv]…

Copying file://table_creation.sql [Content-Type=application/x-sql]…

| [3 files][ 14.2 KiB/ 14.2 KiB]

Operation completed over 3 objects/14.2 KiB.

  • 建立並新增範例資料庫; Cloud shell 出現提示時,請輸入 Y 後繼續下方指令

i.) 匯入 .sql

gcloud sql import sql ${SQL_INSTANCE} gs://${BUCKET_NAME}/table_creation.sql –project ${PROJECT_ID}

成功後回傳結果

gcloud sql import sql ${SQL_INSTANCE} gs://${BUCKET_NAME}/table_creation.sql –project ${PROJECT_ID}

ii.)匯入 .csv

gcloud sql import csv ${SQL_INSTANCE} gs://${BUCKET_NAME}/accommodation.csv \

–database recommendation_spark \

–table Accommodation

成功後回傳結果

Importing data into Cloud SQL instance…done.

Imported data from [gs://g410536021-mysql-1607105107/accommodation.csv] into [https://sqladmin.googleapis.com/sql/v1beta4/projects/direct-archery-297617/instances

/sql-export-tutorial-sql].

iii.)匯入 .csv

gcloud sql import csv ${SQL_INSTANCE} gs://${BUCKET_NAME}/rating.csv \

–database recommendation_spark \

–table Rating

成功後回傳結果

Importing data into Cloud SQL instance…done.

Imported data from [gs://g410536021-mysql-1607105107/rating.csv] into [https://sqladmin.googleapis.com/sql/v1beta4/projects/direct-archery-297617/instances/sql-ex

port-tutorial-sql].

 

如何建立 Pub/Sub topic, a Cloud Function?

接下來,我們會教您建立一個 Pub/Sub 服務 topic,該 topic 會用於觸發執行任務。在替帳號建立 Cloud Function 時,首先要建一個服務帳號,並將其綁定到已啟用的 SQL Admin API。

Step 1

建立 IAM 帳號

  gcloud iam service-accounts create ${GCF_NAME} \

–display-name “Service Account for GCF and SQL Admin API”

Step 2

賦予建立好的帳號SQL訪問權限

  gcloud projects add-iam-policy-binding ${PROJECT_ID} \

  –member=”serviceAccount:${GCF_NAME}@${PROJECT_ID}.iam.gserviceaccount.com” \

–role=”projects/${PROJECT_ID}/roles/${SQL_ROLE}”

Step 3

建立並發布 pub/sub topics

gcloud pubsub topics create ${PUBSUB_TOPIC}

Step 4

建立名為 main.py 的檔案,並複製下方範例程式碼,貼到 Cloud Shell 中,完成 Cloud Function 建置

 cat <<EOF > main.py

 

import base64

import logging

import json

 

from datetime import datetime

from httplib2 import Http

 

from googleapiclient import discovery

from googleapiclient.errors import HttpError

from oauth2client.client import GoogleCredentials

 

def main(event, context):

pubsub_message = json.loads(base64.b64decode(event[‘data’]).decode(‘utf-8’))

credentials = GoogleCredentials.get_application_default()

 

service = discovery.build(‘sqladmin’, ‘v1beta4’, http=credentials.authorize(Http()), cache_discovery=False)

 

datestamp = datetime.now().strftime(“%Y%m%d%H%M”) # format timestamp: YearMonthDayHourMinute

uri = “{0}/backup-{1}-{2}.gz”.format(pubsub_message[‘gs’], pubsub_message[‘db’], datestamp)

 

instances_export_request_body = {

   “exportContext”: {

     “kind”: “sql#exportContext”,

     “fileType”: “SQL”,

     “uri”: uri,

    “databases”: [

       pubsub_message[‘db’]

     ]

   }

}

 

try:

   request = service.instances().export(

         project=pubsub_message[‘project’],

         instance=pubsub_message[‘instance’],

         body=instances_export_request_body

     )

   response = request.execute()

except HttpError as err:

     logging.error(“Could NOT run backup. Reason: {}”.format(err))

else:

   logging.info(“Backup task status: {}”.format(response))

EOF

Step 5

建立名為 requirements.txt 的檔案,並複製下方範例程式碼,貼到 Cloud Shell 中

cat <<EOF > requirements.txt

google-api-python-client

Oauth2client

EOF

Step 6

接著進行程式部署。本操作會花費數分鐘的時間

gcloud functions deploy ${GCF_NAME} \

–trigger-topic ${PUBSUB_TOPIC} \

–runtime python37 \

–entry-point main \

–service-account ${GCF_NAME}@${PROJECT_ID}.iam.gserviceaccount.com

成功後的結果:

Deploying function (may take a while – up to 2 minutes)…done.

 

如何建立 Cloud Scheduler Job 進行排程作業?

緊接著,就要教您如何建立 Cloud Scheduler 定期執行導出資料的任務。

Step 1

Cloud Scheduler Job 建 Google App Engine 實例

gcloud app create –region=${REGION}

Step 2

創建一個 Cloud Scheduler Job 以定期執行數據導出功能,排定於每日晚上11點執行

gcloud scheduler jobs create pubsub ${SCHEDULER_JOB} –schedule ‘0 23 * * *’ –topic ${PUBSUB_TOPIC} –message-body ‘{“db”:”recommendation_spark”,”instance”:’\”${SQL_INSTANCE}\”‘,”project”:’\”${PROJECT_ID}\”‘,”gs”:’\”gs://${BUCKET_NAME}\”‘}’ –time-zone ‘America/Los_Angeles’

 

測試範例

Step 1

手動執行 Cloud Scheduler Job 以觸發數據庫的MySQL轉儲。

gcloud scheduler jobs run ${SCHEDULER_JOB}

Step 2

列出在MySQL實例上執行的操作,並驗證是否存在 EXPORT 類型的操作

gcloud sql operations list –instance ${SQL_INSTANCE} –limit 1

執行結果:

NAME                              TYPE START                      END                        ERROR  STATUS

ecdd1ac1-45d3-4e31-9640-b712731ad987  EXPORT  2020-12-04T18:56:52.887+00:00  2020-12-04T18:57:03.502+00:00  –  DONE

Step 3

查看資料庫轉存的檔案是否存在

gsutil ls gs://${BUCKET_NAME} | grep backup-recommendation_spark

回傳結果會看到一個名為 backup-database_name-timestamp.gz 的壓縮檔名:

gs://g410536021-mysql-1607105107/backup-recommendation_spark-202012041856.gz

 

經過一系列的教學,相信您已經學會如何使用 Cloud Scheduler 和 Cloud Functions 將 MySQL 類型的 Cloud SQL 服務,定期匯出至 Cloud Storage了。透過存放資料於 Cloud Storage,企業可擬定多樣的災難恢復計劃,做好最全面的資料備份!

想了解更多 Google Cloud 的隱藏版實用功能,請持續鎖定宏庭架構師專欄,讓您新知訊息接不完喔!