apt-get install postgresql
Quick Start
Using
安装后默认在系统里添加了一个 "postgres" 用户(Linux 下安装默认该用户被禁用密码登录;Windows 下安装时会提示设置该用户密码)和一个 "postgres" database。
默认监听端口:127.0.0.1:5432/tcp
创建一个“数据库”使用用户:
# su - postgres
$ createdb mydb
$ psql -s mydb
> create user dbuser password '123456';
> GRANT ALL PRIVILEGES ON DATABASE mydb TO dbuser;
然后即可以使用用户名 "dbuser" 和密码 "123456" 连接 localhost 5432 tcp 端口的 "mydb" PostgreSQL 数据库。
Config
允许 Docker 容器访问 host 里的 postgresql
Docker 容器默认使用 172.17.0.0/16 网络。(Linux 里 docker host 的 IP 默认始终是 172.17.0.1)
/etc/postgresql/12/main/postgresql.conf
listen_addresses = 'localhost,172.17.0.1'
/etc/postgresql/12/main/pg_hba.conf (访问权限设置)
host all all 172.17.0.0/16 md5
host replication all 172.17.0.0/16 md5
更改配置后重启生效
/etc/init.d/postgresql restart
systemctl restart postgresql
Update: 这种方式可能存在的问题:postgresql 必须在 docker 服务以后启动(修改 systemd 里 posgreesql.service 配置加入 After=dockerd.service)。如果开机时 postgresql 服务先启动,那么本机还没有创建 docker 网卡,postgresql 无法监听到 172.17.0.1 上。
或者把 postgresql 改成监听所有地址 listen_addresses = 'localhost,172.17.0.1'
Backup & Restore
Backup:
#!/bin/bash
DATE=$(date -u --rfc-3339=date)
export PGPASSWORD="123456"
pg_dump dbname -U dbuser -h localhost -F c > dbname-$DATE.dump
Restore:
export PGPASSWORD="123456"
# -F c 指定备份文件格式。(默认自动检测)
pg_restore -d dbname -U dbuser -h localhost dbname.dump
pg_dump / pg_restore 默认询问用户密码。要避免手动输入密码,创建 ~/.pgpass 文件并将其权限设为 0600,内容每行一个 credential ):
# hostname:port:database:username:password
localhost:5432:db:user:123456
CLI
默认 postgres 用户可以直接连接。
su postgres
psql mydb
使用 root 用户连接:
psql -U dbuser -h 127.0.0.1 mydb
psql 里常用命令
\l : 列出数据库
\c mydb : 切换到数据库 mydb
\dt : 列出当前数据库所有表
Drivers
node.js
npm install pg --save
Docs: https://node-postgres.com/
Getting Started: https://node-postgres.com/features/connecting
Sequelize Connection String: postgresql://user:pass@localhost/dbname
傻逼 Java JDBC
Driver: https://mvnrepository.com/artifact/postgresql/postgresql
jdbc:postgresql://host:port/database
可选 Query Params 参数 user, password, ssl 等:
jdbc:postgresql://localhost/test?user=fred&password=secret&ssl=true