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
(如果您要为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
但是这会产生这个错误:
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
我收到此错误:
pg_ctl:无法以root身份运行请登录(使用例如“su”)作为 (非特权的)将拥有服务器进程的用户。
这意味着什么?
另一个SO线程说,为了回应这个错误,你应该这样做:
$ sudo -u postgres bash
产生这个输出:
Password:
shell-init: error retrieving current directory: getcwd: cannot access parent directories: Permission denied
bash: /Users/7stud/.bashrc: Permission denied
bash-3.2$
那里的错误是怎么回事?
答案 0 :(得分:12)
遇到并解决的错误列表:
shell-init:检索当前目录时出错:getcwd:无法访问父目录:Permission denied
pg_config错误
未加载库:libpq.5.dylib
fe_sendauth:未提供密码
pg_ctl:未指定数据库目录且环境变量PGDATA未设置
pg_ctl:服务器未关闭
(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
我将文件向下滚动到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>
这样的错误:
~$ sudo su postgres
shell-init: error retrieving current directory: getcwd: cannot access parent directories: Permission denied
是由于你试图在postgres用户没有权限的目录中切换到用户postgres这一事实,据我所知,除了/Library/PostgreSQL/9.2之外的每个目录< / p>
正确切换到postgres用户后:
$ cd /Library/PostgreSQL/9.2
$ sudo su postgres
Password: <normal sudo password>
你得到一个有趣的提示。就我而言,它看起来像这样:
bash-3.2$
如果您发出ls命令:
bash-3.2$ ls
bin installer scripts
data lib share
doc pgAdmin3.app stackbuilder.app
include pg_env.sh uninstall-postgresql.app
你可以推测你在/Library/PostgreSQL/9.2目录中。
当安装完成后,enterpriseDB安装程序会自动为您启动postgres服务器。如果您需要启动服务器,例如你关闭了电脑,看到&#34;你可以从命令行停止或启动服务器&#34;在下面的第5步中。
C)使用pgAdmin3连接服务器:
我花了几个小时试图找出如何启动服务器,只是一般使用postgres没有运气。然后我偶然在dir /Library/PostgreSQL/9.2中看到了一个名为pgAdmin3的东西。我点击了它,打开了一个带有几个窗格的窗口。
在pgAdmin3窗口的左侧窗格中,显示:
Server Groups
--Servers(1)
----PostgresSQL 9.2 (localhost:5432)
我点击了PostgreSQL 9.2(localhost:5432)&#39;突出显示它,然后我右键单击以显示一个菜单,然后我选择了Connect。出现提示时,我输入了数据库超级用户密码。
D)设置rails以使用PostgreSQL:
然后我按照本教程中的说明进行导轨设置:
如下:
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$
这会创建一个没有密码的新用户。
接下来,在pgAdmin3中,如果单击:
---Login Roles(1)
突出显示它,然后单击图标&#34;刷新所选对象&#34;在窗口顶部,您将看到显示新用户。
createuser的postgres文档在这里:
http://www.postgresql.org/docs/9.2/interactive/app-createuser.html
还有一个dropuser命令:
bash-3.2$ dropuser 7stud
2)然后添加&#39;&#39; gem到您的Gemfile ,并注释掉sqlite gems。
3)然后尝试使用Bundler安装pg gem:
rails_projects/sample_app/$ bundle install --without production
当我尝试这个时,我得到了一个&#39; pg_config&#39;错误。为了解决这个错误,我遵循了这里的建议:
http://excid3.com/blog/installing-postgresql-and-pg-gem-on-mac-osx/#.UftQUOB6gy6
并将/Library/PostgreSQL/9.2添加到我的PATH中(我在.bashrc中执行所有PATH操作。)。不要忘记来源&#39; .bashrc或退出终端并重新启动终端以使新PATH生效。
然后我能够安装pg gem而不会出错:
rails_projects/sample_app/$ bundle install --without production
rails_projects/sample_app/$ bundle update
rails_projects/sample_app/$ bundle install
(我真的不明白为什么你必须完成所有这三个命令,但这就是railstutorial所做的。)
4)接下来更改config / database.yml文件。
对于每个部分:测试,开发和生产改变了适配器&#39;和&#39;数据库&#39;行,并添加一个&#39;编码&#39;线,例如:
development:
adapter: postgresql
database: ArbitaryDatabaseName (e.g. sampleapp_dev)
encoding: utf8
pool: 5
timeout: 5000
确保所有三个数据库行都指定了不同的名称。
5)然后尝试创建数据库:
rails_projects/sample_app/$ bundle exec rake db:create:all
当我尝试这个时,我收到了错误:
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
库libpq.5.dylib位于
/Library/PostgreSQL/9.2/lib
使用此处的建议:
https://github.com/PostgresApp/PostgresApp/issues/109
我通过将以下内容添加到我的.bashrc文件中解决了这个错误(或者你可以把它放在.bash_profile中):
export DYLD_FALLBACK_LIBRARY_PATH="/Library/PostgreSQL/9.2/lib:$DYLD_LIBRARY_PATH"
(请记住&#39; source&#39; .bashrc或退出终端并启动新的终端窗口。)
然后我尝试再次创建数据库:
rails_projects/sample_app/$ bundle exec rake db:create:all
fe_sendauth: no password supplied …
要解决该爆破错误,您需要更改目录中的pg_hba.conf文件
/Library/PostgreSQL/9.2/data
您无法使用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)
在.conf文件中,您需要更改&#39; md5&#39;信任&#39;:
# 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
访问METHOD&#39; md5&#39;表示数据库期望指定数据库用户的加密密码。但是,当您创建新用户时,您创建了它而没有密码。访问METHOD&#39;信任&#39;表示数据库不需要密码。
然后我尝试再次创建数据库:
rails_projects/sample_app/$ bundle exec rake db:create:all
fe_sendauth: no password supplied …
为了让服务器读取我在.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.
但显然那不起作用。断开连接并重新连接到服务器不会导致服务器重新加载.conf文件。要让服务器重新加载.conf文件,请在pgAdmin3中右键单击PostgresSQL 9.2 (localhost:5432)
并选择:
Reload configuration
或者您可以从命令行停止然后启动服务器:
(注意以下命令假设您已经切换到postgres用户,请参阅&#34;安装和使用PostgreSQL&#34;上面。)
bash-3.2$ cd /Library/PostgreSQL/9.2/
bash-3.2$ pg_ctl stop (First disconnect from the server in pgAdmin3)
然而,这产生了错误:
pg_ctl: no database directory specified and environment variable PGDATA unset
Try "pg_ctl --help" for more information.
我解决了这样的错误:
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
如果您未先在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$
后来,当我打开rails控制台时,我无法关闭服务器。我使用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
我猜这意味着db已经创建了。如果您查看pgAdmin3,您应该能够看到三个新数据库(尽管它们上面有红色的x)。如果您看不到它们,请右键单击Databases目录(在pgAdmin3中)并选择Refresh。
编辑:我后来遇到了一些问题。要完全测试事情是否正常,请参见此处:
How do I get my rails app to use my postgresql db?
6)Guard / Spork
当我开始使用Guard / Spork组合时:
~/rails_projects/sample_app4_0$ bundle exec guard
我收到了这个错误:
...
...
Preloading Rails environment
Loading Spork.prefork block...
FATAL: the database system is shutting down
(PG::Error)
我通过启动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。