如何在Mac OSX 10.6.8上启动enterpiseDB PostgreSQL?

7st*_*tud 1 railstutorial.org postgresql-9.2 ruby-on-rails-4

Mac OSX 10.6.8

postgres网站称postgres 9.2+与Mac OSX 10.6+兼容,所以我在这里下载了Mac OSX的9.2.4版安装程序:

http://www.enterprisedb.com/products-services-training/pgdownload

我接受了所有默认值,因此postgres安装在目录中:

/Library/PostgreSQL/9.2
Run Code Online (Sandbox Code Playgroud)

(如果要为rails开发安装postgres,为了安装pg gem,需要添加到PATH:http://excid3.com/blog/installing-postgresql-and-pg-gem-on-mac-osx /#.UfkImuB6gy5)

现在,我想弄清楚如何使用postgres.我找到了一个stackoverflow线程,说你可以用这个命令启动postgres:

~$ /Library/PostgreSQL/9.2/bin/pg_ctl start -D /Library/PostgreSQL/9.2/data -l postgres.log
Run Code Online (Sandbox Code Playgroud)

但是这会产生这个错误:

pg_ctl:无法打开PID文件"/Library/PostgreSQL/9.2/data/postmaster.pid":权限被拒绝

如果我用sudo尝试相同的命令:

~$ sudo /Library/PostgreSQL/9.2/bin/pg_ctl start -D /Library/PostgreSQL/9.2/data -l postgres.log
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

pg_ctl:无法以root身份运行请登录(使用,例如,"su")作为将拥有服务器进程的(非特权)用户.

这是什么意思??

另一个SO线程说,为了响应该错误,你应该这样做:

$ sudo -u postgres bash
Run Code Online (Sandbox Code Playgroud)

产生这个输出:

Password:
shell-init: error retrieving current directory: getcwd: cannot access parent directories: Permission denied
bash: /Users/7stud/.bashrc: Permission denied
bash-3.2$ 
Run Code Online (Sandbox Code Playgroud)

那里的错误是怎么回事?

7st*_*tud 12

遇到和解决的错误列表:

  1. shell-init:检索当前目录时出错:getcwd:无法访问父目录:权限被拒绝

  2. pg_config错误

  3. 未加载库:libpq.5.dylib

  4. fe_sendauth:没有提供密码

  5. pg_ctl:未指定数据库目录,并且环境变量PGDATA未设置

  6. pg_ctl:服务器没有关闭

  7. (PG ::错误)

A)预安装:

单击.dmg文件开始安装时,将打开一个对话框窗口,并在安装程序旁边有一个README文件.读那个.我按照规定更改了共享内存:

$ sudo vi /etc/sysctl.conf

On a MacBook Pro with 2GB of RAM, the author's sysctl.conf contains:

kern.sysv.shmmax=1610612736
kern.sysv.shmall=393216
kern.sysv.shmmin=1
kern.sysv.shmmni=32
kern.sysv.shmseg=8
kern.maxprocperuid=512
kern.maxproc=2048
Run Code Online (Sandbox Code Playgroud)

我将文件向下滚动到k,并将每个列出的行更改为指定的值.然后,您需要重新启动计算机.

B)安装和使用PostgreSQL:

然后再次单击.dmg文件,然后单击安装程序并安装postgres.我接受了所有默认值.

据我所知,postgres安装程序只将目录/Library/PostgreSQL/9.2的权限授予名为'postgres'的用户.在postgres安装过程中,安装程序要求输入数据库超级用户的密码,如果你想知道数据库超级用户的名字是什么,那就是'postgres'.

当您发出sudo命令时,您将暂时更改为用户"root".但是,root用户无权访问目录/Library/PostgreSQL/9.2.所以你必须使用su命令(切换用户)来更改为postgres用户.但是为了发出su命令,您需要成为root用户.了解?

因此,无论何时发出postgres命令,您都需要先执行此操作:

$ cd /Library/PostgreSQL/9.2
$ sudo su postgres
Password: <normal sudo password>
Run Code Online (Sandbox Code Playgroud)

像这样的错误:

