连接postgresql的三种方式

假设我们拥有一个远端的数据库服务器,是需要连接才能去管理和获取数据的,那我们怎样才能去连接呢?

通过数据库管理软件(pgadmin)

这是一种非常常见也很方便的工具。

未分类

通过代码的方式(sequel gem)

require 'sequel'       #sequel是一个数据库管理gem
require 'pg'

# 下面是sequle 提供的连接数据的方式
DB = Sequel.postgres(:host => '121.201.xx.xxx', 
           :port => 59888, 
           :user => 'usename', 
           :password => '123456', 
           :database => 'database', 
           :max_connections => 20, 
           :pool_timeout => 30 
           )

# 下面就可以写获取数据的sql 语句了
sql = "select * from accounts"
DB[sql].all

通过终端连接

前提是你在本机已安装了postgresql
如果没有安装则: brew install postgres
然后终端输入: psql -h 121.201.xx.xxx -p 6xxxx -U usename -d database

-h 主机名
-p 端口号
-U 用户名
-d 数据库

未分类

debian8 安装postgresql 和 phpPgAdmin

安装软件包

sudo apt-get install postgresql postgresql-contrib

配置apache2

sudo vim /etc/apache2/conf-available/phppgadmin.conf

内容如下

<Directory /usr/share/phppgadmin>

DirectoryIndex index.php
AllowOverride None
Allow from all
# Only allow connections from localhost:
#Require local

<IfModule mod_php5.c>

查看页面

http://192.168.1.125/phppgadmin/

设置postgresql账号和密码

账号为test,密码为password

sudo -u postgres psql template1
template1=# create user test with password 'password' createdb createuser; 

成功登陆数据库

温馨提示:数据库一般不要让其他客户端直接连接,你可以提供http的接口或者其他方式,所以我这里也没有配置其他客户端连接。

Postgresql不重启加载配置文件

当我们新加入数据库用户默认是无法连接的,因为pg_hba.conf不允许连接,当然这个要看你的配置文件规则。

如果现在我添加了一个用户规则配置而我不想重启pgsql就让配置生效怎么半?

pgsql提供了一个方法

Pg_ctl

pg_ctl 是一个用于初始化,启动,停止, 或者重起 PostgreSQL 后端服务器(postgres), 或者显示一个运行着的服务器的状态的工具, 尽管我们可以手动启动服务器,但是 pg_ctl 封装了重新定向日志输出,与终端和进程组合理分离,以及另外提供了方便的选项用于有控制的关闭。

执行命令

pg_ctl reload
返回server signaled成功

常见报错

pg_ctl: no database directory specified and environment variable PGDATA unset

解决办法

你没有设置PGDATA环境变量,设置临时环境变量即可

export PGDATA=/data/pgsql/data

PostgreSQL 数据库的备份

一、建立数据库连接

命令:

psql -h IP地址 -p 端口 -U 数据库用户名 -d 数据库名
psql -h 127.0.0.1 -p 5432 -U postgres -d postgres

psql命令连接选项

Connection options:

  -h, --host=HOSTNAME     主机   默认local
  -p, --port=PORT         端口   默认5432
  -U, --username=USERNAME 用户名 默认postgres
  -w, --no-password       从不提示密码
  -W, --password          强制 psql 提示输入密码,即使没有密码也会提示。
  -d                 指定要连接的库名

=============================================

二、数据备份还原

pg_restore可以恢复由pg_dump备份的文件,它会重新生成包括数据在内的所有用户定义的类型、函数、表、索引的所有别要的命令
使用-d选项执行数据库的名称,-C指定备份文件的路径

pg_restore -d testdb -U postgres -C /home/postgres/testdb.sql

psql是一个PostgreSQL的终端,它可以运行用户输入的语句,输入的语句还可以来自一个文件,

所以对于备份的包含create、insert语句的文本文件,可以使用psql恢复到数据中。

psql -d  testdb -U postgres -f /home/postgres/testdb.sql 

1. pg_dump备份数据库

命令:pg_dump -h IP地址 -p 端口 -U 数据库用户名 -f 目标存储文件及路径 目标数据库名

备份testdb数据库到/home/postgres/testdb.sql文件

pg_dump  -U postgres -f /home/postgres/testdb.sql testdb

恢复

