まだプログラマーですが何か?

プログラマーネタとアスリートネタ中心。たまに作成したウェブサービス関連の話も http://twitter.com/dotnsf

(追記 2015.01.05)
記事タイトルでは対象バージョンを 10.1 にしていますが、2015/01/05 現在は同じ手順でバージョン 10.5 が導入されるようです。


IBM 製リレーショナルデータベースである DB2 を CentOS に導入する手順を紹介します。
2014020100

DB2 は IBM 製のリレーショナルデータベースのサーバーおよび管理システムです。1980 年にリリースされた System 38 に組み込まれており、これが SQL を初めて採用した製品、と言われています(DB2 という単体製品としては 1983 年リリース)。リレーショナルデータベースとしての機能を持ちながら、XML DB 機能が統合されていたり、最新バージョンではビッグデータの統計処理に対応するための列ストア機能にも対応しています。

DB2 は本来有償の商用製品ですが、サポートが無いことも含めた特定の条件下であれば無料でダウンロードして利用することができます(商用利用も可)。その条件で提供されるエディションが Express-C と呼ばれています。無償版用のエディション名が与えられていますが、モジュールそのものに商用版との違いはありません。結構お得感のある製品と言えます。この詳しい条件については後述の「DB2 Express-C 10.1 for Linux クイックインストール」リンク先を参照してください。


インストール&セットアップの手順を紹介する上で最初にいくつかお断りを。まず現時点で DB2 の最新バージョンは 10.5 です。以下に Express-C 版(サポート無しの無償版)の導入手順を紹介しますが、Express-C でも 10.5 を入手すること自体は可能ですが、10.5 版のインストーラは独自のもので、よく言えば「インストーラーが最初に色々やってくれて便利」なんですが、悪く言うと「普段オープンソース製品を使っている人からすると独自すぎ&最初に色々すっ飛ばされると理解できない部分がある」のでした。というわけもあって、rpm で導入できるバージョン 10.1 を対象に紹介します。

また、IBM は公式には CentOS 上での DB2 の動作を保証していません(RHEL は対象):
DB2 Express-C 10.1 for Linux クイックインストール

私自身で試した範囲では RHEL 向けの手順をそのまま利用することで CentOS でも導入できて動作することを確認していますが、とりあえず注意が必要です。


では導入手順の紹介です。上記でも少し触れましたが DB2 は(現時点では)yum でサクっと導入できるものではありません。まずはインストールモジュールをダウンロードする必要があります。そしてその前提として IBM ID というユーザーIDが必要になります。登録自体は無料です。IBM ID を所有していない場合はダウンロード前に(誘導されて)作成することになります。

DB2 バージョン10.1の場合、"DB2 Express-C Team Blog" から直接リンクがあるのでこちらからダウンロードするのが手っ取り早いです。
http://www.db2teamblog.com/2010/11/rpm-and-deb-packages-for-db2-express-c.html

2014020101


上記サイト内の "Get RPM and DEB packages for DB2 Express-C" と書かれたリンクをたどると、DB2 バージョン 10.1 の、Linux 向けインストールパッケージ(RPM版とDEB版)が、32bit/64bit 用に用意されています。自分の環境にあったものをダウンロードしましょう。とりあえず今回は CentOS 用ということで RPM 版をダウンロードしますが、Ubuntu に導入するのであれば DEB 版を選択してください。
2014020102


ダウンロードが完了すると(RPM 64bit 版であれば) IBM-DB2-EXPC-latest.x86_64.rpm という300MB前後のファイルが見つかるはずです("lastest"バージョンではない気もするけど・・・)。これがインストーラーです。こいつを sftp などを使ってインストール対象の CentOS に転送しておきます。

で、RPM を使ってインストール・・・の前にしておくことあります。DB2 はインストール時に hostname コマンドで取得できるホスト名の IP アドレス解決ができるようになっている必要があるのでした。というわけでまずは hostname を確認と。。
# hostname
test.localhost.com (例です)
# 


このホスト名の IP アドレスが解決できるようになっていないといけないのでした。上記例であればこんな感じで確認します:
# ping test.localhost.com
ping: unknown host test.localhost.com
# 


IP アドレスの解決ができていないのであれば /etc/hosts を編集しておきましょう:
# vi /etc/hosts