~$ sudo su postgres
shell-init: error retrieving current directory: getcwd: cannot access parent directories: Permission denied
Run Code Online (Sandbox Code Playgroud)

是因为你试图在postgres用户没有权限的目录中切换到用户postgres这一事实,据我所知,除了/Library/PostgreSQL/9.2之外的每个目录

正确切换到postgres用户后:

$ cd /Library/PostgreSQL/9.2
$ sudo su postgres
Password: <normal sudo password>
Run Code Online (Sandbox Code Playgroud)

你得到一个有趣的提示.就我而言,它看起来像这样:

bash-3.2$ 
Run Code Online (Sandbox Code Playgroud)

如果发出ls命令:

bash-3.2$ ls
bin             installer           scripts
data                lib             share
doc             pgAdmin3.app            stackbuilder.app
include             pg_env.sh           uninstall-postgresql.app
Run Code Online (Sandbox Code Playgroud)

你可以推测你在/Library/PostgreSQL/9.2目录中.

完成安装后,enterpriseDB安装程序会自动为您启动postgres服务器. 如果需要启动服务器,例如关闭计算机,请参阅下面的步骤5中的"您可以从命令行停止或启动服务器".

C)使用pgAdmin3连接到服务器:
我花了好几个小时试图找出如何启动服务器,并且通常只使用postgres而没有运气.然后我偶然在dir /Library/PostgreSQL/9.2中看到了一个名为pgAdmin3的东西.我点击了它,打开了一个带有几个窗格的窗口.

在pgAdmin3窗口的左侧窗格中,它显示:

Server Groups
--Servers(1)
----PostgresSQL 9.2 (localhost:5432)
Run Code Online (Sandbox Code Playgroud)

我点击'PostgreSQL 9.2(localhost:5432)'来突出显示它,然后我右键单击以显示一个菜单,然后我选择了Connect.出现提示时,我输入了数据库超级用户密码.

D)设置rails以使用PostgreSQL:
然后我按照本教程中的指示获取rails设置:

https://pragtob.wordpress.com/2012/09/12/setting-up-postgresql-for-ruby-on-rails-on-linux/#comment-1142

如下:

1)第一步是创建一个新用户.
如果使用与mac用户名相同的名称,则不必在rails应用程序的database.yml文件中添加用户名(或密码):

$ cd /Library/PostgreSQL/9.2
$ sudo su postgres
Password: <normal sudo password>
bash-3.2$ createuser --interactive 7stud
Shall the new role be a superuser? (y/n) n
Shall the new role be allowed to create databases? (y/n) y
Shall the new role be allowed to create more new roles? (y/n) n
Password:<database superuser password>
bash-3.2$
Run Code Online (Sandbox Code Playgroud)

这会创建一个没有密码的新用户.

接下来,在pgAdmin3中,如果单击:

---Login Roles(1)
Run Code Online (Sandbox Code Playgroud)

要突出显示它,然后单击窗口顶部的"刷新所选对象"图标,您将看到显示的新用户.

createuser的postgres文档在这里:

http://www.postgresql.org/docs/9.2/interactive/app-createuser.html

还有一个dropuser命令:

bash-3.2$ dropuser 7stud
Run Code Online (Sandbox Code Playgroud)

2)然后将'pg'gem添加到Gemfile中,并注释掉sqlite gems.

3)然后尝试使用Bundler安装pg gem:

rails_projects/sample_app/$ bundle install --without production
Run Code Online (Sandbox Code Playgroud)

当我尝试这个时,我收到了'pg_config'错误.为了解决这个错误,我按照这里的建议:

http://excid3.com/blog/installing-postgresql-and-pg-gem-on-mac-osx/#.UftQUOB6gy6

并将/Library/PostgreSQL/9.2添加到我的PATH中(我在.bashrc中执行所有PATH操作.).不要忘记'source'.bashrc或退出终端并重新启动终端以使新PATH生效.

然后我能够安装pg gem而不会出错:

rails_projects/sample_app/$ bundle install --without production
rails_projects/sample_app/$ bundle update
rails_projects/sample_app/$ bundle install
Run Code Online (Sandbox Code Playgroud)

