この記事は JPOUG Advent Calendar 2021 - Adventar 17日目の記事です。 昨日はShinodaさんの「Oracle Database から PostgreSQL への接続を試す - Qiita」でしたね。 いやーOracle Database Gateway for ODBC全然使ったことがなかったので、これはぜひやってみよ…あれ、RDSでできるの?明日AWSサポートに早速連絡してみよう… 最近ブログを書く頻度がアドベントカレンダー以外書く頻度がない感じになってきております…コレハ、マズイ、ゾ!!笑 さて弱気な内容はおいておいて…ここ最近、ろくに活動もできなかったのはこれをやっていたからなのです。 そうよくある、(꜆꜄•ω•)꜆꜄꜆オンプレOracleからRDSに移行した話。 今更感あるのですが、私と同じミスを減らすきっかけになれば。と思い、書いてみます。

 

https://wakelet.com/@3bvzg7hkf53x552
https://wakelet.com/wake/J9H_y6U4hJvuPxDfQhXbH
https://wakelet.com/wake/mSF982GaLC4gcBjrzwhbk
https://wakelet.com/wake/etxBfD_hRpgQJu457Uhge
https://wakelet.com/wake/xS73_CT-gDRR--e_jULLq
https://wakelet.com/wake/n_Xju8ZNZRziZncS6v35A
https://wakelet.com/wake/qe7My_ry0bor6p-Pb4wIv
https://wakelet.com/wake/B16SBn4DCnr_XmoVPqJZb
https://wakelet.com/wake/CIMk5TVfqxuSHGyJEAsdD
https://wakelet.com/wake/pPcdEmKdsUWuzOs0T-0Bz
https://wakelet.com/wake/mM6NmuGomxKocDM36eabP
https://wakelet.com/wake/eEcWMmKdxY96Wes4yW1Uw
https://wakelet.com/wake/FzHD9fHMBoNV302bhngeN
https://wakelet.com/wake/NopViVhBQkV6NbESI0TgU
https://wakelet.com/wake/FhQ92n9ux8OSl-jnk_NXj
https://wakelet.com/wake/vn3spDdR6ot_bIysbwGVM
https://wakelet.com/wake/Uk_9QXzsrCHnQBEgwA-J6
https://wakelet.com/wake/MrdlN7gqk7Sr-xk_X68m2
https://wakelet.com/wake/uMAz5iuF0td-HOlKP9IbL

結論

結論を最初に書くのが大事なので、これ一番最初に書きます。
私の反省は、以下の3つです。
本当はいっぱい書きたいけど、そうすると長すぎるのでやめましょう。

  1. 性能試験は必ずしましょう
  2. DB移行で一番大事なのはNWです
  3. 運用の見直しを忘れずに

https://wakelet.com/wake/9eYaVqw5Al1V-FYqowHK2
https://wakelet.com/wake/URGj7HJSieFE3c9CKylvW
https://wakelet.com/wake/V7jLkdOPGJH20wAbCflYB
https://wakelet.com/wake/d52cLIa1GcSeq2RrvFlEG
https://wakelet.com/wake/B_CwFzt9yn6lBM-0LVsG3
https://wakelet.com/wake/TcDyRPax2CFcmgj_9-_4d
https://wakelet.com/wake/OjlkNhZSaLx9jPS53qSK4
https://wakelet.com/wake/zsXPwLsLYvhQDpO1hcX3G
https://wakelet.com/wake/ZQYue7ouQzQ9O8EXjsNT0
https://wakelet.com/wake/bLmLj9RPqxmwl7wfM8yDh
https://wakelet.com/wake/ebkNPGW3rkXLo11kAqDK2
https://wakelet.com/wake/rLyrotbafaPPcUL64Xo41
https://wakelet.com/wake/2jrqSYZpg4OXmAfZLVDPo
https://wakelet.com/wake/Am1G78A0Cx_fvq-YbKHdJ
https://wakelet.com/wake/3e1HznZpAxy3JOZbILB2j
https://wakelet.com/wake/C_YfqqhlqHUM66nr-TT8K
https://wakelet.com/wake/FitNTPn41KKiiugpn71AO
https://wakelet.com/wake/1chlzibu0r6Ol5Zaqncmo
https://wakelet.com/wake/E11Nf4Qd7KmudlPB1gha4
https://wakelet.com/wake/QtvOWVKyRYYjxEa2mNJiz
https://wakelet.com/wake/s1wTrSsF4g3dkAIUJV_2f
https://wakelet.com/wake/pYHB1PB9134NUVtdSya-d
https://wakelet.com/wake/UVWYESQT0bemjTKqVtUH4
https://wakelet.com/wake/dO4BPUhtCo4Xglt10f0vS
https://wakelet.com/wake/jG1iYkJLqk5jdUZrDXKfL
https://wakelet.com/wake/Efd-lFO4a_btcT0_Wro2f

 

