PostgreSQL

Posted ...狂风...

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PostgreSQL相关的知识,希望对你有一定的参考价值。

PostgreSQL 是一个免费的对象-关系数据库服务器(ORDBMS),在灵活的BSD许可证下发行。 PostgreSQL 开发者把它念作 post-gress-Q-L。PostgreSQL 的 Slogan 是 "世界上最先进的 开源关系型数据库"。

PostgreSQL安装

到官网下载源码版本9.5.17 https://www.postgresql.org/ftp/source/
postgresql- 9.5.17 .tar.gz

 

1、拷贝安装包到linux服务器 2、使用 tar 命令解压到 /usr下 # tar -zxvf postgresql-9.5.17.tar.gz -C /usr 3、重命名 mv /usr/postgresql-9.5.17 /usr/postgresql 4、安装依赖:# yum -y install gcc-c++ 5、安装依赖:# yum -y install zlib-devel 7、安装依赖:# yum -y install readline-devel 8、进入解压目录: cd /usr/postgresql 9、执行命令:# ./configure 10、执行命令:# make 12、执行命令:# make install 13、建立一个系统用户 postgres: # adduser postgres 14、建立一个存储数据的目录: # mkdir /usr/local/pgsql/data 15、将目录分配给 postgres 用户: # chown -R postgres:postgres /usr/local/pgsql 16、添加启动服务: # cp /usr/postgresql/contrib/start-scripts/linux /etc/init.d/postgresql 17、启动服务的脚本须是可执行程序,用chmod 修改: # chmod a+x /etc/init.d/postgresql 18、在环境变量下添加 postgresql 的 bin 目录: # vi /etc/profile export PATH USER 下添加: export PATH=/usr/local/pgsql/bin:$PATH :wq source /etc/profile 19、初始化数据库,切换用户到 postgres: # su -l postgres 初始化数据库,支持 unicode (多语种字符): # initdb -E UNICODE -D /usr/local/pgsql/data 20、切换root用户: # su 启动数据库: # /etc/init.d/postgresql start 21、切换用户到 postgres # su -l postgres psql 进入数据库系统;\\l 查看数据库; \\q退出数据库 修改数据库账号postgres的密码: # ALTER USER postgres WITH PASSWORD '123456';
postgresql 命令:   列出系统中的数据库 \\l   创建数据库 create database aa \\h :查看 SQL 命令的解释,比如 \\h select \\? :查看 psql 命令列表。 \\l :列出所有数据库。 \\c [database_name] :连接其他数据库。 \\d :列出当前数据库的所有表格。 \\d [table_name] :列出某一张表格的结构。 \\du :列出所有用户。 \\e :打开文本编辑器。 \\conninfo :列出当前数据库和连接的信息

 PostgreSQL使用

数据库操作

 连接数据库

 在linux控制台中,输入如下命令:

默认连接本机 [postgres @cluster152 ~]$ psql 或者,连接其他服务器上的指定数据库 [postgres @cluster152 ~]$ psql -h 192.168.48.151 -p 5432 -U postgres mytest   Password for user postgres:

 创建数据库

 CREATE DATABASE 命令需要在 PostgreSQL 命令窗口来执行,语法格式如下

CREATE DATABASE dbname;

createdb 命令创建数据库(在linux环境下执行) createdb 是一个 SQL 命令 CREATE DATABASE 的封装。 createdb 命令语法格式如下:
createdb [option...] [dbname [description]]
接下来我们打开一个命令窗口,进入到 PostgreSQL 的安装目录,并进入到 bin 目录, createdb 命令位于 PostgreSQL安装目录/bin 下,执行创建数据库的命令:
[postgres @cluster152 ~]$ ll /usr/local/pgsql/bin $ createdb -h 主机 -p 5432 -U postgres 数据库名字 password ******

 删除数据库

DROP DATABASE 会删除数据库的系统目录项并且删除包含数据的文件目录。 DROP DATABASE 只能由超级管理员或数据库拥有者执行。 DROP DATABASE 命令需要在 PostgreSQL 命令窗口来执行,语法格式如下:
DROP DATABASE [ IF EXISTS ] name

 切换数据库

 接下来我们可以使用 \\c + 数据库名 来进入数据库:

postgres=# \\c 数据库名 You are now connected to database "数据库名" as user "postgres". 数据库名=#

 表操作

创建表

PostgreSQL 使用 CREATE TABLE 语句来创建数据库表格。 语法 CREATE TABLE 语法格式如下:
CREATE TABLE table_name( column1 datatype, column2 datatype, column3 datatype, ..... columnN datatype, PRIMARY KEY( 一个或多个列 ) );
我们可以使用 \\d 命令来查看表格是否创建成功: 1.使用\\c先选择某个数据库 2.使用\\d查看该数据库下的表 使用 \\d 表名 还可以查看表的结构信息

 删除表

 语法:

DROP TABLE table_name;

 增删改查

 1)INSERT INTO 语句语法格式如下:

INSERT INTO TABLE_NAME (column1, column2, column3,...columnN) VALUES (value1, value2, value3,...valueN);
在使用 INSERT INTO 语句时,字段列必须和数据值数量相同,且顺序也要对应。 如果我们向表中的所有字段插入值,则可以不需要指定字段,只需要指定插入的值即可:
INSERT INTO TABLE_NAME VALUES (value1,value2,value3,...valueN);

 2)SELECT 语句用于从数据库中选取数据。

结果被存储在一个结果表中,称为结果集。 语法 SELECT 语句语法格式如下:
SELECT column1, column2,...columnN FROM table_name;

 如果我们想读取表中的所有数据可以使用以下 SQL 语句:

SELECT * FROM table_name;
3)UPDATE 操作,更新在 PostgreSQL 数据库中的数据 语法 以下是 UPDATE 语句修改数据的通用 SQL 语法:
UPDATE table_name SET column1 = value1, column2 = value2...., columnN = valueN WHERE [condition];
4)DELETE 语句可以删除 PostgreSQL 表中的数据。 语法 以下是 DELETE 语句删除数据的通用语法:
DELETE FROM table_name WHERE [condition];

prometheus使用postgresql-adapter连接postgresql

概述

Prometheus使用postgresql需要使用postgresql-adapter进行数据转换。在安装postgresql-adapter之前需要安装2个扩展:pg_prometheustimescaledb

官方推荐使用PostgreSQL, pg_prometheus,和TimescaleDB打包在一起的容器,但对于使用已有的postgresql来说并不合适,故需要手动编译安装。


环境准备

使用os为:redhat 7.4

假设已经安装好postgresql,本次使用的postgresql版本为11.1,安装路径为:/usr/pgsql-11/bin/。安装过程中如果遇到psql: command not foundNo package pg_config available时执行如下命令即可:

# export PATH=$PATH:/usr/pgsql-11/bin/

安装cmake

编译pg_prometheustimescaledb都会使用到cmake。

官网下载cmake二进制版本,使用版本为3.15.1

# tar -zxvf cmake-3.15.1-Linux-x86_64.tar.gz
# mv cmake-3.15.1-Linux-x86_64 cmake-3.15.1
# mv cmake-3.15.1 /user/local/bin
# export PATH=$PATH:/usr/local/bin/cmake-3.15.1/bin/

安装clang

编译pg_prometheus会使用到clang,且对clang版本有要求。clang的安装可参照CentOS 7 编译安装clang+llvm

下载clang源码,本次使用的clang版本为7.1.0,下载cfe-7.1.0.src.tar.xzclang-tools-extra-7.1.0.src.tar.xzcompiler-rt-7.1.0.src.tar.xzllvm-7.1.0.src.tar.xz并解压。安装路径为:/usr/local/clang。执行如下步骤编译clang,时长大约1小时。

# export PATH=$PATH:/usr/local/bin/cmake-3.15.1/bin/  #已经安装好的cmake
# mv cfe-7.1.0.src clang
# mv clang/ llvm-7.1.0.src/tools/

# mv clang-tools-extra-7.1.0.src extra
# mv extra/ llvm-7.1.0.src/tools/clang/

# mv compiler-rt-7.1.0.src compiler-rt
# mv compiler-rt-7.1.0.src/projects/

# mkdir build-7.1.0
# cd build-7.1.0
# cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX=/usr/local/clang -DCMAKE_BUILD_TYPE=Release -DLLVM_ENABLE_ASSERTIONS=On ../llvm-7.1.0.src  
# make -j 4
# make install 

安装postgresql devel

从官网下载并安装postgresql11-devel-11.2-2PGDG.rhel7.x86_64.rpm即可,该rpm包含postgresql的libraries和头文件,编译pg_prometheus时会用到。


安装pg_prometheus

安装好clang和postgresql devel之后就可以编译pg_prometheus了。

官方下载pg_prometheus源码,执行如下命令即可编译:

# make
# make install # Might require super user permissions

在make时可能会遇到如下问题:

问题1:

fatal error: \'stddef.h\' file not found

原因:缺少头文件,该头文件是clang定义的,可能是因为clang安装路径的原因,将头文件拷贝过去即可

