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