XXX.XXX.XXX.XXX test.localhost.com (↑ホストのIPアドレス 127.0.0.1 でも可)


ここまでできれば RPM でインストールできます:
# rpm -ivh IBM-DB2-EXPC-latest.x86_64.rpm

正常に終了すると /opt/ibm/db2/V10.1/ 以下に IBM DB2 が導入されているはずです。


ここからが RPM 版インストーラを使った場合の仕様(?)なのですが、通常の専用インストーラを使ってインストールした場合は、インストールと同時に管理に必要な各種ユーザー/グループも作成してくれたり、インスタンスを作ったり、その中にサンプルのデータベースも作ってくれたり、その中身も初めから入れておいたりしてくれます。要はインストールが完了した段階で動作確認程度の利用まではできるようになっています。一方 RPM 版の場合はそれらを別途手動で行う必要があるのです。まあ他のオープンソース RDB を使っていると後者の方が一般的だと思うのですが、要はこの段階ではまだ DB2 というサーバーモジュールがインストールされただけで、起動させるための初期設定もできていない状態だということです。


では DB2 サーバーを起動して、データベースを1つ作成して接続するところまでの手順を以下に紹介します。

DB2 サーバーを運用する上では3つの管理ユーザー/グループを用意して、指定しておく必要があります。まずインスタンス所有者としての管理ユーザー、次にユーザー定義関数やストアドプロシージャの実行権限を持った管理ユーザー、そして DB2 管理サーバーの管理ユーザー、およびこれらの所属グループです。今回はこれらのユーザーをそれぞれ db1inst1/db2fenc1/dasusr1 、またそれぞれの所属グループを db2iadm1/db2fadm1/dasadm1 として作成することにします(通常インストーラを使った場合のデフォルト設定と同じです)。


まずは管理用のグループを作成します。以下ではグループIDに997~999を使っていますが、既存環境とバッティングする場合は適当に変えてください:
# groupadd -g 999 db2iadm1
# groupadd -g 998 db2fadm1
# groupadd -g 997 dasadm1

次に管理ユーザーを作成します。以下ではユーザーIDに1002~1004を使っていますが、これも既存環境とバッティングする場合は適当に変えてください:
# useradd -u 1004 -g db2iadm1 -m -d /home/db2inst1 db2inst1
# useradd -u 1003 -g db2fadm1 -m -d /home/db2fenc1 db2fenc1
# useradd -u 1002 -g dasadm1 -m -d /home/dasusr1 dasusr1

そしてこれらの各ユーザーのパスワードを設定しておきます:
# passwd db2inst1
# passwd db2fenc1
# passwd dasusr1

ここまでの作業でやっと DB2 のインスタンスを作成する準備ができました。インスタンスの所有者を db2inst1 に、ユーザー定義関数やストアドプロシージャの管理者を db2fenc1 に指定するには以下のコマンドを実行します:
# /opt/ibm/db2/V10.1/instance/db2icrt -u db2fenc1 db2inst1

インスタンスが出来た所で DB2 サーバーを起動してみましょう。サーバーは root ユーザーでは起動できません。インスタンスオーナーである db2inst1 ユーザーで起動することになります:
# su - db2inst1
$ db2start
SQL1063N  DB2START processing was successful.
$

では起動した DB2 インスタンスに接続します:
$ db2
(c) Copyright IBM Corporation 1993,2007
Command Line Processor for DB2 Client 10.1.1

  :
  :

For more detailed help, refer to the Online Reference Manual.

db2 => 

何はともあれ、まずはデータベースを作成しましょう。コードセットは UTF-8 で、テリトリーコードを JP に設定した testdb というデータベースを作成します:
db2 => create db testdb using codeset utf-8 territory jp
DB20000I  The CREATE DATABASE command completed successfully.
db2 =>
※ちなみにこのコマンドの完了までに長い時間がかかります。コマンド入力し終わったらコーヒー一杯くらいは飲めそう(苦笑)。裏でどんな処理がされているのか分からないのですが、ここが MySQL などと大きく違う点の1つと言えるかもしれません。。

データベースに接続するには connect コマンドを利用します:
db2 => connect to testdb

   Database Connection Information

 Database server       = DB2/LINUXX8664 10.1.1
 SQL authorization ID  = DB2INST1
 Local database alias  = TESTDB