かいたひと

これを書いた人は、10年ちょいSIerで開発PM→DBA→DBチームリーダーをしていた人でした。DB移行回数は…数えるのやめましょう。 ずっとオンプレOnly、パブリッククラウドはAWSですら未経験の人です。 もう数年SQLを打つことさえしなくなり(設計計画とマネジメントしかしない)、現場の仕事がしたいなぁと思って心機一転、全く別業種の社内DBAに転職してみました。

 

https://wakelet.com/wake/GR8eHYzZjFmbkZYj7RVQp
https://wakelet.com/wake/YivQG8a0p7gT2XEgRE_zs
https://wakelet.com/wake/821RDqCGt76zRQjgjm7Gm
https://wakelet.com/wake/b_gGnGgX-i3d308Y97F5L
https://wakelet.com/wake/1veEb2a2FyRFXRvKe60oQ
https://wakelet.com/wake/YJ1lJxwqGP0x6rXR-j0FD
https://wakelet.com/wake/n5c_a22gKNTGyFXL8U6Mu
https://wakelet.com/wake/IdY_wZxcOgX72IIH3FE7T
https://wakelet.com/wake/3ilLiqH1vSX85W-tm-w-r
https://wakelet.com/wake/qqAVg9V0EAb-BbICZsRHZ
https://wakelet.com/wake/iaI01AwH6OdA_B5oKVzRe
https://wakelet.com/wake/BdnqmGC8IiplSzzWhFueY
https://wakelet.com/wake/NIYUNGoP-ZnAStQ7ncpbT
https://wakelet.com/wake/Md7_tDWoAX9Xau5ssZjpN
https://wakelet.com/wake/zZ6lP-QHjXWeEWkpQD9Sz
https://wakelet.com/wake/plnX15_FspCeQ9b2Yc7Qx
https://wakelet.com/wake/zpaKvq5s3kwXlXjzNL9Ne
https://wakelet.com/wake/oLp7gnlGTgFLksp8p3H8V

 

前提

転職後、とあるDBの移行プロジェクトにアサインされました。 移行元のDBはシステムの最も重要なDBでした。 ほとんどのシステム、業務処理がそのDBを利用しており、そのDB停止=サービスほぼ全停止、という会社において最もミッションクリティカルなDBです。 私が参画段階では既にAWS RDSで移行することも、その移行先のRDSサイズや構成も決められていました。 AWSさんがしっかり入って検討してくださっていて、先方のエンジニアの方も凄腕のDBエンジニアさんでした。 転職直後ということもあり、事前検討はしっかりされているのだろうなと考え、私は計画や全体の流れではなく技術的に細かいことを検討することに集中しようと考えました。 これだけ見ると、とても順調に進んでいるように見えたのです。 ところが…まぁ、そうですよね。順調にいかないのがDB移行。もちろん、沢山の問題が発生しました。

 

https://out.paiza.io/projects/RwFJgsgyZEdsVXLxo-ur7Q
https://paiza.io/projects/1iPnOX4af7CZU-GuFRo_Kg
https://paste.ee/p/vsMlg
https://paste2.org/tg4mDM7B
https://notes.io/SkxC
https://rentry.co/qdtzc
https://p.teknik.io/DFZ4g
https://dpaste.com/AHNZMYRLW
https://paste.feed-the-beast.com/view/e6fad1fa
http://ben-kiki.org/ypaste/data/46945/index.html
https://paste.rs/GFq
https://te.legra.ph/ae0aa1bx0ogu8-12-17
https://telegra.ph/7wjmlu1y9n6r2-12-17
http://cpp.sh/5bkie

 

