end0tknr's kipple - web写経開発

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

php -S <addr>:<port> Run with built-in web server

phpビルトインwebサーバの存在を初めて知りました。

PG言語自体に、こんな機能があるとは...

多分、pythonperl等の他言語には、存在しない機能かと思います。

$ php --version
PHP 7.4.7 (cli) (built: Jun 21 2020 06:51:36) ( ZTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies

$ php --help
Usage: php [options] [-f] <file> [--] [args...]
   php [options] -r <code> [--] [args...]
   php [options] [-B <begin_code>] -R <code> [-E <end_code>] [--] [args...]
   php [options] [-B <begin_code>] -F <file> [-E <end_code>] [--] [args...]
   php [options] -S <addr>:<port> [-t docroot] [router] ######## ココ ########
   php [options] -- [args...]
   php [options] -a
     :

oracle 12c のエクスポート/インポート ツール - exp/imp と expdp/impdp

またも oracleをあまり使用したことがない自分用メモ。

目次

1. 旧 exp/imp と 新 expdp/impdp

以前からの exp/imp は下位互換の為に残されていますので、 oracle 10g から導入のexpdp/impdp を利用すべきようです。

exp/imp や expdp/impdp は、oracle のinstall先である /u01/app/oracle/product/12.2.0/dbhome_1/bin に存在します

2. exp & imp による エクスポート & インポート

exp によるエクスポート

まず「exp help=y」コマンドでヘルプを見ると、 expは圧縮データをエクスポートすること等が分かります。

$ /u01/app/oracle/product/12.2.0/dbhome_1/bin/exp help=y
Export: Release 12.2.0.1.0 - Production on Mon Dec 28 23:39:04 2020
  :
You can let Export prompt you for parameters by entering the EXP
command followed by your username/password:
     Example: EXP SCOTT/TIGER
Or, you can control how Export runs by entering the EXP command followed
by various arguments. To specify parameters, you use keywords:
     Format:  EXP KEYWORD=value or KEYWORD=(value1,value2,...,valueN)
     Example: EXP SCOTT/TIGER GRANTS=Y TABLES=(EMP,DEPT,MGR)
               or TABLES=(T1:P1,T1:P2), if T1 is partitioned table
USERID must be the first parameter on the command line.

Keyword    Description (Default)      Keyword      Description (Default)
--------------------------------------------------------------------------
USERID     username/password          FULL         export entire file (N)
BUFFER     size of data buffer        OWNER        list of owner usernames
FILE       output files (EXPDAT.DMP)  TABLES       list of table names
COMPRESS   import into one extent (Y) RECORDLENGTH length of IO record
GRANTS     export grants (Y)          INCTYPE      incremental export type
INDEXES    export indexes (Y)         RECORD       track incr. export (Y)
DIRECT     direct path (N)            TRIGGERS     export triggers (Y)
LOG        log file of screen output  STATISTICS   analyze objects (ESTIMATE)
ROWS       export data rows (Y)       PARFILE      parameter filename
CONSISTENT cross-table consistency(N) CONSTRAINTS  export constraints (Y)
$ /u01/app/oracle/product/12.2.0/dbhome_1/bin/exp system/ないしょ FILE=exp_data.dmp
Export: Release 12.2.0.1.0 - Production on Mon Dec 28 23:46:15 2020
   :
Connected to: Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
Export done in US7ASCII character set and AL16UTF16 NCHAR character set
server uses AL32UTF8 character set (possible charset conversion)
   :
. . exporting table                         MEMBER          1 rows exported
EXP-00091: Exporting questionable statistics.
. . exporting table                            OL$
. . exporting table                       OL$HINTS
. . exporting table                       OL$NODES
. . exporting table        SQLPLUS_PRODUCT_PROFILE          0 rows exported
EXP-00091: Exporting questionable statistics.
. . exporting table                     TEST_TBL_1      10000 rows exported
       :
. . exporting table                     TEST_TBL_4
. . exporting partition             TBL_4_PART__500000     499999 rows exported
. . exporting partition             TBL_4_PART_1000000     500000 rows exported
      :
. . exporting partition             TBL_4_PART_5500000          1 rows exported
EXP-00091: Exporting questionable statistics.
  :
$

一旦、テーブルをいくつか削除

$ sqlplus /nolog

SQL> connect system/ないしょ;

SQL> column OWNER      format a10
column TABLE_NAME format a10
SELECT OWNER,TABLE_NAME
FROM   ALL_TABLES
WHERE OWNER='SYSTEM' and TABLE_NAME like 'TEST_%'
ORDER BY OWNER,TABLE_NAME;

OWNER      TABLE_NAME
---------- ----------
SYSTEM     TEST_TBL_1
SYSTEM     TEST_TBL_2
SYSTEM     TEST_TBL_3
SYSTEM     TEST_TBL_4


SQL> drop table TEST_TBL_1 cascade constraints;
Table dropped.

SQL> drop table TEST_TBL_2 cascade constraints;
Table dropped.

SQL> commit;
Commit complete.

imp によるインポート

expは圧縮した状態でエクスポートしていると思いますが、 user=systemで実施した為か、269MBサイズがあります。

$ ls -lh exp_data.dmp 
-rw-r--r-- 1 oracle oinstall 269M Dec 28 23:46 exp_data.dmp
$ /u01/app/oracle/product/12.2.0/dbhome_1/bin/imp system/ないしょ FILE=exp_data.dmp

Import: Release 12.2.0.1.0 - Production on Tue Dec 29 00:12:17 2020

Copyright (c) 1982, 2017, Oracle and/or its affiliates.  All rights reserved.


Connected to: Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

Export file created by EXPORT:V12.02.00 via conventional path
import done in US7ASCII character set and AL16UTF16 NCHAR character set
import server uses AL32UTF8 character set (possible charset conversion)
IMP-00403: 

Warning: This import generated a separate SQL file "import_sys"
   which contains DDL that failed due to a privilege issue.

IMP-00031: Must specify FULL=Y or provide FROMUSER/TOUSER or TABLES arguments
IMP-00000: Import terminated unsuccessfully

上記のIMP-00031エラーとなった為、対象テーブルを先程、dropしたテーブルに限定します。

$ /u01/app/oracle/product/12.2.0/dbhome_1/bin/imp system/ないしょ \
>         FILE=exp_data.dmp TABLES=TEST_TBL_1,TEST_TBL_2

Import: Release 12.2.0.1.0 - Production on Tue Dec 29 00:15:36 2020
   :
Export file created by EXPORT:V12.02.00 via conventional path
import done in US7ASCII character set and AL16UTF16 NCHAR character set
import server uses AL32UTF8 character set (possible charset conversion)
   :
. . importing table                   "TEST_TBL_1"      10000 rows imported
. . importing table                   "TEST_TBL_2"    1000000 rows imported
Import terminated successfully with warnings.
$

最後にインポート結果を確認して完了です。

$ sqlplus /nolog

SQL> connect system/ないしょ;

SQL> column OWNER      format a10
column TABLE_NAME format a10
SELECT OWNER,TABLE_NAME
FROM   ALL_TABLES
WHERE OWNER='SYSTEM' and TABLE_NAME like 'TEST_%'
ORDER BY OWNER,TABLE_NAME;

OWNER      TABLE_NAME
---------- ----------
SYSTEM     TEST_TBL_1
SYSTEM     TEST_TBL_2
SYSTEM     TEST_TBL_3
SYSTEM     TEST_TBL_4

SQL> select count(*) from TEST_TBL_1;
  COUNT(*)
----------
     10000

SQL> select count(*) from TEST_TBL_2;
  COUNT(*)
----------
   1000000
SQL>

3. expdp & impdp による エクスポート & インポート

expdp によるエクスポート

先程の expと同様「expdp help=y」コマンドでヘルプを見ることができますが、 expdp はオプションが増えすぎて、見る気をなくします。

$ /u01/app/oracle/product/12.2.0/dbhome_1/bin/expdp help=y
  :
Export: Release 12.2.0.1.0 - Production on Tue Dec 29 00:25:09 2020

The Data Pump export utility provides a mechanism for transferring data objects
between Oracle databases. The utility is invoked with the following command:

   Example: expdp scott/tiger DIRECTORY=dmpdir DUMPFILE=scott.dmp

You can control how Export runs by entering the 'expdp' command followed
by various parameters. To specify parameters, you use keywords:

   Format:  expdp KEYWORD=value or KEYWORD=(value1,value2,...,valueN)
   Example: expdp scott/tiger DUMPFILE=scott.dmp DIRECTORY=dmpdir SCHEMAS=scott
               or TABLES=(T1:P1,T1:P2), if T1 is partitioned table
   :
<略 この先が長い>   

インターネットで検索すると、expdp コマンドには、 DIRECTORYオプションを指定するよう記載されているページを見かけますが、 DIRECTORYオプションがなくても、 /u01/app/oracle/admin/orcl/dpdump/expdp_data.dmp へ エクスポートできました。

$ /u01/app/oracle/product/12.2.0/dbhome_1/bin/expdp system/ないしょ DUMPFILE=expdp_data.dmp

Export: Release 12.2.0.1.0 - Production on Tue Dec 29 00:31:32 2020
   :
Starting "SYSTEM"."SYS_EXPORT_SCHEMA_01":  system/********
    dumpfile=expdp_data.dmp reuse_dumpfiles=true nologfile=true 
Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA
   :
Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
. . exported "SYSTEM"."TEST_TBL_3"                       112.9 MB 5000000 rows
. . exported "SYSTEM"."TEST_TBL_2"                       21.81 MB 1000000 rows
. . exported "SYSTEM"."TEST_TBL_4":"TBL_4_PART_1500000"  11.39 MB  500000 rows
. . exported "SYSTEM"."TEST_TBL_4":"TBL_4_PART_2000000"  11.39 MB  500000 rows
   :
Master table "SYSTEM"."SYS_EXPORT_SCHEMA_01" successfully loaded/unloaded
******************************************************************************
Dump file set for SYSTEM.SYS_EXPORT_SCHEMA_01 is:
  /u01/app/oracle/admin/orcl/dpdump/expdp_data.dmp

一旦、テーブルをいくつか削除

詳細の記載は省略しますが、先程と同様、テーブルをいくつか削除します。

impdp によるインポート

先程のimpコマンドと同様のパラメータで、インポートできます

$ /u01/app/oracle/product/12.2.0/dbhome_1/bin/impdp system/ないしょ \
         FILE=expdp_data.dmp TABLES=TEST_TBL_1,TEST_TBL_2
Import: Release 12.2.0.1.0 - Production on Tue Dec 29 00:43:38 2020
   :
Connected to: Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
   :
Starting "SYSTEM"."SYS_IMPORT_TABLE_01":  system/********
   dumpfile=expdp_data.dmp TABLES=TEST_TBL_1,TEST_TBL_2 nologfile=true 
Processing object type SCHEMA_EXPORT/TABLE/TABLE
Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA
. . imported "SYSTEM"."TEST_TBL_2"                       21.81 MB 1000000 rows
. . imported "SYSTEM"."TEST_TBL_1"                       219.9 KB   10000 rows
Processing object type SCHEMA_EXPORT/TABLE/INDEX/INDEX
Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
Processing object type SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
Processing object type SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
Processing object type SCHEMA_EXPORT/STATISTICS/MARKER
Job "SYSTEM"."SYS_IMPORT_TABLE_01" successfully completed at Tue Dec 29 00:43:59 2020 elapsed 0 00:00:20

oracle database 12c の range パーティショニングを試す

随分、以前に、postgresやmysql の partitioning は試していましたが、 今回は、oracle の partitioning 。

oracle の パーティショニング方式には、1)レンジ、2)ハッシュ、3)リスト 4)その他... がありますが、 私がmysqlでも使用していたレンジパーティショニングを試します。

私のユースケースとしては、見積書にある明細行を登録する見積明細テーブルへ適用していました。

よく聞く間違い

  • 既に存在するテーブルも「alter table ~ modify」で後からパーティショニングできます
  • パーティショニングは、DB内部のテーブルを分割しますので、アプリケーションが呼ぶSQLは変更不要です

事前準備 - 非パーティショニング テーブルの作成

create table TEST_TBL_4 (
num_1         NUMBER(10),
num_2         NUMBER(10),
str_1         VARCHAR2(10),
str_2         VARCHAR2(10),
PRIMARY KEY (num_1)
);

CREATE INDEX TEST_TBL_4_STR_1 ON TEST_TBL_4(str_1);

レンジ パーティショニング化

alter table TEST_TBL_4 modify
  partition by range(num_1) (
    partition tbl_4_part__500000 values less than ( 500000),
    partition tbl_4_part_1000000 values less than (1000000),
    partition tbl_4_part_1500000 values less than (1500000),
    partition tbl_4_part_2000000 values less than (2000000),
    partition tbl_4_part_2500000 values less than (2500000),
    partition tbl_4_part_3000000 values less than (3000000),
    partition tbl_4_part_3500000 values less than (3500000),
    partition tbl_4_part_4000000 values less than (4000000),
    partition tbl_4_part_4500000 values less than (4500000),
    partition tbl_4_part_5000000 values less than (5000000),
    partition tbl_4_part_5500000 values less than (5500000)
  ) online;

レンジ パーティショニング化の確認

SQL> column table_name      format a20
     column PARTITION_NAME  format a20
     SELECT TABLE_NAME,PARTITION_NAME
     FROM   USER_TAB_PARTITIONS
     where table_name='TEST_TBL_4';

TABLE_NAME           PARTITION_NAME
-------------------- --------------------
TEST_TBL_4           TBL_4_PART__500000
TEST_TBL_4           TBL_4_PART_1000000
TEST_TBL_4           TBL_4_PART_1500000
TEST_TBL_4           TBL_4_PART_2000000
TEST_TBL_4           TBL_4_PART_2500000
TEST_TBL_4           TBL_4_PART_3000000
TEST_TBL_4           TBL_4_PART_3500000
TEST_TBL_4           TBL_4_PART_4000000
TEST_TBL_4           TBL_4_PART_4500000
TEST_TBL_4           TBL_4_PART_5000000
TEST_TBL_4           TBL_4_PART_5500000

パーティショニング化の速度効果

は、自身で「explain plan for ~」や、 アプリケーションからのDBテーブル参照で、ご確認ください。

テーブルを分割した影響もあり、 単純な「explain plan for ~」だけでは速度効果を確認できないかと思いますので

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, '¿¿¿¿¿¿', '¿¿¿')]

oracle 12c における sql チューニング - 「explain plan for」「V$SQLSTATS」等

oracle dbは自身に利用実績が少ない為、メモ。

目次

事前準備

テスト用 table 作成

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)
);
CREATE INDEX TEST_TBL_1_STR_1 ON TEST_TBL_1(str_1);

create table TEST_TBL_2 (
num_1         NUMBER(10),
num_2         NUMBER(10),
str_1         VARCHAR2(10),
str_2         VARCHAR2(10),
PRIMARY KEY (num_1)
);
CREATE INDEX TEST_TBL_2_STR_1 ON TEST_TBL_2(str_1);

作成したtabl定義や、pkey、index確認。

まず、カラム定義

SQL> DESCRIBE TEST_TBL_1;
 Name                       Null?    Type
 -------------------------- -------- -------------
 NUM_1                      NOT NULL NUMBER(10)
 NUM_2                               NUMBER(10)
 STR_1                               VARCHAR2(10)
 STR_2                               VARCHAR2(10)

SQL> DESCRIBE TEST_TBL_2;  
 Name                       Null?    Type
 -------------------------- -------- ------------
 NUM_1                      NOT NULL NUMBER(10)
 NUM_2                               NUMBER(10)
 STR_1                               VARCHAR2(10)
 STR_2                               VARCHAR2(10)

次に、primary key

SQL> column constraint_name format a20
column table_name      format a20
column column_name     format a20
SELECT c.table_name, cc.column_name,constraint_type
FROM user_constraints c
JOIN user_cons_columns cc
  ON (c.table_name     =cc.table_name AND
      c.constraint_name=cc.constraint_name)
WHERE c.table_name in ('TEST_TBL_1','TEST_TBL_2')
ORDER BY cc.table_name, cc.column_name;

TABLE_NAME           COLUMN_NAME          C
-------------------- -------------------- -
TEST_TBL_1           NUM_1                P
TEST_TBL_2           NUM_1                P

最後に、index

SQL> column INDEX_NAME format a16
column INDEX_TYPE format a10
column TABLE_NAME format a10
SELECT
  INDEX_NAME, INDEX_TYPE, TABLE_NAME,
  TABLE_TYPE, UNIQUENESS, LAST_ANALYZED
FROM DBA_INDEXES
WHERE table_name in ('TEST_TBL_1','TEST_TBL_2');

INDEX_NAME       INDEX_TYPE TABLE_NAME TABLE_TYPE  UNIQUENES LAST_ANAL
---------------- ---------- ---------- ----------- --------- ---------
SYS_C007451      NORMAL     TEST_TBL_1 TABLE       UNIQUE    26-DEC-20
TEST_TBL_1_STR_1 NORMAL     TEST_TBL_1 TABLE       NONUNIQUE 26-DEC-20
SYS_C007452      NORMAL     TEST_TBL_2 TABLE       UNIQUE    26-DEC-20
TEST_TBL_2_STR_1 NORMAL     TEST_TBL_2 TABLE       NONUNIQUE 26-DEC-20

テストテーブルへのデータinsert

先程のエントリにある python script の通りです。

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

念の為?、indexを再構築

ALTER INDEX TEST_TBL_1_STR_1 REBUILD;
ALTER INDEX TEST_TBL_2_STR_1 REBUILD;

チューニングの為のTIPS (調査・分析)

V$SQLSTATS による統計情報

日々、実行されるSQLのうち遅いSQLを抽出するには、 以下のように V$SQLSTATS を参照すると良いかと思います。

以下では、一回あたりの実行時間(マイクロ秒)が長いSQL 上位5種を出力しています。

EXECUTE DBMS_STATS.GATHER_DATABASE_STATS;

SELECT * FROM(
  SELECT  SQL_TEXT,
          ELAPSED_TIME/EXECUTIONS, 
          LAST_ACTIVE_TIME
  FROM V$SQLSTATS
  WHERE EXECUTIONS > 0
  ORDER BY ELAPSED_TIME/EXECUTIONS desc)
WHERE ROWNUM <= 5;

SQL_TEXT
--------------------------------------------------------------------------------
ELAPSED_TIME/EXECUTIONS LAST_ACTI
----------------------- ---------
call dbms_stats.gather_database_stats_job_proc (  )
             4154223.47 26-DEC-20

select count(*) from wri$_optstat_opr o, wri$_optstat_opr_tasks t where o.id = t
.op_id(+) and o.operation = 'gather_database_stats (auto)' and (not regexp_like(
   extract(xmltype('<notes>' || o.notes || '</notes>'), '//error'),   '^<error>O
RA-200[0-9][0-9]') or  not regexp_like(   extract(xmltype('<notes>' || t.notes |
| '</notes>'), '//error'),   '^<error>ORA-200[0-9][0-9]'))
                3094077 26-DEC-20

SQL_TEXT
--------------------------------------------------------------------------------
ELAPSED_TIME/EXECUTIONS LAST_ACTI
----------------------- ---------

begin prvt_hdm.auto_execute( :dbid, :inst_num , :end_snap_id ); end;
                1023710 26-DEC-20

select /*+  no_parallel_index(t, "I_WRI$_OPTSTAT_H_OBJ#_ICOL#_ST")  dbms_stats c
ursor_sharing_exact use_weak_name_resl dynamic_sampling(0) no_monitoring xmlinde
x_sel_idx_tbl opt_param('optimizer_inmemory_aware' 'false') no_substrb_pad  no_e
xpand index(t,"I_WRI$_OPTSTAT_H_OBJ#_ICOL#_ST") */ count(*) as nrw,count(distinc
t sys_op_lbid(14364,'L',t.rowid)) as nlb,count(distinct hextoraw(sys_op_descend(

SQL_TEXT
--------------------------------------------------------------------------------
ELAPSED_TIME/EXECUTIONS LAST_ACTI
----------------------- ---------
"OBJ#")||sys_op_descend("INTCOL#")||sys_op_descend("SYS_NC00018$")||sys_op_desce
nd("COLNAME"))) as ndk,sys_op_countchg(substrb(t.rowid,1,15),1) as clf from "SYS
"."WRI$_OPTSTAT_HISTGRM_HISTORY" t where "OBJ#" is not null or "INTCOL#" is not
null or "SYS_NC00018$" is not null or "COLNAME" is not null
                 880529 26-DEC-20

MERGE /*+ dynamic_sampling(ST 4) dynamic_sampling_est_cdn(ST)                OPT
_PARAM('_parallel_syspls_obey_force' 'false')             */ INTO STATS_TARGET$
ST USING (SELECT CASE WHEN DBMS_STATS_INTERNAL.BITCLR(AFLAGS, :B20 + :B23 ) = :B
  :

5 rows selected.

「EXECUTE DBMS_STATS.GATHER_DATABASE_STATS;」は不要かも

実行計画確認 - 「explain plan for」「autotrace」

mysql の explain analyze と異なり、 まず「explain plan for ~」で実行計画を登録し、 その後、「SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY());」で参照します。

参考として、出力結果は以下に記載していますが、 実際に動かしながら、確認する方が理解しやすいと思います。

SQL> explain plan for
select count(*)
from test_tbl_1 t_1
join test_tbl_2 t_2 on (t_1.num_1=t_2.num_1)
where t_1.str_1 like 'A%';  2    3    4    5  
Explained.

SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY()) ;
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 3343162413