db2 => 

動いたー! d(o^ )


(2014/05/28 追加)
最後にこのサーバーへの外部アクセスを許可するための設定(というかおまじない)を db2inst1 ユーザーで実行します:
$db2set DB2COMM=TCPIP
$db2 update dbm cfg using svcename 50000

そしてこの一行を /etc/services に追加して再起動:
db2c_db2inst1   50000/tcp

(追加ここまで)


ここから先は普通の RDB 同様に、create table なり select なり、一般的な SQL の世界になります。



 

いつもの CentOS ネタです。

CentOS や RHEL(RedHat Enterprise Linux) を GUI 化してデスクトップ環境として使っています。アプリも揃っていて大抵の用途で使える(自分の利用範囲で今のところ使えないのは iTunes と LINE くらい)ので便利なのですが、ちょっとだけ不便を感じるのがウェブブラウザでした。

CentOS では yum で FireFox を導入して使うことはできます(説明いらないと思うけど #yum -y install firefox です)。まあ通常用途であれば FireFox でダメってことはないのですが、ウェブ開発やそのデバッグをする場合、慣れもあって Chrome を使いたくなります。

しかし、残念ながら現在 Chrome は CentOS 向けには(公式には)提供されていないのでした:
Google Says Red Hat Enterprise Linux 6 Is Obsolete [Updated]


ただ諦めるのは少し早いです。有志を中心に対策が練られていて、大きく以下の2つの方法で CentOS に Chrome 環境を導入することが可能です:
(1) 有志で用意されたインストーラを使って Chrome を導入する
(2) Chromium ブラウザをインストールする


(1) は CentOS には提供されていないものの、Fedora 向けに提供されている(た?)Chrome を元に、必要な前提ライブラリなどと一緒に導入するインストーラを、Richard Lloyd 氏が有志で開発してくれました。その方法を使うケースです。こちらの方法についてはリンク先を参照してください:
http://www.tecmint.com/install-google-chrome-on-redhat-centos-fedora-linux/

※上記リンク先の説明が少しわかりにくいと思うので補足。Step 2 の Update と書かれた中に "Richard Lloyd" さんの名前が書かれたその下からが、Chrome 導入方法の紹介になります。

(2) は厳密には Chrome ブラウザではないのですが、Chrome のベースとなっているオープンソースプロジェクト Chromium を CentOS にインストールして使う、というケースです。まあほとんど Chrome と同じと言えるし、ある意味で Chrome よりも一歩進んだ、開発最先端の機能を取り入れているとも言えるし、開発者ならこっちを使ってみるのも悪くないですよね。


というわけで、以下 CentOS に Chromium ブラウザを導入する手順の紹介です。CentOS6 前提で進めます。

まず root になって、その後で Chromium の yum レポジトリファイルをダウンロードします:
# cd /etc/yum.repos.d
# wget http://people.centos.org/hughesjr/chromium/6/chromium-el6.repo

で、yum を使って chromium をインストールします。途中何か聞かれたら YES で先に進めます:
yum install chromium

これだけ。yum が必要な前提ライブラリごと Chromium をインストールしてくれます。導入が終わるとメニューから Chromium が実行できるようになっているはずです。
2014013101


以上、Chrome や Chromium の導入方法についての紹介終わりです。以下はこれら2つに共通する、実行時の Tips についての補足です。

Chrome/Chromium のインストールはできました、実行時にはちと問題が生じます。一般ユーザーで Chromium や Chrome を実行するのは問題ないのですが、root ユーザーで Chromium(Chrome) を実行しようとすると何故かエラーメッセージが表示されてしまうのでした:
2014013102

これを回避するには特殊なパラメータを付けて Chromium を起動する必要があります。そのためにはメニュー選択時の実行コマンドを編集する必要があるのでした。

ではそのための手順も紹介します。まずはメニュー編集用の alacarte という GUI アプリケーションを yum でインストールしておきます:
yum -y install alacarte

インストール後に alacarte を実行します:
alacarte &

alacarte が起動します:
2014013103


Chrome/Chromium は「インターネット」カテゴリの中にあるので、左ペインで「インターネット」を選択し、右画面の「Chromium ウェブ・ブラウザ」と書かれた箇所を右クリックして「プロパティ」を選択します:
2014013104


プロパティの「コマンド」欄を書き換えます。具体的には最初から記述されている内容はそのままに、 %U に続けて -user-data-dir=$HOME/.config/google-chrome を追加します。"%U" と "-user-data.." との間に1つスペースを入れることを忘れずに:
2014013105

これでメニューの変更ができました。「閉じる」で alacarte を終了し、再度メニューから Chromium を実行すると、今度は正しく起動するはずです:
2014013106


Chromium からも Google Chrome ストアが使えそうです。豊富な Chrome プラグインが使えるのはやはり魅力的です。


 

Linux のコマンドラインで cp といえば「ファイルコピー」コマンドです。

# cp a.txt b.txt

とやれば「a.txt というファイルを b.txt という名前でコピー」です。簡単ですよね。

この cp コマンドには便利なオプションが数多くあります。例えば、
# cp -r /home/a /tmp

で /home/a というディレクトリをまるごと /tmp に(/tmp/a というディレクトリを作って)コピーする、という命令になる、とかです。

この cp コマンドは賢いので、コピー先に同じ名前のファイルがあると、新しいファイルで上書きするかどうかを確認してくれます:
# cp a.txt b.txt
cp: `b.txt' を上書きしてもよろしいですか(yes/no)?


ここで y(es) を押すと上書きコピー、n(o) を押すと上書きしません。

さて、 ディレクトリまるごとコピーした後に、コピー元のディレクトリの一部に変更が加わったとします。ファイルそのものが更新されたとか、新しいファイルが追加されたとか。 で、その変更をコピー先にも反映させようとして、もう一度ディレクトリまるごとコピーを試みるとこんな感じになります:
# cp -r /home/a /tmp
cp: `a.txt' を上書きしてもよろしいですか(yes/no)? y
cp: `b.txt' を上書きしてもよろしいですか(yes/no)? n
cp: `c.txt' を上書きしてもよろしいですか(yes/no)? y
  :

新しく追加されたファイルは無条件にコピーされるのですが、それ以外の(既に存在する)ファイルは上書き扱いになるので、1つ1つ確認メッセージが表示されます。で、上記例では最初の a.txt は上書きする、次の b.txt は上書きしない、次の c.txt は上書きする、・・・といちいちコマンドを入力してコピーするかどうかを指示しています。

現実的には変更の加わったファイルは上書きしてほしいし、変更されていないファイルについても(処理としては無駄になりますが)上書きしても結果的にファイル内容は変わらないので、「全て無条件に上書きしても構わない」というケースも少なくないと思います。でもその場合でも y とリターンキーを連打することになって、ちょっと面倒です。


もちろんそんなことは想定済みで、cp コマンドには「コピー先に同名のファイルがあった場合に強制上書きする」というオプション -f があります。
# cp --help
:
:
-f, --force if an existing destination file cannot be opened, remove it and try again.
でも実際にやってみるとうまくいかないケースが多いです。
# cp -f a.txt b.txt
cp: `b.txt' を上書きしてもよろしいですか(yes/no)?
これはシステムの設定で cp にエイリアスが指定されていることが原因として考えられます。僕の CentOS 環境では特に何もエイリアスを指定したつもりがなくてもこのようなエイリアスが(デフォルトで)設定されているようでした。
# alias
alias cp='cp -i'
alias l.='ls -d .* --color=auto'
  :

cp は知らないうちに 'cp -i' という命令になっていました。この -i オプションは強制インタラクティブの指定で、いわば -f の逆の動作(常に上書きを確認する)を指定するオプションです。
# cp --help
:
:
-i, --interactive prompt before overwrite (overrides a previous -n option)

なので、このエイリアスを無効にすれば -f オプションが有効になるのですが、デフォルトの設定を変えてしまうのはそれはそれで怖い。。

というわけで、普段は -f を付ける時だけ cp コマンドの頭に \(¥あるいはバックスラッシュ) を付けて実行するようにしています。コマンドの頭に \ を付けると、その時だけエイリアスが無効になります
# \cp -f a.txt b.txt
# (上書きコピー完了)

もちろん -r オプションなどとも一緒に使えるので、これでディレクトリまるごと上書きコピーすることもできるようになります。











 

このページのトップヘ