首页 > 挨踢(IT), 数据库 > 在Mac OSX上通过Homebrew安装PostgreSQL

在Mac OSX上通过Homebrew安装PostgreSQL

2015年9月22日 发表评论 阅读评论 1,467 人阅读    

最近玩一个 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 的安装就非常简单方便了。如下:

  1. 升级一下 Homebrew :
    brew update
    
  2. 安装 PostgreSQL:
    brew install postgresql
    

OK,到这里,安装完成。当然了,如果仅此而已,那么这篇文章就成一堆废话了!继续……

创建数据库集簇

第一在 Mac 上安装 PostgreSQL 的话,需要先创建一个数据库簇。命令如下:

initdb `brew --prefix`/var/postgres -E utf8

initdb 命令创建一个 PostgreSQL 数据库簇。一个数据库簇就是被一个数据库实例管理的数据库集合。
创建数据库簇包括创建数据库数据存放的目录、生成共享目录表(shared catalog table)(这些表属于整个数据库簇,而不是特定的某些表)、创建template1postgres数据库。

这里解释一下“数据库簇”的翻译。其实,数据库簇的英文是: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=#”,表示这时已经进入了数据库控制台。以下的命令都在控制台内完成。

  1. 使用\password命令,为postgres用户设置一个密码。

    \password postgres
    
  2. 创建数据库用户dbuser,并设置密码。

    CREATE USER dbuser WITH PASSWORD 'password';
    
  3. 创建用户数据库,这里为exampledb,并指定所有者为dbuser

    CREATE DATABASE exampledb OWNER dbuser;
    
  4. exampledb数据库的所有权限都赋予dbuser,否则dbuser只能登录控制台,没有任何数据库操作权限。

    GRANT ALL PRIVILEGES ON DATABASE exampledb to dbuser;
    
  5. 这里是备选的。有时,我们需要使用dbuser创建数据库,上面的授权只是把某个数据库的权限赋予了dbuser,但是还是不能进行数据库的创建。所以,再赋予dbuser创建数据库的权限:

    ALTER USER dbuser CREATEDB;
    
  6. 这里依然是备选。服务器慎用!由于是本地调试学习,所以,难免有些奇葩的需求,给个超级管理员妥妥的:

    ALTER USER dbuser SUPERUSER;
    
  7. 设置完成就可以退出

    \q
    

这里再送两个比较常用的命令:如何查询数据库当前所有的用户信息

  1. 这个比较长,标准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;
    
  2. 简单点:

    \du
    
    # 需要描述信息的还可以这样:
    \du+
    

远程访问

上面数据库用户、数据库、权限等都设置好了。本地连接没有问题了,But远程连接不好使了。这是因为默认的设置是不允许远程访问的,这里我们需要修改一下相关配置:

  1. 打开相关配置文件:

    vim  `brew --prefix`/var/postgres/postgresql.conf
    
  2. 将文件中的内容做如下修改:

    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)
    
  3. 最后重启数据库就OK了。

参考资料

  1. PostgreSQL新手入门 – 阮一峰的网络日志
  2. How to install PostgreSQL on a Mac with Homebrew and Lunchy – Moncef Belyamani
  3. osx – How to start postgreSQL server on mac os x? – Stack Overflow
  4. PostgreSQL: Documentation: 9.4: ALTER USER
  5. Homebrew — OS X 不可或缺的套件管理器
  6. MacOS启动服务分析以及更加优雅的服务管理方案(launchd tuning) – Jack’s Blog
  7. PostgreSQL: Documentation: 9.0: GRANT
  8. Re: How to list user accounts?
  9. postgresql – How do I list all databases and tables using psql? – Database Administrators Stack Exchange


作 者: D瓜哥,https://www.diguage.com/
原文链接:https://wordpress.diguage.com/archives/133.html
版权声明:非特殊声明均为本站原创作品,转载时请注明作者和原文链接。

分类: 挨踢(IT), 数据库 标签:
  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.