読者です 読者をやめる 読者になる 読者になる

作業ノート

様々なまとめ、雑感など

Oracleで特定テーブルの参照整合性制約を確認するSQL

今、Symfony2を使用した開発をしている。DBはOracle。

Symfony2のconsoleでORMの設定からSQLを作成することができる。利用しているDBの状況から最新にするために必要なSQLを作成できるので便利。しかし、その作成に時間がかなりかかるため、その調査をした。

実行ログをみると参照整合性制約を抽出するSQLに時間がかかっていたため、SQLを書き換えて改善されるか試してみた。そのとき作成したSQLが以下。

SELECT
  uc.constraint_name,
  uc.delete_rule,
  uc.search_condition,
  ucc.column_name,
  ucc.position,
  r_ucc.table_name  r_table_name,
  r_ucc.column_name r_column_name
FROM user_constraints uc
JOIN user_cons_columns ucc
  ON ucc.owner             = uc.owner
 AND ucc.constraint_name   = uc.constraint_name
JOIN user_cons_columns r_ucc
  ON r_ucc.owner           = uc.r_owner
 AND r_ucc.constraint_name = uc.r_constraint_name
 AND r_ucc.position        = ucc.position
WHERE
    uc.constraint_type = 'R'
AND uc.table_name = 'FOO'
ORDER BY uc.constraint_name ASC,
         ucc.position ASC
;

確認するために2つのビューを使用する。user_constraintsは、テーブルに定義された制約を示すビューでuser_cos_columnsはその制約で使用しているカラムを示すビュー。

user_constraints.constraint_typeは当該制約の種別でRは参照整合性を意味する。参照整合性制約の場合、user_constraints.owneruser_constraints.constraint_nameが参照元の制約であり、参照先の制約はuser_constraints.r_owneruser_constraints.r_constraint_name

それぞれのカラムをuser_cons_columnsの該当カラムと内部結合して、それぞれのテーブル名とカラム名を取得した。

ちなみに上記のSQLで試したところ元のSQLよりは改善されたが、それでも実行には数秒かかった。どうやらuser_constraintsをselectするだけでも時間がかかっているようだった。

参考

systemdの環境でapacheユーザのumask値を変更する

RHEL6までは/etc/sysconfig/httpdにumaskを書けば、/etc/init.d/httpdを実行することで変更できた。

RHEL7からはデーモンの管理がsystemdに変更になった。 systemdでも/etc/sysconfig/httpdは使用するが、そこで設定できるのは環境変数のみで、umaskを書いても変更されない。

systemdでumaskを変更する場合、デーモンの設定ファイルを作成し、そこにumask値を設定する。

cat <<'EOT' | sudo tee /etc/systemd/system/httpd.service > /dev/null
.include /lib/systemd/system/httpd.service
[Service]
UMask=002
EOT

設定したいのはumaskだけなので、もともと用意されているhttpd.serviceをincludeして他の設定を同じにする。

sudo systemctl --system daemon-reload

httpd.serviceファイルを作成したら、systemdをリロードする。

sudo systemctl restart httpd.service

httpdを既に起動しているなら、再起動する。

参考

RHEL 7.1でOracle 12cのためのfirewalldの設定をする

仕事で、Oracle 12c Enterprise EditionをRHEL7.1にインストールした。 Oracleでは通常、Oracleのリスナーで1521、EM Expressで5500のポートを使用する。

RHEL6のときはiptablesの設定をしていたが、RHEL7からはfirewalldに変更されたので、その設定方法を調べた。

方法としては2つ。

1つは、firewall-cmdでzoneに対して該当ポートの使用を許可する方法。

rootでログインしているときに、firewall-cmd

# firewall-cmd --zone=public --add-port=5500/tcp --permanent
# firewall-cmd --zone=public --add-port=1521/tcp --permanent

このように該当のポートを特定のzoneに対して許可したあと

# firewall-cmd --reload

設定を反映する。permanentオプションはその設定を永続化させるもので、再起動しても設定内容は有効になる。

もう1つは、oracleのための設定ファイルを作成して、それをzoneに設定する方法。

rootでログインしているときに

# cat <<'EOT' > /etc/firewalld/services/oracle12c.xml
<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>Oracle 12c</short>
  <description>Oracle Database 12c Release 1 Enterprise Edition</description>
  <port protocol="tcp" port="1521"/>
  <port protocol="tcp" port="5500"/>
</service>
EOT

このような設定ファイルを作成する。firewall-cmdでサービスを参照すると

# firewall-cmd --permanent --get-services
RH-Satellite-6 ... openvpn oracle12c pmcd ... wbem-https

サービスの一覧にoracle12cと表示される。作成したファイル名がそのままサービス名になる。

そして、firewall-cmd

# firewall-cmd --zone=public --add-service=oracle12c --permanent

作成したサービズをzoneに追加し

# firewall-cmd --reload

設定を反映する。zoneのステータスを参照すると

# firewall-cmd --zone=public --list-all
public (default, active)
  interfaces: ens1
  sources:
  services: dhcpv6-client oracle12c ssh
  ports:
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:

先ほど設定したサービスが設定されていることが確認できる。

参考