SSブログ

Oracle Databaseに思うこと [JPOUG]

この記事は、JPOUG Advent Calendar 2014 の第18番目の扉です。

去年は、echa-oracleクックブックを使って、Oracle11gをChefでインストールしてみましたが、今年は、前回のこのブログでoracleクックブックでOracle12cをインストールした記事を書いていますので、期待してくれた方は、こちらをどうぞご覧ください。

今年は、Oracle Databaseに個人的に思うことを書いておこうと思います。

Oracle Databaseの好きなところ

  • マニュアルが充実している。市販本が多い。
  • システム辞書が充実している。たいていのDBの状態がわかる
  • マルチOS(Windowsだけじゃないところは重要)
  • コミュニティが好き(niftyのSORACLEの時代から)

Oracle Databaseの困ったところ

  • sqlplusでreadline機能が使えない(WindowsのDOS窓を除く)
  • Oracle Enterprise Manager Database Expressでいろいろな機能が使えなくなった
    • Application Express(Apex)での実装に変わったので、DBの起動が前提。(起動/停止ができない)
    • スケジューラ機能が使えなくなった。
      • スケジューラジョブの実行結果は確認できる
      • 自動化メンテナンス機能の定義を制御できなくなった。
      • バックアップジョブが作成できなくなった。
    • スキーマごとのテーブル定義が参照できなくなった (dba_tables相当の情報)
    • 追加ライセンスがないと使えないのに、パフォーマンスタブがデフォルトで有効
  • 追加ライセンスがないと便利機能が使えない(SE/SE Oneだとそもそも買えない)
    • AWR(Diagnostics Pack)
    • ADDM(Diagnostics Pack)
    • SQLチューニングアドバイザ(Tuning Pack)
マルチテナントなど、大規模データベース方面しか向いていないとしか思えないです。
それでもなんとか使っていく方法を考えたいと思います。

自力で何とかする(sqlplus)

まず、エディションによらずに共通するsqlplus問題です。
sqlplusでreadline機能がつかえないのは、相当に痛いです。
PostgreSQLでplsqコマンドを使った直後にsqlplusをさわると相当イラっときます。

