BigQueryのテーブルは謝って削除しても復元可能です。しかし、重要なのはviewテーブルのクエリら定期的に全バックアップをしないと死亡するため、頑張ってシェル芸してみました。
■bq show
https://cloud.google.com/bigquery/bq-command-line-tool?hl=ja#listdatasets
- bq ls
1 2 3 4 5 6 7 8 |
$ bq ls --format=pretty adachin:views01 +--------------+------+--------+-------------------+ | tableId | Type | Labels | Time Partitioning | +--------------+------+--------+-------------------+ | test | VIEW | | | | xxxx | VIEW | | | | xxxx | VIEW | | | +--------------+------+--------+-------------------+ |
- bq show
1 |
$ bq show --format=prettyjson adachin:views.test > test.json |
- test.json
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
{ "creationTime": "1551424833736", "etag": "S/xxxxxxxxxxxxxxx==", "id": "adachin:views.test", "kind": "bigquery#table", "lastModifiedTime": "1551424833967", "location": "US", "numBytes": "0", "numLongTermBytes": "0", "numRows": "0", "schema": { "fields": [ { "mode": "NULLABLE", "name": "xxxxxxxx", "type": "INTEGER" }, { "mode": "NULLABLE", "name": "xxxxxxxx", "type": "INTEGER" }, { "mode": "NULLABLE", "name": "xxxxxxxx", "type": "STRING" }, { "mode": "NULLABLE", "name": "xxxxxxxx", "type": "INTEGER" }, { "mode": "NULLABLE", "name": "xxxxxxxx", "type": "STRING" }, { "mode": "NULLABLE", "name": "xxxxxxxx", "type": "INTEGER" }, { "mode": "NULLABLE", "name": "xxxxxxxx", "type": "STRING" }, { "mode": "NULLABLE", "name": "xxxxxxxx", "type": "STRING" }, { "mode": "NULLABLE", "name": "xxxxxxxx", "type": "DATETIME" }, { "mode": "NULLABLE", "name": "xxxxxxxx", "type": "DATE" } ] }, "selfLink": "https://www.googleapis.com/bigquery/v2/xxxxxxxx", "tableReference": { "datasetId": "views", "projectId": "adachin", "tableId": "test" }, "type": "VIEW", "view": { "query": "SELECT\n id\nFROM\n `adachin.xxxxxx.works`", "useLegacySql": false } } |
bq showで全ての情報がjsonで返ってくるので、一番下のqueryをいい感じに取ってきます。
■backup-all-views.sh
https://stackoverflow.com/questions/48814065/bigquery-backup-all-view-definitions
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
#!/bin/bash DIR=/home/adachin/backup/views/ DATE_YEAR=`date +%Y` DATE=`date +%m%d` OLD_DATE=`date +%m%d --date "5 days ago"` DATASETS=$(bq ls --format=sparse | tail -n+3) mkdir -p $DIR/$DATE_YEAR/$DATE for d in $DATASETS; do TABLES=$(bq ls --format=prettyjson "$d" | jq '.[] | "\(.id), \(.type)"') IFS=$'\n' for table in $TABLES; do [[ ! "$table" == *VIEW* ]] && continue view=$(echo "$table" | sed -e 's/"//g' | cut -d , -f 1) query=$(bq show --format=prettyjson "$view" | jq -r '.view.query') echo -e "$query" > "$DIR/$DATE_YEAR/$DATE/$view.sql" rm -rf "$DIR/$DATE_YEAR/$OLD_DATE" done done aws s3 cp /home/adachin/backup s3://xxxxxxxx/backup --recursive |
上記参考にしましたが、全viewテーブルのクエリをsqlで日付ごとに保存し、世代は5日で十分かと思います。実行すると以下のようにsqlファイルが出来上がり、クエリが保存されています。
※jqコマンド必須!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
$ tree backup/ backup/ └── views └── 2019 └── 0305 ├── adachin:views.test.sql.20190305 ├── adachin:views.xxxx.sql.20190305 ├── adachin:views.xxxx.sql.20190305 ~省略~ $ cat adachin:views.test.sql.20190305 SELECT id FROM `adachin.xxxxx.works` |
- cron
1 2 |
# run backup-all-views.sh 00 01 * * * sudo -u adachin bash -l /scripts/backup-all-views.sh |
S3にコピーすればOK!
■まとめ
これで削除しても復元可能!!バックアップ大事。
0件のコメント