A Day In The Boy's Life -185ページ目

A Day In The Boy's Life

とあるエンジニアのとある1日のつぶやき。

普段あまり意識する事はありませんが、PostgreSQLにはデータふぃある初期化(initdb実行時)に3つのDBが作成されます。


template0

template1

postgres


この上2つのtemplateXというDBは、全てのDBのテンプレートとなるDBという特殊な意味を持っています。

これについては、マニュアルの中にも触れられて(@ PostgreSQL 8.3.3文書) いますが、もう少し詳しくみていってみます。


どういうことかは、具体的に動かしてみればはっきり分かります。


例)

$ psql template1
template1=# create table master (id integer, name text);
CREATE TABLE
template1=# \z
Access privileges for database "template1"
Schema | Name | Type | Access privileges
--------+------ +-----+-------------------
public | master | table |
(1 row)
template1=# \q
$ createdb testdb
CREATE DATABASE
$ psql testdb
testdb=# \z
Access privileges for database "testdb"
Schema | Name | Type | Access privileges
--------+------+------+-------------------
public | master | table |
(1 row)

どうでしょう。

template1で作成したテーブル(master)が、その後に作ったDBであるtestdb上でも勝手に作られています。

このように、template1は全てのDBのテンプレートとなる役割を果たしています。


template1がこういう用途のDBとなっているため、template1内にオブジェクトを作ってはならないとなっています。

作ってしまった場合、その後作る全DBにそのオブジェクトがコピーされて作られてしまうためです。


※ 全DBで共通のテーブルを作成したい場合(本番DBとテストDBの用途分けなど)などに意味を持ったりしますが、

  それほど大きな用途としてはなさそうな気もします。


では、次にtemplate0の役割です。

こちらも、同じテンプレートDBですがtemplate0へは接続する事もできません。


$ psql template0
psql: FATAL: database "template0" is not currently accepting connections 


こちらは、マニュアルに書いてあるとおりで、データファイル初期化時(initidb実行時)の状態のテンプレートDBとなっています。(純粋な状態のテンプレートDB)

template1のDBへは接続や変更を加える事はできますが、template0へは(通常のままだと)変更を加える事や接続する事はできません。

template0はtemplate1のテンプレートにもなっています。(言い方が紛らわしいですが)


予断となりますが、残り一つのpostgresというDBですが、こちらもinitdb実行時に自動的に作成されるDBです。


$ initdb
(snip)
copying template1 to template0 ... ok
copying template1 to postgres ... ok


次に、マニュアルをよく読むとtemplate1は削除する事ができると書いていますが、実際に削除してみるとエラーが出てしまいます。


$ dropdb template1
dropdb: database removal failed: ERROR: cannot drop a template database

誤ってtemplate1内にオブジェクトを作ってしまった場合、一つ一つのオブジェクトを削除するのも面倒なので、ばっさりとDBごとを削除してしまいたいと考えるかもしれません。

(template1は削除してもよいものと、マニュアルにも記載されています)


具体的にtemplate1のDBを削除するには、下記の方法を取れば可能です。


$ psql template1
template1=# UPDATE pg_database SET datistemplate = FALSE where datname = 'template1';
UPDATE 1
template1=# \q
$ dropdb template1
DROP DATABASE 

まず、pg_database というシステムカタログ(Oracleのデータディクショナリのようなもの)内にある、「datistemplate」というカラムをFALSEにセットします。

このカラムは、テンプレートに指定ができるかどうかを表すもので、template1ではデフォルトTRUEになっています。

datistemplateカラムがTRUEとなっている場合、DBの削除は行えません。


template1を再作成したい場合、引き続き下記の操作を行います。


$ createdb template1 --template=template0;
CREATE DATABASE
$ psql -l
List of databases
Name | Owner | Encoding
-----------+----------+----------
postgres   | postgres | UTF8
template0  | postgres | UTF8
template1  | postgres | UTF8
(3 rows)
$ psql template1
template1=# UPDATE pg_database SET datistemplate = TRUE where datname = 'template1';
UPDATE 1

template1は、全DBのテンプレートとなる特殊なDBという意味からも、勝手に削除をされないように、再度UPDATEをかけて元の状態に戻しています。


