end0tknr's kipple - web写経開発

太宰府天満宮の狛犬って、妙にカワイイ

centos7 へ oracle database 12c を install

上記を参考に centos7 へ oracle database 12c を install。

これまで、mysqlやpostgresを利用することが多かった私にとってポイント?は以下

  • oracle 12cのinstallにGUI(GNOME Desktop)要
  • OSカーネルパラメータを変更
  • oracle 12cの download サイトが、独特
  • 参考urlはver.12.2を使用してますが、12.1にした影響か文字化けしてます...

目次

今回のエントリは、長いので珍しく目次を付けました

1. centos7 を virtual box へ install

oracle 12cのinstallには GUI要な為、 centos7 minimal install後、GNOME を 追加installしました。

また、oracle 12c の installは、oracleユーザで行う為、 centos7 minimal install の中で ユーザ追加(oracle)しました。

(参考) 以下はGNOMEのinstallコマンドと、GUIの起動コマンドです

$ sudo yum groups install "GNOME Desktop"
$ startx

f:id:end0tknr:20201227083413p:plain

2. oracle installの前準備

私の場合、centos7 install時にユーザ:oracleを作成しましたが、基本的には https://dbalone.com/oracle-db-12c-r2-ee-install に記載の通りです。

私がよく利用するmysqlやpostgresのinstallでは、OSリソース制限変更までは 実施していなかったこともあり、内容は理解していません。

OSグループ作成

# groupadd -g 54321 oinstall
# groupadd -g 54322 dba
# groupadd -g 54323 oper
# groupadd -g 54324 backupdba
# groupadd -g 54325 dgdba
# groupadd -g 54326 kmdba
# groupadd -g 54330 racdba

OSユーザ修正

# usermod -g oinstall -G dba,backupdba,dgdba,kmdba,racdba,oper oracle
# id oracle
uid=1000(oracle) gid=54321(oinstall) groups=54321(oinstall),54322(dba),54323(oper),
                 54324(backupdba),54325(dgdba),54326(kmdba),54330(racdba)

oracle install 先の mkdir

# mkdir -p /u01/app/oracle
# mkdir /u01/app/oraInventory
# chown -R oracle:oinstall /u01/app/oracle
# chown -R oracle:oinstall /u01/app/oraInventory
# chmod -R 775 /u01

oracleユーザの .bash_profile 変更

# vi /home/oracle/.bash_profile
 
umask 022                           ## ADD
export ORACLE_HOSTNAME=cent7.a5.jp  ## ADD ★注意
export ORACLE_BASE=/u01/app/oracle  ## ADD

OSリソース制限変更

# vi /etc/security/limits.conf
oracle soft nproc 2047              ## ADD
oracle hard nproc 16384             ## ADD
oracle soft nofile 1024             ## ADD
oracle hard nofile 65536            ## ADD
oracle soft stack 10240             ## ADD
oracle hard stack 32768             ## ADD

# vi /etc/pam.d/login
session required pam_limits.so      ## ADD

依存libraryのyum install

https://dbalone.com/oracle-db-12c-r2-ee-install で記載の内容に加え、 後で実施する oracleインストーラのチェックにより、 gcc-c++ の不足が指摘されましたので、これを追加しています。

# yum install bc.x86_64 binutils.x86_64 compat-libcap1.x86_64 \
      compat-libstdc++-33.i686 compat-libstdc++-33.x86_64 glibc.x86_64 \
      glibc-devel.x86_64 glibc.i686 glibc-devel.i686 ksh.x86_64 \
      libaio.x86_64 libaio.i686 libaio-devel.i686 libaio-devel.x86_64 \
      libgcc.x86_64 libgcc.i686 libstdc++.x86_64 libstdc++-devel.x86_64 \
      libstdc++.i686 libstdc++-devel.i686 libxcb.x86_64 libxcb.i686 \
      libX11.x86_64 libX11.i686 libXau.x86_64 libXau.i686 libXi.x86_64 \
      libXi.i686 libXtst.x86_64 libXtst.i686 libXrender.x86_64 \
      libXrender.i686 libXrender-devel.i686 libXrender-devel.x86_64 \
      make.x86_64 net-tools.x86_64 nfs-utils.x86_64 smartmontools.x86_64 \
      sysstat.x86_64

