今から始めるOracleDatabase 

3月 20日 @ 22:00 ~ 23:00 主催者: yuina_i

皆さんがよく使っているDB、その中でもなかなか手が出ないといわれるOracleDatabaseについて少し話をしてみようと思います。 少し他のRDBについても触れる予定です。

資料

https://docs.google.com/presentation/d/1IjNeLA90GvdWAKhwY-Qg1TYsrgxJJgAy1kGiy55Qk5w/edit?usp=sharing

注意

スピーカーyuina_iさんのOracleDBの知識バージョンは、11gとのこと。

録音

DiscordでのVC録音 

公演

  • Oracle Databaseとは
    • ライセンスがクソ高いけれど、学習目的であればフル機能のEnterprise Editionも無料で使える。
    • Standard Editionも使える
  • 気になったら構築を
    • Ansibleで一発構築できる→有志のリポジトリ(本ページの下部にリンクあります)
    • Dockerでも11g,12cがある
  • どんな構造になってるん?
    • スライドでは大体の概要を記載している。詳細はこちら 
    • まずはデータベースのアーキテクチャについて見ていく
      • Oracleはインスタンスとデータベースから構成される。
      • ジョジョのスタンドに例えると非常に分かりやすい。スタンド同士で戦わせる。
        スタンドがダメージを受けたら本人に跳ね返る。
        • インスタンス : スタンド
        • データベース : 本人
      • P.10スライドの左側にあるパソコンがクライアントPCになる。
      • クライアントPCからOracle Databaseサーバにアクセスするにはサーバプロセスにアクセスする必要があるが、
        サーバプロセスの場所が分からないのでリスナープロセスに依頼してサーバプロセスに繋ぐ。
      • サーバプロセスの場所がわかっているならば、クライアントPCからサーバープロセスに直接アクセスする、という方法もあるにはある。
      • スライドに記載されている[メモリ]がインスタンスとなる。
      • サーバプロセスからインスタンスにSQL文を渡してあげる。
      • SQL文を解析して[実行計画]というものを作る。
      • 実行計画 → こうすればSQLの内容が取れるね! というのを教えてあげる。
      • 実行計画から必要なテーブルをメモリにキャッシュする(ストレージにデータファイルという記載があるが、そこから情報を取得する)
      • データテーブルを使ってSQLクエリの処理を実行する。その結果をサーバプロセスを経由してクライアントに返してあげるような動きをする。
      • 何回かSQLクエリを実行して、[これでOK!]となったら、データベースをCommit(コミット)する。データベース内の変更したものをバックグラウンドプロセスを経由して書き込む。
      • データベースはSQL文を何回かやり取りして、その結果はCommitするまでデータファイルには書き込まない。(トランザクションと呼ぶ)
      • トランザクションログとして[こういうSQLやったよ!!]というのを書いておき、Commitした際にバックグラウンドプロセスからログファイルに書き込む。

他のRDBMSと何が違うん?

  • RDBMSと言ったら何を思い浮かべますか?
    • 以下のDBを比較してみる
      • Oracle Database
      • Microsoft SQL Server
      • PostgreSQL
      • MySQL(MariaDBも同じかと)

トランザクション編(update他DMLを実行した際のトランザクション処理)

  • Oracle Database
    ⇒デフォルトの設定のままだと、自動コミット(今までの操作を確定)してくれない!
    DML(Data Manipulation Language:データ操作文)実行後に、明示的にコミットするためのコマンドを打たないとだめ。
  • SQLServer
  • PostgreSQL
  • MySQL(みんな大好きMariaちゃん)
    ⇒1クエリ実行ごとに自動コミットしてくれる!
    トランザクションで動かしたい場合は明示的に開始、コミットの
    コマンドを行う必要がある。

CreateTable他(DDL)を実行した際のトランザクション処理

  • Oracle Database

  • SQLServer
    ⇒1クエリ実行ごとに自動コミットしてくれる!
    トランザクションで動かしたい場合は明示的に開始、コミットのコマンドを行う必要がある。

  • PostgreSQL
    ⇒自動コミットしてくれない!
    DML実行後に明示的にコミットするためのコマンドを打たないとだめ。

  • MySQL(みんな大好きMariaちゃん)
    ⇒1クエリ実行ごとに自動コミットしてくれる!
    DML実行後に明示的にコミットするためのコマンドを打たないとだめ。
    DDL文は暗黙的コミットしてしまうため、トランザクション処理すらさせてもらえない・・・
    悲しみを背負うのが多い・・・

用語説明: DDL(Data Definition Language) =コンピュータのデータを定義するコンピュータ言語もしくはコンピュータ言語要素

