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'