------------------------------------------------------------------------------
| Id |Operation              |Name       |Rows |Bytes| Cost (%CPU)| Time     |
------------------------------------------------------------------------------
PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------
|  0 |SELECT STATEMENT       |           |    1|   14|   528   (2)| 00:00:01 |
|  1 | SORT AGGREGATE        |           |    1|   14|            |          |
|* 2 |  HASH JOIN            |           | 2559|35826|   528   (2)| 00:00:01 |
|* 3 |   TABLE ACCESS FULL   |TEST_TBL_1 | 2559|23031|    12   (0)| 00:00:01 |
|  4 |   INDEX FAST FULL SCAN|SYS_C007452|1000K|4882K|   514   (1)| 00:00:01 |
------------------------------------------------------------------------------
PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------
   2 - access("T_1"."NUM_1"="T_2"."NUM_1")
   3 - filter("T_1"."STR_1" LIKE 'A%')

「explain plan for ~」の他、実際にSQLを実行した結果から表示する 「set autotrace on;」もあります。

set autotrace on;
select * from test_tbl_2 where str_1 like 'A%';
set autotrace off;

チューニングの為のTIPS (対策実施)

ヒント句による index 指定

mysqlでは「using index~」のように記載していましたが、 oracleではヒント句において「/+ INDEX(~ ~) /」のように指定します。

