タグ: OracleDB

  • Oracle DatabaseでSQLの結果表示する件数を制限する方法

    MySQLだと、limitを使うことで検索結果の表示件数の制御ができるが、Oracle Databaseだとlimitがないので、指定できない。そんなに使う機会がないので、調べる手間があるのでメモ。

    Oracle Databaseでやる場合には、「ROWNUM」を使うことで似たようなことができる。例えば、ROWNUMで、10以下に設定すると、最初から10行目まで表示される。これをうまく使うことで、いろいろとできる。

    例)

    SELECT EXTENDED_TIMESTAMP, DB_USER, SQL_TEXT  
    FROM DBA_COMMON_AUDIT_TRAIL  
    WHERE ROWNUM <= 10;
  • Oracleクライアントと接続先のDBで時間が大きくずれても、TNS-12638は発生する

    急にOracle Databaseとの接続時にTNS-12638のエラーが発生するようになった。

    TNS-12638: 資格証明の取出しに失敗しました。
    

    いろいろと調べてみると、何かをトリガーにして急に発生することがあるらしい。 トリガーとなった原因を調べていくと、ログの出力時間が異なっていることを発見。 DBサーバ側の時間が数時間ずれている(タイムゾーンではなく、時間がずれている)ことが判明。 DBサーバの時間を修正したところ、TNS-12638が解消。

    設定云々の前に、時間がずれていても認証エラーは発生することがわかった。いろいろとあるものだ。

  • MSFC上のOracleDBのTNSNAMES.ORA

    MSFC(Microsoft Failover Cluster)上に構築されたOracle Database(Oracle Fail Safe使用) は、MSFCの構成上、共有ディスクではなく、ローカルのドライブ(Cドライブなど)にインストールする。

    そのため、MSFC上のOracle DBの「TNSNAMES.ORA」は、MSFCの各ノードに対して、 変更や作成を行う必要がある。TNSNAMES.ORAは、$ORACLE_HOME\ の下のフォルダ配下に存在する。

    DBのファイルなどとは違い、共有リソース上にはないので注意すること。

  • SYS.DBMS_LOCK権限を割り当て

    Oracle DatabaseでDBMS_LOCK権限の割り当てと確認方法。

    ■DBMS_LOCK権限を付与する
    ※DBAで実施

    GRANT EXECUTE ON SYS.DBMS_LOCK TO ユーザ名;

    ■オブジェクト権限を確認するSELECT文

    SELECT * FROM dba_tab_privs;

    SELECT * FROM dba_tab_privs where GRANTEE = '確認するユーザ' ;

    ■確認結果

     SQL> SELECT * FROM dba_tab_privs where GRANTEE = 'OracleUSER' ;
     
     GRANTEE                        OWNER
     ------------------------------ ------------------------------
     TABLE_NAME                     GRANTOR
     ------------------------------ ------------------------------
     PRIVILEGE                                GRA HIE
     ---------------------------------------- --- ---
     OracleUSER                        SYS
     DBMS_LOCK                      SYS
     EXECUTE                                  NO  NO
     
     
     SQL>
    
  • Oracle Databaseで特定時間のSCNを調べる

    現在のSCNではなく、過去の特定の時間のSCNを調べるには、下記のSQL文を実行する

    SELECT timestamp_to_scn(指定時間) from dual;
    

    実際に実行したSQL文。

    SELECT timestamp_to_scn('20171217 13:56:00') from dual;
    
  • Oracle Databaseで現在のSCNを調べる

    Oracle Databaseで、現在のSCN(システム・チェンジ・ナンバー)を調べたいときの調査方法。

    SELECT CURRENT_SCN FROM v$database;
    

    SCN使用のシーンとしては、フラッシュバッククエリで、時間指定が難しいくらいの変更があるときにSCNで指定するので、SCNを調べるときに使う。

  • Oracle DBの監査ログにシステム権限での接続が大量に記録される

    Oracle DBの監査ログを調べて、変なアクセスや接続がないかどうかを調べた時の話。 監査ログに大量にログが記録されており、肥大化していた。 監査ログに、だいたい1分に2回くらいのシステム権限でのアクセスとSQL文の実行が記録されていた。 あまりにも気持ち悪いので、調べてみると、単に「システム権限で接続」しているセッションは、同一のサーバ内で「RHS.exe」が実行していることが分かった。

    それで、この「RHS.exe」を調べると、MSFCのクラスタサービスが行っているリソースモニターのプロセスだった。

    まとめると、

    • Oralce DBの環境は、Windows Server 2008 R2 Enterpriseで、MSFCでクラスタを構成している。
    • MSFCでは、Oracle Databaseをクラスタリングしている。
    • MSFCでは、Databaseが正常稼働しているかどうかをチェックするために、キープアライブの確認を行っている。
    • このキープアライブがシステム権限で接続しているので、そのログがOracle DBの監査ログに記録されており、ログが膨れ上がっていた。

    わかってしまえば、なんということはない。ログはウザイが正常な動作でした。

  • Oracle Database 12cの次は、18c

    新しいOracle Databaseのバージョンが発表されたのだけど、
    Database 12cの次が、Database 18cという。
    いきなり12から18まで飛ばしてくれた。
    これ、分かりたくない人に説明するのが大変だ。
    18の由来は、2018みたいなので、それだけが救いかな。
    でも、いままでにあったRelease1とか2はどうするのだろうか。

    あと18cは、機械学習してメモリ割り当てサイズとか、
    パッチ当てとか、チューニングが自動化されるとのこと。
    使ったら、いろいろと楽できるのかな。
    またOracleのハードウェアじゃないと性能を発揮できないとか言われるのかな。
    さらに勝手にパッチがあたるとか、日本企業への受けは悪いだろうな。
    個人的には、常に最新になるのがいいんだけど、
    安定のためバージョンを固定したいのが日本だし。

    http://www.publickey1.jp/blog/17/oracle_18c_autonomous_database_oracle_openworld_2017.html

  • Oracle Database Enterprise Edition のパラレルクエリ機能が使われているか調べる方法

    1文のSQLで複数のCPUを使用して実行するパラレルクエリ機能(Enterprise Editionのみ) を実際にSQL実行時に使用しているかどうかは、Oracle DBの動的パフォーマンス・ビューに 記録されている。

    記録されているのは、“V$SQL”と“V$PQ_SYSSTAT”のView。 それぞれ、使用された回数などが記録されているので、 Viewを検索すれば使用しているかどうかがわかる。

    SELECT * FROM V$SQL WHERE PX_SERVERS_EXECUTIONS > 0
    SELECT * FROM V$PQ_SYSSTAT
    

    ■参考

    http://otndnld.oracle.co.jp/document/products/oracle10g/102/doc_cd/server.102/B19228-04/dynviews_2.htm
    https://docs.oracle.com/cd/E16338_01/server.112/b56311/dynviews_2099.htm