在Mac OSX上通过Homebrew安装PostgreSQL
最近玩一个 Rails 项目,项目中使用了 PostgreSQL 数据库,正好借此也了解一下 PostgreSQL 。
对于 Ubuntu 系统,阮一峰老师的文章已经非常详细地介绍了关于 PostgreSQL 的安装使用。但是,在 Mac 上有些细节却不是很适用。在上网找资料的时候,各种资料也是零零碎碎,查找起来极不方便。正好整理成文,分享出来,方便自己,也方便需要的朋友参考。
坑已经挖好。听口令:预备,跳……
Homebrew 安装
工欲善其事,必先利其器。D瓜哥准备用 Homebrew 安装 PostgreSQL。所以,我们先来介绍一下 Homebrew 。Homebrew 可以说是 Mac 上居家旅行之必备神器!上可以装软件,下可以一键更新,实乃方便至极!
这样的神器,安装也非常简单,这么娇艳欲滴,实在让人爱不释手啊:
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
其实,本来不想加上 Homebrew 的安装了。但是,Homebrew 实在太爽了,不介绍介绍实在是不足以表达D瓜哥对她的喜爱啊!
PostgreSQL 安装
在上一节中,D瓜哥介绍了一下 Homebrew 的安装。在 Homebrew 的基础之上,PostgreSQL 的安装就非常简单方便了。如下:
- 升级一下 Homebrew :
brew update
- 安装 PostgreSQL:
brew install postgresql
OK,到这里,安装完成。当然了,如果仅此而已,那么这篇文章就成一堆废话了!继续……
创建数据库集簇
第一在 Mac 上安装 PostgreSQL 的话,需要先创建一个数据库簇。命令如下:
initdb `brew --prefix`/var/postgres -E utf8
initdb
命令创建一个 PostgreSQL 数据库簇。一个数据库簇就是被一个数据库实例管理的数据库集合。
创建数据库簇包括创建数据库数据存放的目录、生成共享目录表(shared catalog table)(这些表属于整个数据库簇,而不是特定的某些表)、创建template1
和postgres
数据库。
这里解释一下“数据库簇”的翻译。其实,数据库簇的英文是:database cluster
。单词cluster
更常见的翻译是“集群”,但是翻译成“集群”明显不合适,而且还容易产生歧义。所以,D瓜哥斗胆翻译成“数据库簇”。
数据库的启动和关闭
创建好数据库簇后就可以启动数据库了,启动方法如下:
postgres -D /usr/local/var/postgres
但是,以这种方式启动的数据库不能在后台运行,即使使用常见的如下方式来启动也不行:
postgres -D /usr/local/var/postgres & 1>/dev/null 2>&1
这种方式也能启动。但是,启动后,终端中并没有自动进入后台运行,按下Ctrl + C
后终端退出,PostgreSQL 才进入后台运行。
另外,这种方式启动后,先退出,只能通过杀进程的方式来退出。命令如下:
killall postgres
lunchy
Mac OS X 中,通过 launchctl 来管理后台运行进程。如果管理 PostgreSQL 需要如下几个命令:
ln -sfv /usr/local/opt/postgresql/*.plist ~/Library/LaunchAgents launchctl load ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
卧槽,这么长的命令,还让不让人愉快地玩耍了?
那么有没有更方便优雅地解决方案呢?
聪明的 Rubyist 们给出了肯定答案。在这里多提一句:Homebrew 也是 Rubyist 搞出来的!
Rubyist 给出的答案是: lunchy。这是一个 Ruby gem 。我们需要先安装它。(这里假设大家电脑上已经有 Ruby 安装环境。)
gem install lunchy
安装过之后,上面的命令就可以简化到下面这样:
# 只需要执行一次 ln -sfv /usr/local/opt/postgresql/*.plist ~/Library/LaunchAgents # 以后启动 PostgreSQL,只需要执行下面这个命令: lunchy start postgres # 关闭 PostgreSQL,也只需要执行如下命令: lunchy stop postgres
实在是方便之极啊!关于lunchy ,更多的命令还有:
# 显示所有服务 ls [-l] [pattern] # ls的别名 list [-l] [pattern] # 启动服务 start [-wF] [pattern] # 停止服务 stop [-w] [pattern] # 重启服务 restart [pattern] # 显示服务运行的PID和服务代理名称(plist名称) status [pattern] # 安装plist file到~/Library/LaunchAgents或者/Library/LaunchAgents(取决于你加不加sudu) install [-s] [file] # 从~/Library/LaunchAgents or /Library/LaunchAgents(同上)卸载服务 uninstall [name] # 显示服务的plist内容 show [pattern] # 使用默认编辑器编辑plist内容 edit [pattern] 可选参数: -w #will persist the start/stop command so the agent will load on startup or never load, respectively.(官方的解释,没能理解,反正我没试出来区别) -l #显示launchctl daemon files的绝对路径
创建账号、数据库并授权
使用lunchy启动 PostgreSQL,然后我们开始添加账号,创建数据库等等。
使用psql命令登录PostgreSQL控制台。
psql
这条命令相当于 Mac 系统当前用户以同名数据库用户的身份,登录数据库,这是不用输入密码的。如果一切正常,系统提示符会变为”postgres=#”,表示这时已经进入了数据库控制台。以下的命令都在控制台内完成。
-
使用
\password
命令,为postgres
用户设置一个密码。\password postgres
-
创建数据库用户
dbuser
,并设置密码。CREATE USER dbuser WITH PASSWORD 'password';
-
创建用户数据库,这里为
exampledb
,并指定所有者为dbuser
。CREATE DATABASE exampledb OWNER dbuser;
-
将
exampledb
数据库的所有权限都赋予dbuser
,否则dbuser
只能登录控制台,没有任何数据库操作权限。GRANT ALL PRIVILEGES ON DATABASE exampledb to dbuser;
-
这里是备选的。有时,我们需要使用
dbuser
创建数据库,上面的授权只是把某个数据库的权限赋予了dbuser
,但是还是不能进行数据库的创建。所以,再赋予dbuser
创建数据库的权限:ALTER USER dbuser CREATEDB;
-
这里依然是备选。服务器慎用!由于是本地调试学习,所以,难免有些奇葩的需求,给个超级管理员妥妥的:
ALTER USER dbuser SUPERUSER;
-
设置完成就可以退出
\q
这里再送两个比较常用的命令:如何查询数据库当前所有的用户信息
-
这个比较长,标准SQL:
-- 查看数据库当前用户 SELECT u.usename AS "User name", u.usesysid AS "User ID", CASE WHEN u.usesuper AND u.usecreatedb THEN CAST('superuser, create database' AS pg_catalog.text) WHEN u.usesuper THEN CAST('superuser' AS pg_catalog.text) WHEN u.usecreatedb THEN CAST('create database' AS pg_catalog.text) ELSE CAST('' AS pg_catalog.text) END AS "Attributes" FROM pg_catalog.pg_user u ORDER BY 1;
-
简单点:
\du # 需要描述信息的还可以这样: \du+
远程访问
上面数据库用户、数据库、权限等都设置好了。本地连接没有问题了,But远程连接不好使了。这是因为默认的设置是不允许远程访问的,这里我们需要修改一下相关配置:
-
打开相关配置文件:
vim `brew --prefix`/var/postgres/postgresql.conf
-
将文件中的内容做如下修改:
listen_addresses = 'localhost' # what IP address(es) to listen on; # comma-separated list of addresses; # defaults to 'localhost'; use '*' for all # (change requires restart) # 根据上面的提示把 localhost,修改为星号:*。 listen_addresses = '*' # what IP address(es) to listen on; # comma-separated list of addresses; # defaults to 'localhost'; use '*' for all # (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
原文链接:https://wordpress.diguage.com/archives/133.html
版权声明:非特殊声明均为本站原创作品,转载时请注明作者和原文链接。