反省その①:性能試験ができないDBの移行 最初に躓いたのはこちらでした。 試験計画(一応作った)を作っていたところ…突然、想定外のことを言われました。 性能試験は出来ません。 詳細は会社的にアレなので割愛させてください… この時点で、「あ、SIer時代だったら丁重にお断りする案件だな」と思いました。 ←素直 AWSの担当さんから、性能試験無しのDB移行はやめてくれ、最大のアンチパターンだと念押しで言われました。 でも、出来ないことは出来ないのです。 ということで私は性能試験ができない、けれどミッションクリティカルなDBの移行をすることになったのです。 これはこのDB移行プロジェクトの、最大のリスクでした。 ここで投げ出したかったんですが、それじゃあ私の存在意義はないですよね? このことから性能問題が必ず発生することを予測し、 Oracle Enterprise Manager(後述OEM)の利用を訴え、Diagnostics PackとTuning Packの購入を上申しました。 RDSのPerfomance Instight(後述PI)は非常に有用ですが、OEMで見れるような詳細な情報を追うことは出来ません。また、Tuning Packは非常に強力な性能改善機能です。 これはPIが悪いということではありません。様々なDB製品を扱う中、同様のIFであれだけ詳細な情報を見せれるPIは本当に素晴らしい機能です。が、OracleDBの深淵を覗くには浅すぎるのです。 幸い、上層は新参者のぎゃーぎゃーした言い分を聞いてくださり、この2つのライセンスを購入していただくことになりました。これは私にとって、最大の幸運でした。 さて、移行後の今…私が最も評価された事は「OEMの導入」になってしまいましたorz 案の定移行後のDBは安定せず、気を抜くとCPU使用率が100%近くになってしまうのですが… CPUが上がってき始めた段階で各待機イベントの割合を占めているSQL IDをOEMで確認、Tuning PackでSQLチューニングをかけて対処方法を提示することで、今も順調に稼働しています。これを順調に稼働と呼んでいいのかはさておき。 結果、性能の担保をOracleDBの持つ製品機能とお金の力で解決しました。 DBのチューニングを華麗にやった!という素敵な内容でなくてごめんなさい。でもこれが、性能試験をせずにDB移行をした結果です。 まだお金の力でどうにかなっただけ、マシだとお考え下さい。本当に、性能試験無しは絶対だめです。移行後性能出なくても、文句言っちゃだめです。 余談ですが、製品の力を借りたSQLチューニングは個人スキルに依存しない為、安定したDB運用方法かなと考えています。一人の凄腕SQLチューニングエンジニアがいないと動くこともままならないDB、危険すぎますよね。 反省その②:DB移行の鍵はNW プロジェクトを進めていく中で、現行と移行先の構成は決まっていたのに、移行方法がぽっかり空いていることに気づきました。 そのため私は、移行計画の作成に着手したわけです。 そうしてほうぼうにヒアリングをしていく中で気付くのです… AWS向けのDirect Connectの回線の帯域は? 本当によーーーーく抜け漏れるのですが、DB移行作業の重要なポイントはNWなのです。 簡単な例は、引っ越しです。 一般家庭の引っ越し用のトラックが1tだったとして、何フロアも借りている企業のオフィス引越しも、1tトラックで済むと思いますか? そりゃあなた、荷物の量が全然違うじゃないですか。1tトラックだったら何回往復しないといけないじゃない。そう、そうなんです。 通常MB、多くて1G程度のデータ転送しか発生しない回線であれば、Mbpsでいいのかもしれません。 ただ相手はDB、それもOracleDBなんて使ってるのですから、大抵データ量は多いのが相場です。 現状の回線帯域を聞いて青ざめた私は、すぐにNWエンジニアの方に移行計画内容を伝え、転送データ、秒間あたりの転送量を伝えて、10Gは最低でも用意してほしいという旨を伝えました。 その内容を聞いていただいたNWエンジニアの方は、同様に顔を青ざめて「それはまずい」と言ってくださり、すぐ10Gの回線の手配をしてくださいました。 ただ、気づくのが遅く、大分ギリギリに対応していただいたというのが、私の反省点です。 今思えばあれがなかったら、移行作業時間は何十倍も膨れ上がっていたと思います。本当にNWエンジニアの方には感謝しかありません。 これはRDSでなくとも、通常の移行時においても非常に重要なポイントだと思います。
 

 

https://ide.geeksforgeeks.org/2IpT5ex3Hd
https://tech.io/snippet/5511HkP
https://www.unphp.net/decode/099d89838b5c5f8727bc536d115b5cc7/
https://jsfiddle.net/6xd0kmbs/
https://www.onlinegdb.com/I0p5LHrC-
https://www.hybrid-analysis.com/sample/8461b1e1ce69c1e26d6e18b1061636c48f0d798a80fae1982a551dd376b2c181
https://www.hybrid-analysis.com/sample/44dbc110c708e983f0eae89973de7219fd031d330724fe2c02f9d2625214ac49
https://www.hybrid-analysis.com/sample/baa45a94929c43ab3a3bb29d0d9dc613a383daa06881378ff5992b818ed21838
https://backlinktool.io/p/JD2BX7lNu7ERUdCA3XSN.html
https://backlinktool.io/p/mKKpn1tETwhfD2RxRYgK.html
https://backlinktool.io/p/38zOsHAxJaaeonrm8Pow.html

 