以下の例では、先程のSELECT文では「TABLE ACCESS FULL」がありましたが 「INDEX RANGE SCAN」で効率化されていることが分かります。

SQL>  explain plan for
SELECT /*+ INDEX(tbl TEST_TBL_2_STR_1) */ *
from TEST_TBL_2 tbl
where str_1 = 'ABCD';
Explained.

SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY()) ;
PLAN_TABLE_OUTPUT
---------------------------
Plan hash value: 3456234334

------------------------------------------------------------------------------------------
|Id |Operation                           |Name            |Rows|Bytes|Cost(%CPU)|Time    |
------------------------------------------------------------------------------------------
PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------
|  0|SELECT STATEMENT                    |                |3959|75221|2330   (0)|00:00:01|
|  1| TABLE ACCESS BY INDEX ROWID BATCHED|TEST_TBL_2      |3959|75221|2330   (0)|00:00:01|
|* 2|  INDEX RANGE SCAN                  |TEST_TBL_2_STR_1|3959|     |  11   (0)|00:00:01|
------------------------------------------------------------------------------------------
PLAN_TABLE_OUTPUT
---------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   2 - access("STR_1"='ABCD')

オプティマイザ統計情報の移行

RDBMSは統計情報を参照し、実行計画を作成しますが、 開発環境<->本番環境等、オプティマイザ統計情報の移行を 行った方が良いケースもあります。

