ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

PostgreSQL入门

2020-05-16 12:02:58  阅读:320  来源: 互联网

标签:psql postgresql 入门 数据库 pgsql usr PostgreSQL postgres


PostgreSQL

一种超越MYSQL的开源关系型数据库
告知:作者在初学PostgreSQL的过程中将学习思路和操作流程记录下来,希望对初学者有一定帮助
环境告知:
1 操作系统:Centos7.7
在这里插入图片描述
2 必须的依赖工具库
① make版本3.80或以上
在这里插入图片描述
②GCC编译器
③GNU Readline库:它允许psql记住你输入的每个命令,这样就可以通过上下方向键快速输入之前的命令,默认开启,也可以通过编译参数–without-readline来禁止它,建议保留默认。
④Zlib库

yum install -y readline \
readline-devel \
openssl \
openssl-devel \
zlib \
zlib-devel

3 环境变量

#默认安装路径/usr/local/pgsql/
export PG_HOME=/usr/local/pgsql/
export PATH="$PG_HOME/bin:$PATH"

##########################################################
1 安装
作者提供三种安装方式,并亲测有效
1.1 yum安装
流程:
①下载官方yum源
https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
#路径可能根据官方的更新而失效,进入连接,选择你想要的版本
https://yum.postgresql.org/repopackages.php#pg10
②yum安装

    yum clean all \
 && yum repolist \
 && yum -y install postgresql10-server

③初始化
yum安装默认路径

/usr/pgsql-10/bin/postgresql-10-setup initdb

④启动

   systemctl restart postgresql-10.service \
&& systemctl enable postgresql-10.service

⑤验证

#使用postgres用户进入
[root@db1 ~]# su postgres
#进入PostpreSQL数据库
bash-4.2$ psql
#退出
postgres=# \q
#返回终端
bash-4.2$ exit
#已退出
[root@db1 ~]#

在这里插入图片描述
⑥安装成功,到此,yum安装PostgreSQL完成!!!
###########################################################
1.2 源码安装
流程:
①获取官方源码包
我准备装11.7版本(12版本还不稳定),选择其他版本进入下面的第一个地址后退选择目的版本即可
安装官方教学:
https://www.postgresql.org/docs/11/install-getsource.html
源码包:
https://www.postgresql.org/ftp/source/
11.7:连接可能随着官方的更新而失效
https://ftp.postgresql.org/pub/source/v11.7/postgresql-11.7.tar.gz
②源码安装
指定安装路径,便于管理:/usr/local/postgresql

--prefix=/usr/local/postgresql

依赖gcc等,自行安装(根据报错提示安装)

mkdir -p /usr/local/postgresql
wget https://ftp.postgresql.org/pub/source/v11.7/postgresql-11.7.tar.gz \
-O /usr/local/postgresql/postgresql-11.7.tar.gz
cd /usr/local/postgresql/
tar -xvf postgresql-11.7.tar.gz
cd postgresql-11.7
#按照默认安装
./configure  --prefix=/?
#如果出现报错:configure: error: readline library not found
yum -y install readline readline-devel
#再运行
./configure  --prefix=/?
make && make install
#成功
#生成/usr/local/pgsql目录,默认路径/usr/local/pgsql

详细的configure配置:
https://blog.csdn.net/pg_hgdb/article/details/81946121
③初始化数据库

cd /usr/local/pgsql/
mkdir /usr/local/pgsql/data/
chown postgres: /usr/local/pgsql/data/
sudo su postgres
#-D定义数据的存放路径
/usr/local/pgsql/bin/initdb  -D /usr/local/pgsql/data

④启动与开机自启
在解压路径下有一个
/usr/local/postgresql/postgresql-11.7/contrib/start-scripts/linux

cp -a /usr/local/postgresql/postgresql-11.7/contrib/start-scripts/linux \
/etc/init.d/postgresql
vi /etc/init.d/postgresql
#根据实际情况修改下列两行内容
prefix=/usr/local/pgsql          #安装路径
PGDATA="/usr/local/pgsql/data"   #数据库路径
#centos6版本的启动方式,centos7版本的启动方式还未研究
service  postgresql start
service  postgresql status
#关闭
service  postgresql stpo
#启动成功,能看见PID
#使用postgres用户连接
sudo su postgres
/usr/local/pgsql/bin/psql
#进入
#安装成功
#查看版本
postgres=# select version();
                             version                                                 
