SourceForge.JP: Open Source Software

LoginCreate AccountAdd BookmarkHelp

OpenSource Downloads

(7,661) Cabos
(2,622) 7-Zip
(1,956) HandBrake Japanese Language Version
(1,671) CrystalDiskInfo
(1,621) Tera Term
(1,111) CrystalDiskMark
(827) ffdshow
(589) Tween
(586) ギコナビ
10  (542) Amateras
11  (495) VirtualDubMod-jp
12  (460) NNDD - ニコニコ動画DL&再生ソフト
13  (456) MergeDoc
14  (437) SMPlayer
15  (401) えこでこツール
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 更新