試していませんが、以下のurlが分かりやすいです。

qiita.com

パーティショニング

別のエントリに記載しました

oracle database 12c の range パーティショニングを試す - end0tknr's kipple - web写経開発

Oracle Instant Client + cx_Oracle による python3 on centos7 から、oracle 12cへ接続

oracle dbは利用実績が少ない為、メモ。

Step1 「Instant Client for Linux x86-64

https://www.oracle.com/jp/database/technologies/instant-client/downloads.html

にある Instant Client for Linux x86-64 (zip)をdownload し、/etc/ld.so.conf へ登録する程度です。

# mkdir -p /opt/oracle
# cd /opt/oracle
# wget https://download.oracle.com/otn_software/linux/instantclient/19800/instantclient-basic-linux.x64-19.8.0.0.0dbru.zip
# unzip instantclient-basic-linux.x64-19.8.0.0.0dbru.zip

# ls -l instantclient_19_8 
total 233556
-rwxr-xr-x 1 root root     41696 Jul  3 13:44 adrci
-r-xr-xr-x 1 root root      5780 Jul  3 13:44 BASIC_LICENSE
-rw-r--r-- 1 root root      1632 Jul  3 13:44 BASIC_README
-rwxr-xr-x 1 root root     59272 Jul  3 13:44 genezi
-rwxr-xr-x 1 root root   8019360 Jul  3 13:44 libclntshcore.so.19.1
lrwxrwxrwx 1 root root        17 Dec 26 06:10 libclntsh.so -> libclntsh.so.19.1
lrwxrwxrwx 1 root root        17 Dec 26 06:10 libclntsh.so.10.1 -> libclntsh.so.19.1
lrwxrwxrwx 1 root root        17 Dec 26 06:10 libclntsh.so.11.1 -> libclntsh.so.19.1
lrwxrwxrwx 1 root root        17 Dec 26 06:10 libclntsh.so.12.1 -> libclntsh.so.19.1
lrwxrwxrwx 1 root root        17 Dec 26 06:10 libclntsh.so.18.1 -> libclntsh.so.19.1
-rwxr-xr-x 1 root root  80804848 Jul  3 13:44 libclntsh.so.19.1
-r-xr-xr-x 1 root root   3608240 Jul  3 13:44 libipc1.so
-r-xr-xr-x 1 root root    478096 Jul  3 13:44 libmql1.so
-rwxr-xr-x 1 root root   6586360 Jul  3 13:44 libnnz19.so
lrwxrwxrwx 1 root root        15 Dec 26 06:10 libocci.so -> libocci.so.19.1
lrwxrwxrwx 1 root root        15 Dec 26 06:10 libocci.so.10.1 -> libocci.so.19.1
lrwxrwxrwx 1 root root        15 Dec 26 06:10 libocci.so.11.1 -> libocci.so.19.1
lrwxrwxrwx 1 root root        15 Dec 26 06:10 libocci.so.12.1 -> libocci.so.19.1
lrwxrwxrwx 1 root root        15 Dec 26 06:10 libocci.so.18.1 -> libocci.so.19.1
-rwxr-xr-x 1 root root   2338456 Jul  3 13:44 libocci.so.19.1
-rwxr-xr-x 1 root root 130527608 Jul  3 13:44 libociei.so
-r-xr-xr-x 1 root root    153600 Jul  3 13:44 libocijdbc19.so
-rwxr-xr-x 1 root root    115760 Jul  3 13:44 liboramysql19.so
drwxr-xr-x 3 root root        19 Jul  3 13:44 network
-rw-r--r-- 1 root root   4396157 Jul  3 13:44 ojdbc8.jar
-rw-r--r-- 1 root root   1681792 Jul  3 13:44 ucp.jar
-rwxr-xr-x 1 root root    236256 Jul  3 13:44 uidrvci
-rw-r--r-- 1 root root     74263 Jul  3 13:44 xstreams.jar

# vi /etc/ld.so.conf
/opt/oracle/instantclient_19_8  # <-- ADD
# ldconfig

Step2 pip3 install cx_Oracle

# pip3 install cx_Oracle

Step3 sample script

#!/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()
    insert_to_tbl(db_cursor,"TEST_TBL_1",10000)
    insert_to_tbl(db_cursor,"TEST_TBL_2",1000000)
    db_conn.commit()
    db_cursor.close()
    db_conn.close()


def insert_to_tbl(db_cursor, tbl_name, row_size):

    sql_tmpl ='''
insert into %s (num_1, num_2, str_1, str_2) values(:1, :2, :3, :4)
 '''
    sql = sql_tmpl % tbl_name
    db_cursor.prepare(sql)

    id = 0
    sql_vals_rows = []
    while id < row_size:
        id += 1
        sql_vals_rows.append([id,
                              random.randint(0,1000),
                              rand_str(4),
                              rand_str(4) ])
        if len(sql_vals_rows) > 50:
            print(tbl_name,":", id,"/",row_size)
            # executemany()は、bulk insertのような気がしていますが
            # 実際の処理速度は計測していません
#            db_cursor.executemany(sql, sql_vals_rows)
            db_cursor.executemany(None, sql_vals_rows)
            sql_vals_rows = []
            
    if len(sql_vals_rows) > 0:
        db_cursor.executemany(None, sql_vals_rows)

            
# ランダムな文字列を生成します
def rand_str(str_len):
    dat = "ABCD"
    #dat = string.ascii_letters+string.digits
    #dat = string.digits + string.ascii_lowercase + string.ascii_uppercase
    return ''.join(random.choices(dat, k=str_len))

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()
    

windows server 2016 に付属の iis 10 アプリケーションプール リサイクル 設定

Step1 IISマネージャー画面から「リサイクル設定」を起動

f:id:end0tknr:20201222082126p:plain

Step2 アプリケーションプール リサイクル 設定

f:id:end0tknr:20201222082136p:plain

Step3 アプリケーションプール リサイクル発生によるイベントログ設定

f:id:end0tknr:20201222082147p:plain

