安装
sudo apt-get install postgresql
设置 postgres 的密码
安装 PostgreSQL 后,会自动创建 Ubuntu 的 postgres 用户和 PostgreSQL 的 postgres 用户。现在,我们要设置 postgres 这个用户的密码和 PostgreSQl 内 postgres 用户的密码。请保持这两个密码的一致性,避免未知异常。
ubuntu@ubuntu:~$ sudo passwd -d postgres # 清除原有 postgres 用户密码 passwd: password expiry information changed. # 密码清除成功 ubuntu@ubuntu:~$ sudo -u postgres passwd Enter new UNIX password: # 输入新密码 Retype new UNIX password: # 确认新密码 passwd: password updated successfully # 密码设置成功 ubuntu@ubuntu:~$ sudo -u postgres psql psql (10.7 (Ubuntu 10.7-1.pgdg18.04+1)) Type "help" for help. postgres=# ALTER USER postgres WITH PASSWORD \'yourpassword\'; # 输入你的新密码,要和前面的密码一致 ALTER ROLE postgres=# \q # 退出 ~$
启动服务器
/usr/lib/postgresql/10/bin/pg_ctl -D /var/lib/postgresql/10/main -l logfile start Ver Cluster Port Status Owner Data directory Log file 10 main 5432 down postgres /var/lib/postgresql/10/main /var/log/postgresql/postgresql-10-main.log
重启服务
/etc/init.d/postgresql restart
或者
service postgresql restart
卸载
sudo apt-get purge \'postgresql-*\' sudo apt-get
远程访问配置
配置文件目录
/etc/postgresql/{version}/main
修改postgresql.conf文件
#listen_addresses=\'localhost’修改为listen_addresses = \'*\'
修改pg_hba.conf文件
# TYPE DATABASE USER ADDRESS METHOD # IPv4 local connections: host all all 127.0.0.1/32 md5 host all all 0.0.0.0/0 md5
其中0.0.0.0/0表示运行任意ip地址访问。
若设置为 192.168.1.0/24 则表示允许来自ip为192.168.1.0 ~ 192.168.1.255之间的访问。
设置好后重启服务即可被远程连接。
PostgreSQL 中 sequence 的用法
作者:calvinxiao 来源:简书
链接:https://www.jianshu.com/p/f494b4f96908
介绍
sequence 是 pg 自带的高效的自增id工具(也叫序列)。sequence 使用了轻量级锁的方式来做到高效自增id的,所以会比 UPDATE 行锁快。sequence 的返回数据类型默认是64位的整数,pg 10 可以自定 smallint, integer 或者是 bigint。
用法
使用 sequence
# 创建 CREATE SEQUENCE temp_seq; # 获取下一个sequence select nextval(\'temp_seq\'); # 1 # 设置 sequence 的开始值 select setval(\'temp_seq\', 42); # 获取下一个sequence select nextval(\'temp_seq\'); # 43 # 创建一个自动循环的 sequence CREATE SEQUENCE temp_seq2 MINVALUE 18 MAXVALUE 20 CYCLE; select nextval(\'temp_seq2\'); # 18 select nextval(\'temp_seq2\'); # 19 select nextval(\'temp_seq2\'); # 20 select nextval(\'temp_seq2\'); # 18 # 创建表的时候把类型设置为 serial 会自动创建一个 sequence CREATE TABLE temp_seq_table (id serial); postgres=# \d temp_seq_table Table "public.temp_seq_table" Column | Type | Modifiers --------+---------+------------------------------------------------------------- id | integer | not null default nextval(\'temp_seq_table_id_seq\'::regclass) # 自动创建了 sequence temp_seq_table_id_seq
CACHE 参数
sequence 是可以保证自增数据不重复的,也就是说每次自增后都会持久化保存,那么为了继续提高性能,可以加上 CACHE 参数(默认为1),每个进程(连接)可以缓存一个子序列在当前进程内存里面,当子序列用完了才会去原序列取新的子序列。
这个用个例子简单说一下,创建 sequence temp_seq3 时用了 CACHE 10,A session 可以获取到的值是 1...10,B session 可以获取到的值是 11...20,那么获取顺序可能是 (A, A, B, A),返回值是 (1, 2, 11, 3),这个不是严格自增的序列,但可以保证回次返回都是唯一的,用了 CYCLE 参数的除外。
根据文档和源码( link 第80行),缓存在内存里面的最大值(cached)是每个进程都不一样的,所以如果要求严格自增的服务不能用 CACHE。
CREATE SEQUENCE temp_seq3 CACHE 10; select nextval(\'temp_seq3\'); # 1 select nextval(\'temp_seq3\'); # 2 # \q 退出 psql 重新链接 select nextval(\'temp_seq3\'); # 11
pgbench 压测
这里写三种用 pg 做自增id的方式
- 直接用
UPDATE SET RETURNING - 用默认值的 SEQUENCE
- 用 CACHE=10 的SEQUENCE
测试命令,在 MacOS 上用 docker 开一个 pg 在里面运行一下 pgbench 脚本,其中 sql.sql 的内容替换成对应的压测脚本。
pgbench -c 10 -T 10 -f sql.sql -U postgres postgres
# 准备数据库表 CREATE TABLE temp_incr_table (id integer primary key, val integer); INSERT INTO temp_incr_table VALUES(1, 1); # 上面例子创建的 temp_seq 和 temp_seq3 都会用于压测
UPDATE;
BEGIN; UPDATE temp_incr_table SET val = val + 1 WHERE id = 1 RETURNING val; END;
TPS: 986
CACHE 默认为1 的sequence
BEGIN; SELECT nextval(\'temp_seq\'); END;
TPS: 7332
CACHE 默认为10 的sequence
BEGIN; SELECT nextval(\'temp_seq3\'); END;
TPS: 7451
压测总结
- sequence 比 update 快 8 倍左右,在并发量大的时候更明显,而且从 pg 运行原理来说也是可以证明的,mvvc 里面的 update 都会写一份新的数据,有额外的写和额外的vacuum工作,而且行锁还需要把锁的上下文记录到stat表。
- CACHE 优化不明显,理论上是可以减少更新 buffer 的次数,后续可以在生产环境的机器上验证一下。
ref
看看微信的分布式id生成器,原理都差不多,"实际应用中每次提升的步长为10000" = "CACHE 10000"。link
以上优化已经是用在友好速搭电商系统的订单号和优惠券号生成服务中,为商家提供更快更可靠的服务。
可视化客户端pgadmin4安装
docker pull dpage/pgadmin4 docker run -p 5050:80 \ -e "PGADMIN_DEFAULT_EMAIL=user@domain.com" \ -e "PGADMIN_DEFAULT_PASSWORD=SuperSecret" \ -d dpage/pgadmin4
安装psycopg2
报错You need to install postgresql-server-dev-X.Y for building a server-side extension or libpq-dev for building a client-side application?
sudo apt-get install libpq-dev python-dev pip install psycopg2