Postgres入门与实践(一)

如何安装

RPM包安装

直接下载旧版本rpm安装(比如9.5),官网下载:https://yum.postgresql.org/9.5/redhat/rhel-7-x86_64/repoview/

#按顺序安装
yum localinstall postgresql95-libs-9.5.25-1PGDG.rhel7
yum localinstall postgresql95-9.5.25-1PGDG.rhel7
yum localinstall postgresql95-server-9.5.25-1PGDG.rhel7
yum localinstall postgresql95-contrib-9.5.25-1PGDG.rhel7  

#修改数据库存放目录
mkdir -p /usr/local/pgsql/data
#改变属主
chown -R postgres:postgres /usr/local/pgsql/9.5/data
#修改systemctl启动文件
vim /usr/lib/systemd/system/postgresql-9.5.service
# Environment=PGDATA=/var/lib/pgsql/9.5/data/   #注释此行
Environment=PGDATA=/usr/local/pgsql/9.5/data   #新增此行

#初始化数据库
/usr/pgsql-9.5/bin/postgresql95-setup initdb
#启动数据库
systemctl enable postgresql-9.5 #开启启动
systemctl start postgresql-9.5

PostgreSQL Yum Repository

# Install the repository RPM:
sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm

# Install PostgreSQL:
sudo yum install -y postgresql96-server

# Optionally initialize the database and enable automatic start:
sudo /usr/pgsql-9.6/bin/postgresql96-setup initdb
sudo systemctl enable postgresql-9.6
sudo systemctl start postgresql-9.6

源码安装

wget https://ftp.postgresql.org/pub/source/v9.6.21/postgresql-9.6.21.tar.gz
tar zxvf postgresql-9.6.21.tar.gz
#安装配置
./configure   --prefix=/usr/local/pgsql --with-perl --with-python --with-libxml --with-libxslt 
#编译安装
make && make install、
# 添加用户 postgres
useradd postgres
# 创建数据目录
mkdir -p /usr/local/pgsql/data
chown postgres /usr/local/pgsql/data
#初始化数据库
/usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data
#启动数据库服务
/usr/local/pgsql/pg_ctl -D /usr/local/pgsql/data

数据库配置

pg_hba.conf配置参数

# 相同的规则,但是使用本地环回 TCP/IP 连接。
# TYPE  DATABASE        USER            ADDRESS                 METHOD
host    all             all             127.0.0.1/32            trust

# 和前一行相同,但是使用了一个独立的掩码列
# TYPE  DATABASE        USER            IP-ADDRESS      IP-MASK             METHOD
host    all             all             127.0.0.1       255.255.255.255     trust

# IPv6 上相同的规则
# TYPE  DATABASE        USER            ADDRESS                 METHOD
host    all             all             ::1/128                 trust

# 使用主机名的相同规则(通常同时覆盖 IPv4 和 IPv6)。
# TYPE  DATABASE        USER            ADDRESS                 METHOD
host    all             all             localhost               trust

# 允许来自任意具有 IP 地址
# 192.168.93.x 的主机上任意
# 用户以 ident 为该连接所
# 报告的相同用户名连接到
# 数据库 "postgres"
#(通常是操作系统用户名)。
# TYPE  DATABASE        USER            ADDRESS                 METHOD
host    postgres        all             192.168.93.0/24         ident

# 如果用户的口令被正确提供,
# 允许来自主机 192.168.12.10
# 的任意用户连接到数据库 "postgres"。
#
# TYPE  DATABASE        USER            ADDRESS                 METHOD
host    postgres        all             192.168.12.10/32        md5

postgresql.conf配置参数

常用命令

登陆数据库

# 登陆数据库(本机postgres免密登陆)
-bash-4.2$ psql
psql (10.5)
Type "help" for help.
# 指定账号数据库登陆
psql -h 127.0.0.1 -p 5432 -U postgres -d postgres
# 详细参数 参见 psql --help
# 查看数据库
postgres=# \l
# 查看数据库版本
postgres=# select version();
# 退出数据库
postgres=# \q
# 命令指南
postgres=# \?
# 命令详细
postgres=# \h

数据库查看

#切换到dbname库, dbuser用户
postgres=# \c dbname dbuser
#查看数据库的对象
dbname=#\d
#查看指定表对象
dbname=#\d table_name

用户角色数据库模式表空间

用户与角色

用户和角色对PostgresSQL来说是完全相同的两个对象

CREATE ROLE kanon PASSWORD 'kanon'; //默认没有登陆权限

CREATE ROLE kanon PASSWORD 'kanon' LOGIN 
#等同于
CREATE USER kanon PASSWORD 'kanon'

#用户密码
ALTER USER kanon WITH PASSWORD 'kanon';
#删除用户
drop user kanon;

创建只读账号

1.创建只读用户

create user readonly with password 'readonly';
#指定只读用户的搜索路径(默认查询的模式)
alter user readonly  set search_path='kannon';

2.设置只读

alter user readonly set default_transaction_read_only=on;

3.授权

#授权模式使用权限
grant  usage on schema kannon  to readonly;
#授权select 权限
grant select on all tables in schema kannon to readonly;
#授权系列(可选)
grant select on all sequences in schema kannon to readonly; 
#授权默认权限(后续增加的表也有权限)
alter default privileges in schema kannon grant select on tables to readonly;