windows server 2016 に付属の iis 10 アプリケーションプールを power shell でリサイクル

https://docs.microsoft.com/en-us/powershell/module/webadminstration/restart-webapppool?view=winserver2012-ps

上記によれば

IIS:\>Restart-WebAppPool DefaultAppPool

で実行できるらしい。

ちなみに、再起動と、リサイクルの違いは以下。

再起動
  既存 worker process の停止
  新規 worker process の開始

Recycle
  新規 worker process の開始 (以降新規 session はこちらを利用)
  既存 session すべて終了後、もしくは一定時間経過後 worker process の停止

PowerShellによる詳細な手順は、以下に通り

#### WebAdministration モジュール インポート
PS C:\Users\Administrator> Import-Module WebAdministration
PS C:\Users\Administrator> cd iis:\
PS IIS:\> ls

Name
----
AppPools
Sites
SslBindings


PS IIS:\> cd AppPools
PS IIS:\AppPools> ls
Name                     State        Applications
----                     -----        ------------
DefaultAppPool           Started      Default Web Site

PS IIS:\AppPools\DefaultAppPool\> ls

Name
----
WorkerProcesses

#### IISのプロセスID確認
PS IIS:\AppPools\DefaultAppPool\> ls WorkerProcesses

Process  State      Handles  Start Time
Id
-------- -----      -------  ----------
2708     Running    332      2020/12/22 6:47:19


#### IISのCPUやメモリ使用量を確認
PS IIS:\AppPools> Get-Process -id 2708
PS C:\Users\Administrator> Get-Process

Handles  NPM(K)    PM(K)      WS(K)     CPU(s)     Id  SI ProcessName
-------  ------    -----      -----     ------     --  -- -----------
    243      16     4592      20624       0.03   3084   1 conhost
   <略>
    332      39     6584      21488       0.11   2708   0 w3wp
    <略>
    147      10     2620       8984       0.00   3768   0 WmiPrvSE

PS IIS:\AppPools\DefaultAppPool\WorkerProcesses\> Get-Process -id 3796
Handles  NPM(K)    PM(K)      WS(K)     CPU(s)     Id  SI ProcessName
-------  ------    -----      -----     ------     --  -- -----------
    339      42     6684      21544       0.11   3796   0 w3wp

PS IIS:\AppPools\DefaultAppPool\WorkerProcesses\> Get-Process -name w3wp
Handles  NPM(K)    PM(K)      WS(K)     CPU(s)     Id  SI ProcessName
-------  ------    -----      -----     ------     --  -- -----------
    339      42     6684      21544       0.11   3796   0 w3wp


#### アプリケーション プールのリサイクル
PS IIS:\AppPools> ReStart-WebAppPool DefaultAppPool


#### その他、参考情報として、アプリケーション プールの停止、開始
PS IIS:\AppPools> Stop-WebAppPool    DefaultAppPool
PS IIS:\AppPools> Start-WebAppPool   DefaultAppPool


#### 更に、その他、参考情報として、アプリケーション プールの詳細情報
PS IIS:\AppPools> Get-ItemProperty IIS:\AppPools\DefaultAppPool | Select *

name                        : DefaultAppPool
queueLength                 : 1000
autoStart                   : True
enable32BitAppOnWin64       : False
managedRuntimeVersion       : v4.0
managedRuntimeLoader        : webengine4.dll
enableConfigurationOverride : True
managedPipelineMode         : Integrated
CLRConfigFile               :
passAnonymousToken          : True
startMode                   : OnDemand
state                       : Started
applicationPoolSid          : S-1-5-82-3006700770-424185619-1745488364-794895919-4004696415
processModel                : Microsoft.IIs.PowerShell.Framework.ConfigurationElement
recycling                   : Microsoft.IIs.PowerShell.Framework.ConfigurationElement
failure                     : Microsoft.IIs.PowerShell.Framework.ConfigurationElement
cpu                         : Microsoft.IIs.PowerShell.Framework.ConfigurationElement
environmentVariables        : Microsoft.IIs.PowerShell.Framework.ConfigurationElement
workerProcesses             : Microsoft.IIs.PowerShell.Framework.ConfigurationElement
ItemXPath                   : /system.applicationHost/applicationPools/add[@name='DefaultAppPool']
PSPath                      : WebAdministration::\\WIN-ALDOJI9921O\AppPools\DefaultAppPool
PSParentPath                : WebAdministration::\\WIN-ALDOJI9921O\AppPools
PSChildName                 : DefaultAppPool
PSDrive                     : IIS
PSProvider                  : WebAdministration
PSIsContainer               : True
Attributes                  : {name, queueLength, autoStart, enable32BitAppOnWin64...}
ChildElements               : {processModel, recycling, failure, cpu...}
ElementTagName              : add
Methods                     : {Start, Stop, Recycle}
Schema                      : Microsoft.IIs.PowerShell.Framework.ConfigurationElementSchema

Classic ASP における Sleep処理には、独自実装が必要

結局、以下のように書きました

<%@ LANGUAGE="VBSCRIPT" %>
<html>
<head>
<meta charset="utf-8">
<title>end0tknr's asp test page</title>
</head>
<body>
<h1>end0tknr's asp test page</h1>

This file exits in "C:\inetpub\wwwroot"<br/>
Log  files exits in "C:\inetpub\logs\LogFiles\ "<br/>
<br/>

現在の時刻は、<%= Now() %> です。<br/>
<br/>
<br/>

<%
Sub SleepSeconds(sec)
  Dim oShell
  Set oShell = Server.CreateObject("WScript.Shell")
  oShell.Run "C:\Windows\System32\timeout.exe " + Cstr(sec), 1, True
End Sub
%>
<% SleepSeconds(10) %>

Sleep後の時刻は、<%= Now() %> です。<br/>

</body>
</html>

windows server 2016で、classic asp を有効化

windows server 2016 の IIS を 有効化(インストール?) - end0tknr's kipple - web写経開発

先日の上記エントリの続き? です。

Step1 サーバーマネージャ → IIS → 「役割と機能追加」

f:id:end0tknr:20201220181020p:plain

Step2 サーバーの役割の選択で「ASP」を選択

f:id:end0tknr:20201220181034p:plain

Step3 動作確認

<%@ LANGUAGE="VBSCRIPT" %>
<html>
<head>
<meta charset="utf-8">
<title>end0tknr's asp test page</title>
</head>
<body>
<h1>end0tknr's asp test page</h1>

This file exits in "C:\inetpub\wwwroot"<br/>
Log  files exits in "C:\inetpub\logs\LogFiles\ "<br/>
<br/>

<% Response.Write "Hello Classic ASP World" %><br/><br/>

現在の時刻は、<%= Now() %> です。<br/><br/>

<table border=1>
<thead>
 <tr><th>ServerVariables key</th><td></td></tr>
</thead>
<tbody>
  <% For Each name In Request.ServerVariables %>
  <tr>
    <td><%= name%></td>
    <td><%= Request.ServerVariables(name) %></td>
  </tr>
  <% Next %>
</tbody>
</table>

<br/>

</body>
</html>

↑この内容を C:\inetpub\wwwroot\index2.asp で作成すると

↓以下のように表示されます。

f:id:end0tknr:20201220181203p:plain

windows server 2016 の IIS を 有効化(インストール?)

windows serverは、殆ど触ったことがない為、メモ。

1 サーバーマネージャー > ダッシュボード から「役割と機能の追加」

f:id:end0tknr:20201215083915p:plain

2 「インストールの種類の選択」まで来たら、「役割ベースまたは機能ベースのインストール」

f:id:end0tknr:20201215084237p:plain