psql  -U postgres -d testdb -f /home/postgres/testdb.sql 

备份testdb库中的pmp_login_log表

pg_dump -U postgres -t pmp_login_log -f /home/postgres/login_log.sql testdb

恢复

psql  -U postgres -d testdb -f /home/postgres/login_log.sql

2. pg_dumpall备份数据库

使用pg_dumpall备份整个服务器的数据库

备份

pg_dumpall -U postgres -f /home/postgres/postgres.sql

恢复

psql -U postgres -f /home/postgres/postgres.sql

三、PostgreSQL 无须手动输入密码

PostgreSQL里没有加入密码选项,一般备份命令需要手动输入密码,所以会给自动备份带来一定的不便。

查看了官方文档,(英文不好,全程都翻译/(ㄒoㄒ)/~~)

PGPASSWORD behaves the same as the password connection parameter. Use of this environment variable is not recommended for security reasons, as some operating systems allow non-root users to see process environment variables via ps; instead consider using the ~/.pgpass file (see Section 32.15).

PGPASSFILE specifies the name of the password file to use for lookups. If not set, it defaults to ~/.pgpass (see Section 32.15).

On Unix systems, the permissions on.pgpassmust disallow any access to world or group; achieve this by the command chmod 0600 ~/.pgpass. If the permissions are less strict than this, the file will be ignored. 

文档中提到两种方法;

第一种方法:通过PostgreSQL的环境变量参数来实现保存密码。

export PGPASSWORD="123456"

第二种方法:创建 ~/.pgpass 文件来保存密码

密码文件的格式: hostname:port:database:username:password

cat ~/.pgpass 
localhost:5432:testdb:postgres:123456

注意:

根据官方文档的说明,因为安全的原因,不推荐环境变量的方式,推荐使用~/.pgpass 来保存密码,此文件必须设置0600权限,如果权限不那么严格,则该文件将被忽略。

chmod 0600 ~/.pgpass

Centos 7.3 安装配置 PostgreSQL 9.x

一、安装 PostgresSQL

Centos 7 自带的 PostgresSQL 是 9.2 版的。因为,yum 已经做了国内源,速度飞快,所以直接就用 yum 安装了。依次执行以下命令即可,非常简单。

sudo yum -y install postgresql-server postgresql
sudo service postgresql initdb
sudo chkconfig postgresql on
sudo systemctl enable postgresql
sudo systemctl start postgresql

如果需要安装最新的版本,那就按官网上的说明来吧,但那个下载速度实在是……

https://www.postgresql.org/download/linux/redhat/

二、控制台 & 基本命令 & 数据库操作

PostgresSQL 默认已经创建了名为 postgres 的超级用户。

执行以下命令,登录控制台

sudo -u postgres psql postgres

可以试试以下一些常用的控制台命令

(这一部分的内容,基本是照搬阮兄的博文,我把操作逻辑贯通了一些,另做了少量补充,方便实验,原文在此)

# 查看 SQL 命令的解释,比如 h select
h

# 查看 PostgresSQL 命令列表 
?

# 列出所有数据库
l

# 连接(使用)某个数据库 
c [database_name]

# 列出当前数据库的所有表格
d

# 列出某一张表格的结构
d [table_name]

# 列出所有用户
du

# 打开文本编辑器
e

# 列出当前数据库和连接的信息
conninfo

# 退出控制台
q

创建名为 testdb 的数据库(注意:不要忘了命令末尾的分号!)

CREATE DATABASE testdb;

再用执行 l,确认数据库已经创建成功了

连接到(使用)testdb 数据库

c testdb

查看连接信息,确认已经连接到 testdb 上了

conninfo

接下来就是数据库的基本操作了,其实就是各种 SQL 语句,例如:

# 创建新表(执行后,用 d 可以看到当前数据库的表格列表中,出现了 user_tb)
CREATE TABLE user_tb(name VARCHAR(20), signup_date DATE);

# 插入数据 
INSERT INTO user_tb(name, signup_date) VALUES('张三', '2017-08-03');

# 选择记录 
SELECT * FROM user_tb;

# 更新数据 
UPDATE user_tb set name = '李四' WHERE name = '张三';

# 删除记录 
DELETE FROM user_tb WHERE name = '李四';