(我真的不明白为什么你必须完成所有这三个命令,但那就是railstutorial所做的.)

4)接下来更改config/database.yml文件.
对于每个部分:测试,开发和生产更改"适配器"和"数据库"行,并添加"编码"行,例如:

development:
  adapter: postgresql
  database: ArbitaryDatabaseName (e.g. sampleapp_dev)
  encoding: utf8

  pool: 5
  timeout: 5000
Run Code Online (Sandbox Code Playgroud)

确保所有三个数据库行都指定了不同的名称.

5)然后尝试创建数据库:

rails_projects/sample_app/$ bundle exec rake db:create:all
Run Code Online (Sandbox Code Playgroud)

当我尝试这个时,我得到了错误:

dlopen(/Users/7stud/.rvm/gems/ruby-2.0.0-p247@railstutorial_rails_4_0/gems/pg-0.15.1/lib/pg_ext.bundle, 9): Library not loaded: libpq.5.dylib
Library not loaded: libpq.5.dylib
  Referenced from: /Users/7stud/.rvm/gems/ruby-2.0.0-p247@railstutorial_rails_4_0/gems/pg-0.15.1/lib/pg_ext.bundle
Run Code Online (Sandbox Code Playgroud)

库libpq.5.dylib位于

/Library/PostgreSQL/9.2/lib
Run Code Online (Sandbox Code Playgroud)

使用这里的建议:

https://github.com/PostgresApp/PostgresApp/issues/109

我通过将以下内容添加到我的.bashrc文件中来解决该错误(或者您可以将其放在.bash_profile中):

export DYLD_FALLBACK_LIBRARY_PATH="/Library/PostgreSQL/9.2/lib:$DYLD_LIBRARY_PATH"
Run Code Online (Sandbox Code Playgroud)

(记住'source'.bashrc或退出终端并启动一个新的终端窗口.)

然后我尝试再次创建数据库:

rails_projects/sample_app/$ bundle exec rake db:create:all
fe_sendauth: no password supplied …
Run Code Online (Sandbox Code Playgroud)

要解决该严重错误,您需要更改目录中的pg_hba.conf文件

/Library/PostgreSQL/9.2/data 
Run Code Online (Sandbox Code Playgroud)

你不能使用Finder进入该目录 - 你必须使用postgres用户进入该目录:

$ cd /Library/PostgreSQL/9.2
$ sudo su postgres
Password: <normal sudo password>
bash-3.2$ cd data
bash-3.2$ ls
PG_VERSION  pg_hba.conf pg_notify   pg_subtrans postgresql.conf
base        pg_ident.conf   pg_serial   pg_tblspc   postmaster.opts
global      pg_log      pg_snapshots    pg_twophase postmaster.pid
pg_clog     pg_multixact    pg_stat_tmp pg_xlog

bash-3.2$ mvim pg_hba.conf  
(or instead of mvim open with another text editor, e.g. vim)
Run Code Online (Sandbox Code Playgroud)

在.conf文件中,您需要将"md5"更改为"trust":

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     trust  #md5
# IPv4 local connections:
host    all             all             127.0.0.1/32            trust  #md5
# IPv6 local connections:
host    all             all             ::1/128                 trust  #md5
# Allow replication connections from localhost, by a user with the
# replication privilege.
#local   replication     postgres                                md5
#host    replication     postgres        127.0.0.1/32            md5
#host    replication     postgres        ::1/128                 md5
Run Code Online (Sandbox Code Playgroud)

访问METHOD'md5'表示数据库期望指定数据库用户的加密密码.但是,当您创建新用户时,您创建了它而没有密码.访问METHOD'信任'意味着数据库不期望密码.

然后我尝试再次创建数据库:

rails_projects/sample_app/$ bundle exec rake db:create:all
fe_sendauth: no password supplied …
Run Code Online (Sandbox Code Playgroud)

为了让服务器读取我在.conf文件中所做的更改,我在pgAdmin3中断开了与服务器的连接:

Server Groups
--Servers(1)
----PostgresSQL 9.2 (localhost:5432)

