KEMBAR78
初めての Spanner 移行 | PDF
初めてのSpanner移行

GCPUG Yokohama September 2019

https://ygcpug.connpass.com/event/143914/

注意事項

この発表は個人の意見であり、

所属する会社及び団体を

代表する発言ではございません

2
自己紹介

● Name

○ Toru Igarashi / iganari 

● Twitter

○ @iganari_

● Favorites

○ Ansible, Terraform, Kubernetes, Docker 

○ Python, Go

● Position

○ Cloud Ace Inc.

■ System Development Div. 

● SRE

● blood donation

○ 109 times

3
自己紹介

● 個人的にコミット(2019/01~)

○ JAWS DAYS 2019

○ No Ops Japan Community 

○ serverless DAYS TOKYO 2019 

4
アジェンダ

● 背景

● 事前調査

● ハマった(っている)ポイント

● Tips

5
アンケート

6
Spanner は…?

すべて理解した <-- -->人類には早すぎた

7
背景

8
背景

9
背景

OK !!

10
事前調査

11
インターネットから調べることが出来る情報

● 公式ドキュメント

○ https://cloud.google.com/spanner/docs/ 

○ https://cloud.google.com/spanner/docs/concepts 

● Samir さんの資料

○ https://www.slideshare.net/HammoudiSamir/cloud-spanner-78081604 

● メルペイさんのブログ

○ https://tech.mercari.com/entry/2018/11/22/112423 

○ https://tech.mercari.com/entry/2019/04/18/090000 

● 弊社社員の資料

○ https://www.slideshare.net/ExistMikan/cloud-spanner-84064544 

12
事前調査の直後の気持ち

13
やり始めて、1ヶ月くらいの気持ち

14
なにが起きたのか

● Spanner を構築する

○ Terraform を使い構築 

○ 最初から、 整備された DDL があれば ここで一緒にテーブルも作成可能 

○ IAM を用いて権限管理も分かりやすい 

● データ(レコード)のコピー

○ カラム名に Spanner が許容しない文字列が入っている 

○ データ型の変換が必要 

■ つまり、中のデータも変換が必要な場合がある 

○ 要件的に元の DB に変更は加えられない 

■ カラム足して、予め変換してから Spanner へコピーとか出来ない 

● データベースの移行にものすごく手間がかかる

○ Spanner の検証になかなか着手出来ない 

15
個人的にハマった(っている)ポイント

16
Spanner の命名規則の縛り

● データベースの名前

○ {a-z}[{a-z|0-9|_|-}+]{a-z|0-9} 

○ 先頭は小文字のみ

○ 末尾は小文字か数字のみ 

○ 大文字はいっさい使えない 

○ 作成後に変更不可

● テーブルとカラムの名前

○ {a-z|A-Z}[{a-z|A-Z|0-9|_}+] 

○ 先頭は大文字または小文字 

○ ハイフンが使えない

○ 大文字と小文字の区別は無い 

参考ドキュメント

https://cloud.google.com/spanner/docs/data-definition-language#database_statements 

https://cloud.google.com/spanner/docs/data-definition-language#create_table 



17
Spanner の時刻の制約

● DATE

○ 0001-01-01~9999-12-31 

○ タイムゾーンに関係なく、論理カレンダー日 

○ 本来はタイムゾーンと合わせて、解釈すべきものだけど… 

● TIMESTAMP

○ 0001-01-01 00:00:00~9999-12-31 23:59:59.999999999 UTC. 

○ 絶対的な時刻を表す 

■ ナノ秒まで記載可能 

○ 例

■ 2014-09-27T12:30:00.45Z 

参考ドキュメント

https://cloud.google.com/spanner/docs/data-types#date-type 

https://cloud.google.com/spanner/docs/data-types#timestamp-type 



18
Primary key について

● Spanner においては必須

○ すべてのテーブルにはプライマリキーが必要 

■ テーブルの各行を一意に識別するため 

○ プライマリキーを設定しない table も作成可能 

■ しかし、一行しかレコードが入らない 

● 他の RDBMS では必ずしも必須ではない

○ 既存のカラムを ALTERするか、新しいカラムを追加するか… 

19
参考ドキュメント

https://cloud.google.com/spanner/docs/schema-and-data-model?hl=ja#primary_keys 

Tips

● MySQL における TIME 型の変換

○ 公式では TIMESTAMP に変換してねと記載 

■ https://cloud.google.com/solutions/migrating-mysql-to-spanner 

○ しかし要件的には INTでいいかもしれない 

■ INT の場合も SELECT 文で ORDER BY が使える 

○ アプリの処理と大きく依存する 

○ ディベロッパーと確認するか、アプリのソースを読みましょう 

20
今の気持ち

21
See you Next time !! ;)

22

初めての Spanner 移行