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:
先ほど設定したサービスが設定されていることが確認できる。
参考
Oracleのシーケンスの取得値を所定値に変更する
OracleのDBで、シーケンス値を使用するカラムを持つテーブルのデータを移行するときに起きる問題。
Oracleでは、シーケンスとテーブルは別に扱う。このため、テーブルのデータを移行するときには あわせてシーケンスの値も変更しないと、値が重複してしまうことになる。
主キーの値としてシーケンスを使用することは多く、その値が制約違反により登録できない、といった現象が起きる。
この現象を避けるためには、シーケンスの取得値が移行データとかぶらないようにする必要があるのだが、シーケンスの値を簡単に変更するようなSQL文は存在しない。
そこでいくつかのSQL文を実行して、最終的に取得値を所定値にすることになる。
以下は例として、foo_seq
というシーケンスの取得値を11
にするための手順。
1. シーケンスを削除する
シーケンスが存在するときは、一旦削除する。
DROP SEQUENCE foo_seq;
2. シーケンスを作成する
シーケンスを作成する。初期値、最小値、増分値を全て1にする。
CREATE SEQUENCE foo_seq START WITH 1 MINVALUE 1 INCREMENT BY 1;
3. 増分値を変更する
ALTER文で増分値を10
に変更する。この値は、開始したい値(11
)から1を引いたもの。
ALTER SEQUENCE foo_seq INCREMENT BY 10;
4. シーケンス値を取得する
SELECT文で、このシーケンスの値の現在を取得する。
SELECT foo_seq.nextval FROM dual; NEXTVAL ---------- 10
これによって、シーケンスの値が10になる。
5. 増分を1にする
増分を1に戻す。
ALTER SEQUENCE foo_seq INCREMENT BY 1;
これで、次回のシーケンスの取得では11
になる。
SQL> SELECT foo_seq.nextval FROM dual; NEXTVAL ---------- 11
参考
Oracleユーザの有効期限を変更する
会社の開発環境でOracle 12cのDBを構築し、その確認時に作成したユーザに有効期限がついていた。
意識的にそのような設定をした憶えはなく、期限が過ぎて無効になると困るので、設定の確認と無制限にする対応を行った。以下はその手順。
1. sysdbaでログインする
Oracleのサーバにssh
でログインし、sqlplus
コマンドでsysdbaとしてログインする。
$ sqlplus /nolog
SQL> conn / as sysdba
接続されました。
2. 有効期限に関する設定を確認する
ユーザの有効期限はユーザプロファイルに設定があるので、今の設定内容を確認する。
SQL> set linesize 200
SQL> set tab off
SQL> col profile format a32
SQL> col limit format a32
SQL> select * from dba_profiles where resource_name = 'PASSWORD_LIFE_TIME';
PROFILE RESOURCE_NAME RESOURCE LIMIT COM
-------------------------------- -------------------------------- -------- -------------------------------- ---
DEFAULT PASSWORD_LIFE_TIME PASSWORD 180 NO
対象の有効期限は180日。
3. 有効期限を無期限にする
alter profile
でdefaultプロファイルの有効期限を無期限に変更する。
SQL> alter profile default limit password_life_time unlimited;
プロファイルが変更されました。
変更後、先ほどのSQLを再実行すると、設定が無期限に変更されたことが確認できる。
SQL> select * from dba_profiles where resource_name = 'PASSWORD_LIFE_TIME';
PROFILE RESOURCE_NAME RESOURCE LIMIT COM
-------------------------------- -------------------------------- -------- -------------------------------- ---
DEFAULT PASSWORD_LIFE_TIME PASSWORD UNLIMITED NO