ただ、このような回りくどいやり方をせずとも、バックアップを取るべきDBをpg_dumpコマンドでバックアップし、initdbでデータファイルを初期化後に、リストアするという方法もあります。

ただし、pg_dumpallで取得したバックアップファイルからリストアする場合、template1も対象となっているので気をつけましょう。





以前に書いた「レンタルサーバーのファーストサーバ設定あれこれ 」の続き。


Webの設定に引き続き、RDBMSとしてPostgreSQLを利用できるようにしてみます。

ファーストサーバ では、DBとしてMySQLが利用可能になっていますが、あまり触れたことが無いため、慣れているPostgreSQLをインストールしたいと思います。


ファーストサーバのVPS環境では、root権限が与えられているため、かなり自由度の高いサーバー管理が可能になっています。

サーバー(CentOS)上のS/Wは、Parallels Power Panel(仮想化ソフトウェア)上にてパッケージの管理が行えますが、パッケージの管理画面からPostgreSQLを検索してみてもヒットしないため、Paralles Power Panelを通してPostgreSQLを利用可能にすることはできないようです。


という事で、回避策としてyumコマンドをインストールして、yumを通してPostgreSQLをインストールします。


注)

ファーストサーバでは基本、このPLESKコンソール画面を通してサーバーを操作することを推奨しており、端末を使って接続し、サーバーを操作する場合は自己責任でということになっているようです。

もちろん、このブログ記事で書かれていることも、実際にやる場合は同様に自己責任でお願いします。



1. ファーストサーバ上でyumコマンドを利用可能にする


まず、仮想化ソフトウェアの管理用システム(Parallels Power Panel)にログインし、左メニューの「パッケージ」を

開きます。


Plesk-yum1

次に、「新しいパッケージのインストール」ボタンをクリックします。


Plesk-yum2


そして、「名前」の入力欄に「yum」と入力して検索し、結果の一覧に表示されるyumパッケージの横にあるチェック

ボックスをクリックし、「インストール」ボタンでインストールを実行します。


Plesk-yum3



これで、yumコマンドがインストールされ利用可能になりました。

実際にインストールされているかどうかは、SSHで接続してみて


# which yum
/usr/bin/yum 

とでも入力すればわかります。



2. yumを通してPostgreSQLをインストールする


後は、yumコマンドを通してPostgreSQLをインストールするだけです。


まずは、利用可能なバージョンを調べて見ます。


# yum info postgresql
Loading "fastestmirror" plugin
Loading mirror speeds from cached hostfile
* base: ftp.jaist.ac.jp
* updates: ftp.jaist.ac.jp
* addons: ftp.jaist.ac.jp
* extras: ftp.jaist.ac.jp
base 100% |=========================| 1.1 kB 00:00
updates 100% |=========================| 951 B 00:00
addons 100% |=========================| 951 B 00:00
extras 100% |=========================| 1.1 kB 00:00
Available Packages
Name : postgresql
Arch : i386
Version: 8.1.11
Release: 1.el5_1.1
Size : 2.9 M
Repo : base
Summary: PostgreSQL client programs and libraries.

PostgreSQL8.1.11が利用可能なようです。


では、いよいよyumを通してPostgreSQLをインストールしますが、その前にGPGキーをインポートしておきます。


# rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5

これで準備が整いましたので、PostgreSQlをインストールします。


# yum install postgresql-server

※ yumコマンドの詳しい利用方法は「yumによるRPMパッケージの更新管理 」を参照してください。



3. PostgreSQLの環境設定


PostgreSQLのインストール完了後は必要な環境設定とDBの作成を行います。



3.1 postgresユーザーの作成


PostgreSQLの管理用として、postgresユーザーを作成します。


# useradd -m -d /home/postgres -s /bin/bash postgres

※ 管理用ユーザー名は何でも指定可能です。ここでは習慣的なpostgresユーザーとしています。


次に、ユーザーの環境設定を行います。

適当なエディタで、postgresユーザーのホームディレクトリ内にある「.bash_profile」ファイルを開き、下記を追加しておきます。


export POSTGRES_HOME=/var/lib/pgsql
export PGLIB=$POSTGRES_HOME/lib
export PGDATA=$POSTGRES_HOME/data
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$PGLIB

