私が使いだしたときの(無償版)foltia は、データベースエンジンとしてSQLite を使うようになってました。昔のバージョンやfoltia ANIME LOCKER はPostgreSQL を使っているようですが、個人で使う用途にはSQLiteで十分だろうと思ってました。
が、実際に使いだすと、時々現れる「Database is locked」なるエラー。背後で動いているコマンド(新しい番組データの取得など)がデータベースへのアクセス権限を独占し、こちらが予約を入れようとしても失敗、背後のコマンドがいつ終わるか分からないのでいつになったら予約ができるのか分からず、イライラすることも。これはトランザクションや排他ロックをデータベースファイル全体へのロックで実装しているSQLiteでは避けられない現象なのかなと。
ということで、下記の手順でPostgreSQLに引っ越しました。Database is lockedはいつ発生するか分からないので改善したか確認できていませんが、放送予定や番組表などが見違えるほど早く表示されるようになりました。予想してなかった副作用ですが、こっちの方がメリット大きい。
さて、今後長期間運用で変な誤動作しなければいいのですが…
[手順]
データベース作成。ここでのスーパーユーザーはPostgreSQLのそれで、rootではない。
- PostgreSQLおよびPHPとPerlモジュールをインストール(FreeBSDの場合postgresql93-server, p5-DBD-Pg, php55-pgsql, php55-pdo_pgsql)
- PostgreSQLを外部から接続する必要がないなら、postgresql.confにlisten_addresses = 'localhost'を指定
- スーパーユーザーで以下のコマンド実行(パスワードを'foltia'以外にする場合には後述のperl/foltia_conf1.pl, php/foltia_config2.phpも適切に設定を)
$ createuser --no-adduser --no-createdb --password foltia
$ echo "alter role foltia with password 'foltia'" | psql
$ createdb --owner foltia -E UTF8 foltia
データのコピー
- SQLiteのデータをダンプ
$ sqlite3 ~foltia/foltia.sqlite .dump > foltia.sqlite.dump
- ダンプしたファイルの編集
- PRAGMA foreign_keys=OFF;を削除
- CREATE TABLE foltia_programの部分
- integer PRIMARY KEY AUTOINCREMENT → serial PRIMARY KEY
- CREATE TABLE foltia_subtitleの部分
- startdatetime, enddatetimeの型をinteger → bigint
- CREATE TABLE foltia_epgの部分
- startdatetime, enddatetimeの型をinteger → bigint
- integer PRIMARY KEY AUTOINCREMENT→serial PRIMARY KEY
- 最後の部分
- DELETE FROM sqlite_sequenceを削除
- INSERT INTO "sqlite_sequence" VALUES('foltia_epg',XXXXX) → select setval('foltia_epg_epgid_seq',XXXXX) (XXXXXは数字)
- foltiaもしくはスーパーユーザーで以下のコマンドを実行
$ psql foltia < foltia.sqlite.dump
foltiaの設定変更
- perl/foltia_conf1.plのコメントアウトされているPostgreSQL設定の行を有効にし、SQLite向けの設定をコメントアウトする
## for postgresql
$main::DSN="dbi:Pg:dbname=foltia;host=localhost;port=5432";
require 'db/Pg.pl';
## for sqlite
#$main::DSN="dbi:SQLite:dbname=/home/foltia/foltia.sqlite";
#require 'db/SQLite.pl';
$main::DBUser="foltia";
$main::DBPass="foltia";
- php/foltia_config2.phpのコメントアウトされているPostgreSQL設定の行を有効にし、SQLite向けの設定をコメントアウトする
define("DSN", "pgsql:host=localhost dbname=foltia user=foltia password=foltia");
// define("DSN", "sqlite:/home/foltia/foltia.sqlite");
[2016/3/14 追記] Perlのフラグ付きUTF8による文字化け を避けるため、以下のファイルを変更。
- perl/getxml2db.pl
- perl/xmltv2foltia.pl
変更内容
- use Encode;を追加(use Jcode;はたぶん抜いてもいい)
- [2016/3/23 追記] use utf8;を追加
- foreach(@line)ループ内の最初に$_ = Encode::decode('utf8', $_);を追加、ファイルから読み込んだ文字列を即刻フラグ付きにする。
- jcode()->tr(str1, str2)の代わりに、標準のtr/str1/str2/を用いる。変換文字内に/(スラッシュ)が入っているので、エスケープを付ける。
Comments