1.下载

http://www.postgres.cn/v2/download

2. 预备locale

  1. apt-get install -y locales locales-all
  2. localectl list-locales
  3. sudo vi /etc/environment
  4. LANG="zh_CN.UTF-8"
  5. LANGUAGE="zh_CN:zh"
  6. LC_ALL=zh_CN.UTF-8
  7. source /etc/environment
  8. reboot

3. 编译

可能发生的异常解决方法

./configure 出现:
error:readline library not found解决方法
apt-get install libreadline-dev 

这两个包wsl默认没有
sudo apt-get install libreadline6-dev
sudo apt-get install zlib1g-dev

开始编译

#为创建pg实例准备用户和目录
adduser postgres 
export PGDATA=/home/postgres/pg_data
mkdir $PGDATA
chown postgres $PGDATA  # 分配目录权限


su - postgres # 切换用户
export PGDATA=/home/postgres/pg_data
export PGBIN =/home/postgres/pg_bin
mkdir $PGBIN
解压pg压缩包到PGBIN

# 编译
sudo ./configure --bindir ....
这里是可以配置的参数
BINDIR = /mnt/c/development/postgresql-12/bin
DOCDIR = /usr/local/pgsql/share/doc
HTMLDIR = /usr/local/pgsql/share/doc
INCLUDEDIR = /usr/local/pgsql/include
PKGINCLUDEDIR = /usr/local/pgsql/include
INCLUDEDIR-SERVER = /usr/local/pgsql/include/server
LIBDIR = /usr/local/pgsql/lib
PKGLIBDIR = /usr/local/pgsql/lib
LOCALEDIR = /usr/local/pgsql/share/locale
MANDIR = /usr/local/pgsql/share/man
SHAREDIR = /usr/local/pgsql/share
SYSCONFDIR = /usr/local/pgsql/etc

sudo make install

4. 安装实例

# 初始化
$PGBIN/initdb -D $PGDATA -E UTF-8 --locale=zh_CN.UTF8 -A md5 -W -U postgres 
# 启动
$PGBIN/pg_ctl -D $PGDATA start
# 无密登录
psql
# 设置postgres账户密码
ALTER USER postgres PASSWORD 'root';
$PGBIN/psql -d postgres  -U postgres --port=5433 -h 127.0.0.1

5. 开启远程访问

若虚拟机未开启ssh

sudo apt-get update
sudo apt-get install openssh-server  
sudo gedit /etc/ssh/sshd_config  
  port 22 处即为修改端口的地方,默认不修改也可。
service ssh start
    # 修改 $PGDATA/postgresql.conf
    listen_addresses = '*' # what IP address(es) to listen on;
    # 修改 $PGDATA/pg_hba.conf
    # IPv4 local connections:
    #host    all             all             192.168.31.190/32        md5
    host     all             all             0.0.0.0/0               md5
    host    all             all             127.0.0.1/32            md5

6. 安装RUM

git clone https://github.com/postgrespro/rum
cd rum
export PGDATA=/home/postgres/pg_data
export PGHOME=/mnt/c/development/postgresql-12
export PGBIN=$PGHOME/bin
export PATH=$PGBIN:$PATH
make USE_PGXS=1
make USE_PGXS=1 install # 这一步可能需要root
make USE_PGXS=1 installcheck

psql test -c "CREATE EXTENSION rum;"

7. 权限

使用postgres用户登录, 创建 database d1 创建带登录权限的u1
psql -Upostgres -dtest
用户 postgres 的口令:
psql (12.0)
输入 "help" 来获取帮助信息.
test=# create database d1;
CREATE DATABASE
test=# create role u1 login  password 'u1';
CREATE ROLE
test=#

另开窗口登录d1, d1的所有者是postgres, 但u1却可以在d1中建表 删表
psql -Uu1 -d d1
用户 u1 的口令:
psql (12.0)
输入 "help" 来获取帮助信息.
d1=> select 1;
 ?column?
----------
        1
(1 行记录)
d1=> create table t1(id bigint);
CREATE TABLE
d1=> insert into t1 values(1);
INSERT 0 1
d1=> select * from t1;
 id