解决:cp /usr/local/clang/lib/clang/7.1.0/include/* /usr/include/ ---注意不要覆盖原有的头文件

问题2:

/usr/lib64/llvm5.0/bin/llvm-lto: No such file or directory

原因:找不到llvm-lto的可执行文件,同样拷贝即可

解决:执行如下命令拷贝

mkdir -p /usr/lib64/llvm5.0
cp /usr/local/clang/bin/* /usr/lib64/llvm5.0/bin/

创建pg_prometheus扩展

  • 在postgresql的postgresql.conf中添加:shared_preload_libraries = \'pg_prometheus\',重启psql
  • 使用psql创建扩展:CREATE EXTENSION pg_prometheus;
  • 创建role: CREATE ROLE admin WITH LOGIN PASSWORD \'admin\';
  • 授权role admin:GRANT ALL ON SCHEMA prometheus TO admin;
  • 创建table:SELECT create_prometheus_table(\'metrics\');

重启psql加载pg_prometheus.so动态库时可能会遇到如下问题

问题1:

could not load library "/usr/pgsql-11/lib/pg_prometheus.so": /usr/pgsql-11/lib/pg_prometheus.so: undefined symbol: Float8GetDatum

原因:动态库缺少外部符号

解决:Float8GetDatum定义在postgresql源码的src/backend/utils/fmgr/fmgr.c中,内容如下,将其拷贝到pg_prometheus的src/prom.c中,重新编译pg_prometheus.so即可

Datum
Float8GetDatum(float8 X)
{
	float8	   *retval = (float8 *) palloc(sizeof(float8));

	*retval = X;
	return PointerGetDatum(retval);
}
#endif
问题2:

lock file "postmaster.pid" already exists

原因:存在pid文件

解决:在postgres的数据库目录中删除postmaster.pid即可


安装timescaledb

下载timescaledb源码,解压后执行如下命令即可

# cd build && make
# make install

创建timescaledb扩展

  • pgsql的postgresql.conf添加:shared_preload_libraries = \'pg_prometheus,timescaledb\'
  • 创建扩展:CREATE EXTENSION timescaledb;

启动postgresql-adapter

使用容器启动

dockerhub下载镜像

由于使用容器连接postgresql,故pgsql的pg_hba.conf中添加如下内容,172.17.0.2/16为容器的IP段,重启psql

host    all             admin           172.17.0.2/16           md5

启动命令如下,需要注意的是,由于在容器内部运行,-pg.host必须指定postgresql主机的地址,而非loopback接口

# docker run --name prometheus_postgresql_adapter -d -p 9201:9201 prometheus-postgresql-adapter:0.4 -pg.user=admin -pg.host=${psqlIP} -pg.port=5432 -pg.password=admin -pg.database=postgres -pg.prometheus-log-samples

使用可执行文件启动

下载官方源码,解压后执行如下命令编译即可。由于安装依赖很多库,建议在如阿里云海外主机上编译后拷贝下来

# go mod download
# make

此时使用本地地址连接postgresql,故pgsql的pg_hba.conf中添加如下内容,重启psql:

host    all             admin           127.0.0.1/32           md5

启动命令如下:

# ./prometheus-postgresql-adapter -pg.user=admin -pg.password=admin -pg.database=postgres -pg.prometheus-log-samples

配置Prometheus

Prometheus配置文件加入如下命令即可:

remote_write:
  - url: "http://<adapter-address>:9201/write"
remote_read:
  - url: "http://<adapter-address>:9201/read"

timescaledb的使用

timescaledb具体使用可以参见官网API,下面给出常用的方式:

SELECT * FROM timescaledb_information.hypertable;    //查看hypertable的信息

SELECT * FROM timescaledb_information.hypertable WHERE table_schema=\'public\' AND table_name=\'metrics_values\';    //查看schema中特定表的信息
SELECT * FROM hypertable_relation_size_pretty(\'metrics_values\');    //查看表大小
SELECT * FROM indexes_relation_size_pretty(\'metrics_values\');    //查看表中的index大小

SELECT * FROM chunk_relation_size_pretty(\'metrics_values\');    //查看chunk大小
SELECT drop_chunks(interval \'3 months\');    //手动丢弃超过3个月以上的chunk

SELECT add_drop_chunks_policy(\'metrics_values\', INTERVAL \'6 months\');    //定制drop_chunks策略,自动清除超过6个月的chunk
SELECT remove_drop_chunks_policy(\'metrics_values\');    //删除drop_chunks策略
SELECT * FROM timescaledb_information.drop_chunks_policies;    //查看drop_chunks丢弃策略

SELECT * FROM timescaledb_information.policy_stats;    //查看策略的详细信息

PS:直接源码编译的timescaledb的license为社区版,无法使用add_drop_chunks_policy等功能

TIPS:

问题:

环境拓扑为2个Prometheus做高可用同时向一个postgresql进行write/read。

在对Prometheus+postgresql-adapter进行重启等操作后,发现postgresql-adapter会与Prometheus端创建大量tcp连接(含大量close_wait和establish状态的连接),由于会持续创建tcp连接,导致系统内存不足触发OOM

解决:

停止Prometheus并重新创建Prometheus容器即可。

在对postgresql-adapter重启后,最好重启Prometheus端

总结

使用postgresql-adapter难点就是要编译出2个动态库文件pg_prometheus.sotimescaledb.so

以上是关于PostgreSQL的主要内容,如果未能解决你的问题,请参考以下文章

个人书签

CentOS 6安装PostgreSQL

去IOE,MySQL完胜PostgreSQL

PostgreSQL安装及简单使用

PostgreSQL | Arch Linux安装PostgreSQL

什么是PostgreSQL?跟MySQLOracle比强在哪?