# 添加栏位(使用 d user_tb 查看 SQL 执行前后,表结构的变化)
ALTER TABLE user_tb ADD email VARCHAR(40);

# 更新结构 
ALTER TABLE user_tb ALTER COLUMN signup_date SET NOT NULL;

# 更名栏位 
ALTER TABLE user_tb RENAME COLUMN signup_date TO signup;

# 删除栏位 
ALTER TABLE user_tb DROP COLUMN email;

# 表格更名 
ALTER TABLE user_tb RENAME TO user_dt_new;

# 删除表格 
DROP TABLE IF EXISTS user_dt_new;

三、创建用户 & 启用密码登录 & shell 命令

真正我们在产品中不会直接使用默认的 postgres 用户,而是自己创建一个用户。

有两种操作方法:

  • 进入 PostgresSQL 的控制台操作
  • 使用 PostgresSQL 提供的 shell 命令

第二部分,使用的是控制台操作,这一部分,我们要试试 shell 命令

创建名为 dbuser 的用户并设置密码

sudo -u postgres createuser dbuser -P

创建名为 mydb 的数据库,并设置其所有者为我们新创建的用户 dbuser

sudo -u postgres createdb -O dbuser mydb

这时候,如果我们尝试用新创建的用户 dubser 登录数据库 mydb

psql -U dbuser -d mydb -h localhost

会遇到下面的错误

psql: FATAL: Ident authentication failed for user "dbuser"

这是因为 PostgresSQL 默认没有启用密码登录,所以我们要先修改配置启用之

打开配置文件

sudo vim /var/lib/pgsql/data/pg_hba.conf

找到下面这两行

host    all    all    127.0.0.1/32    ident
host    all    all    ::1/128         ident

将 ident 改为 md5

host    all    all    127.0.0.1/32    md5
host    all    all    ::1/128         md5

保存配置文件后,PostgresSQL

sudo systemctl restart postgresql

接下来,我们就可以用新创建的用户 dbuser 愉快地登录数据库啦

psql -U dbuser -d mydb -h localhost

注意 -h localhost 不能省略,否则 PostgresSQL 还会走 ident 的验证,会出现下面的错误

psql: FATAL: Peer authentication failed for user "dbuser"

四、允许远程访问(连接)

PostgresSQL 默认是不允许远程访问的,如果我们想要在别的机器上访问数据库,还需要做一些设置。

打开 postgresql.conf 文件

sudo vim /var/lib/pgsql/data/postgresql.conf

加入下面一行配置,表示允许来自任意 IP 的连接请求

listen_addresses = '*'

打开 pg_hba.conf 文件

sudo vim /var/lib/pgsql/data/pg_hba.conf

加入下面一行配置,表示对任意 IP 访问进行密码验证

host    all    all    0.0.0.0/0    md5

最后,重启 PostgreSQL 使配置生效

sudo systemctl restart postgresql

现在就可以远程访问 PostgreSQL 数据库啦

PostgreSQL 的索引类型

PostgreSQL 提供了多种索引类型:B 树、hash、GiST 和 GIN,每种索引类型都有适合的应用场景,可以根据场景选择合适的索引以提高效率。

B 树

B 树适合相等判断和有序的区间查询,通常来说,经常使用这些查询时推荐使用 B 树索引: <、>、<=、>= 以及 =。

此外,对于判断字符串开头的 LIKE 和 ~ 查询也可以考虑使用 B 树索引。比如: col LIKE ‘foo%’ 或者 col ~ ‘^foo’。

B 树对内容进行了排序,并不保证总是快于遍历查询,但大多数情况下都很有效率。

hash 索引

hash 索引只适合相等判断,对于 = 以外的查询并没有优化效果。

GiST 索引

GiST 并不是一种索引,更像是多种索引策略的集合。PostgreSQL 默认的 GiST 支持多种二维几何图形, 并且支持一下比较查询:

  • <<
  • &<
  • &>
  • >>
  • <<|
  • &<|
  • |&>
  • |>>
  • @>
  • <@
  • ~=
  • &&>

GiST 索引也支持“邻近查询”,比如:

SELECT * FROM places ORDER BY location <-> point '(101,456)' LIMIT 10;

GIN

