Db2 でのスキーマについて

スキーマとは

  • データを区別するためのもの
  • 同じ表名でもスキーマを指定して区別することができる
  • データベース内に存在するオブジェクト(表、ビュー、インデックス、制約等)はどれかのスキーマに属している
  • スキーマを明示的に指定せずに実行されたSQLはカレントスキーマが使用される
  • スキーマ省略した場合は基本的には接続しているユーザがカレントスキーマになる

カレントスキーマの確認

[db2inst1@localhost ~]$ db2 "VALUES CURRENT SCHEMA"

1                                                                                                                               
-----------------------------------------
DB2INST1                                                                                                                        

  1 record(s) selected.

スキーマ一覧の取得

[db2inst1@localhost ~]$ db2 "SELECT SCHEMANAME,OWNER FROM SYSCAT.SCHEMATA"

SCHEMANAME                        OWNER                                                                                                                           
--------------------------------- -------------------------
SYSIBM                            SYSIBM                                                                                                                          
SYSCAT                            SYSIBM                                                                                                                          
SYSFUN                            SYSIBM                                                                                                                          
SYSSTAT                           SYSIBM                                                                                                                          
SYSPROC                           SYSIBM                                                                                                                          
SYSIBMADM                         SYSIBM                                                                                                                          
SYSIBMINTERNAL                    SYSIBM                                                                                                                          
SYSIBMTS                          SYSIBM                                                                                                                          
SYSPUBLIC                         SYSIBM                                                                                                                          
NULLID                            SYSIBM                                                                                                                          
SQLJ                              SYSIBM                                                                                                                          
SYSTOOLS                          SYSIBM                                                                                                                          
DB2INST1                          SYSIBM                                                                                                                          

  13 record(s) selected.

epel (リポジトリ)のインストール

epelとは

  • Extra Packages for Enterprise Linuxの略
  • 標準のリポジトリでは提供されない追加パッケージセットが含まれている

yumを使ったインストール

[root@localhost ~]# yum install epel-release
Last metadata expiration check: 1:23:09 ago on Fri Aug 16 13:04:00 2024.
Dependencies resolved.
==============================================================================================
 Package                   Architecture        Version              Repository           Size
==============================================================================================
Installing:
 epel-release              noarch              9-7.el9              extras               19 k

Transaction Summary
==============================================================================================
Install  1 Package

Total download size: 19 k
Installed size: 26 k
Is this ok [y/N]: y
Downloading Packages:
epel-release-9-7.el9.noarch.rpm                                17 kB/s |  19 kB     00:01    
----------------------------------------------------------------------------------------------
Total                                                          10 kB/s |  19 kB     00:01     
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Preparing        :                                                                      1/1 
  Installing       : epel-release-9-7.el9.noarch                                          1/1 
  Running scriptlet: epel-release-9-7.el9.noarch                                          1/1 
Many EPEL packages require the CodeReady Builder (CRB) repository.
It is recommended that you run /usr/bin/crb enable to enable the CRB repository.

  Verifying        : epel-release-9-7.el9.noarch                                          1/1 

Installed:
  epel-release-9-7.el9.noarch                                                                 

Complete!

yumでインストールしたリポジトリの確認

