こんにちは。インサイトテクノロジーの松尾です!
札幌は今年の初雪がだいぶ遅かったですが、この冬は降りますかねぇ?
さて、とうとう Oracle Database 12c の EOL ( end-of-life、サポート終了 ) が来年 ( 2022年 ) に迫ってきました。それに伴って、RDS などのマネージドデータベースも EOL 予定を発表していますね!
- 参考:現在のデータベース・リリースのリリース・スケジュール (Doc ID 2413744.1)
- 参考:Amazon RDS for Oracle バージョン 12.1.0.2と12.2.0.1 のサポート終了のお知らせ
Oracle Database をサポート付きできちんと使い続けるにはデータベースバージョンのアップグレード ( バージョンアップ ) が必要となりますが、Oracle も AWS も、データベースバージョンのアップグレードにあたってのアプリケーション動作のテストを強く推奨しています。
ということで、一般的な Oracle Database を利用されている方々はこの EOL のタイミングの前に、アプリケーションのテストをして Database バージョンのアップグレードを実施していくことと思います。
さて、テストはどのように実行しましょう?
一般的には、テスト用のデータベースを用意したうえで、アプリケーションをテストデータベースに接続して動作テストを行います。自動テストの仕組みがない場合には実施可能なテストは工数との相談になるので、テストケースも厳選して実施することになると思われます。
Oracle Database ではテストを支援するツールとして、Oracle Real Application Testing ( RAT )も提供していますが、利用している Oracle Database のバージョンや Edition により RAT を利用できないケースもあります。
本ブログではマルチデータベースに対応した SQL テスティングツールである Insight Database Testing を使用し、Oracle Database 12c を 19c にアップグレードする際のテストを実施する例を紹介します。
Amazon RDS for Oracle では強制的なアップグレード
ソフトウェアがどんどん機能追加されたり不具合修正されたりしてバージョンアップされていくのは世の常であり、それはデータベースも、そして Oracle Database も例外ではありません。オンプレミスでは古いバージョンのまましばらく延命ということも可能ですが、RDS ではそういうわけにもいきません。
アップグレードに伴ってのなんらかの仕様変更に影響されないよう、テストなどの必要な確認は必ずしておきたいところです。
バージョンアップのテストに有効な SQL テスト
バージョンアップ時によくある変更としては、一般的には以下のようなものがあります。
- 非互換な変更
- 構文チェック強化
- 予約語/キーワードの追加
- システムテーブルの変更
- 組み込み関数の挙動の変更
- パフォーマンス関連
- オプティマイザの変更
- パラメータのデフォルトの変更
データベースのバージョンアップにあたっては、基本的にはこれまで通り動作すること、そして性能劣化がないことが期待されていると思います。現行のアプリケーションから発行されている SQL を何らかの形で収集し、その SQL をもとに SQL テストを実行すると、バージョンアップ後のデータベースでもそのまま動作するか?著しい性能劣化がないかを、確認することができます。
Insight Database Testing はマルチデータベースに対応した SQL テスティングツールです。Insight Database Testing を使用すると、SQL の収集と SQL のテストを効率的に行うことで、データベースのバージョンアップテストやデータベース移行のアセスメントを大幅に省力化することが可能です。
- 参考:ネットプロテクションズ|Insight Database Testingでテストの網羅性を向上し、テスト工数を大きく削減 – Oracle Database のバージョンアップでの利用事例
- 参考:電算システム|Insight Database Testingで膨大な手間となるSQL検証を自動化し迅速化にする – Oracle Database から PostgreSQL への移行評価での利用事例
Oracle Database 12c から 19c へバージョンアップする際のテスト例
今回は、まさに来年 EOL を迎える Oracle Database 12c を 19c へバージョンアップする想定での確認例をご紹介します。12c から 19c へのバージョンアップだとそんなに変更はないと思われるかもしれません。データベースのバージョンアップなので、当然、大量の非互換が発生するわけではありませんが、そこはソフトウェアなので、目に見えない(仕様変更として記載されていない)変更が入る場合もあるのです。
まずは 12c でどのように実行できるかを SQL*Plus で見てみます
今回実行したテスト SQL は以下の 4 つです。さてどの SQL に問題があるか(どの SQL が 19c でエラーとなるか)わかるでしょうか?12c での SQL*Plus からの実行例をまず示します(すべて成功します)。
SQL> select * from emp;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 800 20
~~~(中略)~~~
14 rows selected.
SQL> select d.deptno,d.dname,e.empno,nvl(e.ename,'(no employee)') ename from dept d,emp e where d.deptno=e.deptno(+) order by deptno,empno
2 ;
DEPTNO DNAME EMPNO ENAME
---------- -------------- ---------- -------------
10 ACCOUNTING 7782 CLARK
~~~(中略)~~~
15 rows selected.
SQL> select * from emp where hiredate = to_date('19801217', 'YYMMDD');
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 800 20
SQL> select * from emp where hiredate = to_date('20101217', 'YYMMDD');
no rows selected
SQL> exit
この中に 19c ではエラーとなる SQL があると言われると発見できるかもしれませんが、実際はソースコードから「エラーになる SQL を生成する可能性のあるコード」を探さねばなりませんし、調査対象の SQL も大量にあるのが普通です。
Insigt Database Testing で 19c で確認
それでは Insight Database Testing で 19c に対して実行してみます。
Insight Database Testing のアセスメントの実行方法として「パース」と「実行」があります。「パース」は構文解析を行うのみ、「実行」は SQL の実行を行います。
ではまず、「パース」でアセスメントを実行してみましょう。
構文チェックは問題ないようです。Oracle のバージョンアップなので、そう、構文が変わることはないでしょう。
次に、「実行」でアセスメントを実行してみます。
今度はエラーが出ました!
エラーとなった SQL を確認してみましょう。
ORA-01843 のエラーということで、 to_date
関数での変換に失敗しているようです。
ここでよく見ると、、、エラーとなった to_date
関数は以下でした。
to_date('19801217', 'YYMMDD')
お気づきになったかと思いますが、本来は YYYYMMDD
であるべきところを、YYMMDDD
と書いていたことにそもそもの問題があることがわかります。ただ、12c では問題なく動作していたのと、
to_date('20101217', 'YYMMDD')
については 19c でもエラーが出ないため、なかなかソースコード調査で問題に気づくのは難しそうです。また、この挙動変更については 19c での非互換情報としてもリストされているわけではありませんでした。
求められる計画的なバージョンアップ
このようなバージョンアップに対する備えは、どのようなタイミングで行うとよいのでしょうか?
データベースのバージョンはメジャーバージョンの登場やバージョンの廃止( EOL )以外にも、定期的にマイナーバージョンが登場し、セキュリティ対策なども強化されていきます。マイナーバージョンアップが可能かなども含め、継続的に確認を行っておくことで、急なセキュリティアップデートにも対応しやすくなります。
バージョンアップの場合の SQL 互換性についてはエラーがほぼ発生しないケースが想定はされますが、今回の確認例のように、予期せぬエラーが発生することもありえることがわかります。本番環境のバージョンアップを実施してからエラーが発見されて十分な対応を行えない、ということにならないよう、できる限りの確認はしておきたいものです。
おわりに
本ブログでは EOL が近づいている Oracle Database 12c を 19c にバージョンアップすることを想定した確認作業に、Insight Database Testing を使用する方法を紹介しました。
Insight Database Testing をまだご利用いただいていない方で実際に試されたい場合は、製品の説明やデモ、トライアルなどについてInsight Database Testingに関するお問い合わせ よりお問い合わせいただければと思います。
なお RDS for Oracle については、Insight Database Testing 現在のバージョンでは SQL を自動で取得する仕組みはありませんが、近日対応予定です。詳細についてはお問合せください。
次回もどうぞお楽しみに!