Click on PostgresSQL 9.2 (localhost:5432) to highlight it, 
right click, then select Disconnect,
then right click and select Connect.
Run Code Online (Sandbox Code Playgroud)

但显然那是行不通的.断开连接并重新连接到服务器不会导致服务器重新加载.conf文件.要让服务器重新加载.conf文件,请在pgAdmin3中右键单击PostgresSQL 9.2 (localhost:5432)并选择:

Reload configuration
Run Code Online (Sandbox Code Playgroud)

或者您可以从命令行停止然后启动服务器:(
注意以下命令假设您已经切换到postgres用户,请参阅上面的"安装和使用PostgreSQL".)

bash-3.2$ cd /Library/PostgreSQL/9.2/
bash-3.2$ pg_ctl stop  (First disconnect from the server in pgAdmin3)
Run Code Online (Sandbox Code Playgroud)

但是,这产生了错误:

pg_ctl: no database directory specified and environment variable PGDATA unset
Try "pg_ctl --help" for more information.
Run Code Online (Sandbox Code Playgroud)

我解决了这样的错误:

bash-3.2$ export PGDATA=/Library/PostgreSQL/9.2/data
bash-3.2$ echo $PGDATA 
/Library/PostgreSQL/9.2/data
bash-3.2$ pg_ctl stop  
waiting for server to shut down.... done
server stopped
bash-3.2$ pg_ctl start
server starting
Run Code Online (Sandbox Code Playgroud)

如果您没有先在pgAdmin3中断开与服务器的连接,则会得到输出:

bash-3.2$ pg_ctl stop
waiting for server to shut down............................................................... failed
pg_ctl: server does not shut down
HINT: The "-m fast" option immediately disconnects sessions rather than
waiting for session-initiated disconnection.
bash-3.2$
Run Code Online (Sandbox Code Playgroud)

后来,当我打开rails控制台时,我无法关闭服务器.我使用了一个User添加到数据库中User.create(....),我忘了事先启动postgres,所以我想知道该记录会发生什么.出于某种原因,postgress服务器已经在我的系统上运行(似乎每次启动计算机时都会启动postgress - 在下面解决).接下来,我试图停止服务器,我无法.关闭rails控制台后,服务器停止了.

最后,没有错误:

~/rails_projects/sample_app4_0$ bundle exec rake db:create:all
~/rails_projects/sample_app4_0$ bundle exec rake db:migrate
~/rails_projects/sample_app4_0
Run Code Online (Sandbox Code Playgroud)

我想这意味着db已经创建了.如果您查看pgAdmin3,您应该能够看到三个新数据库(尽管它们上面有红色的x).如果看不到它们,请右键单击Databases目录(在pgAdmin3中)并选择Refresh.

编辑:我后来遇到了一些问题.要完全测试事情是否正常,请参见此处:

如何让我的rails应用程序使用我的postgresql数据库?

6)Guard/Spork
当我启动Guard/Spork组合时:

~/rails_projects/sample_app4_0$ bundle exec guard
Run Code Online (Sandbox Code Playgroud)

我收到了这个错误:

...
...
Preloading Rails environment
Loading Spork.prefork block...
FATAL:  the database system is shutting down
 (PG::Error)
Run Code Online (Sandbox Code Playgroud)

我通过启动postgres服务器,并使用pgAdmin3连接到服务器来修复它.

最后,我想出了每次启动计算机时如何防止postgres服务器启动.我不得不做两个改变:

1)$ sudo vim /Library/LaunchDaemons/com.edb.launchd.postgresql-9.2.plist
替换你的postgres版本代替9.2.

2)找到RunAtLoad行

3)将下一行更改<true/><false/>

https://superuser.com/questions/244589/prevent-postgresql-from-running-at-startup

仅这些步骤对我来说不起作用.然后我发现了这个建议:

4) $ sudo launchctl unload -w /Library/LaunchDaemons/com.edb.launchd.postgresql-9.2.plist

替换你的postgres版本代替9.2.

http://www.postgresql.org/message-id/flat/4B41FD48.7030009@enterprisedb.com#4B41FD48.7030009@enterprisedb.com