3 「サーバーの役割の選択」で「Webサーバー(IIS)」を選択

f:id:end0tknr:20201215084442p:plain

f:id:end0tknr:20201215084451p:plain

4 「役割サービスの選択」で必要そうなものを追加

f:id:end0tknr:20201215084816p:plain

f:id:end0tknr:20201215084824p:plain

5 「インストール」実行後、「役割とサーバー グループ」にIISが追加

f:id:end0tknr:20201215085107p:plain

f:id:end0tknr:20201215085115p:plain

6 windows server 付属のIEhttp://localhost へアクセスし、表示確認

defaultでは、以下の C:\inetpub\wwwroot\iisstart.htm が表示されますが、 ココに C:\inetpub\wwwroot\index.html を登録すると、そちらが表示されます。

f:id:end0tknr:20201215085203p:plain

7 その他 - IIS のログは、C:\inetpub\logs\LogFiles\ にあります

/usr/bin/cpanm XML::Atom for perl で error

$ perl -v
This is perl 5, version 26, subversion 3 (v5.26.3)

$ sudo /usr/bin/cpanm XML::Atom
     :
XML::Atom 31-external-entities-libxml.t

t/30-datetime-stringification.t .. skipped: DateTime and DateTime::Format::Atom are required for tests

#   Failed test 'resolved entity'
#   at t/31-external-entities-libxml.t line 57.
#                   '<p>No, Ben isn't updating. It's me testing out guest author functionality.</p>'
#     doesn't match '(?^:This is what you get when you do unit testing)'
# Looks like you failed 1 test of 4.
t/31-external-entities-libxml.t .. 
Dubious, test returned 1 (wstat 256, 0x100)
Failed 1/4 subtests 
# XPath Override in place
Constant subroutine XML::Atom::LIBXML redefined at t/31-external-entities-xpath.t line 18.
External Entities disabled. at /root/.cpanm/work/1606830522.134077/XML-Atom-0.42/blib/lib/XML/Atom.pm line 
52.
t/31-external-entities-xpath.t ... ok

という、error が発生

https://github.com/miyagawa/xml-atom/issues/18

を見ると、test script の t/31-external-entities-libxml.t において 以下のように修正すると、OKらしい。

old) my $libxml=XML::LibXML->new;
new) my $libxml=XML::LibXML->new(expand_xinclude=>1,expand_entities=>1,load_ext_dtd=>1);

ただ、今回、cpanm で installしていますので 「sudo /usr/bin/cpanm --force XML::Atom」のように「--force」でinstallしました。

CentOS8 / RHEL8 へ Apache2.4 & php7 (from yum) + mod_php(from source) を install

※ 2021/1/31 追記

一度、php 7.2でmod_php をmake しましたが、pdo 等が利用できなかった為、 その後、php 7.3.26 を使用しています。

以前の CentOS6 では、

# yum install httpd-devel php-devel

により、mod_php ( /etc/httpd/modules/libphp5.so )がinstallされていました。

2020/11時点で最新の CentOS8 / RHEL8 へ apache + php を install しても、 mod_php (libphp7.so)は installされません。

RHEL8 より、apache の MPM の defaultが prefork→event に変更され、 phpに関してもdefaultが mod_phpphp-fpm に変更されたようです。

以降では、RHEL8 における Apache2.4 & php7 (from yum) + mod_php(from source) の install を記載します。

STEP 1 - install Apache2.4 & php7 from yum

$ sudo yum install httpd-devel
$ sudo yum install php-devel

まず、yumapache & php を install します。 この状態では、apache は MPM=event 、 php は mod_phpなし ( /etc/httpd/modules/libphp7.so ) です

$ /usr/sbin/httpd -V
Server version: Apache/2.4.37 (Red Hat Enterprise Linux)
Server built:   Jun 15 2020 11:51:05
Server's Module Magic Number: 20120211:83
Server loaded:  APR 1.6.3, APR-UTIL 1.6.1
Compiled using: APR 1.6.3, APR-UTIL 1.6.1
Architecture:   64-bit
Server MPM:     event ★★ HERE ★★
  threaded:     yes (fixed thread count)
    forked:     yes (variable process count)
    :

$ ls /etc/httpd/modules/libphp*
ls: cannot access '/etc/httpd/modules/libphp*': No such file or directory

STEP 2 - Apache2.4 MPM の event → prefork 化

以下のように、apache 設定ファイル修正 & apache 再起動だけでOKです。

$ sudo vi /etc/httpd/conf.modules.d/00-mpm.conf
old) #LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
old) LoadModule mpm_event_module modules/mod_mpm_event.so

new) LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
new) #LoadModule mpm_event_module modules/mod_mpm_event.so

$ sudo systemctl restart httpd

$ /usr/sbin/httpd -V
Server version: Apache/2.4.37 (Red Hat Enterprise Linux)
Server built:   Jun 15 2020 11:51:05
Server's Module Magic Number: 20120211:83
Server loaded:  APR 1.6.3, APR-UTIL 1.6.1
Compiled using: APR 1.6.3, APR-UTIL 1.6.1
Architecture:   64-bit
Server MPM:     prefork ★★ HERE ★★
  threaded:     no
    forked:     yes (variable process count)

STEP 3 - install mod_php ( /etc/httpd/modules/libphp5.so )

私が探した限り、yum では mod_php を単独で install できないようですので source から build します。

まず、前準備

$ sudo yum install wget
$ sudo yum install make
$ sudo yum install libxml2-devel

次に、source download や build.

「--with-apxs2=/usr/bin/apxs」により、libphp7.so が buildされるので、 これを /etc/httpd/modules/libphp7.so へ copy すれば、完了です。

$ wget https://www.php.net/distributions/php-7.2.24.tar.gz
$ tar -xvf php-7.2.24.tar.gz
$ cd php-7.2.24
$ ./configure \
  --with-apxs2=/usr/bin/apxs \
  --enable-mbstring \
  --with-mysqli=/usr/bin/mysql_config \
  --with-pdo-mysql=/usr/bin/mysql_config \
  --with-mysql=/usr/bin/mysql_config \
  --with-pdo-pgsql=/usr/bin/pg_config
$ make
$ make test

$ ls -lh ./libs/libphp7.so 
-rwxrwxr-x. 1 44M Nov 28 22:06 ./libs/libphp7.so

$ sudo cp libs/libphp7.so /etc/httpd/modules/

STEP 4 - apache の設定変更

この前のSTEP までに、mod_php の installは完了していますので apacheの設定file (httpd.conf)へ mod_php の設定を追加して下さい。

$ sudo vi /etc/httpd/conf/httpd.conf

LoadModule php7_module modules/libphp7.so
<FilesMatch \.php$>
  SetHandler application/x-httpd-php
</FilesMatch>

$ sudo systemctl restart httpd

STEP 5 - mod_php の動作確認

いつもの? phpinfo() を仕込んだ後に、ブラウザでアクセスし、 表示されれば、OKかと思います。

$ sudo vi /var/www/html/test.php
<?php
phpinfo();
?>

install Greenbone Vulnerability Manager 11 (GVM, 旧OpenVAS) from source to ubuntu20

install openvas-9 to raspbian (raspberry pi) from src - end0tknr's kipple - web写経開発

2017年に記載した上記エントリの2020年版です。

今回は、※1 を参考にしています。(というより、まるパクリです)

2020/11時点で、GVMの最新は、ver.20ですが、バグがあるらしく、 installできたものの、脆弱性SCANできなかった為、GVM 11(OpenVAS) を使用しています。

※1  kifarunix.com

脆弱性SCANの際、以下の点にはご注意下さい。

install自体に手間取る部分はありませんが

Configuration → Alive Test = Consider Alive

