作業ノート

様々なまとめ、雑感など

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:

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

参考

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

参考