PostgreSQL设置PGDATA变量

4

服务器:Ubuntu服务器14 LTS + PostgreSQL 9.2 我想使用drbd创建集群数据库,但是我无法在未初始化集群的情况下设置PGDATA。我只需要告诉pgsql使用来自drbd磁盘的数据即可。我该如何做?

示例1:

mkdir /cluster/var/lib/pgsql -p
chown postgres:postgres /cluster/var/lib/pgsql -R
cp -R /var/lib/pgsql /cluster/var/lib/pgsql

edit /etc/init.d/postgresql :
 PGDATA=/cluster/var/lib/pgsql/data
...
PGLOG=/cluster/var/lib/pgsql/pgstartup.log

/etc/init.d/postgresql start

在postgresql 8.3中可以工作,但在9.2中我无法更改/etc/init.d/postgresql中的pgdata,我需要找到另一个文件并设置pgdata,但是,令人惊讶的是,它没有起作用。
例如2: PGDATA - 指定存储数据库集群的目录;可以使用-D选项覆盖。
好的,让我们开始: --pgdata=directory 是的,它有效了!但现在我们有了postgresql-xc和错误,如“postgresql不认识这个用户-postgresql”。 drbd开始复制集群中的数据,但postgresql也启动了它。
更新1:
root: initdb --pgdata=/home/username/dir
~initdb not install~bla-bla-bla~use apt-get install postgres-xc

UPD2: 更新2:
$: /usr/lib/postgresql/9.3/bin/initdb --pgdata=/whateveryouwant

#now you can run postgresql only one way:

$: /usr/lib/postgresql/9.3/bin/postgres -D /see_up

#then:

LOG:  database system was shut down at 2014-09-26 15:56:33 YEKT   
LOG:  database system is ready to accept connections    
LOG:  autovacuum launcher started

#aaaaaaaaaaand...nothing. just empty console, ^C stopping postgres    
#another SSH connect:

$: ps-ela

S  1000  5995  5217  0  80   0 - 62202 poll_s pts/0    00:00:00 postgres    
1 S  1000  5997  5995  0  80   0 - 62202 poll_s ?        00:00:00 postgres    
1 S  1000  5998  5995  0  80   0 - 62202 poll_s ?        00:00:00 postgres    
1 S  1000  5999  5995  0  80   0 - 62202 poll_s ?        00:00:00 postgres    
1 S  1000  6000  5995  0  80   0 - 62415 poll_s ?        00:00:00 postgres    
1 S  1000  6001  5995  0  80   0 - 26121 poll_s ?        00:00:00 postgres

#is it ok? because...

$: /etc/init.d/postgresql status    
9.3/main (port 5432): down

1
i can't set PGDATA without cluster initialization”这句话没有意义。PGDATA是一个环境变量,不需要任何东西来设置它。只需在您的.profile文件中定义它或通过set命令设置即可。 - user330315
在psql 9.2中,您只能使用initdb设置pgdata,之后pgsql将由postgresql-xc控制。如果您想使用文本编辑器设置pgdata,则什么也得不到... - user4074041
再次强调:PGDATA是一个环境变量。除非你不是指PGDATA而是实际的数据目录。这两个东西是不同的(变量PGDATA通常指向Postgres应该使用的数据目录)。另外,如果你正在使用Postgres-XC,你应该从一开始就提到它。Postgres-XC和PostgreSQL是两个不同的东西。 - user330315
我添加了一个例子...是的,我理解了pgdata变量的含义。但它对我没有用。当我使用--pgdata=directory时,我无法从psql中获取任何数据。 - user4074041
在两个正在运行的PostgreSQL实例之间使用挂载在drbd上的文件系统共享PostgreSQL数据目录,这将保证导致严重的数据损坏。即使它是一个集群文件系统,这也是正确的,因为PostgreSQL本身要求只有一个PostgreSQL实例可以同时访问数据目录。不要这样做。如果你尝试这样做,你将完全摧毁你的数据库。 - Craig Ringer
1
你一直在提到postgres-xc。它是PostgreSQL还是postgres-xc?它们不是同一件事。 - Craig Ringer
2个回答

6
使用Ubuntu,若要为PostgreSQL实例指定特定的数据目录,只需执行以下操作:
# pg_createcluster --datadir=/path/to/the/directory 9.3 nameofcluster

您无需在任何地方操作或操纵$PGDATA。请参阅pg_createcluster手册。

如果使用drdb复制集群中的数据目录,请记住,在PostgreSQL术语中,术语cluster具有不同的意义:它始终是数据库集群,这意味着特定PostgreSQL实例的所有由其唯一数据目录服务的数据库。这与drdb集群不同,后者是机器集群。

PostgreSQL集群的数据目录根本不能共享,也就是说只有单个机器上运行的一个特定PostgreSQL实例可以写入它,否则将导致损坏。

如果drdb配置符合此要求,则可以使用它,否则不行。您可能还会问为什么首先要使用drdb,而PostgreSQL自8.3版本以来就具有内置的复制选项,这些选项比纯磁盘复制更专业化,更适合于数据库。


4
请将以下内容放入您的~/.bashrc文件中。
PATH=$PATH:/usr/lib/postgresql/<PostgresVersionNumber>/bin
export PATH
export PGDATA="$HOME/<FolderNameForPostgresDatabases>"

请将“PostgresVersionNumber”替换为您安装的Postgres版本号。 请将“FolderNameForPostgresDatabases”替换为您想要存储Postgres数据库的文件夹名称。确保该文件夹已创建。
从终端中,你需要导航到 ~/FolderNameForPostgresDatabases, 然后运行:
initdb

在尝试运行之前,请执行以下操作:
pg_ctl start

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