Insight Technology

2021.12.23

Oracle 12c の EOL がやってくる!

このエントリーをはてなブックマークに追加

こんにちは。インサイトテクノロジーの松尾です!

札幌は今年の初雪がだいぶ遅かったですが、この冬は降りますかねぇ?

さて、とうとう Oracle Database 12c の EOL ( end-of-life、サポート終了 ) が来年 ( 2022年 ) に迫ってきました。それに伴って、RDS などのマネージドデータベースも EOL 予定を発表していますね!

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 のテストを効率的に行うことで、データベースのバージョンアップテストやデータベース移行のアセスメントを大幅に省力化することが可能です。

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 の実行を行います。

assessment-setting.png

ではまず、「パース」でアセスメントを実行してみましょう。

assessment-parse.png

構文チェックは問題ないようです。Oracle のバージョンアップなので、そう、構文が変わることはないでしょう。

次に、「実行」でアセスメントを実行してみます。

assessment-exec.png

今度はエラーが出ました!

エラーとなった SQL を確認してみましょう。

assessment-exec-sql-detail.png

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 を自動で取得する仕組みはありませんが、近日対応予定です。詳細についてはお問合せください。

次回もどうぞお楽しみに!

ページトップへ