SourceForge.JP: Open Source Software

LoginCreate AccountAdd BookmarkHelp

OpenSource Downloads

(7,965) Cabos
(3,068) 7-Zip
(2,483) Tera Term
(2,009) CrystalDiskInfo
(1,669) HandBrake Japanese Language Version
(1,252) CrystalDiskMark
(921) ffdshow
(669) Tween
(667) Boookends
10  (569) Amateras
11  (563) ギコナビ
12  (502) MergeDoc
13  (436) VirtualDubMod-jp
14  (422) えこでこツール
15  (375) SMPlayer
More >>

最近ブックマークされた記事

MySQLをファイルシステムとして使う

2008年02月21日 09:39 1 2 3
  • スラッシュドットにタレコむ
  • あとで読む
  MySQLfs を使うと、リレーショナル・データベースMySQLの中にファイルシステムを入れることができる。このファイルシステム中のファイルに含まれるバイト列はデータベースの各行に分割して格納されるため、大きなファイルがある場合もデータベースが巨大なBLOBフィールドをサポートしている必要はない。ファイルシステムをMySQLデータベースに入れておくと、データベースが備えているバックアップやクラスタリング、レプリケーションの機能を利用してMySQLfsファイルシステムを保護することができる。

 Fedora、openSUSE、UbuntuにはMySQLfsのバイナリー・パッケージは含まれていない。したがって、MySQLfsを使うにはソースからビルドする必要がある。また、あらかじめmysql-develとfuse-develをインストールしておかなければならない(FUSEにより、一般のプログラムがLinuxカーネルを介してファイルシステムを開示できるようになる。つまり、任意のアプリケーションからFUSEファイルシステムが直接使えるようになる)。develパッケージに不足がある場合、configureでエラーが発生するが、これが若干の混乱を引き起こすことがあるので注意されたい。たとえば、私がFedora 8 64ビット・マシンで試行したときはmysqlclient_rのリンクに失敗した。これはFUSE開発パッケージがなかったのが原因だ。つまり、このエラーによりリンカーのフラグに-Lが生成されたために、mysqlclientテスト・プログラムのリンクに失敗したのだ。また、ビルドではデフォルトで-Wall -Werrorが含まれているため、警告メッセージが発生した時点でビルドは直ちに中止される。これを回避するため、-Werrorを外してコンパイルし、必要な開発パッケージがすべてインストールされていることを確認しておく。MySQLfsがビルドできたら、make installコマンドでMySQLfsを/usr/local/binにインストールする。

 MySQLfsを使用できるようMySQLデータベースを設定する手順を以下に示す。ここで、make installでは、schema.sqlファイルがファイルシステムのどこにもインストールされないことに注意。あとでほかのMySQLfsデータベースを設定する場合はこのスキーマをどこかにコピーしておかなければならない。

# mysql -p
mysql> CREATE DATABASE mysqlfs;
mysql> GRANT SELECT, INSERT, UPDATE, DELETE ON mysqlfs.* TO mysqlfs@"%" IDENTIFIED BY 'foobar';
mysql> FLUSH PRIVILEGES;
mysql> Bye
# mysql -uroot -p mysqlfs < /tmp/mysqlfs-0.4.0-rc1/schema.sql

 データベース・スキーマは、tree、inodes、data_blocksという3つのテーブルから成る。treeはinodeの子から親への対応だ。テーブルの一部を下に例示する。

 以下の例は、guten/alice13a.txtというファイルをインポートしたときのものだ。treeテーブルはファイルシステム中のファイルやディレクトリーの階層を表現しており、この場合ファイルalice13a.txtはディレクトリーgutenの中にあり、ディレクトリーgutenはMySQLfsファイルシステムのルートの下にあることを示している。inodesテーブルにはstat(2)で得られるすべての情報が、data_blocksテーブルにはファイルの内容がバイト列として格納されている。

mysql> select * from tree;
+-------+--------+----------------------+
| inode | parent | name                 |
+-------+--------+----------------------+
|     1 |   NULL | /                    |
|     2 |      1 | guten                |
|     3 |      2 | alice13a.txt         |
...
mysql> select * from inodes;
+-------+-------+---------+-------+-----+-----+------------+------------+------------+----------+
| inode | inuse | deleted | mode  | uid | gid | atime      | mtime      | ctime      | size     |
+-------+-------+---------+-------+-----+-----+------------+------------+------------+----------+
|     1 |     0 |       0 | 16877 |   0 |   0 | 1201155861 | 1201155861 | 1201155861 |        0 |
|     2 |     0 |       0 | 16888 | 500 | 500 | 1200108244 | 1200108244 | 1201156234 |        0 |
|     3 |     0 |       0 | 33184 | 500 | 500 | 1200108239 | 1200108239 | 1201156234 |   153477 |
...
mysql> describe data_blocks;
+-------+------------------+------+-----+---------+-------+
| Field | Type             | Null | Key | Default | Extra |
+-------+------------------+------+-----+---------+-------+
| inode | bigint(20)       | NO   | PRI |         |       |
| seq   | int(10) unsigned | NO   | PRI |         |       |
| data  | blob             | YES  |     | NULL    |       |
+-------+------------------+------+-----+---------+-------+
Ben-Martin(2008年2月15日(金))
2008年04月22日 17:07 更新