# yum install gcc-*

カーネルパラメータの変更

以下のconfファイルを新規作成し、その後 sysctl コマンドにて反映

# vi /etc/sysctl.d/97-oracle-database-sysctl.conf
 
fs.aio-max-nr = 1048576
fs.file-max = 6815744
kernel.shmall = 858993
kernel.shmmax = 4294967295
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
net.ipv4.ip_local_port_range = 9000 65500
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048576
# sysctl --system

/etc/hosts へ 自身を追加

# vi /etc/hosts
192.168.63.3 cent7.a5.jp  ## ADD

3. oracle database 12c の入手

oracle 12c の download

最新の oracle database は、以下の1)で配布されていますが、 古い oracle 12c は、2) で入手します。

ブラウザで 2)へアクセスし、「oracle database 12c」で検索すると、 「Oracle_SSN_DLM_12262356.exe」のようなファイル名のダウンローダを入手できますので、 このダウンローダにて、oracle dababase 12c の zip をダウンロードします。

以下は、2)へアクセスした後からの画面遷移です。

f:id:end0tknr:20201227090016p:plain

f:id:end0tknr:20201227090027p:plain

f:id:end0tknr:20201227090039p:plain

f:id:end0tknr:20201227090055p:plain

f:id:end0tknr:20201227090106p:plain

oracle12c installerの解凍

$ pwd
/home/oracle/tmp
$ ls -lh
-rwxr--r-- 1 oracle oinstall 1.6G Dec 27 09:40 V46095-01_1of2.zip
-rwxr--r-- 1 oracle oinstall 968M Dec 27 09:40 V46095-01_2of2.zip

$ unzip V46095-01_1of2.zip
$ unzip V46095-01_2of2.zip

4. oracle database 12c の install

installerの起動

ここから先は、GUI環境で行います

$ startx

で、GNOME Desktop を起動し、ターミナルにて以下を実行

$ cd /home/oracle/tmp/database
$ ./runInstaller

installer ウィザードの各画面

メールアドレスは空欄でOK

f:id:end0tknr:20201227112600p:plain

DBは後で作成しますので、「install database software only」を選択

f:id:end0tknr:20201227112609p:plain

「Single instance database installation」を選択

f:id:end0tknr:20201227112626p:plain

defaultのEnglishに 「Japapanese」を追加

f:id:end0tknr:20201227114428p:plain

「Enterprise Edition」を選択

f:id:end0tknr:20201227114452p:plain

Oracle base」や「Software location」はdefaultのまま

★これらのdirは、このエントリの序盤で mkdir したものです

f:id:end0tknr:20201227114503p:plain

「Inventory(目録?) Directory」や「orainventory Group Name」はdefaultのまま

★ 「oinstall」は、このエントリの序盤で「# groupadd -g 54321 oinstall」したものです

f:id:end0tknr:20201227114512p:plain

この画面もdefaultのままです

f:id:end0tknr:20201227114523p:plain

「Perform Prerequisite Checks」の画面で「OS Kernel Parameters」のWarningsが 複数ありましたが、「Warnings」であり「Error」でなないので、「Ignore All」で先に進みました

f:id:end0tknr:20201227120738p:plain

その後、install処理完了まで、数分待ちます。

f:id:end0tknr:20201227120749p:plain

しばらくすると、rootユーザで sh を実行するよう促されますので、これを実行します

f:id:end0tknr:20201227121615p:plain

以下は、上記 root用 scriptの実行結果です。

# /u01/app/oraInventory/orainstRoot.sh 
Changing permissions of /u01/app/oraInventory.
Adding read,write permissions for group.
Removing read,write,execute permissions for world.

Changing groupname of /u01/app/oraInventory to oinstall.

The execution of the script is complete.
# /u01/app/oracle/product/12.1.0/dbhome_1/root.sh 
Performing root user operation.

The following environment variables are set as:
    ORACLE_OWNER= oracle
    ORACLE_HOME=  /u01/app/oracle/product/12.1.0/dbhome_1