デフォルトでは、pingに対しての反応がないと、サイトダウンと判定され、 scanされませんので

f:id:end0tknr:20201126141319p:plain

Scans → Tasks → Scanner=Kifarunix-demo OpenVAS Scanner

今回のインストールでは、新規にスキャナを追加していますので、 「Scanner=Kifarunix-demo OpenVAS Scanner」を指定して下さい。

また、デフォルトでは、Maximum concurrently scanned hosts=20 で過大な 気がしますので、10程度に下げた方がよいかと思います。

f:id:end0tknr:20201126141322p:plain

以降が、インストールメモです

$ cat /etc/os-release
NAME="Ubuntu"
VERSION="20.04.1 LTS (Focal Fossa)"

$ sudo apt update    ## install可能なpackageの一覧更新
$ sudo apt upgrade   ## install済のpackage更新
$ sudo useradd -r -d /opt/gvm -c "GVM User" -s /bin/bash gvm
 
$ sudo mkdir /opt/gvm
$ sudo chown gvm:gvm /opt/gvm

$ sudo apt \
    install gcc g++ make bison flex libksba-dev curl redis libpcap-dev \
    cmake git pkg-config libglib2.0-dev libgpgme-dev nmap libgnutls28-dev uuid-dev \
    libssh-gcrypt-dev libldap2-dev gnutls-bin libmicrohttpd-dev libhiredis-dev \
    zlib1g-dev libxml2-dev libradcli-dev clang-format libldap2-dev doxygen \
    gcc-mingw-w64 xml-twig-tools libical-dev perl-base heimdal-dev libpopt-dev \
    libsnmp-dev python3-setuptools python3-paramiko python3-lxml \
    python3-defusedxml python3-dev gettext python3-polib xmltoman \
    python3-pip texlive-fonts-recommended texlive-latex-extra \
    --no-install-recommends xsltproc

$ sudo su - 
# curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
# echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list
$ sudo apt update

$ sudo apt install yarn

$ sudo apt install postgresql postgresql-contrib postgresql-server-dev-all

$ sudo -Hiu postgres
postgres$ createuser gvm
postgres$ createdb -O gvm gvmd

postgres$ psql gvmd
gvmd=# create role dba with superuser noinherit;
gvmd=# grant dba to gvm;
gvmd=# create extension "uuid-ossp";
gvmd=# \q
postgres$ exit


$ sudo systemctl restart postgresql
$ sudo systemctl enable postgresql
$ sudo vim /etc/environment
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/opt/gvm/bin:/opt/gvm/sbin:/opt/gvm/.local/bin"

↑「/opt/gvm/bin:/opt/gvm/sbin:/opt/gvm/.local/bin」を追加

$ sudo su -
# echo "/opt/gvm/lib" > /etc/ld.so.conf.d/gvm.conf
$ sudo su - gvm

$ mkdir /opt/gvm/tmp
$ mkdir /opt/gvm/tmp/gvm-source
$ cd /opt/gvm/tmp/gvm-source

$ git clone -b gvm-libs-11.0 https://github.com/greenbone/gvm-libs.git
$ git clone https://github.com/greenbone/openvas-smb.git
$ git clone -b openvas-7.0 https://github.com/greenbone/openvas.git
$ git clone -b ospd-2.0 https://github.com/greenbone/ospd.git
$ git clone -b ospd-openvas-1.0 https://github.com/greenbone/ospd-openvas.git
$ git clone -b gvmd-9.0 https://github.com/greenbone/gvmd.git
$ git clone -b gsa-9.0 https://github.com/greenbone/gsa.git

$ export PKG_CONFIG_PATH=/opt/gvm/lib/pkgconfig:$PKG_CONFIG_PATH

$ cd gvm-libs
$ mkdir build
$ cd build
$ cmake .. -DCMAKE_INSTALL_PREFIX=/opt/gvm
$ make
$ make install

$ cd ../../openvas-smb/
$ mkdir build
$ cd build
$ cmake .. -DCMAKE_INSTALL_PREFIX=/opt/gvm
$ make
$ make install

$ cd ../../openvas
$ mkdir build
$ cd build
$ cmake .. -DCMAKE_INSTALL_PREFIX=/opt/gvm

