PostgreSQL中的initlocation无法正常工作

3

我正在一台运行 RHEL 6.5 的机器上使用 postgresql 9.2,并希望在非标准位置上设置数据库,因为它正在填满根分区。指南告诉我要使用命令行中的 initlocation 命令,但是当我使用它时会出现“命令未找到”的错误。我已经搜索过它,以防它是一个 shell 脚本,但无处可寻。 如何运行此命令?感谢任何帮助。


您想安装Postgres并将数据文件放在不同的目录中,还是想修改现有的安装并将单个数据库放在不同的目录中? - Greg
链接到说明文档? - Mike Sherrill 'Cat Recall'
@greg 我有一个现有的安装程序,它默认将数据文件放在根分区中,我想修改这个现有的安装程序,创建一个新的数据库,其中数据文件存储在我的主目录中。我也想将未来的数据文件放在我的主目录中,因为它更大。 - andrewp
迈克·谢里尔的“Cat Recall”http://www.postgresql.org/docs/7.4/static/manage-ag-alternate-locs.html - andrewp
2个回答

6

好的,所以您想把现有的安装保留在原地,并在一个具有更多空间的目录中创建一个新的数据库。

首先,免责声明,我之前没有完全做过这个,但是,我在家里的电脑上有一个9.4b2的安装,我确实走过了这些步骤,以验证它似乎可以正常工作 :-)

@Mike Sherrill 'Cat Recall'在数据库存储方面写了一篇相当不错的文章(PostgreSQL数据库存储在哪里?)。我不认为它特别回答了您的问题,但它确实包含了解决问题所需的所有信息。

对于您的情况,您需要使用表空间。首先,在postgres安装中创建一个新的表空间。我将使用我的机器作为示例。我会首先确定新数据库将存放在哪里。一个目录名称,它必须为空。对于我来说,我将在我的主目录下创建一个空目录(我必须以root用户身份执行)并使用shell命令:

mkdir /home/gfausak/pg_tablespace
chown postgres /home/gfausak/pg_tablespace
chgrp postgres /home/gfausak/pg_tablespace
chmod 700 /home/gfausak/pg_tablespace

然后我使用postgres用户登录到psql。如下:

psql -Upostgres

您的咒语可能不同。当您到达提示符时,请通过以下方式验证当前数据库位置:

postgres=# show data_directory;
    data_directory 
-----------------------
 /var/local/pgsql/data
(1 row)

现在,创建您的新表空间。
postgres=# create tablespace newspace location '/home/gfausak/pg_tablespace';
CREATE TABLESPACE

这个命令的文档可以在这里查看:http://www.postgresql.org/docs/9.2/static/manage-ag-tablespaces.html 一旦创建,它可以用于各种不同的对象。 在您的情况下,可以从命令行或postgres psql提示符中执行createdb。 我将在该表空间中创建一个测试数据库:
postgres=# create database newdb with tablespace = newspace;
CREATE DATABASE

开个玩笑,打开它并创建一个表格:

postgres=# \c newdb
You are now connected to database "newdb" as user "postgres".
newdb=# create table testme (t text);
CREATE TABLE
newdb=# 

如果我返回到我的主目录并查看新创建的目录,我会看到一些Postgres文件:
ls /home/gfausak/pg_tablespace
PG_9.4_201407151

在newdb数据库中创建的所有内容都将进入new目录,除非你覆盖了它的创建。有一个default_tablespace变量。只要它是空的,缺省值就是将对象放在当前数据库中。同样适用于另一个设置temp_tablespace。这两者的默认值都是空的,意味着当前数据库。

你甚至可以通过在创建表时指定tablespace,在新表空间中创建旧数据库中的对象。

-g


我从未想过最后一部分(将新对象放置在旧数据库中的新位置)是可能的。这甚至更好。我会尝试一下。 - andrewp

0

试试这个。


vi /etc/init.d/postgresql-XX 

Change this variable with:
PGDATA=/var/lib/pgsql/$PGMAJORVERSION/data
PGLOG=/var/lib/pgsql/$PGMAJORVERSION/pgstartup.log

on:
PGDATA=/new_pgdata/pgsql/${PGMAJORVERSION}/data
PGLOG=/new_pgdata/pgsql/${PGMAJORVERSION}/pgstartup.log

than:
mkdir -p /new_pgdata/pgsql/XX/data/
chown -R postgres:postgres /pgdata/pgsql

/etc/init.d/postgresql-XX initdb -D /new_pgdata/pgsql/XX/data/

Where XX is equal to 9.2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接