最近玩一个 Rails 项目,项目中使用了 PostgreSQL 数据库,正好借此也了解一下 PostgreSQL 。
对于 Ubuntu 系统,阮一峰老师的文章已经非常详细地介绍了关于 PostgreSQL 的安装使用。但是,在 Mac 上有些细节却不是很适用。在上网找资料的时候,各种资料也是零零碎碎,查找起来极不方便。正好整理成文,分享出来,方便自己,也方便需要的朋友参考。
坑已经挖好。听口令:预备,跳……
Homebrew 安装
工欲善其事,必先利其器。D瓜哥准备用 Homebrew 安装 PostgreSQL。所以,我们先来介绍一下 Homebrew 。Homebrew 可以说是 Mac 上居家旅行之必备神器!上可以装软件,下可以一键更新,实乃方便至极!
这样的神器,安装也非常简单,这么娇艳欲滴,实在让人爱不释手啊:
其实,本来不想加上 Homebrew 的安装了。但是,Homebrew 实在太爽了,不介绍介绍实在是不足以表达D瓜哥对她的喜爱啊!
PostgreSQL 安装
在上一节中,D瓜哥介绍了一下 Homebrew 的安装。在 Homebrew 的基础之上,PostgreSQL 的安装就非常简单方便了。如下:
- 升级一下 Homebrew :
- 安装 PostgreSQL:
OK,到这里,安装完成。当然了,如果仅此而已,那么这篇文章就成一堆废话了!继续……
创建数据库集簇
第一在 Mac 上安装 PostgreSQL 的话,需要先创建一个数据库簇。命令如下:
1 | initdb `brew --prefix`/var/postgres -E utf8 |
initdb
命令创建一个 PostgreSQL 数据库簇。一个数据库簇就是被一个数据库实例管理的数据库集合。
创建数据库簇包括创建数据库数据存放的目录、生成共享目录表(shared catalog table)(这些表属于整个数据库簇,而不是特定的某些表)、创建template1
和postgres
数据库。
这里解释一下“数据库簇”的翻译。其实,数据库簇的英文是:database cluster
。单词cluster
更常见的翻译是“集群”,但是翻译成“集群”明显不合适,而且还容易产生歧义。所以,D瓜哥斗胆翻译成“数据库簇”。
数据库的启动和关闭
创建好数据库簇后就可以启动数据库了,启动方法如下:
1 | postgres -D /usr/ local /var/postgres |
但是,以这种方式启动的数据库不能在后台运行,即使使用常见的如下方式来启动也不行:
1 | postgres -D /usr/ local /var/postgres & 1>/dev/null 2>&1 |
这种方式也能启动。但是,启动后,终端中并没有自动进入后台运行,按下Ctrl + C
后终端退出,PostgreSQL 才进入后台运行。
另外,这种方式启动后,先退出,只能通过杀进程的方式来退出。命令如下:
lunchy
Mac OS X 中,通过 launchctl 来管理后台运行进程。如果管理 PostgreSQL 需要如下几个命令:
1 | ln -sfv /usr/ local /opt/postgresql/*.plist ~/Library/LaunchAgents |
2 | launchctl load ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist |
卧槽,这么长的命令,还让不让人愉快地玩耍了?
那么有没有更方便优雅地解决方案呢?
聪明的 Rubyist 们给出了肯定答案。在这里多提一句:Homebrew 也是 Rubyist 搞出来的!
Rubyist 给出的答案是: lunchy。这是一个 Ruby gem 。我们需要先安装它。(这里假设大家电脑上已经有 Ruby 安装环境。)
安装过之后,上面的命令就可以简化到下面这样:
2 | ln -sfv /usr/ local /opt/postgresql/*.plist ~/Library/LaunchAgents |
实在是方便之极啊!关于lunchy ,更多的命令还有:
创建账号、数据库并授权
使用lunchy启动 PostgreSQL,然后我们开始添加账号,创建数据库等等。
使用psql命令登录PostgreSQL控制台。
这条命令相当于 Mac 系统当前用户以同名数据库用户的身份,登录数据库,这是不用输入密码的。如果一切正常,系统提示符会变为”postgres=#”,表示这时已经进入了数据库控制台。以下的命令都在控制台内完成。
-
使用\password
命令,为postgres
用户设置一个密码。
-
创建数据库用户dbuser
,并设置密码。
1 | CREATE USER dbuser WITH PASSWORD 'password' ; |
-
创建用户数据库,这里为exampledb
,并指定所有者为dbuser
。
1 | CREATE DATABASE exampledb OWNER dbuser; |
-
将exampledb
数据库的所有权限都赋予dbuser
,否则dbuser
只能登录控制台,没有任何数据库操作权限。
1 | GRANT ALL PRIVILEGES ON DATABASE exampledb to dbuser; |
-
这里是备选的。有时,我们需要使用dbuser
创建数据库,上面的授权只是把某个数据库的权限赋予了dbuser
,但是还是不能进行数据库的创建。所以,再赋予dbuser
创建数据库的权限:
1 | ALTER USER dbuser CREATEDB; |
-
这里依然是备选。服务器慎用!由于是本地调试学习,所以,难免有些奇葩的需求,给个超级管理员妥妥的:
1 | ALTER USER dbuser SUPERUSER; |
-
设置完成就可以退出
这里再送两个比较常用的命令:如何查询数据库当前所有的用户信息
-
这个比较长,标准SQL:
03 | u.usename AS "User name" , |
04 | u.usesysid AS "User ID" , |
06 | WHEN u.usesuper AND u.usecreatedb |
07 | THEN CAST ( 'superuser, create database' AS pg_catalog.text) |
09 | THEN CAST ( 'superuser' AS pg_catalog.text) |
11 | THEN CAST ( 'create database' AS pg_catalog.text) |
12 | ELSE CAST ( '' AS pg_catalog.text) |
14 | FROM pg_catalog.pg_user u |
-
简单点:
远程访问
上面数据库用户、数据库、权限等都设置好了。本地连接没有问题了,But远程连接不好使了。这是因为默认的设置是不允许远程访问的,这里我们需要修改一下相关配置:
-
打开相关配置文件:
1 | vim `brew --prefix`/var/postgres/postgresql.conf |
-
将文件中的内容做如下修改:
01 | listen_addresses = 'localhost' |
02 | # what IP address(es) to listen on; |
03 | # comma-separated list of addresses; |
04 | # defaults to 'localhost'; use '*' for all |
05 | # (change requires restart) |
07 | # 根据上面的提示把 localhost,修改为星号:*。 |
09 | # what IP address(es) to listen on; |
10 | # comma-separated list of addresses; |
11 | # defaults to 'localhost'; use '*' for all |
12 | # (change requires restart) |
-
最后重启数据库就OK了。
参考资料
- PostgreSQL新手入门 – 阮一峰的网络日志
- How to install PostgreSQL on a Mac with Homebrew and Lunchy – Moncef Belyamani
- osx – How to start postgreSQL server on mac os x? – Stack Overflow
- PostgreSQL: Documentation: 9.4: ALTER USER
- Homebrew — OS X 不可或缺的套件管理器
- MacOS启动服务分析以及更加优雅的服务管理方案(launchd tuning) – Jack’s Blog
- PostgreSQL: Documentation: 9.0: GRANT
- Re: How to list user accounts?
- postgresql – How do I list all databases and tables using psql? – Database Administrators Stack Exchange