[pgsql-jp: 36991] 各ユーザ毎のデータベース容量を、QUOTA制限に含めたい
wata1930 @ mail.goo.ne.jp
wata1930 @ mail.goo.ne.jp
2006年 4月 16日 (日) 05:48:59 JST
渡部と申します
FreeBSD 5.4 RELEASE
PostgreSQL 7.4.12
各ユーザ毎に作成したPostgreSQLデータベースの容量を、各ユーザ毎に設定したQUOTAの
制限ブロック数の容量に含まれるような仕組みを考えています。
以下のような手順を試してみました。
・fstabにて、マウントポイント/homeのOptionに、suiddir,userquotaを指定、有効化
・/home/db/pgsql ディレクトリを作成
drwx------ 3 pgsql pgsql 512 Apr 16 03:26 pgsql
・ユーザhogeにて、データベースhogedbを作成
・作成されたデータベースディレクトリを移動、シンボリックリンクを張る
# mv /usr/local/pgsql/data/base/17010 /home/db/pgsql/
# ln -s /home/db/pgsql/17010 /usr/local/pgsql/data/base/17010
※ 17010 = hogedb
・移動したデータベースディレクトリを、所有者hoge、グループpgsqlに設定し、
chmod 4700を実行(pgsqlディレクトリ以下に作成されるファイルは、所有者hogeにな
るよう設定)
# cd /home/db/pgsql
# chown hoge:pgsql 17010
# chmod 4770 17010
drwsrwx--- 2 hoge pgsql 2048 Apr 16 03:53 17010
・既に作成されている17010ディレクトリ内のファイルの所有者をhogeに変更、所有者、
グループ共に読み書きできるよう設定
# cd 17010/
# chown hoge:pgsql *
# chmod 660 *
これで、とりあえず現状のデータベースがユーザhogeのQUOTA制限の対象になり、新たに
このディレクトリ内に作成されるテーブル用のファイルなどは、所有者hogeとなり、ファ
イル作成や、読み書きはグループpgsqlにて操作される事を期待しました
が、テーブルの作成でパーミッションエラーとなりました
% psql -U hoge -d hogedb
hogedb=> CREATE TABLE test_tbl(id int);
ERROR: could not open relation "test_tbl": Permission denied
試しに、/home/db/pgsql/17010ディレクトリに設定している、setuidビットを外してみた
ところ、正常にテーブルが作成されました。
# chmod 0770 /home/db/pgsql/17010
drwxrwx--- 2 hoge pgsql 2048 Apr 16 04:31 18781
% psql -U hoge -d hogedb
hogedb=> CREATE TABLE test_tbl(id int);
CREATE TABLE
どうやら、新たに作成されるテーブル用のファイルの所有者がpgsqlとして作成出来ない
と、パーミッションエラーになるようです。
ちなみに、MySQL 4.1.18にて同じような事をしてみたところ、setuidビットがセットされ
たままの状態でも、正常にテーブルの作成が完了しました。
MySQLの場合、新規作成されるファイルが、所有者、グループ共に読み書き権限が与えられ
ており、PostgreSQLの場合は、所有者のみ読み書き権限が与えられるため、ユーザpgsqlが
ファイルの読み書きが出来ない状態だからでは、と考えています。
[ MySQLの場合 ]
-rw-rw---- 1 hoge mysql 0 Apr 15 23:32 test_tbl.MYD
-rw-rw---- 1 hoge mysql 1024 Apr 15 23:32 test_tbl.MYI
-rw-rw---- 1 hoge mysql 9170 Apr 15 23:32 test_tbl.frm
[ PostgreSQLの場合(setuidビットを外して作成したもの) ]
-rw------- 1 pgsql pgsql 0 Apr 16 04:46 18798
-rw------- 1 pgsql pgsql 4 Apr 16 03:24 PG_VERSION
-rw------- 1 pgsql pgsql 69385 Apr 16 03:24 pg_internal.init
PostgreSQLの設定で、作成するファイルのマスクを設定できるような項目があればうまく
いくのでは、と考えていますが、そのような設定はありますでしょうか?
それ以前に、このような仕組みをもっとスマートにこなす方法等ありますでしょうか。
(8.0以降の、テーブルスペースという機能で出来るのでしょうかね)
長くなりましたが、よろしくお願いします。
pgsql-jp メーリングリストの案内