[root@localhost ~]# yum repolist all
repo id                       repo name                                               status
appstream                     Rocky Linux 9 - AppStream                               enabled
appstream-debuginfo           Rocky Linux 9 - AppStream - Debug                       disabled
appstream-source              Rocky Linux 9 - AppStream - Source                      disabled
baseos                        Rocky Linux 9 - BaseOS                                  enabled
...
epel                          Extra Packages for Enterprise Linux 9 - x86_64          enabled
epel-cisco-openh264           Extra Packages for Enterprise Linux 9 openh264 (From Ci enabled
epel-cisco-openh264-debuginfo Extra Packages for Enterprise Linux 9 openh264 (From Ci disabled
epel-cisco-openh264-source    Extra Packages for Enterprise Linux 9 openh264 (From Ci disabled
...

    Db2でファイルからSQLを実行する

    ファイルにSQLを記載し、実行する(バッチモード)

    ファイル作成

    [db2inst1@localhost ~]$ vi file1.sql
    
    -- テーブルが存在する場合はdrop
    drop table if exists test;
    
    -- create table
    create table test (id int not null primary key,
                       col1 varchar(100));
    -- insert
    insert into test values (1, '1回目');
    insert into test values (2, '2回目');
    
    -- select
    select * from test;
    

    表記方法

    • 改行はOK
    • SQL文の最後はセミコロン「;」
    • コメントはハイフン2つ「–」で始める

    ファイル実行

    [db2inst1@localhost ~]$ db2 -tvf file1.sql
    drop table if exists test
    DB20000I  The SQL command completed successfully.
    
    create table test (id int not null primary key, col1 varchar(100))
    DB20000I  The SQL command completed successfully.
    
    insert into test values (1, '1回目')
    DB20000I  The SQL command completed successfully.
    
    insert into test values (2, '2回目')
    DB20000I  The SQL command completed successfully.
    
    select * from test
    
    ID          COL1                                                                                                
    ----------- -----------------------------------------------------------
              1 1回目                                                                                               
              2 2回目                                                                                               
    
      2 record(s) selected.
    

    コマンド説明

    • -t: 終端文字の指定。デフォルトはセミコロン「;」
    • -v: 入力コマンドを標準出力にエコーする
    • -f: 入力ファイルを指定

    Db2 の CLP(コマンド・ライン・プロセッサー)モード

    CLP対話モード

    CLP環境を起動して、CLPのプロンプト(行頭にdb2 =>)が出た状態でコマンドを実行する。

    [db2inst1@localhost ~]$ db2
    (c) Copyright IBM Corporation 1993,2007
    Command Line Processor for DB2 Client 11.5.9.0
    
    You can issue database manager commands and SQL statements from the command 
    prompt. For example:
        db2 => connect to sample
        db2 => bind sample.bnd
    
    For general help, type: ?.
    For command help, type: ? command, where command can be
    the first few keywords of a database manager command. For example:
     ? CATALOG DATABASE for help on the CATALOG DATABASE command
     ? CATALOG          for help on all of the CATALOG commands.
    
    To exit db2 interactive mode, type QUIT at the command prompt. Outside 
    interactive mode, all commands must be prefixed with 'db2'.
    To list the current command option settings, type LIST COMMAND OPTIONS.
    
    For more detailed help, refer to the Online Reference Manual.
    
    db2 => 

    対話モードでのDB接続

    db2 => connect to sample
    
       Database Connection Information
    
     Database server        = DB2/LINUXX8664 11.5.9.0
     SQL authorization ID   = DB2INST1
     Local database alias   = SAMPLE
    
    db2 => 

    対話モードでのOSコマンド実行

    db2 => !date
    Thu Aug 15 03:56:14 JST 2024
    db2 => 

    対話モードでの複数行入力

    改行したい箇所に「\」を入れる。

    db2 => select * from \
    db2 (cont.) => test
    
    ID          COL1                                                                                                
    ----------- ---------------------------------------------------
              1 1行目                                                                                               
              2 2行目                                                                                              
    
      2 record(s) selected.
    
    db2 => 

    対話モードの終了

    db2 => quit
    DB20000I  The QUIT command completed successfully.

    CLPコマンドモード

    OSコマンドラインから、db2コマンドを先頭につけて実行する。

    [db2inst1@localhost ~]$ db2 connect to sample
    
       Database Connection Information
    
     Database server        = DB2/LINUXX8664 11.5.9.0
     SQL authorization ID   = DB2INST1
     Local database alias   = SAMPLE
    
    [db2inst1@localhost ~]$ db2 "create table test (id int not null primary key, col1 varchar(100))"
    DB20000I  The SQL command completed successfully.
    [db2inst1@localhost ~]$ db2 +c "insert into test values (1, '1行目')"
    DB20000I  The SQL command completed successfully.
    [db2inst1@localhost ~]$ db2 commit
    DB20000I  The SQL command completed successfully.
    [db2inst1@localhost ~]$ db2 "insert into test values (2, '2行目')"
    DB20000I  The SQL command completed successfully.
    [db2inst1@localhost ~]$ db2 +c "insert into test values (3, '3行目')"
    DB20000I  The SQL command completed successfully.
    [db2inst1@localhost ~]$ db2 rollback
    DB20000I  The SQL command completed successfully.
    [db2inst1@localhost ~]$ db2 "select * from test"
    
    ID          COL1                                                                                                
    ----------- -------------------------------------------------
              1 1行目                                                                                               
              2 2行目                                                                                              
    
      2 record(s) selected.
    
    [db2inst1@localhost ~]$ db2 "update test set col1='1行目' where id=1"
    DB20000I  The SQL command completed successfully.
    [db2inst1@localhost ~]$ db2 "select * from test"
    
    ID          COL1                                                                                                
    ----------- ---------------------------------------------------
              1 1行目                                                                                              
              2 2行目                                                                                              
    
      2 record(s) selected.

    CLPモードでのコミット

    • CLPはデフォルトで自動コミットモード(実行したSQLは即座にコミットされる)
    • 複数のSQLを実行し、まとめてコミットしたい場合は、コミットしたくないSQLの前に、+cのオプションをつける
    • -cが、自動コミット
    • +cが、自動コミットしない

    Rocky Linux の時刻同期

    タイムゾーンの設定

    [root@localhost lib64]# timedatectl list-timezones
    Africa/Abidjan
    Africa/Accra
    Africa/Addis_Ababa
    Africa/Algiers
    ...
    [root@localhost lib64]# timedatectl set-timezone Asia/Tokyo
    [root@localhost lib64]# timedatectl
                   Local time: Wed 2024-08-07 16:51:52 JST
               Universal time: Wed 2024-08-07 07:51:52 UTC
                     RTC time: Tue 2024-08-13 22:05:24
                    Time zone: Asia/Tokyo (JST, +0900)
    System clock synchronized: no
                  NTP service: active
              RTC in local TZ: no

    timedatectlの説明

    • localal time: OSが持っている時間 = システムクロック。dataコマンドで表示される時間
    • Universal time: 世界標準時 = イギリスの現在時刻
    • RTC time: Real Time Clockの略。リアルタイムクロック = ハードウェアクロック = マザーボードが保持している時刻
    • System clock synchronized: NTPで時刻取得を行っているかどうか。noであればNTPによる時刻取得は行っていない。NTPの設定を行えばyesに変わる
    • NTP service: inactiveであればNTPサービスが起動してない。NTPサービスを起動すればactiveに変わる
    • RTC in local TZ: デフォルトはno。timedatectl set-local-rtc trueコマンドでyesに変わる。yesにするとハードウェアクロックをシステムクロックに同期する。基本的にnoのままでよい

    NTP(chrony)の設定

    chrony(クローニー)とは、RHEL7からntpdに代わって導入された時刻同期サーバー/クライアントで、ntpdとは異なる時刻同期アルゴリズムを採用されており、より効率良く正確な時刻同期を提供する。

    ネットワークの問題(切断や遅延)、温度変化等の環境問題や、時刻の同期が継続的に実行されない環境(仮想マシン等)であっても時刻がずれないような工夫がされている。

    • NTPのバージョンが異なる
    • ハードウェアクロックとの同期が可能(ntpdは不可)
    • slewモードのslewレート
    • stepモードとslewモード(デフォルトはstepモード)。slewレートを変更可能
    • 使用ポートが変更可能(デフォルトは123、なおNTPは123固定)

    chronyのインストール

    [root@localhost lib64]# dnf install chrony
    Rocky Linux 9 - BaseOS                                        1.4 kB/s | 4.1 kB     00:02    
    Rocky Linux 9 - AppStream                                     2.5 kB/s | 4.5 kB     00:01    
    Rocky Linux 9 - AppStream                                     1.3 MB/s | 8.0 MB     00:06    
    Rocky Linux 9 - Extras                                        1.8 kB/s | 2.9 kB     00:01    
    Rocky Linux 9 - Extras                                        6.4 kB/s |  15 kB     00:02    
    Package chrony-4.5-1.el9.x86_64 is already installed.
    Dependencies resolved.
    Nothing to do.
    Complete!
    [root@localhost lib64]# vi /etc/chrony.conf
    # Use public servers from the pool.ntp.org project.
    # Please consider joining the pool (https://www.pool.ntp.org/join.html).
    #pool 2.rocky.pool.ntp.org iburst                      # コメントアウト
    pool ntp.nict.jp iburst                                # 追記
    ...
    [root@localhost lib64]# chronyc makestep
    200 OK
    [root@localhost lib64]# systemctl restart chronyd
    [root@localhost lib64]# systemctl enable chronyd
    [root@localhost lib64]# chronyc sources
    MS Name/IP address         Stratum Poll Reach LastRx Last sample               
    ===============================================================================
    ^- ntp-b2.nict.go.jp             1   6    17    11  +1968us[+1968us] +/- 4857us
    ^- ntp-a3.nict.go.jp             1   6    17    10   -140us[ -140us] +/- 3514us
    ^* ntp-a2.nict.go.jp             1   6    17    11   +851us[ +656us] +/- 4069us
    ^- ntp-k1.nict.jp                1   6    17    11   +711us[ +711us] +/- 8111us
    [root@localhost lib64]# date
    Wed Aug 14 10:30:06 JST 2024
    • NTPサーバー名の前に「*」または「+」が表示されていれば時刻同期中

    [補足] curl: (60) 証明書エラー対応

    chronyのインストール時に以下のエラーが出力される。

    事象

    [root@localhost lib64]# dnf install chrony
    Rocky Linux 9 - BaseOS                                        0.0  B/s |   0  B     00:06    
    Errors during downloading metadata for repository 'baseos':
    [main]
      - Curl error (60): SSL peer certificate or SSH remote key was not OK for https://mirrors.rockylinux.org/mirrorlist?arch=x86_64&repo=BaseOS-9 [SSL certificate problem: certificate is not yet valid]
    Error: Failed to download metadata for repo 'baseos': Cannot prepare internal mirrorlist: Curl error (60): SSL peer certificate or SSH remote key was not OK for https://mirrors.rockylinux.org/mirrorlist?arch=x86_64&repo=BaseOS-9 [SSL certificate problem: certificate is not yet valid]

    原因

    SSLで証明書の検証で失敗

    対応(暫定)

    証明書の検証を無視する設定を入れる

    [root@localhost lib64]# vi /etc/yum.conf
    ...
    sslverify=false                             # 追記

    Db2 起動/停止/接続 コマンド

    停止

    [db2inst1@localhost ~]$ db2 terminate
    DB20000I  The TERMINATE command completed successfully.
    [db2inst1@localhost ~]$ db2 deactivate db sample
    DB20000I  The DEACTIVATE DATABASE command completed successfully.
    [db2inst1@localhost ~]$ db2stop
    08/07/2024 16:36:03     0   0   SQL1064N  DB2STOP processing was successful.
    SQL1064N  DB2STOP processing was successful.

    起動

    [db2inst1@localhost ~]$ db2start
    08/07/2024 16:36:53     0   0   SQL1063N  DB2START processing was successful.
    SQL1063N  DB2START processing was successful.

    接続

    [db2inst1@localhost ~]$ db2 connect to sample
    
       Database Connection Information
    
     Database server        = DB2/LINUXX8664 11.5.9.0
     SQL authorization ID   = DB2INST1
     Local database alias   = SAMPLE

    SQL実行

    [db2inst1@localhost ~]$ db2 "select count(*) from customer"
    
    1          
    -----------
              6
    
      1 record(s) selected.

    db2startでlibaws-cpp-sdk-transfer.soに関するエラー

    事象

    db2startで以下のエラーが出力される。

    [db2inst1@localhost ~]$ db2start
    db2start: error while loading shared libraries: libaws-cpp-sdk-transfer.so: cannot open shared object file: No such file or directory

    原因

    Db2 v11.5.9.0 のインストール時に作成される以下のファイルはディストリビューション別に用意され、libaws-cpp-sdk-core.soがシンボリックリンクになっているが、Rocky Linux用には作成されない。

    [root@localhost ~]# cd /opt/ibm/db2/V11.5/lib64
    [root@localhost lib64]# sudo find / -name libaws-cpp-sdk-core.so
    /opt/ibm/db2/V11.5/lib64/awssdk/UBUNTU/20.04/libaws-cpp-sdk-core.so
    /opt/ibm/db2/V11.5/lib64/awssdk/UBUNTU/22.04/libaws-cpp-sdk-core.so
    /opt/ibm/db2/V11.5/lib64/awssdk/UBUNTU/18.04/libaws-cpp-sdk-core.so
    /opt/ibm/db2/V11.5/lib64/awssdk/RHEL/8.1/libaws-cpp-sdk-core.so
    /opt/ibm/db2/V11.5/lib64/awssdk/RHEL/9.2/libaws-cpp-sdk-core.so
    /opt/ibm/db2/V11.5/lib64/awssdk/RHEL/7.6/libaws-cpp-sdk-core.so
    /opt/ibm/db2/V11.5/lib64/awssdk/SLES/12.4/libaws-cpp-sdk-core.so
    /opt/ibm/db2/V11.5/lib64/awssdk/SLES/15.1/libaws-cpp-sdk-core.so
    /opt/ibm/db2/V11.5/lib64/libaws-cpp-sdk-core.so

    対応

    Rocky Linux用にシンボリックリンクを作成する。

    [root@localhost ~]# cd /opt/ibm/db2/V11.5/lib64
    [root@localhost lib64]# sudo ln -s awssdk/RHEL/9.2/libaws-cpp-sdk-core.so libaws-cpp-sdk-core.so
    [root@localhost lib64]# sudo ln -s awssdk/RHEL/9.2/libaws-cpp-sdk-kinesis.so libaws-cpp-sdk-kinesis.so
    [root@localhost lib64]# sudo ln -s awssdk/RHEL/9.2/libaws-cpp-sdk-s3.so libaws-cpp-sdk-s3.so
    [root@localhost lib64]# sudo ln -s awssdk/RHEL/9.2/libaws-cpp-sdk-transfer.so libaws-cpp-sdk-transfer.so

    Db2をインストールするための前提条件の検査

    検査コマンド

    インストール・イメージを解凍したディレクトリに移動して「db2prereqcheck」コマンドを実行する。

    # pwd
    /work/server_dec
    # ./db2prereqcheck -i -v 11.5.9.0
    ==========================================================================
    
    Fri Jul 19 14:18:16 2024
    Checking prerequisites for DB2 installation. Version "11.5.9.0". Operating system "Linux" 
    ...

    ありがちなエラー

    Validating "ksh symbolic link" ... 
       WARNING : Requirement not matched. 

    kshが不足している。Db2単体で利用する場合は必要ないが、Tivoli System Automation for Multiplatformsを使う場合には必要になるとのこと。(yum install kshで解消)

    Validating "32 bit version of "libstdc++.so.6" " ... 
       Found the 64 bit "/lib64/libstdc++.so.6" in the following directory "/lib64". 
    DBT3514W  The db2prereqcheck utility failed to find the following 32-bit library file: "libstdc++.so.6". 
    Validating "/lib/libpam.so*" ... 
       DBT3514W  The db2prereqcheck utility failed to find the following 32-bit library file: "/lib/libpam.so*". 
       WARNING : Requirement not matched.

    libstdc++やlibpamのWarning(failed)は64bit環境では無視できる(IBMのマニュアルに記載)とのこと。

    Stable Diffusion Web UIのインストール時エラー(Python絡み)

    事象

    Stable Diffusion Web UI(AUTOMATIC1111)のインストール時に「Could not find a version that satisfies the requirement torch==2.1.2」でエラーとなる。

    原因

    Stable Diffusion Web UI(AUTOMATIC1111)で使用されるPyTorch(2.1.2)はPython3.11までしかサポートしていない。

    対応

    サポートしているバージョンのPythonを使用する。具体的にはバージョン3.11を使用する。

    wslにUbuntuをインストールする

    wsl –install を実行して WSL ヘルプ テキストが表示される場合(WSL環境構築済の場合)

    使用可能なディストリビューションを確認する

    > wsl --list --online

    Ubuntuを指定してインストールする

    > wsl --install -d Ubuntu