GIN 是一种反向索引,可以处理拥有多个 key 的数据,比如数组。 和 GiST 和 SP-GiST 一样,GIN 支持多种不同用户定义的索引策略, 根据索引策略的不同,能够优化的操作符也不尽相同。

比如,PostgreSQL 的标准实现中包含了支持一维数组 GIN 操作类,支持这些操作符的查询优化:

  • <@
  • @>
  • =
  • &&

(这些操作符的意义见 9.18) 标准实现中的 GIN 操作类更多课件文档 Table 61-1,更多 GIN 操作类可以在 contrib 集合中找到,第 61 章会更详细地介绍。

BRIN 索引(Block Range Index)存储了物理区块值概要。 和 GiST、SP-GIST 和 GIN 一样,BRIN 也支持多种不同的索引策略,能够使用的操作类也依索引策略而定。 对于线性短顺序,索引的数据相当于块区间行内最小和最大值。支持下面这些操作符的优化:

  • <
  • <=
  • =
  • >=
  • >

标准实现的 BRIN 操作类介绍见 Table 62-1,详情见 62 章。

参考:

官方文档 http://www.postgresql.org/docs/current/static/indexes-types.html

PostgreSQL删除pg_xlog日志

PostgreSQL的pg_xlog下有大量日志,空间不足,如何删除?

Darren1:postgres:/usr/local/pgsql/data/pg_xlog:>ls
000000010000000000000008.00000028.backup  00000001000000000000009D  0000000100000000000000C9  0000000100000000000000F5  000000010000000100000021  00000001000000010000004D
000000010000000000000072                  00000001000000000000009E  0000000100000000000000CA  0000000100000000000000F6  000000010000000100000022  00000001000000010000004E
000000010000000000000073                  00000001000000000000009F  0000000100000000000000CB  0000000100000000000000F7  000000010000000100000023  00000001000000010000004F
......


Darren1:postgres:/usr/local/pgsql/data/pg_xlog:>ll|wc -l
263


Darren1:postgres:/usr/local/pgsql/data/pg_xlog:>du -sh /usr/local/pgsql/data/pg_xlog/
4.1G    /usr/local/pgsql/data/pg_xlog/

清理步骤:

pg_resetxlog用来清理WAL日志,当数据库服务启动的情况下,是不能使用的,所以执行之前需要停机。

(1)停机

Darren1:postgres:/usr/local/pgsql/bin:>pg_ctl stop -m fast

(2)查看NextXID和NextOID(发生checkpoint的时候,这两个值会发生改变)

Darren1:postgres:/usr/local/pgsql/bin:>pg_controldata
pg_control version number:            960
Catalog version number:              201608131
Database system identifier:          6446917631406040181
Database cluster state:              shut down
pg_control last modified:            Thu 27 Jul 2017 05:04:12 AM CST
Latest checkpoint location:          1/73000028
Prior checkpoint location:            1/720048F8
Latest checkpoint's REDO location:    1/73000028
Latest checkpoint's REDO WAL file:    000000010000000100000073
Latest checkpoint's TimeLineID:      1
Latest checkpoint's PrevTimeLineID:  1
Latest checkpoint's full_page_writes: on
Latest checkpoint's NextXID:          0:19545
Latest checkpoint's NextOID:          16646
......

(3)使用pg_resetxlog,指定oid和xid

Darren1:postgres:/usr/local/pgsql/bin:>pg_resetxlog -o 16646 -x 19545 -f /usr/local/pgsql/data/
Transaction log reset
Darren1:postgres:/usr/local/pgsql/data/pg_xlog:>ll
-rw-------. 1 postgres dba      302 Jul 26 12:12 000000010000000000000008.00000028.backup
-rw-------. 1 postgres dba 16777216 Jul 27 05:07 000000010000000100000077
drwx------. 2 postgres dba    20480 Jul 27 05:07 archive_status
Darren1:postgres:/usr/local/pgsql/data/pg_xlog:>du -sh /usr/local/pgsql/data/pg_xlog/
17M    /usr/local/pgsql/data/pg_xlog/

(4)启动数据库

Darren1:postgres:/usr/local/pgsql/data/pg_xlog:>pg_ctl start

postgresql只导出函数

/usr/local/postgresql/bin/pg_dump --p5432 -U ddpguser -s -Fc -v -f temp.dump database