$ vim ../../openvas/CMakeLists.txt
  #set (CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} ${COVERAGE_FLAGS}")
  set (CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -Werror -Wno-error=deprecated-declarations")

$ make
$ make install

# ldconfig

# cp /opt/gvm/tmp/gvm-source/openvas/config/redis-openvas.conf /etc/redis/

# chown redis:redis /etc/redis/redis-openvas.conf

# echo "db_address = /run/redis-openvas/redis.sock" > /opt/gvm/etc/openvas/openvas.conf

# chown gvm:gvm /opt/gvm/etc/openvas/openvas.conf

# usermod -aG redis gvm

# echo "net.core.somaxconn = 1024" >> /etc/sysctl.conf
# echo 'vm.overcommit_memory = 1' >> /etc/sysctl.conf
# sysctl -p
net.core.somaxconn = 1024
vm.overcommit_memory = 1


# vi /etc/systemd/system/disable_thp.service

[Unit]
Description=Disable Kernel Support for Transparent Huge Pages (THP)

[Service]
Type=simple
ExecStart=/bin/sh -c "echo 'never' > /sys/kernel/mm/transparent_hugepage/enabled && echo 'never' > /sys/kernel/mm/transparent_hugepage/defrag"

[Install]
WantedBy=multi-user.target


# systemctl daemon-reload
# systemctl enable --now disable_thp
# systemctl enable --now redis-server@openvas


# echo "gvm ALL = NOPASSWD: /opt/gvm/sbin/openvas" > /etc/sudoers.d/gvm


# visudo

Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin:/opt/gvm/sbin"
※「/opt/gvm/sbin」を追加

# echo "gvm ALL = NOPASSWD: /opt/gvm/sbin/gsad" >> /etc/sudoers.d/gvm

# su - gvm
gvm$ greenbone-nvt-sync
※上記の処理には、10min程 要します

gvm$ sudo openvas --update-vt-info
※上記の処理には、2-3min程 要します

gvm$ export PKG_CONFIG_PATH=/opt/gvm/lib/pkgconfig:$PKG_CONFIG_PATH


gvm$ cd /opt/gvm/tmp/gvm-source/gvmd
gvm$ mkdir build
gvm$ cd build
gvm$ cmake .. -DCMAKE_INSTALL_PREFIX=/opt/gvm
gvm$ make
gvm$ make install

gvm$ cd ../../gsa
gvm$ mkdir build
gvm$ cd build
gvm$ cmake .. -DCMAKE_INSTALL_PREFIX=/opt/gvm
gvm$ make
gvm$ make install

gvm$ greenbone-scapdata-sync
gvm$ greenbone-certdata-sync

gvm$ gvm-manage-certs -a


gvm$ export PKG_CONFIG_PATH=/opt/gvm/lib/pkgconfig:$PKG_CONFIG_PATH

gvm$ mkdir -p /opt/gvm/lib/python3.8/site-packages/
gvm$ export PYTHONPATH=/opt/gvm/lib/python3.8/site-packages
gvm$ cd /opt/gvm/tmp/gvm-source/ospd
gvm$ python3 setup.py install --prefix=/opt/gvm

gvm$ cd ../ospd-openvas
gvm$ python3 setup.py install --prefix=/opt/gvm


gvm$ /usr/bin/python3 /opt/gvm/bin/ospd-openvas \
       --pid-file /opt/gvm/var/run/ospd-openvas.pid \
       --log-file /opt/gvm/var/log/gvm/ospd-openvas.log \
       --lock-file-dir /opt/gvm/var/run -u /opt/gvm/var/run/ospd.sock

gvm$ gvmd --osp-vt-update=/opt/gvm/var/run/ospd.sock


gvm$ sudo gsad
Oops, secure memory pool already initialized
gvm$ ps aux | grep -E "ospd-openvas|gsad|gvmd" | grep -v grep
gvm      43823 57.7  1.0 163852 43048 pts/0    Rl   09:28   0:25 \
          /usr/bin/python3 /opt/gvm/bin/ospd-openvas \
        --pid-file /opt/gvm/var/run/ospd-openvas.pid \
        --log-file /opt/gvm/var/log/gvm/ospd-openvas.log \
        --lock-file-dir /opt/gvm/var/run \
        -u /opt/gvm/var/run/ospd.sock
gvm      43825  0.0  0.6 149764 27208 pts/0    Sl   09:28   0:00 \
           /usr/bin/python3 /opt/gvm/bin/ospd-openvas \
         --pid-file /opt/gvm/var/run/ospd-openvas.pid \
         --log-file /opt/gvm/var/log/gvm/ospd-openvas.log \
         --lock-file-dir /opt/gvm/var/run \
         -u /opt/gvm/var/run/ospd.sock
gvm      43832  0.1  0.2  99608 10252 pts/0    S    09:28   0:00 \
           gvmd: Waiting for incoming connections
gvm      43854  1.3  0.0  81196  1568 ?        Ss   09:28   0:00 \
           gpg-agent --homedir /opt/gvm/var/lib/gvm/gvmd/gnupg \
                 --use-standard-socket --daemon
postgres 43860  0.0  0.6 225564 26956 ?        SLs  09:28   0:00 \
           postgres: 12/main: gvm gvmd [local] idle
root     43869  0.0  0.1 132176  5636 pts/0    Sl   09:28   0:00 gsad
root     43870  0.0  0.0 132176  3496 pts/0    Sl   09:28   0:00 gsad


# vi /etc/systemd/system/openvas.service

[Unit]
Description=Control the OpenVAS service
After=redis.service
After=postgresql.service

[Service]
ExecStartPre=-rm -rf /opt/gvm/var/run/ospd-openvas.pid /opt/gvm/var/run/ospd.sock /opt/gvm/var/run/gvmd.sock
Type=simple
User=gvm
Group=gvm
Environment=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/opt/gvm/bin:/opt/gvm/sbin:/opt/gvm/.local/bin
Environment=PYTHONPATH=/opt/gvm/lib/python3.8/site-packages
ExecStart=/usr/bin/python3 /opt/gvm/bin/ospd-openvas \
--pid-file /opt/gvm/var/run/ospd-openvas.pid \
--log-file /opt/gvm/var/log/gvm/ospd-openvas.log \
--lock-file-dir /opt/gvm/var/run -u /opt/gvm/var/run/ospd.sock
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target


# systemctl daemon-reload

# systemctl start openvas
# systemctl status openvas
● openvas.service - Control the OpenVAS service
     Loaded: loaded (/etc/systemd/system/openvas.service; disabled; vendor preset: enabled)
     Active: active (exited) since Sat 2020-11-07 09:33:18 UTC; 13s ago
    Process: 44404 ExecStartPre=/usr/bin/rm -rf /opt/gvm/var/run/ospd-openvas.pid \
             /opt/gvm/var/run/ospd.sock /opt/gvm/var/run/gvmd.sock (code=exited, status=0/SUCCE>
    Process: 44419 ExecStart=/usr/bin/python3 /opt/gvm/bin/ospd-openvas \
             --pid-file /opt/gvm/var/run/ospd-openvas.pid \
         --log-file /opt/gvm/var/log/gvm/ospd-openvas.lo>
   Main PID: 44419 (code=exited, status=0/SUCCESS)
      Tasks: 4 (limit: 4621)
     Memory: 24.2M
     CGroup: /system.slice/openvas.service
       ├─44425 /usr/bin/python3 /opt/gvm/bin/ospd-openvas \
       │          --pid-file /opt/gvm/var/run/ospd-openvas.pid \
       │             --log-file /opt/gvm/var/log/gvm/ospd-openvas.log --lock>
       └─44427 /usr/bin/python3 /opt/gvm/bin/ospd-openvas \
                   --pid-file /opt/gvm/var/run/ospd-openvas.pid \
           --log-file /opt/gvm/var/log/gvm/ospd-openvas.log --lock>
Nov 07 09:33:18 ubuntu20 systemd[1]: Starting Control the OpenVAS service...
Nov 07 09:33:18 ubuntu20 systemd[1]: Started Control the OpenVAS service.

# systemctl enable openvas


# vi /etc/systemd/system/gsa.service

[Unit]
Description=Control the OpenVAS GSA service
After=openvas.service

[Service]
Type=simple
User=gvm
Group=gvm
Environment=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/opt/gvm/bin:/opt/gvm/sbin:/opt/gvm/.local/bin
Environment=PYTHONPATH=/opt/gvm/lib/python3.8/site-packages
ExecStart=/usr/bin/sudo /opt/gvm/sbin/gsad
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target


# vi /etc/systemd/system/gsa.path

[Unit]
Description=Start the OpenVAS GSA service when gvmd.sock is available

[Path]
PathChanged=/opt/gvm/var/run/gvmd.sock
Unit=gsa.service

[Install]
WantedBy=multi-user.target


# vi /etc/systemd/system/gvm.service

[Unit]
Description=Control the OpenVAS GVM service
After=openvas.service

[Service]
Type=simple
User=gvm
Group=gvm
Environment=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/opt/gvm/bin:/opt/gvm/sbin:/opt/gvm/.local/bin
Environment=PYTHONPATH=/opt/gvm/lib/python3.8/site-packages
ExecStart=/opt/gvm/sbin/gvmd --osp-vt-update=/opt/gvm/var/run/ospd.sock
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target


# vi /etc/systemd/system/gvm.path

[Unit]
Description=Start the OpenVAS GVM service when opsd.sock is available

[Path]
PathChanged=/opt/gvm/var/run/ospd.sock
Unit=gvm.service

[Install]
WantedBy=multi-user.target


# systemctl daemon-reload
# systemctl enable --now gvm.{path,service}
# systemctl enable --now gsa.{path,service}


# sudo -Hiu gvm gvmd --create-scanner="Kifarunix-demo OpenVAS Scanner" \
       --scanner-type="OpenVAS" --scanner-host=/opt/gvm/var/run/ospd.sock

# sudo -Hiu gvm gvmd --get-scanners

08b69003-5fc2-4037-a479-93b440211c73  OpenVAS  /tmp/ospd.sock  0  OpenVAS Default
6acd0832-df90-11e4-b9d5-28d24461215b  CVE    0  CVE
169efd9c-2248-415e-ba4e-5d7e78069494  OpenVAS  /opt/gvm/var/run/ospd.sock  9390  Kifarunix-demo OpenVAS Scanner

# sudo -Hiu gvm gvmd --verify-scanner=169efd9c-2248-415e-ba4e-5d7e78069494

# sudo -Hiu gvm gvmd --verify-scanner=955420e0-9a75-46f8-b778-80860f946dea
Scanner version: OpenVAS 7.0.1.

# sudo -Hiu gvm gvmd --create-user gvmadmin --password=ないしょ
User created.
# sudo -Hiu gvm gvmd --user=gvmadmin --new-password=ないしょ

# sudo -Hiu gvm gvmd --create-user admin --password=ないしょ
User created.

# ufw allow 443/tcp
Rules updated
Rules updated (v6)


# reboot

後は、ブラウザで、 https://$IPアドレス へアクセスし、お試し下さい