安装 Mac 版本的 PostgreSQL 完整指南
在 Mac 上安装 PostgreSQL 的两种主要方法,以及数据库管理客户端。
本篇教程详细讲解了在 Mac 上安装 PostgreSQL 的两种主要方法,还介绍了 Mac 上优秀的数据库管理客户端,以及数据库安全相关的关键考虑因素和建议。
PostgreSQL 数据库安装
PostgreSQL 是一个强大的开源对象关系数据库系统,以下是在 Mac 上安装和部署 PostgreSQL 的逐步教程。
通过图形化安装
Postgres.app
是一个非常易于使用的 macOS 应用程序,安装之后可以非常方便的管理 PostgreSQL 服务:
- 打开应用程序, PostgreSQL 服务器准备就绪并等待新连接。
- 关闭应用程序, PostgreSQL 服务器就会关闭。
默认情况下, Postgres 应用程度在运行时,会在状态栏中显示。
下载地址: https://postgresapp.com/downloads.html
安装完成之后,打开 Postgres.app ,然后点击初始化,会自动创建用户和数据库:
通过命令行安装
如果你已经安装了 Homebrew ,可以直接通过以下命令来快速安装 PostgreSQL:
brew install postgresql
安装完成后,你可以使用以下命令来启动 PostgreSQL 服务:
brew services start postgresql
PostgreSQL 数据库配置
允许来自远程的连接
PostgreSQL 默认只允许本地连接,如果要开发远程连接,需要修改 postgresql.conf 文件:
- listen_address – 设置在哪个接口监听
listen_addresses = 'localhost,0.0.0.0' # what IP address(es) to listen on;
注意:listen_addresses
参数是指你的 PostgreSQL 数据库服务应该监听在哪个/哪些网络接口,而不是远程主机 IP 。
- pg_hba.conf – 设置允许那些 IP 地址连接
host all all 192.168.2.0/24 md5
Mac 上的数据库管理工具
Mac 上有多种优秀的 PostgreSQL 管理工具,可以为开发者和数据库管理员提供了强大的功能来管理和查询数据库。
工具名 | 描述 | 特色 |
---|---|---|
pgAdmin | 免费的 PostgreSQL 管理工具 | 用户友好的界面,支持所有 PostgreSQL 特性 |
Postico | 专为 Mac 设计的 PostgreSQL 客户端 | 简洁、直观的界面和功能强大的 SQL 编辑器 |
DataGrip | 由 JetBrains 公司开发的多数据库 IDE | 智能代码补全、内联错误检测和数据库架构可视化 |
Navicat for PostgreSQL | 多数据库的图形化界面管理工具 | 数据迁移、备份、数据同步和查询构建 |
DBeaver | 开源的多平台数据库工具 | SQL 查询编辑、数据浏览和 ER 图 |
SQLPro for Postgres | 专为 Mac 设计的轻量级 PostgreSQL 管理工具 | 现代化的界面和高效的性能 |
DataGrip (我的选择)
由 JetBrains 公司开发,这是一个多数据库的 IDE , UI 界面设计上和 JetBrains 的其他 IDE 一脉相承,例如 PyCharm 、 WebStorm 。
另外,还提供智能代码补全、内联错误检测和数据库架构的可视化功能,如果你是 JetBrains IDE 的使用者,它是最推荐的数据库管理工具。
数据库安全
如何使用 Postgres 的日志审计功能?
TODO
如何设置为仅局域网连接/特定 IP 连接?
TODO
如何将密码保存到环境变量以避免硬编码
硬编码是指在代码中直接使用固定的、文字形式的数据值或参数,而不是将其设为可配置或从外部源(如配置文件、环境变量或数据库)获取。
硬编码可能会引发多种问题,以下是其中的一些:
- 可维护性降低:当需要改变某个硬编码的值时,可能需要在多处代码中进行更改,这可能会导致错误,也使代码的维护变得更加困难。
- 缺乏灵活性:因为硬编码的值是固定的,所以当环境或需求发生变化时,可能需要修改和重新编译代码。
- 安全风险:硬编码敏感信息,如密码或 API 密钥,会增加安全风险。如果代码被泄露或公开,这些敏感信息也可能被暴露。
- 重用性问题:硬编码的代码通常很难在其他项目或环境中重用,因为固定的值可能不适用于其他上下文。
- 多环境支持困难:对于需要在多个环境(如开发、测试和生产环境)运行的应用程序,硬编码会导致每个环境都需要修改代码。
- 国际化与本地化困难:硬编码的文本字符串可能会使应用程序的国际化和本地化变得困难。
为了避免这些问题,开发者通常会使用配置文件、环境变量、外部数据源或其他方法来动态地为代码提供必要的值或参数。
在 fish 设置环境变量
配置文件:
~/.config/fish/config.fish
设置环境变量:
set -x POSTGRES_DB_USER "postgres"
set -x POSTGRES_DB_PASSWORD "xxx"
set -x POSTGRES_DB_HOST "localhost"
set -x POSTGRES_DB_NAME "shenbi
使环境变量生效:
source ~/.config/fish/config.fish
在 Python 中使用环境变量:
import os
db_user = os.getenv("POSTGRES_DB_USER")
db_password = os.getenv("POSTGRES_DB_PASSWORD")
db_host = os.getenv("POSTGRES_DB_HOST")
db_name = os.getenv("POSTGRES_DB_NAME")
SQLALCHEMY_DATABASE_URL = f"postgresql://{db_user}:{db_password}@{db_host}/{db_name}"
数据库备份
pg_dumpall 备份所有数据库
pg_dumpall 是 PostgreSQL 自带的工具,它会创建一个全面的备份。可以通过它方便地迁移整个 PostgreSQL 数据库集群,包括所有数据库、角色和权限设置。这在系统迁移或灾难恢复场景中非常有用。
它备份以下内容:
- 所有数据库:它会备份 PostgreSQL 实例(也称为“集群”)中的所有数据库。
- 角色和权限:所有的数据库用户(也称为角色)和他们的权限设置也会被备份。
- 表结构和数据:所有数据库中的所有表的结构和数据。
- 存储过程、函数和触发器:任何自定义的存储过程、函数和触发器也会被备份。
- 数据库模式:包括用于组织表和其他数据库对象的模式。
- 数据库配置和设置:一些全局设置和数据库级别的配置也可能被备份,但这取决于你是否选择了备份全局对象的选项。
- 扩展和数据类型:自定义数据类型和扩展也会被备份。
- 视图和物化视图:包括用于查询的视图和物化视图。
- 序列值:用于自动编号的序列的当前值。
- 约束和索引:包括主键、外键、唯一约束和其他类型的索引。
- 其他数据库对象:如规则、运算符等。
基本命令结构如下:
pg_dumpall -U [username] -h [hostname] > [output_file]
例如,我可以这样导出我的所有数据库文件:
pg_dumpall -U postgres -h localhost > ~/database-backup/postgres_all_database_backup.sql
使用 Github 保存备份文件
你也可以在 Github 上创建一个私人仓库,来备份你的数据库文件。
使用 cron 实现自动定期备份
在 macOS 上,你可以使用 launchd
来设置定期任务。以下是创建一个自动备份和提交到 GitHub 的步骤:
步骤 1: 创建脚本
首先,创建一个 shell 脚本来运行 pg_dumpall
和提交备份到 GitHub 。
保存这个脚本到某个位置, 推荐直接保存在 Github 的备份项目中,例如 ~/database-backup/backup_and_push.sh
。
#!/bin/bash
# 设置代理,如果你无需代理,则删除这部分
export http_proxy=http://127.0.0.1:7890
export https_proxy=http://127.0.0.1:7890
# PostgreSQL 备份
pg_dumpall -U postgres -h localhost > ~/database-backup/postgres_macmini_all_databases.sql
# 切换到备份目录
cd ~/database-backup
# Git 操作
git add -A
git commit -m "Database backup"
git push
赋予脚本执行权限:
chmod +x ~/database-backup/backup_and_push.sh
步骤 2: 添加 cron 定时任务
打开终端,输入 crontab -e
,添加一行:
0 0 * * * /bin/bash ~/database-backup/backup_and_push.sh
- 解释:每天凌晨执行一次该脚本。
使用 crontab -l
可以查看当前用户的所有 cron
任务,确认你刚才添加的任务已经在列表中。
重启电脑后 cron 任务会失效吗?
cron
任务是持久的,所以重启电脑不会失效。