/usr/local/postgresql/bin/pg_restore -l temp.dump

/usr/local/postgresql/bin/pg_restore -l temp.dump | grep FUNCTION > functionlist

/usr/local/postgresql/bin/pg_restore -L functionlist temp.dump > function.sql

单独导出函数命令:

/usr/local/postgresql/bin/pg_dump --p5432 -U ddpguser -s -Fc -v -f temp.dump database  #导出表结构

/usr/local/postgresql/bin/pg_restore -l temp.dump | grep FUNCTION > functionlist #过滤函数 FUNCTION可以指定某个函数名

/usr/local/postgresql/bin/pg_restore -L functionlist temp.dump > function.sql #导出所有函数

PostgreSQL日志分析工具——pgBadger

摘要

之前曾介绍过PostgreSQL的日志审计,这会将执行的SQL输出到服务日志(pg_log),势必会带来性能问题,真正的问题是,这些记录对我们有多少帮助?所以我们来看一下如何使用增加的日志记录来做一些有用的事情。

pg_stat_statements 不仅输出SQL语句,还可以输出执行时间等,通过分析此服务器日志,可以知道执行什么样的SQL,以及缩小范围找到哪些SQL有可能出现性能问题。

SQL日志分析工具pgBadger

pgBadger 主页:home 下载地址:download

pgBadger是在Perl中创建的一个脚本,与PHP脚本中开发的名为pgFouine的程序具有相同的功能。 在命令行上指定并执行服务器日志时,会生成一个将服务器日志分析为HTML文件的报告。

此外,它不仅收集SQL,还收集服务器日志中的错误日志等。

环境

CentOS 6.9、PostgreSQL9.5.9、pgBadger 9.2

安装pgBadger

tar zxvf pgbadger-9.2.tar.gz 
cd pgbadger-9.2 
[root@localhost pgbadger-9.2]# ll 
total 1416 
drwxr-xr-x. 8 root root    4096 Sep 11 01:13 blib 
-rw-rw-r--. 1 root root   94609 Jul 28 07:45 ChangeLog 
-rw-rw-r--. 1 root root     347 Jul 28 07:45 CONTRIBUTING.md 
drwxrwxr-x. 2 root root    4096 Jul 28 07:45 doc 
-rw-rw-r--. 1 root root     903 Jul 28 07:45 LICENSE 
-rw-r--r--. 1 root root   24018 Sep 11 01:13 Makefile 
-rw-rw-r--. 1 root root    1400 Jul 28 07:45 Makefile.PL 
-rw-rw-r--. 1 root root      81 Jul 28 07:45 MANIFEST 
-rw-rw-r--. 1 root root     334 Jul 28 07:45 META.yml 
-rw-rw-r--. 1 root root 1256247 Jul 28 07:45 pgbadger 
-rw-r--r--. 1 root root       0 Sep 11 01:13 pm_to_blib 
-rw-rw-r--. 1 root root   30799 Jul 28 07:45 README 
drwxrwxr-x. 3 root root    4096 Jul 28 07:45 resources 
drwxrwxr-x. 2 root root    4096 Jul 28 07:45 tools 

perl Makefile.PL 

make; 

make install;  

查看安装版本

[root@localhost pgbadger-9.2]# which pgbadger 
/usr/local/bin/pgbadger 
[root@localhost pgbadger-9.2]# pgbadger -V 
pgBadger version 9.2  

PostgreSQL配置

logging_collector = on 
log_filename = 'postgresql-%w.log' 
log_file_mode = 0640 
log_truncate_on_rotation = on 
log_rotation_age = 1d 
log_min_duration_statement = 0 
log_checkpoints = on 
log_connections = on 
log_disconnections = on 
log_duration = on 
log_lock_waits = on 
log_line_prefix = '%t [%p]: [%l-1] user=%u,db=%d '  

安装httpd、php

yum install httpd 
chkconfig httpd on 
service httpd start 
yum install php  

查看/var/www

[root@localhost www]# pwd 
/var/www 
[root@localhost www]# ll 
total 20 
drwxr-xr-x. 2 root root 4096 Aug 15 15:45 cgi-bin 
drwxr-xr-x. 3 root root 4096 Sep 11 02:23 error 
drwxr-xr-x. 2 root root 4096 Sep 11 03:43 html 
drwxr-xr-x. 3 root root 4096 Sep 11 02:23 icons 
drwxr-xr-x. 3 root root 4096 Sep 11 04:33 pgbadger  

