initlocation 在 postgresql 中不起作用

Posted

技术标签:

【中文标题】initlocation 在 postgresql 中不起作用【英文标题】:initlocation not working in postgresql 【发布时间】:2014-09-09 15:18:53 【问题描述】:

我在 RHEL 6.5 机器上使用 postgresql 9.2,并且想在一个非标准位置设置一个数据库,因为它正在填充根分区。说明告诉我从命令行使用 initlocation 命令,但在使用它时出现错误“找不到命令”。我已经搜索过它,以防它是一个 shell 脚本,但在任何地方都找不到它。 如何运行此命令?感谢您的帮助。

【问题讨论】:

您是要安装 postgres 安装以使数据文件位于不同的目录中,还是要修改现有安装,将单个数据库放置在不同的目录中? 说明链接? @greg 我有一个现有的安装,默认情况下将数据文件放入根分区,并且想修改这个现有的安装以创建一个新的数据库,其中数据文件存储在我的家庭区域中。我也想将未来的数据文件放入我的家庭区域,因为它要大得多。 @Mike Sherrill '猫召回'postgresql.org/docs/7.4/static/manage-ag-alternate-locs.html 【参考方案1】:

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

首先,免责声明,我以前没有这样做过,但是,我在我的家用电脑上安装了 9.4b2,我确实完成了这些步骤来验证它似乎工作:-)

@Mike Sherrill 'Cat Recall' 对数据库存储有很好的描述 (Where does PostgreSQL store the database?)。我不认为它专门回答了你的问题,但它确实包含了解决问题所需的所有信息。

在您的情况下,您将需要使用表空间。首先,在 postgres 安装中创建一个新的表空间。我将以我的机器为例。我要做的第一件事是确定新数据库将驻留的位置。目录名,必须为空。对我来说,我将使用 shell 命令在我的主目录中创建一个空目录(我必须以 root 用户身份进行):

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

一旦创建,它就可以用于各种不同的对象。在您的情况下,createdb 可以从命令行或 postgres psql 提示符完成。我将在该表空间中创建一个测试数据库:

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 数据库中创建的任何内容都将进入新目录,除非您覆盖它的创建。有一个 default_tablespace 变量。只要为空,默认就是把对象放到当前数据库中。另一个设置 temp_tablespace 也是如此。两者的默认值都是空白,表示当前数据库。

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

-g

【讨论】:

我没想到最后一点(旧数据库的新位置的新对象)是可能的。那就更好了。我试试看【参考方案2】:

试试这个。


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

【讨论】:

以上是关于initlocation 在 postgresql 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

org.postgresql.util.PGobject 在 org.postgresql 中不可用

Postgresql 9.2 错误与 group by 未出现在 postgresql 12 中

在 postgreSQL 9.2 上编辑 postgresql.conf 文件?

【PostgreSQL】在 Linux 下操作 PostgreSQL 的指令

如何解决这个问题 - 无法在 org.postgresql:postgresql:jar:42.2.4 收集依赖项

prometheus使用postgresql-adapter连接postgresql