追加後は、上記環境設定を有効にするため環境ファイルを再読み込みさせます。


$ source .bash_profile


3.2 DBの初期化


PostgreSQLのDBを初期化するため、下記コマンドをpostgresユーザーで実行します。


$ initdb --local=ja_JP.UTF-8 -E UTF-8


3.3 PostgreSQLデーモンの起動


DBの初期化が終わったらデーモンの起動を行います。


$ pg_ctl start

実際に動いているか、確認してみます。


$ psql -l
List of databases
Name | Owner | Encoding
-----------+----------+----------
postgres | postgres | UTF8
template0 | postgres | UTF8
template1 | postgres | UTF8
(3 rows)

動いているようですね。

後は、好きなDBをcreatedbコマンドで作って使用することができます。


例)

$ createdb testdb
CREATE DATABASE

$ psql testdb
Welcome to psql 8.1.11, the PostgreSQL interactive terminal.
Type: \copyright for distribution terms
\h for help with SQL commands
\? for help with psql commands
\g or terminate with semicolon to execute query
\q to quit
testdb=#





初心者が考えがちな「Linuxの普及しない理由」 @ 狐の王国


言わんとしていることはわかるのですが、理由が少し古すぎるような。

5年ほど前に挙げられたのであれば、「そうだな」となりますが今ではその理由はあまり当てはまらなくなっています。


インストールが難しいというの事もなくなっています。

ただ単にインストールするだけなら、インストールCDを入れて「次へ」ボタンを連打しているだけで完了します。

(それで目的のOSが完成するかどうかは別として)

昔のLinuxのように、ディスクパーティションをどう割り当てるやら、初期のインストールパッケージの依存関係がどうとか言う事もありません。

それらも全て勝手に解決して進めてくれます。

キーバインドが違う点は、OSが違えばみな違いますし、コマンドラインで操作しないといけないというのも、今では理由にはならなくなってきています。(最近のデスクトップLinuxはかなり優秀だと思う)


OSの用途がなんなのかで結果も違ってきます。

サーバーOSとして、Linuxの普及度ってどうなのよ、となれば「結構普及しているよ」となりますが、コンシューマ向けのOSとしてなら「全然ダメだよね」となります。


なので、コンシューマ向けOSとしてWindowsとLinuxを比較するなら、やりたいアプリが動かないからという理由もでてきますが、サーバーOSとしてならそういった理由はあまり出てきません。

(コンシューマ向けOSとしての)デスクトップLinuxで、ゲームをしたいとなると選択肢がかなり狭まるので、利用者もそれを選ばないという事は多いでしょうが、サーバーOSとしてLinux上で業務用のプロプライエタリ製品を動かしたいとなるとメーカ側での対応状況はそれほど悪くありません。


今回の議論の焦点がコンシューマ向けOSとしての普及度を挙げているのであれば、利用者にとってはWindowsだろうがLinuxだろうが関係なく「ネットにつなげたい」、「ゲームがしたい」、「デジカメで取った写真を加工したい」とかそんな捉え方しかしてないだろうなと。

なので、目的が何なのかでOSの選択肢は変わってきます。

ただ、初心者が家電量販店に行って「ネットにつなげたい。これだけできればいい」と言ったところでLinuxの選択肢は出てきませんけどね。

店員が勧めるはずもないですから。

Linuxでも「ネットにつなげるだけ」なら十分に要件を満たしているのに。


単に言葉の普及度をみれば、ここまで広く普及してしまったWindowsの方に分がある事はあきらかです。

あなたの使っているOSは?と聞いても「わかりません」と答える人も多いと思いますが、PCを使っている過程でWindowsという言葉を見る機会は多いでしょうから、選択肢を示してしまえば「使っているのはWindowsです」と答える人は大多数を占めると思います。

Windowsという言葉があまりにも一般化しすぎているからかと。


じゃあ、あなたの使っているPCのOSを下記から選んでください。


・ Whistler

・ Longhorn

・ Linux


多分、大体がカンで答えるでしょうから票は割れるような気がするんですよね。


※ WhistlerはWindows XPの、LonghornはWindows Vistaのコードネーム