日志分析

./pgbench -i 
./pgbench -c 10 -t 1000 

[root@localhost ~]# pgbadger /opt/postgres/db/pgsql-9.5.9/data/pg_log/*.log -o /var/www/pgbadger/out.html -f stderr 
[========================>] Parsed 10485802 bytes of 10485802 (100.00%), queries: 65341, events: 2 
[========================>] Parsed 755640 bytes of 755640 (100.00%), queries: 70036, events: 2 
LOG: Ok, generating html report... 
[root@localhost ~]#   

在浏览器打开/var/www/pgbadger/out.html

未分类

未分类

未分类

连续日志分析(增量模式)

增量模式用于连续获取分析结果。

以增量模式执行pgBadger会在第二天创建下一个报告(增量报告)。

[root@localhost ~]# pgbadger -I /opt/postgres/db/pgsql-9.5.9/data/pg_log/*.log -o /var/www/pgbadger/out.html -f stderr 
[========================>] Parsed 1499636 bytes of 1499636 (100.00%), queries: 0, events: 0 
[========================>] Parsed 10485846 bytes of 10485846 (100.00%), queries: 65379, events: 0 
[========================>] Parsed 743891 bytes of 743891 (100.00%), queries: 4625, events: 0 
LOG: Ok, generating HTML daily report into /var/www/pgbadger//2017/09/11/... 
LOG: Ok, generating HTML daily report into /var/www/pgbadger//2017/09/12/... 
LOG: Ok, generating HTML weekly report into /var/www/pgbadger//2017/week-38/... 
LOG: Ok, generating global index to access incremental reports... 

[root@localhost ~]# ll /var/www/pgbadger/ 
total 692 
drwxr-xr-x. 4 root root   4096 Sep 11 21:09 2017 
-rw-r--r--. 1 root root 695474 Sep 12 21:15 index.html 
-rw-r--r--. 1 root root    187 Sep 12 21:15 LAST_PARSED 
drwxrwxrwx. 6 1107 1107   4096 Aug 28 17:44 postgresql-9.5.9 
[root@localhost ~]# ll /var/www/pgbadger/2017/ 
total 8 
drwxr-xr-x. 4 root root 4096 Sep 12 21:15 09 
drwxr-xr-x. 2 root root 4096 Sep 11 21:09 week-38 
[root@localhost ~]#   

这里创建一个具有年份的目录,链接所有报告的索引页面以及保存最后一个解析行的文件。

以增量模式创建报表时,会创建链接每个报表页面的索引页(index.html)。

未分类

总结

pgBadger是一个完美的分析工具,旨在提高数据库的性能,因为它具有丰富的统计结果。

当你不知道PostgreSQL性能坏的原因,如果你认为查询执行时间是可疑的,可以尝试使用它。

postgresql导入导出数据库

一、postgresql 导出的数据库, 标准语句

pg_dump --host [**地址**] --port [**端口**] --username [**数据库的用户名**] > [**导出的文件**] [**数据库名字**]

例子:

pg_dump --host xxxxx.com --port 3434 --username cs  > cs.sql cs

我们从http://xxxxx.com的地址上, 通过postgresql开放端口3434,并使用的cs的用户,导出了命为cs数据库, 存到了cs.sq文件中。

二、postgresql导入数据库, 标准语句

psql -d [**数据库名字**] -f [**文件名**] [**用户名**]

例子:

psql -d cs  -f cs.sql cs

我们首先要将cs.sql导入目标主机上, 在运行上条命令。

我们将cs.sql文件中的数据库导入cs用户下的cs数据库中。

三、导入docker容器中的postgresql中

sudo docker exec -i [**容器id**] psql -U [**用户名**] -d [**数据库名**] < [文件路径]

例子:

sudo docker exec -i xxxxxxx psql -U cs  -d cs < /home/lixiang/cs.sql

提示:

mac启动数据库

pg_ctl -D /usr/local/var/postgres -l /usr/local/var/postgres/server.log start

创建用户

CREATE USER [**db_name**] WITH PASSWORD [**password**]     

修改角色权限:

alter user [**用户名**] superuser