Enter the full pathname of the local bin directory: [/usr/local/bin]: 
   Copying dbhome to /usr/local/bin ...
   Copying oraenv to /usr/local/bin ...
   Copying coraenv to /usr/local/bin ...

Creating /etc/oratab file...
Entries will be added to the /etc/oratab file as needed by
Database Configuration Assistant when a database is created
Finished running generic part of root script.
Now product-specific root actions will be performed.

以上で、インストール自体は完了です

f:id:end0tknr:20201227121627p:plain

5. Netリスナー追加

次にNetリスナーを追加しますので、GUI を起動した状態で、 netca コマンドにより、ウィザード画面を表示させます。

$ startx
$ netca

以降、defaultのまま、画面を進み、完了すると、 listener.ora が生成され、host名やport=1521等が定義されていることが分かります

f:id:end0tknr:20201227132317p:plain

f:id:end0tknr:20201227132327p:plain

f:id:end0tknr:20201227132336p:plain

f:id:end0tknr:20201227132344p:plain

f:id:end0tknr:20201227132355p:plain

f:id:end0tknr:20201227132403p:plain

f:id:end0tknr:20201227132412p:plain

f:id:end0tknr:20201227132419p:plain

$ cat /u01/app/oracle/product/12.1.0/dbhome_1/network/admin/listener.ora

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = cent7.a5.jp)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
  )

Netリスナー追加後、「ss -napt」で port:1521のlistenや「tnsping localhost」による 応答を確認してください。

$ ss -napt
State    Recv-Q Send-Q Local Address:Port   Peer Address:Port
  :
LISTEN   0      128         [::]:1521       [::]:*    users:(("tnslsnr",pid=14836,fd=9))

$ tnsping localhost
TNS Ping Utility for Linux: Version 12.1.0.2.0 - Production on 27-DEC-2020 13:29:36
  :
Used HOSTNAME adapter to resolve the alias
Attempting to contact (DESCRIPTION=(CONNECT_DATA=(SERVICE_NAME=))
                                   (ADDRESS=(PROTOCOL=TCP)(HOST=127.0.0.1)(PORT=1521)))
OK (0 msec)
$

6. データベースの作成 ( = CREATE DATABASE)

データベースの作成

データベース作成も GUIで実施しますので、dbca コマンドで、 ウィザードを起動してください。

$ dbca

「Create Database」を選択

f:id:end0tknr:20201227154850p:plain

defaultと異なり「Advanced Mode」を選択

f:id:end0tknr:20201227154915p:plain

f:id:end0tknr:20201227154924p:plain

「Global Database Name」「sid」は自身で入力

f:id:end0tknr:20201227154933p:plain

f:id:end0tknr:20201227154941p:plain

defaultと異なり「SYSTEM」「SYS」のパスワードは、同じものを設定 (手間なので)

f:id:end0tknr:20201227154951p:plain

f:id:end0tknr:20201227155003p:plain

f:id:end0tknr:20201227155012p:plain

f:id:end0tknr:20201227155024p:plain

この画面は、タブ分けにより以降、更に4画面があります。

f:id:end0tknr:20201227155040p:plain

f:id:end0tknr:20201227155049p:plain

この画面は、よく分かりませんでしたが、 「Default Language=Japanese」「Default Territory=Japan」としました。

f:id:end0tknr:20201227155112p:plain

f:id:end0tknr:20201227155119p:plain

f:id:end0tknr:20201227155132p:plain

f:id:end0tknr:20201227155140p:plain

f:id:end0tknr:20201227155147p:plain

f:id:end0tknr:20201227155154p:plain

database 作成により、tnsnames.ora が作成

この tnsnames.ora 内にある記載内容で、databaseへ接続できます

$ cat /u01/app/oracle/product/12.1.0/dbhome_1/network/admin/tnsnames.ora 

LISTENER_ORCL =
  (ADDRESS = (PROTOCOL = TCP)(HOST = cent7.a5.jp)(PORT = 1521))
ORCL =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = cent7.a5.jp)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl.a5.jp)
    )
  )

接続用設定 その他

# su - oracle

$ vi /etc/oratab
orcl:/u01/app/oracle/product/12.1.0/dbhome_1:Y ## CHANGE N->Y

$ vi ~/.bash_profile
export ORACLE_SID=orcl ## ADD

