subsonic のDBを調べる

定期的にsubsonicのDBが壊れる。
具体的には実際のファイル数よりも明らかに少ないファイルしかスキャンされず、しかも何度スキャンしても状況が変わらない。
そのたびに直近のバックアップをrestoreしているのだが、proxmoxだから手軽に出来ているのであって、いつまでもこんなやり方ではまずい。
なので、出来ればDB(HSQL)の中で何が起こっているのか調べておきたい。

http://hsqldb.org/doc/guide/ch08.html
を参考に。
というわけで先ずは接続。
予めsubsonic の dbディレクトリを適当な場所にコピーしておく。subsonicをstopしてからやったほうがいいだろう。

java -jar /var/subsonic/jetty/[DIR]/webapp/WEB-INF/lib/hsqldb-1.8.0.7.jar --inlineRc URL=jdbc:hsqldb:file:[DB_PATH]/subsonic,user=sa,charset=UTF-8

subsonicの使っているHSQLのjarを使って、予めコピーしておいた subsonic の dbディレクトリを指定して、standaloneで接続して中身を見る、という事をやっている。dbのファイルは subsonic.* という名前なので、接続する時はファイル名を直接指定せずにsubsonicまでで止めること。
passwordは空っぽで良い。

sql> \dt
TABLE_SCHEM  TABLE_NAME
-----------  -------------------
PUBLIC       ALBUM
PUBLIC       ARTIST
PUBLIC       BOOKMARK
PUBLIC       CUSTOM_AVATAR
PUBLIC       GENRE
PUBLIC       INTERNET_RADIO
PUBLIC       MEDIA_FILE
PUBLIC       MUSIC_FILE_INFO
PUBLIC       MUSIC_FOLDER
PUBLIC       MUSIC_FOLDER_USER
PUBLIC       PLAYER
PUBLIC       PLAYER_TRANSCODING
PUBLIC       PLAYER_TRANSCODING2
PUBLIC       PLAYLIST
PUBLIC       PLAYLIST_FILE
PUBLIC       PLAYLIST_USER
PUBLIC       PLAY_QUEUE
PUBLIC       PLAY_QUEUE_FILE
PUBLIC       PODCAST_CHANNEL
PUBLIC       PODCAST_EPISODE
PUBLIC       ROLE
PUBLIC       SHARE
PUBLIC       SHARE_FILE
PUBLIC       STARRED_ALBUM
PUBLIC       STARRED_ARTIST
PUBLIC       STARRED_MEDIA_FILE
PUBLIC       SYSTEM_AVATAR
PUBLIC       TRANSCODING
PUBLIC       TRANSCODING2
PUBLIC       USER
PUBLIC       USER_RATING
PUBLIC       USER_ROLE
PUBLIC       USER_SETTINGS
PUBLIC       VERSION
PUBLIC       VIDEO_CONVERSION

で、テーブルの一覧を見れる。\d TABLE でテーブルの定義が見れる。

sql> \d MEDIA_FILE
name                   datatype   width  no-nulls
---------------------  ---------  -----  --------
ID                     INTEGER       11  *
PATH                   VARCHAR    32766  *
FOLDER                 VARCHAR    32766  
TYPE                   VARCHAR    32766  *
FORMAT                 VARCHAR    32766  
TITLE                  VARCHAR    32766  
ALBUM                  VARCHAR    32766  
ARTIST                 VARCHAR    32766  
ALBUM_ARTIST           VARCHAR    32766  
DISC_NUMBER            INTEGER       11  
TRACK_NUMBER           INTEGER       11  
YEAR                   INTEGER       11  
GENRE                  VARCHAR    32766  
BIT_RATE               INTEGER       11  
VARIABLE_BIT_RATE      BOOLEAN        5  *
DURATION_SECONDS       INTEGER       11  
FILE_SIZE              BIGINT        20  
WIDTH                  INTEGER       11  
HEIGHT                 INTEGER       11  
COVER_ART_PATH         VARCHAR    32766  
PARENT_PATH            VARCHAR    32766  
PLAY_COUNT             INTEGER       11  *
LAST_PLAYED            TIMESTAMP      6  
COMMENT                VARCHAR    32766  
CREATED                TIMESTAMP      6  *
CHANGED                TIMESTAMP      6  *
LAST_SCANNED           TIMESTAMP      6  *
CHILDREN_LAST_UPDATED  TIMESTAMP      6  *
PRESENT                BOOLEAN        5  *
VERSION                INTEGER       11  *

readlineなんて気の利いたものは無いので、操作はかなりストレスが溜まる。
あくまで予想、なのだが LAST_SCANNED や CHANGED 辺りがおかしくなっているのではと思い、幾つか調べてみる。

select top 10 * from media_file where artist = '[artist]' and type = 'MUSIC';
:
2013-02-12 01:49:48.0  2013-02-12 01:49:48.0  2016-12-22 00:09:44.479  1970-01-01 09:00:00.0  true           4

これは、CREATED以降のcolumnを調べてみたもの。壊れた時に調べてみればいいか。
parent_path には、ファイルのあるディレクトリが入っていた。
ちなみに、LIMITを使おうとしたら何故かエラーになった。しょうがなくTOPというもので代用している。マニュアルにLIMITはあるのだが。謎だ。