----------------------------------------------------------------
PostgreSQL 11.7 on x86_64-pc-linux-gnu, compiled 
by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-39), 64-bit
(1 row)

#制作软连接
rm -rf  /usr/bin/psql
ln -s  /usr/local/pgsql/bin/psql  /usr/bin/psql
sudo su postgres
psql
#成功进入

⑤!!!缺少源码启动方式,后面补充
补充:

#源码启动
#初始化数据库时,提示了启动方式,注意有一个logfile
#这里在安装目录增加一个文件夹log,用来记录日志
mkdir -p /usr/local/pgsql/logs/server.log
#启动,并指定数据库与日志
pg_ctl -D /usr/local/pgsql/data/ \
-l /usr/local/pgsql/logs/server.log \
(start/stop)

⑥安装成功,到此,yum安装PostgreSQL完成!!!
postgresql详细配置,端口,开放网段
https://blog.csdn.net/Linjingke32/article/details/80393576

###########################################################
1.3 二进制安装
①下载二进制包
pgsql有很多类型的包,对于不同linux发行版都有对应的编译好的包,安装很方便,另外如果对于通用的linux平台可以编译源码安装或者安装官方编译好的二进制包,源码包的安装仅仅比二进制安装多出一个编译步骤,其余的都一样,所以这里使用安装方式是安装编译好的二进制包
pgsql官网地址:https://www.postgresql.org/,进入后点击download就来到下载页,这里点击Linux下面的Other Linux选项,然后点击下方的tar.gz archive下载二进制归档
  在这里插入图片描述
然后就来到最终的pgsql下载页了,地址为:https://www.enterprisedb.com/download-postgresql-binaries,如下图下载最新版本的10.1https://sbp.enterprisedb.com/getfile.jsp?fileid=12574&_ga=2.120855624.1731532218.1589505053-724926244.1589505053
在这里插入图片描述

如上图根据机器的位数下载对应的包,我这里下载的是x86-64的包,为:postgresql-10.1-1-linux-x64-binaries.tar.gz,下载之后准备安装
②安装二进制包
将下载好的二进制包上传到你的目标路径,我放到/root/postgresql###验证结果表面,不能放在root下,后来我转移到/pgsql

useradd postgres
mkdir /pgsql
cd /pgsql
tar -xvf postgresql-10.12-1-linux-x64-binaries.tar.gz
#得到pgsql文件夹
cd pgsql
#创建数据库文件和日志文件data logs
mkdir data logs
chown postgres:  /root/postgresql/pgsql -R
#初始化数据库data
sudo su postgres
./bin/initdb  -D data
#初始化成功,提示启动命令
#启动,定义启动日志名称server.log
./bin/pg_ctl  -D data -l logs/server.log  start
#查看帮助
./bin/pg_ctl  --help
#启动成功
#连接postgresql
./bin/psql
#建议设置软连接或者别名
#软连接设置了很多次都没有成功,几个bin sbin都试了
alias psql='/pgsql/pgsql/bin/psql'
echo 'alias psql="/pgsql/pgsql/bin/psql"' >> /etc/bashrc

*③安装成功,到此,yum安装PostgreSQL完成!!!
安装部分结束。
###########################################################

2 PostgreSQL基本操作
2.1 添加用户和新数据库
初次安装后,默认生成一个名为postgres的数据库和一个名为postgres的数据库用户。这里需要注意的是,同时还生成了一个名为postgres的Linux系统用户。
下面,我们使用postgres用户,来生成其他用户和新数据库。好几种方法可以达到这个目的,这里介绍两种。

2.1.1 使用PostgreSQL控制台

#首先,新建一个Linux新用户,可以取你想要的名字,这里为dbuser。

sudo adduser dbuser

#然后,切换到postgres用户。

sudo su - postgres

#下一步,使用psql命令登录PostgreSQL控制台。

psql

#这时相当于系统用户postgres以同名数据库用户的身份,登录数据库,这是不用输入密码的。
#如果一切正常,系统提示符会变为"postgres=#",表示这时已经进入了数据库控制台。以下的命令都在控制台内完成。

#第一件事是使用\password命令,为postgres用户设置一个密码。

\password postgres

#第二件事是创建数据库用户dbuser(刚才创建的是Linux系统用户),并设置密码。

CREATE USER dbuser WITH PASSWORD 'password';