もう有名な話で、Linuxの場合、rlwrapパッケージを使うと、sqlplusでもreadline機能が使えます。
Macでもrlwrapは使えるようです。(THE BLUE NOWHERE
Windowsはもとからこの機能が使えたと記憶しています。(記憶に頼っちゃいけませんが)
SolarisやHP-UX、AIXはどうなんでしょうね。Solaris、HP-UXは、あやふやな記憶によると、使えなかったと思います。AIXはさわったことがないのでわかりません。

私は、Linux環境(RHEL、CentOS)には、オラクルの中家さんのブログで見て以来、可能な限り入れてきました。
その後、EPELを使うと、yumでinstallできることを知ると、手順も楽なのでほとんどといっていいほど、入れています。

しかし、手動で毎回入れるのはそれでもメンドウなので、Chefで追加できるようにクックブックを作りました。
やっていることはたいしたことはないです。
EPELとrlwrapをいれて、.profileか.bash_profileにsqlplusのaliasを追記しているだけです。
クックブックは、GitHubのmiyawaki-cookbooks/rlwrap4sqlplusに置いておきます。
それから、yumのクックブックを使うので、Berksfileにcookbook "yum"を追記してください。
Roleファイルは、前回のoracleクックブックを入れた続きで、roles\ora.rbに以下のように書いています。
name "ora_12c_quickstart" description "Role applied to Oracle 12c quickstart test machines." override_attributes :oracle => { :rdbms => { :latest_patch => { :is_installed => true }, :opatch_update_url => 'https://secure.server.localdomain/path/to/p6880880_121010_Linux-x86-64.zip', :install_files => ['https://www.hogehoge.com/download/linuxamd64_12c_database_1of2.zip', 'https://www.hogehoge.com/download/linuxamd64_12c_database_2of2.zip'], :dbbin_version => '12c', :dbs => { 'ORCL' => false } } } run_list "recipe[oracle]", "recipe[oracle::logrotate_alert_log]", "recipe[oracle::logrotate_listener]", "recipe[oracle::createdb]", "recipe[rlwrap4sqlplus]"

SQLチューニングアドバイザをとめる

EEでもそうですが、Diagnostics Pack + Tuning Packがないと、 SQLチューニングアドバイザは利用できません。、ライセンスがない場合はとめる必要があります。使えれば便利ですが、使えないとリソースのムダなので、涙をのんでとめます。
次のプロシージャを実行すれば、SQLチューニングアドバイザを無効化できます。
SQL> select CLIENT_NAME,STATUS from DBA_AUTOTASK_OPERATION ; CLIENT_NAME STATUS ---------------------------------------------------------------- -------- auto optimizer stats collection ENABLED auto space advisor ENABLED sql tuning advisor ENABLED SQL> exec DBMS_AUTO_TASK_ADMIN.DISABLE('sql tuning advisor',NULL,NULL); SQL> select CLIENT_NAME,STATUS from DBA_AUTOTASK_OPERATION ; CLIENT_NAME STATUS ---------------------------------------------------------------- -------- auto optimizer stats collection ENABLED auto space advisor ENABLED sql tuning advisor DISABLED

自動化メンテナンス機能の設定をいじる

SE/SE Oneでは、Oracle Enterprise Manager Cloud Controlが使えないので、GUIでジョブ機能はいじれません。当然、時間を変更したい場合などあるかと思います。
自動化メンテナンスの開始時間を平日は22:00、休日は06:00からの設定を変更するには、次のようにします。
まず、現在の設定を確認します。
SQL> set linesize 200 SQL> col window_name for a20 SQL> col window_next_time for a40 SQL> SELECT window_name, window_next_time, window_active, autotask_status, optimizer_stats, segment_advisor, sql_tune_advisor 2 FROM dba_autotask_window_clients; WINDOW_NAME WINDOW_NEXT_TIME WINDO AUTOTASK OPTIMIZE SEGMENT_ SQL_TUNE -------------------- ---------------------------------------- ----- -------- -------- -------- -------- SUNDAY_WINDOW 14-12-14 06:00:00.000000 ASIA/TOKYO FALSE ENABLED ENABLED ENABLED DISABLED SATURDAY_WINDOW 14-12-13 06:00:00.000000 ASIA/TOKYO FALSE ENABLED ENABLED ENABLED DISABLED FRIDAY_WINDOW 14-12-12 22:00:00.000000 ASIA/TOKYO FALSE ENABLED ENABLED ENABLED DISABLED THURSDAY_WINDOW 14-12-11 22:00:00.000000 ASIA/TOKYO FALSE ENABLED ENABLED ENABLED DISABLED WEDNESDAY_WINDOW 14-12-17 22:00:00.000000 ASIA/TOKYO FALSE ENABLED ENABLED ENABLED DISABLED TUESDAY_WINDOW 14-12-16 22:00:00.000000 ASIA/TOKYO FALSE ENABLED ENABLED ENABLED DISABLED MONDAY_WINDOW 14-12-15 22:00:00.000000 ASIA/TOKYO FALSE ENABLED ENABLED ENABLED DISABLED
変更するために、いったんスケジューラウィンドゥをdisableにして、ウィンドゥのDURATIONをウィンドゥサイズに変更します。日曜日もウィンドゥサイズを変更する場合は、同様にしてください。最後に、ウィンドゥをenableにもどします。
BEGIN dbms_scheduler.disable( name => 'SATURDAY_WINDOW'); dbms_scheduler.set_attribute( name => 'SATURDAY_WINDOW', attribute => 'DURATION', value => numtodsinterval(4, 'hour')); dbms_scheduler.enable( name => 'SATURDAY_WINDOW'); END; /
ウィンドウの開始時間は、repeat_intervalを次のように変更します。
BEGIN dbms_scheduler.disable(name=>'SATURDAY_WINDOW'); DBMS_SCHEDULER.SET_ATTRIBUTE('SATURDAY_WINDOW','repeat_interval','freq=daily;byday=SAT;byhour=12;byminute=5;bysecond=0'); dbms_scheduler.enable(name =>'SATURDAY_WINDOW'); END; /
土曜日のウィンドゥの開始時間を変更したので、同じように日曜日~金曜日も変更します。
SQL> SELECT window_name, window_next_time, window_active, autotask_status, optimizer_stats, segment_advisor, sql_tune_advisor FROM dba_autotask_window_clients; WINDOW_NAME WINDOW_NEXT_TIME WINDO AUTOTASK OPTIMIZE SEGMENT_ SQL_TUNE -------------------- ---------------------------------------- ----- -------- -------- -------- -------- SUNDAY_WINDOW 14-12-14 12:05:00.000000 ASIA/TOKYO FALSE ENABLED ENABLED ENABLED DISABLED SATURDAY_WINDOW 14-12-13 12:05:00.000000 ASIA/TOKYO FALSE ENABLED ENABLED ENABLED DISABLED FRIDAY_WINDOW 14-12-12 12:05:00.000000 ASIA/TOKYO FALSE ENABLED ENABLED ENABLED DISABLED THURSDAY_WINDOW 14-12-18 12:05:00.000000 ASIA/TOKYO FALSE ENABLED ENABLED ENABLED DISABLED WEDNESDAY_WINDOW 14-12-17 12:05:00.000000 ASIA/TOKYO FALSE ENABLED ENABLED ENABLED DISABLED TUESDAY_WINDOW 14-12-16 12:05:00.000000 ASIA/TOKYO FALSE ENABLED ENABLED ENABLED DISABLED MONDAY_WINDOW 14-12-15 12:05:00.000000 ASIA/TOKYO FALSE ENABLED ENABLED ENABLED DISABLED

Oracle Enterprise Manager Database Expressの機能不足をなげく前にできること

基本的にないものは作ればいいと思っています。
特に上であげた「スキーマごとのテーブル定義が参照できなくなった (dba_tables相当の情報)」は、そのまま、Apexで実装可能だと思います。
OEM DB Express側でユーザ拡張機能の追加用の受け口を用意してもらえれば一番ですが、Apexなんでチャラく作ればいいかと思います。

と、思っただけで、Apexを調べてません。むかし遊んだ記憶によれば、アプリを作るのは簡単だけれど、環境構築に時間がかかりました。
これだけで、ネタになりそうです。

発想を変えて、スキーマ単位にテーブルのエクステント数と割り当て済バイト数が見れればいいのならSQLでもいいでしょ、ということで、次のようなSQL文を書いておきます。
ここの凄い方々はもっといいSELECT文を書くのでしょうが、SQLを忘れかけているのでこれで精一杯です。まあ、これでも自分的には用が足ります。
set linesize 100 col username for a30 col segment_name for a30 col tablespace_name for a16 col type for a20 col Ksize for 999,999,999 select username from all_users order by username ; select e.tablespace_name, e.segment_name,s.segment_type type, sum(e.bytes/1024) Kbyte, count(e.extent_id) count from dba_extents e join dba_segments s on e.segment_name = s.segment_name where e.owner = upper('&schema') group by e.tablespace_name,e.segment_name,s.segment_type order by e.tablespace_name,e.segment_name,s.segment_type ;
セキュリティの設定は変更していませんので、PASSWORD_LIFE_TIME=180のままです。
バックアップはRMANを定時実行すればよさそうなので書きませんでした。
OEM Database Expressのパフォーマンスタブは、control_management_pack_access をNONEに変更すれば、ライセンスが必要ですと表示されます。EEでのデフォルトは、DIAGNOSTIC+TUNINGです。ライセンスに注意してください。

渾身の話ばかりの間に、こんなユルい話で恐縮ですが、私の話はこれで終わりです。
読んでいただいて、ありがとうございました。

明日は、Masashi Matsushitaさんです。よろしくお願いします。

oracle クックブックを使ってora..|- ブログトップ

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。