----
  1
(1 行记录)
d1=> drop table t1;
DROP TABLE
d1=>

public schema对所有用户开放, 这是pg的默认行为, 但这不合适, 接下来有两种做法

1. 回收public schema的所有开放权限, 并将所有权限单独分配给u1

2. 删掉public schema, 重新创建, 将owner设置为u1

如果是第一种, 起owner还是postgres, u1没有权限对schema进行删除, 重命名, 权限分配等操作, 第二种则随心所欲操作public schema

示范第一种
--  回收 schema public的所有权限,
test=# revoke all on schema public from public;
REVOKE
-- 回收 d1的所有权限
test=# revoke all on database d1 from public;
REVOKE
-- 回收 postgers的所有权限
test=# revoke all on database postgres from public;
REVOKE
-- 将 public schema的所有权限赋给u1
test=# grant all on schema public to u1;
GRANT
-- 允许u1登录d1
test=# grant connect on database d1 to u1;
GRANT
-- 使用u1登录d1
d1=> create table t1(id bigint);
CREATE TABLE
d1=> insert into t1 values(1);
INSERT 0 1
d1=> insert into t1 values(2);
INSERT 0 1
d1=> select * from t1;
 id
----
  1
  2
(2 行记录)
d1=> drop table t1;
DROP TABLE
d1=>

示范第二种
--
d1=> drop schema if exists public;
NOTICE:  schema "public" does not exist, skipping
DROP SCHEMA
d1=> create schema public;
CREATE SCHEMA
d1=> alter schema public owner to u1;
ALTER SCHEMA
d1=>

接下来使用postgres会话创建u2 并登录u2
create role u2 login  password 'u2';
-- 分配登录d1的权限给u2
grant connect on database d1 to u2;
psql -Uu2 -d d1
用户 u2 的口令:
psql (12.0)
输入 "help" 来获取帮助信息.
-- public scheama 对 u2 不可见
d1=> \dt
没有找到任何关系.
d1=>
-- 分配schema的使用权给 u2
grant usage on schema public to u2;
-- revoke usage on schema public from u2; 撤销
-- 再次查看
d1=> \dt
             关联列表
 架构模式 | 名称 |  类型  | 拥有者
----------+------+--------+--------
 public   | t1   | 数据表 | u1
(1 行记录)
--只能看到存在, 不能查
-- -s
grant select on table t1 to u2;
-- 创建一个函数, 函数在public schema下, 所以拥有schema usage权限的 u2是可以调用fn1()的
create or replace function fn1() returns void language plpgsql as $$ begin end; $$;
alter function fn1 owner to u1;
-- 撤销 fn1() 的公共权限, 此时只有owner u1可以调用
revoke execute on function   fn1() from public;
-- 分配执行权限给u2, 此时u2可以调用fn1(); 但不能删除 fn1();
grant execute on function   fn1() to u2;

8. 实例参数配置

9. 自带压测工具

pgbench -f 1.sql -U postgres d test -s 8 -c 8 -n
-f 指定要执行的sql文件
-s sql文件内容, 将被执行几次
-c 多少个connection
-j 多少个工作线程
-n 阻止默认执行vacuum
-P 几秒钟打印一次进度

常用
export test_sql="select 1"
export test_sql="select random_phone_cn()"
echo $test_sql > a.txt && pgbench   -M prepared -n -r -P 1 -f a.txt -c 12 -j 12 -T 10 y

10. 生成测试数据

11. 备份与还原

--serializable-deferrable, 如果需要从执行时的绝对一致性
$PGBIN/pg_dump -d y -E utf8 -h 127.0.0.1 -p 5432 -U postgres  > d:\y.dump.sql
$PGHOME/psql  -d y -h 127.0.0.1 -p 5432 -U postgres -f $SHAREHOME/y.dump.sql

12. 执行SQL文件

$PGBIN/psql  -d y -h 127.0.0.1 -p 5432 -U postgres -f $SHAREHOME/y.dump.sql