#第三件事是创建用户数据库,这里为exampledb,并指定所有者为dbuser。

CREATE DATABASE exampledb OWNER dbuser;

#第四件事是将exampledb数据库的所有权限都赋予dbuser,否则dbuser只能登录控制台,没有任何数据库操作权限。

GRANT ALL PRIVILEGES ON DATABASE exampledb to dbuser;

#最后,使用\q命令退出控制台(也可以直接按ctrl+D)。

\q

2.1.2 使用shell命令行

#添加新用户和新数据库,除了在PostgreSQL控制台内,还可以在shell命令行下完成。
#这是因为PostgreSQL提供了命令行程序createuser和createdb。还是以新建用户dbuser和数据库exampledb为例。

#源码和二进制安装方式则需要指定./bin/createuser ./bin/createdb 命令
#也可以制作软连接和设置别名Alias实现

#首先,创建数据库用户dbuser,并指定其为超级用户。

sudo -u postgres createuser --superuser dbuser

sudo -u postgres createuser -s dbuser -P #交互式设置新用户密码

#接着,在shell命令行下,创建数据库exampledb,并指定所有者为dbuser。

sudo -u postgres createdb -O dbuser exampledb

##########################################################
2.2 登录数据库

#修改配置文件,开放所有IP
vi postgresql.conf
vi pg_hba.conf 
#添加新用户和新数据库以后,就要以新用户的名义登录数据库,这时使用的是psql命令。

psql -U dbuser -d exampledb -h 127.0.0.1 -p 5432 -W

#上面命令的参数含义如下:
#-U指定用户,-d指定数据库,-h指定服务器,-p指定端口,-W指定密码。

#输入上面命令以后,系统会提示输入dbuser用户的密码。
#输入正确,就可以登录控制台了。

#psql命令存在简写形式。
#如果当前Linux系统用户,同时也是PostgreSQL用户,则可以省略用户名(-U参数的部分)。
#举例来说,我的Linux系统用户名为ruanyf,且PostgreSQL数据库存在同名用户
#则我以ruanyf身份登录Linux系统后,可以直接使用下面的命令登录数据库,且不需要密码。

psql exampledb

#此时,如果PostgreSQL内部还存在与当前系统用户同名的数据库,则连数据库名都可以省略。
#比如,假定存在一个叫做ruanyf的数据库,则直接键入psql就可以登录该数据库。

psql

#另外,如果要恢复外部数据,可以使用下面的命令。

psql exampledb < exampledb.sql

###########################################################
2.3 控制台命令集

#除了前面已经用到的\password命令(设置密码)和\q命令(退出)以外,控制台还提供一系列其他命令。

\h:查看SQL命令的解释,比如\h select。 
\?:查看psql命令列表。 
\l:列出所有数据库。 
\c [database_name]:连接其他数据库。 
\d:列出当前数据库的所有表格。 
\d [table_name]:列出某一张表格的结构。 
\du:列出所有用户。 
\e:打开文本编辑器。 
\conninfo:列出当前数据库和连接的信息。

##########################################################
2.4 数据库SQL

#基本的数据库操作,就是使用一般的SQL语言。

# 创建新表 

CREATE TABLE user_tbl(name VARCHAR(20), signup_date DATE); 

# 插入数据 

INSERT INTO user_tbl(name, signup_date) VALUES('张三', '2013-12-22'); 

 # 选择记录 

SELECT * FROM user_tbl; 

# 更新数据 

UPDATE user_tbl set name = '李四' WHERE name = '张三'; 

# 删除记录 

DELETE FROM user_tbl WHERE name = '李四' ; 

# 添加栏位 

ALTER TABLE user_tbl ADD email VARCHAR(40); 

# 更新结构 

ALTER TABLE user_tbl ALTER COLUMN signup_date SET NOT NULL; 

# 更名栏位 

ALTER TABLE user_tbl RENAME COLUMN signup_date TO signup; 

# 删除栏位 

ALTER TABLE user_tbl DROP COLUMN email; 

# 表格更名 

ALTER TABLE user_tbl RENAME TO backup_tbl; 

# 删除表格 

DROP TABLE IF EXISTS backup_tbl;

到此,PostgreSQL的安装和基本操作部分已完成,下面对架构进行优化。
##########################################################

3 PostgreSQL主从结构
数据库版本必须一致
https://www.jianshu.com/p/2d07339774c0
主服务器:

#先创建一个新目录用来存放归档文件
mkdir /opt/pgsql/pg_archive
#创建一个数据库用户进行主从同步。创建用户replica,并赋予登录和复制的权限
postgres# CREATE ROLE replica login replication encrypted password 'replica'
#修改pg_hba.conf,允许replica用户来同步
#允许94连接到主服务器
host all          all       192.168.200.90/32     trust  
#允许94使用replica用户来复制 
host replication  replica   192.168.200.90/32      md5   
#这样,就设置了replica这个用户可以从主服务器进行流复制请求
#注:
#第二个字段必须要填replication
#修改postgresql.conf
listen_addresses = '*'   # 监听所有IP
archive_mode = on  # 允许归档
archive_command = 'cp %p /opt/pgsql/pg_archive/%f'  # 用该命令来归档logfile segment
wal_level = hot_standby 
max_wal_senders = 32 #这个设置了可以最多有几个流复制连接,差不多有几个从,就设置几个wal_keep_segments = 256 # 设置流复制保留的最多的xlog数目
wal_sender_timeout = 60s #设置流复制主机发送数据的超时时间
max_connections = 100 #这个设置要注意下,从库的max_connections必须要大于主库的
#配置完两个文件后重启服务器
#测试从服务器能否连接主服务器数据库
#在从服务器上运行如下命令:
psql -h 192.168.200.113 -U postgres
#看看是否能进入数据库。若可以,则正常

从服务器:

#从主节点拷贝数据到从节点
su - postgres
rm -rf /opt/pgsql/data/*   #先将data目录下的数据都清空
pg_basebackup -h 192.168.200.113 -U replica -D /opt/pgsql/data -X stream -P  # 从93拷贝数据到94(基础备份)
#./bin/pg_basebackup -h 192.168.200.91 -U replication -D data/  -F p  -P  -W
mkdir /opt/pgsql/pg_archive
#配置recovery.conf
#复制/usr/pgsql-9.4/share/recovery.conf.sample 到 /opt/pgsql/data/recovery.conf
#recovery.conf
standby_mode = on    # 说明该节点是从服务器
primary_conninfo = 'host=192.168.20.93 port=5432 user=replica password=replica'  # 主服务器的信息以及连接的用户
recovery_target_timeline = 'latest'
#配置postgresql.conf
wal_level = hot_standby
max_connections = 1000 # 一般查多于写的应用从库的最大连接数要比较大
hot_standby = on # 说明这台机器不仅仅是用于数据归档,也用于数据查询
max_standby_streaming_delay = 30s # 数据流备份的最大延迟时间
wal_receiver_status_interval = 10s # 多久向主报告一次从的状态,当然从每次数据复制都会向主报告状态,这里只是设置最长的间隔时间
hot_standby_feedback = on # 如果有错误的数据复制,是否向主进行反馈

#配置完后重启从服务器

验证部署:

#在主节点上执行:
select client_addr,sync_state from pg_stat_replication;
#结果如下:
postgres=# select client_addr,sync_state from pg_stat_replication;
  client_addr 	 | sync_state
-----------------+------------
 192.168.200.90  | async
(1 行记录)
#说明90是从服务器,在接收流,而且是异步流复制。
#进程查看
ps aux | grep postgres 

亲测有效:
主服务器
在这里插入图片描述
从服务器
在这里插入图片描述
注意:这里有坑,官方二进制包的动态库不够,会失败
建议使用yum安装,源码安装未测试

拓展:

#备注:归档标识文件archive_active 需要手工创建。
archive_command = '/bin/date'  # (change requires restart)
#archive_command='cp %p /archive/pg93/%f'

archive_command = 'test ! -f /pgsql/pgsql/archive/10/archive_active  ||  cp %p /pgsql/pgsql/archive/10/%f'

archive_command = 'if [ -f "/archive/pg93/archive_active" ]; then cp %p /archive/pg93/%f; fi'

archive_command =  'DIR=/pgarch/arch/`date +%F`; sudo test ! -d $DIR && sudo mkdir $DIR; sudo test ! -f $DIR/%f && sudo cp %p $DIR/%f'

标签:psql,postgresql,入门,数据库,pgsql,usr,PostgreSQL,postgres
来源: https://blog.csdn.net/linux_yyp/article/details/106121211

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有