同じユーザーが所有するデータディレクトリを持つ非特権ユーザーとしてPostgresqlサーバーを作成して起動することは可能ですか?テストを実行してテストデータベースを作成したいのですが、データファイルはRAMディスクにあります。
$ mkdir -p /dev/shm/tests
$ pg_createcluster 9.3 tests -d /dev/shm/tests/pgsql/data
install: cannot change permissions of ‘/etc/postgresql/9.3/tests’: No such file or directory
Error: could not create configuration directory; you might need to run this program with root privileges
Sudo
が避けられない場合、管理者パスワードを1回だけ入力して、後続のテスト実行でパスワードを必要としない方法はありますか?テスト後にテストサーバーとそのデータディレクトリを停止したいということです。
わかりました。これが機能するまでに少し時間がかかりましたが、次のとおりです。
def run(command, action_descr, env=None):
print '\n%s' % termcolor.colorize(action_descr, termcolor.c.YELLOW)
print '$ %s' % termcolor.colorize(command, termcolor.c.YELLOW)
try:
output = subprocess.check_output(command, env=env, Shell=True)
except subprocess.CalledProcessError as exc:
print termcolor.colorize('FAIL:\n%s' % exc.output, termcolor.c.RED, True)
raise
else:
print termcolor.colorize('OK', termcolor.c.GREEN, True)
return output
def create_test_db_template():
"""Create test template database.
"""
PG_DIR = run('pg_config --bindir', 'Getting the location of Postgresql executables').strip()
PG_CTL = os.path.join(PG_DIR, 'pg_ctl')
test_db_directory = settings.get('tests', 'db_directory')
env = os.environ.copy()
env['PGDATA'] = test_db_directory
env['PGPORT'] = settings.get_test_db_port()
try:
status = run('%s status' % PG_CTL, 'Checking previous test server status', env)
except subprocess.CalledProcessError:
pass
else:
print status
run('%s stop' % PG_CTL, 'Stopping previous instance of test server', env)
run('rm -rf %s' % test_db_directory, 'Deleting server data directory')
run('mkdir -p %s' % test_db_directory, 'Creating server data directory')
run('%s initdb -o "--auth-Host=trust --nosync"' % PG_CTL,
'Initializing test server and data directory', env)
pg_log_path = os.path.join(test_db_directory, 'logfile')
try:
run('%s start -w --log %s' % (PG_CTL, pg_log_path), 'Starting test server', env)
except subprocess.CalledProcessError:
print termcolor.colorize(open(pg_log_path).read(), termcolor.c.RED)
raise
for db_name, db_queries in INIT_DB_SQL:
for db_query in db_queries:
run('psql %s -c "%s"' % (db_name, db_query), 'Creating template database', env)
test_template_db_url = 'postgresql://127.0.0.1:%s/%s' % (env['PGPORT'], TEST_TEMPLATE_DB_NAME)
postgres_db_url = 'postgresql://127.0.0.1:%s/postgres' % (env['PGPORT'])
...
これには多くの追加コードがありますが、アイデアを得る必要があります。
手動で行う唯一のことは、次のことです。
Sudo chmod 777 /var/run/postgresql
このソリューションにはRAMディスクがありませんが、ユーザースペースでPostgresqlサーバーを起動するためのソリューションのほとんどはここにあります。
これをすべてRAMディスクで実行するには、test_db_directory = 'dev/shm/pgdata/'
を作成します
pg_createcluster
は、事前定義された特権のある場所に構成ファイルを配置することを要求します。これを回避するには、initdb
を直接呼び出します。
/usr/lib/postgresql/9.3/bin/initdb /dev/shm/tests/pgsql/data
もちろん、パスワードを必要としないようにSudo
を構成することもできますが、それは実際には別の質問であり、すでに多くの回答があります。