Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Plain db import with Go
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Seiji Takahashi
December 12, 2016
Technology
6.6k
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Plain db import with Go
golang.tokyo#2での発表資料です。
Seiji Takahashi
December 12, 2016
More Decks by Seiji Takahashi
See All by Seiji Takahashi
AIエージェントのデータガバナンスの最新事情。そしてプロダクトのAIファースト化
timakin
0
3.3k
営業、広報、開発。 多面的なAIネイティブ化のための 基盤について
timakin
0
210
権限と承認 〜ユーザー信頼性に繋がる管理画面の根幹について〜
timakin
0
920
Go Backends for frontends with GraphQL and gRPC
timakin
6
4.2k
Design Pattern for Image and Text Composition in Go
timakin
5
6.9k
Golang API Testing the HARD way
timakin
13
7.2k
Head First Golang Image Package
timakin
2
10k
React Native Beyond Prototype
timakin
2
1.7k
Performance Optimization on Google AppEngine
timakin
5
6.7k
Other Decks in Technology
See All in Technology
水を運ぶ人としてのリーダーシップ
izumii19
3
720
AIのReact習熟度を測る
uhyo
2
670
事業会社における 機械学習・推薦システム技術の活用事例と必要な能力 / ml-recsys-in-layerx-wantedly-2026
yuya4
0
120
AWS Security Agent といっしょに脅威モデリングをやってみよう
amarelo_n24
1
200
コミュニティの有益性 ~JAWS Days 2026 での体験を通して~ / The Benefits of a Community ~Through My Experience at JAWS Days 2026~
seike460
PRO
0
260
Agile and AI Redmine Japan 2026
hiranabe
3
430
SONiC Scale-Up Working Group から探る Scale-UpやUltraEthernet機能の実装方法
ebiken
PRO
2
450
あなたの知らないPDFのアクセシビリティ
lycorptech_jp
PRO
0
230
Flow 不死:AI 時代 DevOps 的不變本質
cheng_wei_chen
2
460
GitHub Copilot app最速の発信の裏側
tomokusaba
1
230
AI-DLCを “そのまま導入しなかった”話 ~組織に合わせてアジャストした 私たちの実践共有~
hiroramos4
PRO
1
370
【Cyber-sec+】経営層を"動かす"ための考え方
hssh2_bin
0
200
Featured
See All Featured
Are puppies a ranking factor?
jonoalderson
1
3.6k
Large-scale JavaScript Application Architecture
addyosmani
515
110k
Un-Boring Meetings
codingconduct
0
320
Dominate Local Search Results - an insider guide to GBP, reviews, and Local SEO
greggifford
PRO
0
200
Git: the NoSQL Database
bkeepers
PRO
432
67k
Building a Modern Day E-commerce SEO Strategy
aleyda
45
9.1k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
250
1.3M
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
62
44k
Optimising Largest Contentful Paint
csswizardry
37
3.7k
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.8k
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
3
170
KATA
mclloyd
PRO
35
15k
Transcript
golang.tokyo #2 @__timakin__ Plain db import with Go
ࣗݾհ • timakinͱ͍͍·͢ɻ • twitter: @__timakin__ github: timakin • ࠷ۙboot.fmͱ͍͏
ϙουΩϟετΛ࢝Ί·ͨ͠ɻ
timakin/gopli https://github.com/timakin/gopli
timakin/gopli • Plain DB import tool with toml configuration. •
Without complex replication settings. $ gopli sync -f production -t local -c config/repli.toml
ͳͥ࡞͔ͬͨ • http://techlife.cookpad.com/entry/2014/10/03/110806
ͳͥ࡞͔ͬͨ • ຊ൪ͷσʔλΛ؆୯ʹϩʔΧϧʹ͖࣋ͬͯͨ͘ ͳΓ·͢ΑͶʁʢεςʔδϯάʹϨϓϦͯ͘͠ Δͷɺผ్͋Δͱͯ͠ʣ • Կʮname: testʯͳϢʔβʔɺʮcontent: aaaaaaaaaaaaaaaaʯͳߘ༰࡞͔ͬͨʁ •
seedσʔλ࡞Δͷਏ͘ͳ͍Ͱ͔͢ʁ
طଘͷํ๏ • ͔͍͋ͬͨshell • mysqlpump • maxbube/mydumper • mysqldump͕γϯάϧεϨουͳͷʹରͯ͠ɺ ্ه̎ͭϚϧνεϨου
• উखʹઃఆܾΊͱ͍ͯҙͷλΠϛϯάʹ ίϚϯυΛࢥ͍ग़ͣ͞ʹར༻ग़དྷΔͷ͕ͳ͍…
ࡶͳσʔλίϐʔͷϝϦοτ • ࡶͳೖྗσʔλͰͷςετ࠷దͳݟͨɺUXͷअຐΛ͠·͢Ͷʁ • ݟͨɿϨΠΞτͷͨΊʹtruncate͢Δจࣈྔௐɺ͕ͬͭΓͣ ΕΔը૾αΠζ • ։ൃ໘ɿόάͬͨ࣌ʹຊ൪ΛߥΒͣ͞ϩʔΧϧͰ࠶ݱͰ͖Δ֬Λ ্͛ΒΕΔɺϩʔΧϧ։ൃ࣌ͱຊ൪orεςʔδϯάͰվળʢਏ ͍ΫΤϦൃݟʣΛΪϟοϓͳ͘ߦ͑Δɻ
• ࣌ؒɿʢʮϒϥϯνAΛςετ͍ͨ͠ͷͰϒϥϯνBͷεςʔδϯά ͷσϓϩΠ15࣌͘Β͍͔Β͓ئ͍͠·͢ʯ͕ͳ͍ʣ
σʔλͷͱ͖ͬͯํ • ςʔϒϧҰཡͷऔಘ • goroutineΛར༻ͭͭ͠ɺςʔϒϧ͝ͱʹλϒ۠ΓͷSELECT݁ՌΛ tmpϑΝΠϧͱͯ͠txtʹอଘ • schema_migrations, repli_chkͷςʔϒϧϒϥοΫϦετͱͯ͠আ֎ •
ೖઌͷDBͷςʔϒϧΛҰ୴DELETE͢Δ • LOAD DATA LOCAL INFILEͰσʔλΛϦετΞɻ͜ͷࡍʹ֤ςʔϒϧ ʹಉ࣌ʹσʔλΛೖΕΔͨΊʹgoroutineΛར༻
toml configuration • TOML࠾༻͠·ͨ͠ɻ ڥ͝ͱͷଓઃఆɻ [database] [database.local] host = "localhost"
management_system = "mysql" name = "app_development" user = "root" password = "" [database.staging] host = "xxx.xxx.xxx.xxx" management_system = "mysql" name = "app_staging" user = "root" password = "" [database.production] host = "yyy.yyy.yyy.yyy" management_system = "mysql" name = "app_production" user = "root" password = ""
tomlͷϝϦοτ • ίϝϯτ͕͚ΒΕΔ • Array͕දݱ͍͢͠ • Tableͱ͍͏୯Ґ(gopliͩͱdatabase, sshͱ͍͏୯ҐΛ༻͍· ͨ͠)Ͱkey-valueΛάϧʔϓԽͰ͖Δɻ͜ΕʹΑͬͯෳڥ ͷଓઃఆ͕֊ߏͰॻ͚ΔΑ͏ʹͳΓ·͢
• BurntSushi/tomlͰtomlΛparse͢ΔɻValidator͜ͷϥΠϒϥ Ϧ͕ఏڙͯ͘͠ΕΔɻ
ઃఆϑΝΠϧΛಡΈࠐΉ • ssh༻ͷ伴ͷઃఆͳͲΛॻ͘ͱ͖ɺઈର”~/”ͱॻ͖·͕͢ɺ ৺ͩͬͨͷͰfilepathʹਖ਼֬ͳύεΛಡ·͍ͤͨɻ • os/userͷuser.Current()ͱɺͦͷuserͷHomeDir͕औΕΔ ͷͰɺ”~/”Λstrings.ReplaceΛͬͯஔ͖͑Δɻ • ʮ͜ΕΈΜͳͷGoݴޠͰͬͨ͜ͱͩʂʯ ͜ΕͰೋͱstrings.Replacerʹٽ͔͞Εͳ͍ͰࡁΉͧɻ
mysqlͷଓ • go-mysql-driver/mysqlܦ༝ͰͷϦϞʔτͷଓconstͰܾΊΒΕͯΔ maxPacketSizeΛ͑Δͱଈࢮ͠·ͨ͠ͷͰ͑ͣɻ • mysql -h ͰͷଓࢼΈ·͕ࣦͨ͠ഊɻgo-mysql-driver/mysqlΈͨ͘ Keep-Aliveͯ͘͠Εͳ͍ͷ͔ɺଈࢮ͠·ͨ͠ɻ •
Ͳ͏ΒϩʔΧϧͷmysqlΫϥΠΞϯτʹଓॲཧΛͤͯgoroutineΛ ͓͏ͱͯ͠ɺίωΫγϣϯ͕૿͑ΔͷͰࢮɻɹ • sshͰଓͨ͠ޙɺsession.RunͰʹΫΤϦΛ࣮ߦ͢ΔखஈΛऔΕɺί ωΫγϣϯΛ̍ͭுΓͭͭηογϣϯΛ૿ͤΔ & ఆͷ੍Λ֎ͤΔͷ Ͱɺฒྻ࣮ߦͰ͖Δ༷ࢠɻʢਏ͍ʣ
্࣮ͷ • golangύεϑϨʔζ͖ͷൿີ伴ΛparseͰ͖ͳ͍ͷͰɺopensslͰͷ ෮߸ͨ͠ΩʔΛར༻͠ͳͯ͘ͳΒͳ͍ɻ • σʔλྔ͕ଟ͍ͱϨεϙϯεͰࢮ͵ͷͰηϚϑΥͰಉ࣌ʹ3~5ݸఔͷ ςʔϒϧʹฒྻʹϦΫΤετΛ͛Δɻ • ϨεϙϯεͷύέοτྔΛ͍͍ײ͡ʹ੍ݶͰ͖ΔϥΠϒϥϦ͕͋ͬͨΒڭ ͍͑ͯͩ͘͞…
• mysqldumpͩͱsqlͷσʔλྔ͕૿͑ͯ͠·͍ͦ͏ͩͬͨͷͱɺ ൿಗͷͨΊʹޙ͔ΒσʔλΛॻ͖͍͑ͨ࣌ͱ͔ʹศརͦ͏ͩͬͨͷͰɺ ςʔϒϧ͝ͱʹSELECTͨ݁͠ՌΛtxtʹॻ͖ग़͢खஈΛͱΓ·ͨ͠ɻ
goroutineΛ͏໘ sem := make(chan int, MaxFetchSession) var wg sync.WaitGroup for
_, table := range tables { wg.Add(1) go func(table string) { sem <- 1 defer wg.Done() defer func() { <-sem }() session, err := conn.NewSession() if err != nil { panic("Failed to create session: " + err.Error()) } defer session.Close() var fetchTableStdoutBuf bytes.Buffer session.Stdout = &fetchTableStdoutBuf fetchRowsCmd := fmt.Sprintf(SelectTablesCmd, srcDBConf.User, srcDBConf.Password, srcDBConf.Name, table) err = session.Run(fetchRowsCmd) MySQL1ΫΤϦΛΑ͠ͳʹϚ ϧνίΞͰͬͯ͘ΕΔΈ ͕ͳ͍ͷͰɺμϯϓ/ϦετΞΛ goroutineͰฒྻԽ͢Δ͜ͱͰɺ γϡοͱσʔλΛऔͬͯ͜Ε· ͢ɻ
ࠓޙͷ՝ • sshͷηογϣϯͷඪ४ग़ྗΛͦͷ··͖࣋ͬͯͯɺϩʔΧϧͰtxtʹىͯ͜͠Δͷ ͰɺҰϦϞʔτͰॻ͖ग़ͨ͠txtΛgzipѹॖͯͦ͠ΕΛऔͬͯ͘Δɺͱ͔͕Ͱ͖ͳ ͯ͘ࠔͬͯΔɻ • sshͷϨεϙϯε͕Ͱ͔͗͢Δͱͨ·ʹଓ͕ΕΔͷͰϦτϥΠ/సૹྔ੍ޚ͕ඞ ཁ • γʔΫϨοτΧϥϜͷӅṭ
• mysqlҎ֎ͷରԠ • ύεϑϨʔζ͖ͷ伴Ͱ͑ΔΑ͏ʹ… • IDʹҙͷoffsetΛઃఆͰ͖ΔΑ͏ʹ͢Δ
timakin/gopli https://github.com/timakin/gopli ԿଔͬͯΈ͍ͯͩ͘͞ʂ