2007年11月17日 19:04
サーバー狂想曲
色んなプロジェクトのテスト環境として、自宅にサーバーをつくって、そこでプロジェクトのテストをしているわけですが、そのサーバーでやってはいけないことをしてしまった・・・
使っているのは、RedHatのコミュニティ(オープンソース)版LinuxのCentOS。
CentOSは、yumというコマンドでパッケージ管理をしていて、これが超便利。昔は、ソースファイルを探してきて、自分でコンパイルとか、rpmを探してきて、自分でインストールとかしていたわけですが、yumはコマンド一発でネットからダウンロードしてきて、インストールまでしちゃう。
例えば、yum search hogehogeで、hogehogeというソフトがCentOS用に作成されていているかどうか?というのを確認するわけです。
で・・・
yum updateで、yumでインストールしたすべてのソフトのアップデートをするんです。
yum -y updateで、アップデートする?というyumからの応答をyesとする省略。
金曜の深夜に、思わずyum -y updateとしちゃったわけです。
python-develが何かの依存関係で、バージョンがダメだとlogに書いてあって、個別に入れようと思って悪戦苦闘しているうちに、ついカッとなって・・・
それがまさか、こんな面倒くさいことを引き起こすとは。
yum -y updateしたら、中に入ってるソフトが新しくなるわけです。
新しくなるときに、データの互換性がないこともあるわけです。
特に、PostgreSQLというデータベースでは・・・
アップデートする前は、PostgreSQL 7.4でした。
アップデートした後は、PostgreSQL 8.1です。
アップデートしたら、PostgreSQL動いてない・・・
このデータベース、今やってるプロジェクトでエンジニアさんがせっせと使ってるデータベース・・・
えー・・・つまり、プロジェクトの妨げをしている、と。
かつ、可及的速やかにこのデータベースを稼働させないといけない。
どうやら、データベースソフトをバージョンアップするときは、pg_dumpall > dump.dbとしてデータベースのダンプを作成。
バージョンアップ後に書き戻す作業をしないとダメらしいんですわ。
・・・わかんねーよ。
というか、かれこれ何年もその業務のソバにいないから、本気でわかんねーよ。
そんな感じで逆ギレぎみになりつつも、あ、いやそんなことより、まずは直さないと・・・と。
直す前に、恐ろしいのでデータベースのコピーを作成する。
cp -rp /var/lib/pgsql ~/pgsql_fullcopy
試行錯誤はここから・・・
まず、PostgreSQL 8.1で7.4のデータベースを使って起動することはできないのか探して、できないことを知り。
次に、7.4のデータベースを8.1用にコンバートする方法を探して、そういう方法はないということを知った。
こりゃもう、PostgreSQLを7.4に戻せばいいな、と思いアップデートしたシステムのデータベースを7.4に落とそうと努力するも、うまくいかない。
ここでだいぶ時間を使が、結果は一歩も進まずガッカリ。
どうやら、7.4が動くシステムを別につくって、pg_dumpallしてそれを戻せばいいらしい。
絶望的に時間がかかる・・・自業自得ですが。
しかしこのままではどうしようもないので、VMwareにCentOSを入れてPostgreSQL 7.4をインストール。
新しいが旧いバージョンのCentOSで、PostgreSQLを起動。
/etc/rc.d/init.d/postgresql start
起動できたら、終了する。
/etc/rc.d/init.d/postgresql stop
終了したら、8.1にしてしまってどうしようもない方をコピーする。
scp -rp pgsql username@xxx.xxx.x.x:/var/lib/
コピーできたら、/var/lib/pgsqlのオーナーとパーミッションに注意して、新しいが旧いバージョンのCentOSにあるPostgreSQLを起動。
ここで、起動に失敗するようならオーナーやパーミッションが間違えてる。
起動できたら、データベースの中身を確認してから新しいが旧いバージョンのCentOSでダンプの作業。
su - postgress
でPostgreSQLのユーザになる。
pg_dumpall > pgdump.db
ダンプしたら、ちゃんと内容があるか容量だけ確認。
確認できたら、ダンプファイルをPostgreSQL 8.1が動いている方にコピー。
何が起こるか恐ろしいので、PostgreSQL 8.1の方で、データベースのディレクトリをコピーする。
cp -rp pgsql pgsql7_4
で、su - postgresしてpostgresユーザになって、データベースの初期化(initdb)をして、PostgreSQL 8.1を起動して書き戻す。
psql template1 < pgdump.db
書き戻せたら、中身をちょろっと見て、プロジェクトのシステムが動いてるか確認。
なんとか元に戻せた・・・。
カッとなってやるのは良くないです。反省。
あと、cronでdump取るようにします。
自分で自分にガッカリだ!
けど、7系より8系の方が良いんだよね、と一緒にやってるエンジニアさんが言っていたので、彼の言葉を信じるなら、この後良いことがあると良いなぁ・・・と希望的に考えることにします。
超が付くほど久しぶりにPostgreSQL使いのバイブル、PostgreSQ完全攻略ガイド(通称シーラカンス本)を読みまくりましたよ・・・。