数据库与模式

模式(schema)是对数据库(database)逻辑分割,相当于名称空间
通过模式可以实现权限分离,模式间对象共享
在数据库创建的同时,就已经默认为数据库创建了一个模式--public,这也是该数据库的默认模式。所有为此数据库创建的对象(表、函数、试图、索引、序列等)都是常见在这个模式中的。

一般来说创建一个具体数据库会创建一个与用户名相同的模式

CREATE SCHEMA kanon OWNER kanon;
#删除模式
drop scheam kanon;

表空间和数据库

CREATE DATABASE dbname 默认的数据库所有者是当前创建数据库的角色,默认的模板是template1, template1默认的表空间是系统的默认表空间--pg_default

#完整创建数据库的命令
CREATE DATABASE dbname OWNER kanon TEMPLATE template1 TABLESPACE tablespacename;        

表空间是一个存储区域,在一个表空间中可以存储多个数据库

创建表也可以指定表空间,将表的数据存在一个较慢的磁盘上的表空间,而将表的索引存在于一个快速的磁盘上的表空间

表空间和数据库是多对多的关系

#修改数据库owner
alter database dbname owner to dbuser;
#删除数据库
drop database dbname;
#创建表空间(超级用户创建)
CREATE TABLESPACE tskanon OWNER kanon LOCATION '/tmp/data/tskanon';
#表空间授权使用
grant create on tablespace tskanon to otheruser
#解除授权
revoke create on tablespace tskanon from otheruser
#删除表空间
drop tablespace tskanon;
#创建表指定表空间 
CREATE TABLE tb_kanon(name varchar(32)) tablespace tskanon;

备份还原

pg_dump命令备份(逻辑备份)

#命令帮助
pg_dump --help
#备份指定数据库
pg_dump -p 5432 -U postgres "test" > /tmp/test.sql
#备份指定表
pg_dump -p 5432 -U postgres -t test1  "test" > /tmp/test.sql

pgsql命令恢复(逻辑恢复)

psql -p 5432 -U postgres -d test < /tmp/test.sql

pg_basebackup(物理备份)

#基础备份到/cache1/backup 目录
pg_basebackup -D /cache1/backup -Ft -Xs -P -z -R -h 127.0.0.1 -U repuser

pg_basebackup(物理还原)

1.删除数据库data目录里的所有文件
2.解压备份文件到至数据库data目录

tar -zxvf base.tar.gz -C ../data/

3.复制pg_wal目录下的日志文件到archive目录下(/cache1/archive_log)
4.修改解压后的recovery.conf文件(其实是指定归档的位置,这样就会进行恢复)

restore_command = '/bin/cp /cache1/archive_log/%f %p'

5.启动数据库

service postgresql-9.5 start

快速备份表

create table test_bak as select * from test;

流复制

流复制方案

1.修改主库的配置文件

vi postgresql.conf

#配置修改为:
wal_level = hot_standby 
#synchronous_commit = on(同步复制,-- 实时,如果需要异步改为off)
checkpoint_timeout = 5min 
archive_mode = on
archive_command = '/bin/date'
max_wal_senders = 2
wal_keep_segments = 16 
hot_standby = on
max_standby_archive_delay = 300s
max_standby_streaming_delay = 30s
wal_receiver_status_interval = 1s
hot_standby_feedback = on
wal_receiver_timeout = 60s

vi pg_hba.conf

# 添加IP 可以让备库访问到主库
host replication repuser 192.168.1.200/32 md5

2.创建数据库用户repuser

create role repuser login replication encrypted password '123';

3.备库使用pg_basebackup进行数据库备份恢复

pg_basebackup -Fp -Xs -v -P -D $PGDATA -h 192.168.1.189 -p 5432 -U repuser

4.备库${PGDATA}目录下增加配置文件recovery.conf

vi recovery.conf

recovery_target_timeline='latest'
standby_mode = on
primary_conninfo = 'host=192.168.1.189  port=5432  user=repuser password=repuser' 
trigger_file = '/cache1/pgsql/9.5/data/postgresql.trigger'

5.启动备库

systemctl start postgresql-9.5
#ps aux|grep wal
#主库增加一个wal sender process进程,用于日志发送
#备库增加一个wal receiver progress进程,这个是接收wal日志的进程

流复制切断

#在备库/cache1/pgsql/9.5/data目录下创建文件
touch /cache1/pgsql/9.5/data/postgresql.trigger

常见问题

  • 查询执行比较久的命令

      select pid,usename,query_start,query from pg_stat_activity where query like '%表名称%' order by query_start asc;
      #强制停止进程
      SELECT pg_cancel_backend(pid);
    
  • drop database dbname 失败

      #删除数据库的session
      select  'select pg_terminate_backend('||pid||');' from pg_stat_activity where datname='dbname';
    
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,634评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,951评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,427评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,770评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,835评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,799评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,768评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,544评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,979评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,271评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,427评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,121评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,756评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,375评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,579评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,410评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,315评论 2 352

推荐阅读更多精彩内容