SQLクエリ編 検索上限指定のクエリの書き方

  • Oracle Database
    ⇒そもそもそんなことできない!WHERE句で選択する必要あり。
    例:「SELECT * FROM EMPLOEES WHERE rownum <= 100」
    ここでマサカリが!
    12cから以下の構文が追加されたとのこと。

    SQL> select empno, ename from emp order by empno OFFSET 10 ROWS FETCH NEXT 5 rows only; EMPNO ENAME ---------- ---------- 7876 ADAMS 7900 JAMES 7902 FORD 7934 MILLER SQL> select empno, ename from emp order by empno OFFSET 9 ROWS FETCH NEXT 5 rows only; EMPNO ENAME ---------- ---------- 7844 TURNER 7876 ADAMS 7900 JAMES 7902 FORD 7934 MILLER
  • SQLServer
    →TOP句を使う。
    例:「SELECT TOP100 * FROM EMPLOYEES」

  • PostgreSQL

  • MySQL(みんな大好きMariaちゃん)
    →LIMIT句を使う。
    例:「SELECT * FROM EMPLOYEES LIMIT 100」

Oracleの利点とは?

  1. 1インスタンスに1データベースしか作れないため、
    インスタンスを停止しても他のDBに影響が出ない。
    ⇒DBインスタンスの障害に強い。 ⇒マサカリあり!
    「1インスタンスに1データベース」は11gまでの制限とのこと。
    12cからは1インスタンスに複数データベース(マルチテナント)ができるようになった。

  2. 自動でトランザクションを開始してくれるため、
    DML(Update文など)をミスしてもロールバック可能。
    ⇒他のRDBだと、トランザクションを開始し忘れたら必死にクエリ書かないと戻らない。

  3. 読み取り一貫性があるため、バッチ処理が走っている途中でも、
    参照するだけなら問題なく使用可能。

  4. 処理状況によってメモリの割当を動的に変えてくれる。

まとめ

  • OracleDBで遊ぶだけならタダだからとりあえず遊ぼう
  • 他のRDBよりも障害に強いよ!
  • 堅物だけどデレるとかわいいDB(ツンデレ)

聴講者の声

  • Oracleを、Ansibleで一撃で構築できるようにしてるよ~お試しあれ!
    Github sugitk/ansible-oracle 

  • dockerでも11gのイメージがあったはず。おためしだけだけど。
    Oracle Database on Docker 

  • トランザクションの機能自体はだいたい共通に持っていますが、デフォルトでauto cimmitが有効か無効化というのが異なっています。

  • PostgreSQLのLimitについて次のリンク。
    9.6のドキュメント limit 

  • Oracle 11gからRAC(Real Application Clusters) だと複数のインスタンスで1つのデータベースということになる。
    4096までのマルチテナントに対応

  • 12cからはマルチテナントで CDB と PDB が作成可能

  • Oracleは、読み取り一貫性を実装する機能の一部として、Undoを使っています。

  • ただでSQL打ち込めるよ!
    https://livesql.oracle.com/ 

  • Oracle Technology Network Developer Day:Database Virtual Box Appliance / Virtual Machine 
    Please note that this appliance is for testing purposes only, as such it is unsupported and should not to be used in production environment. This virtual machine contains:
    とある通り、試用目的利用のapplianceもあり。

  • Expressは無料だけど機能制限されててメモリ1GBまでしか使えない。データも 11GBまで。

  • 次回はすぎむらさん(Oracle Master Platina取得済)の上級編に乞うご期待! Oracle Database のお話 by すぎむらさん 

Q & A

  • Q.ライセンスはCPU課金?
    • A.CPU課金、EnterpriseEditionなら2コアまで?
  • Q. スライドのP10にあるRDBのようなDatabaseの仕組みの話ってどのエンジンにも共通なんですか?
    • A. 共通
  • Q.実行計画とコミットとは何?
    • A1.実行計画は、SQLを実行した時にどうデータを取って来て利用するのが効率化するために計画するもの。
    • A2.コミットは、実行したSQL処理を「確定」させるもの。確定すると、どんな手順を使おうが「処理の取りやめ」ができなくなる。
  • Q. MySQLのテーブル構造とか扱うときはバックアップ推奨ってこと?
    • A. 推奨です。暗黙的にcommitされてしまうので・・・
  • Q. (午後10時44分)?? where句が使えない?違うか、limitが使えないってこと?
    • A.
  • Q. DB単位で止められるのはいいなぁ。その分メモリ食う量は大きいんだろうか
    • A. DataBaseって言う単位も(スキーマ/ユーザも)、RDBMSごとにまちまち? なのもある → 拠って?
  • Q. 1インスタンスで1データベースの文脈の "データベース" って、oracle 11g と 12c のこと? それとも11gの中で動いてる hoge_db1 と hoge_db2のこと?
    • A. 11gの中で動いてる hoge_db1 と hoge_db2のこと