反省その③:運用の見直しを忘れずに ※責任共有モデルのことは割愛させてください。 AWS RDS for Oracle。いやー本当にすごいですよね。 すぐDB作れるし、CPU/Memory/DISK増やせられるし、IOPSもこちらで指定できるし、MuritiAZで冗長化。Point Time in Recoveryですぐ戻せる。 それも全部ボタンぽちか、awsコマンド、Terraform applyでできちゃうんですよ。これオンプレでやってた時、どれだけ大変だったか。 パブリッククラウド最高!これは間違いないです。 こう見るとすべての課題、なんでも解決すると思いますよね? それに、OracleからOracleに移行でしょ?やったー色々楽になるぞー! 私も同僚も、そう思っていたんです…いや、もちろん解決したことは沢山あったんですが…移行検証や運用をしていく中で気づくのです。 できなくなっていることが、割と苦痛。 典型的な例は以下です。あまりにも有名なので、何を今更と思われるかもしれませんが。 頭ではわかっていたんです。ただ、使い始めると特に、以下のようなことに悩まされます。 (ほとんどは責任共有モデルで解決できそうな予感/すみませんまだ未検証です…) OSレイヤにアクセスできないことによる変更 DB Serverにクライアントインストールする系のツールが軒並み使えなくなる 大好きだったoratopはもう使えない インストール時にデフォルト存在するスクリプト系を準備しないといけない(@$ORACLE_HOME配置下のSQL達) Dumpファイル等の操作も全部SQLでしないといけない DataPumpのコマンドをクライアント経由で実行する内容に変更しないといけない 「ロングランのプロセスKILL」が出来ない →AWSさんに言ったらできるかもしれないですが、よほどのことない限りNGと思われる。また、やり取り大変。何せこちら、ps -efすら打てない。 OracleDB最大の秘奥義「個別パッチ」が当てられない。わかってたけど。そんな時に限ってすぐBugひく SYS権限が打てないことによる変更 SYS≠マスターユーザであることを意外と皆さん知らない 特にうっかり間違えてalter system打ちがち。そして権限エラーが出ますよねすいませn rdsadminに慣れる期間が必要。同時に開発者にもそれを伝える必要がある。(開発環境のDBでDBA権限持つ人が、やっぱりalter system打つ) SYS系が持っているTABLEはSYS.をつけて実行しましょう DBAロールの権限差分 特にGRANTが打てなくなっているのが本当につらい。セキュリティ向上のためなのだと思いますが、開発環境でもマスターユーザーしかgrant打てないのつらい。だったらcreate userもDBAから外しておいてほしかった RACは使えない ADGでスタンバイは増やせますが、Actは当然増やすことが出来ません。つまりRDS for OracleはシングルライターマルチリーダーのDBなのです。ちなみに増やすときはちゃんとOracle営業さんと相談しましょう 人は、いままで自由だったことが制限されると、こんなにフラストレーションを感じるのだと、改めて知りました。 ちなみにこれ、RDSの悪口ではありません。マネージドサービスなので、当たり前なのです。ちゃんと、出来ないって書いてあります。 特権が持てない代わりに、運用をお任せできる。それがマネージドなんですよね。 頭で理解していたつもりが実際やるとこんなに変わるのだと、身をもって理解しました。 同時に、運用ルールや運用手順、運用に関わる様々なことを変更しなければなりませんでした。 私の盲点は、これを事前に行うことが出来ず、移行直前に慌てて運用設計の見直しをし始めたということです。 これがOracleDB→PostgreSQLであれば、さすがに事前検討や社内周知をしていました。ただ、OSにアクセスできない、SYS権限はない等が具体的に日々の開発や運用にどれほど影響を与えるのか、理解できていなかったのです。 これの対策は、やはり早期から移行検証や軽く運用をしてみて、そのシステムやサービスに応じて検討をしておく必要があったと痛感しました。 同時に、柔軟に対応できるようにする私たちエンジニアの動き。システムやプログラムに文句を言うのは筋違いですよね。 まとめ 他にもここでは書けないようなことが山ほどありましたが、無事移行できたことはほっとしつつ…反省点山盛りだったことは否めません。 そして現在も、私は運用ルールの整備とDB性能チューニングに、日々悩まされております。そろそろ平穏が欲しいよ、相棒のRDS for OracleDB! 明日は、おおのさんの記事です。わくわく、今から楽しみですね!