$ source ~/.bash_profile

データベースへの簡易接続確認

$ sqlplus /nolog
SQL*Plus: Release 12.1.0.2.0 Production on Sun Dec 27 18:43:47 2020
Copyright (c) 1982, 2014, Oracle.  All rights reserved.

SQL> connect / as sysdba
Connect.
SQL> select instance_name, host_name, version, startup_time from v$instance;

INSTANCE_NAME
----------------
HOST_NAME
----------------------------------------------------------------
VERSION           STARTUP_
----------------- --------
orcl
cent7.a5.jp
12.1.0.2.0        20-12-27

7. 自動起動

# vi /etc/sysconfig/orcl.oracledb

ORACLE_BASE=/u01/app/oracle
ORACLE_HOME=/u01/app/oracle/product/12.1.0/dbhome_1
ORACLE_SID=orcl
# vi /usr/lib/systemd/system/orcl@lsnrctl.service

[Unit]
Description=Oracle Net Listener
After=network.target

[Service]
Type=forking
EnvironmentFile=/etc/sysconfig/orcl.oracledb
ExecStart=/u01/app/oracle/product/12.1.0/dbhome_1/bin/lsnrctl start
ExecStop=/u01/app/oracle/product/12.1.0/dbhome_1/bin/lsnrctl stop
User=oracle

[Install]
WantedBy=multi-user.target
# vi /usr/lib/systemd/system/orcl@oracledb.service

[Unit]
Description=Oracle Database service
After=network.target lsnrctl.service

[Service]
Type=forking
EnvironmentFile=/etc/sysconfig/orcl.oracledb
ExecStart=/u01/app/oracle/product/12.1.0/dbhome_1/bin/dbstart $ORACLE_HOME
ExecStop=/u01/app/oracle/product/12.1.0/dbhome_1/bin/dbshut $ORACLE_HOME
User=oracle

[Install]
WantedBy=multi-user.target
# systemctl daemon-reload
# systemctl enable orcl@lsnrctl orcl@oracledb

8. sqlplus による接続テスト

$ sqlplus /nolog
SQL> connect system/sasa24ki;

SQL> create table TEST_TBL_1 (
num_1         NUMBER(10),
num_2         NUMBER(10),
str_1         VARCHAR2(10),
str_2         VARCHAR2(10),
PRIMARY KEY (num_1)
);

SQL> insert into TEST_TBL_1 values (1,10,'HOGE','FOO');
SQL> insert into TEST_TBL_1 values (2,10,'ほげ','風');
SQL> commit;

SQL> select * from TEST_TBL_1;
     NUM_1      NUM_2 STR_1      STR_2
---------- ---------- ---------- ----------
         1         10 HOGE       FOO
         2         10 ??????     ???

日本語入力すると「????」で文字化けしますが、 そのうち、気が向いたら調べます。

  1. python + cx_Oracle による接続テスト

Oracle Instant Client + cx_Oracle による python3 on centos7 から、oracle 12cへ接続 - end0tknr's kipple - web写経開発

↑こちらに書いている通りです。

#!/usr/bin/python3
# -*- coding: utf-8 -*-

import cx_Oracle
import random
import string

# 接続情報(ID/PW, HOST, SERVICE NAME)は、以下の tnsnames.ora の通りです。
# /u01/app/oracle/product/12.2.0/dbhome_1/network/admin/tnsnames.ora
db_user_pw_host_port_service = "system/PWはないしょ@localhost:1521/orcl.a5.jp"


def main():
    db_conn, db_cursor = connect_db()

    db_cursor.execute('select * from TEST_TBL_1')
    res = db_cursor.fetchall()
    print(res)
    
    db_conn.commit()
    db_cursor.close()
    db_conn.close()

def connect_db():
    # print(cx_Oracle.clientversion())
    connect = cx_Oracle.connect(db_user_pw_host_port_service)
    cursor = connect.cursor() # カーソルを取得
    return connect,cursor


if __name__ == '__main__':
    main()

↑こう書くと、↓こう表示されます

$ ./foo.py 
[(1, 10, 'HOGE', 'FOO'), (2, 10, '¿¿¿¿¿¿', '¿¿¿')]