Posts in 2018
  • 故障档案:快慢不匀雪崩

    2018年04月08日 in PG 管理

    最近发生了一起匪夷所思的故障,某数据库切走了一半的数据量和负载。 其他什么都没变,本来还好;压力减小,却在高峰期陷入濒死状态,完全不符合直觉。 但正如福尔摩斯所说,当你排除掉一切不可能之后,剩下的即使再离奇,也是事实。 一、摘要 某日凌晨4点,进行了核心库进行分库迁移,拆走一半的表和一半的查询负载,原库节点规模不变。 当日晚高峰核心库所有热备库(15台)出现连接堆积,压力暴涨,针对性地清理慢查询不再起效。 无差别持续杀查询,有立竿见影的救火效果(22:30后),且暂停后故障立刻重 …

    Read more

  • Bash与psql小技巧

    2018年04月07日 in PG 管理

    一些PostgreSQL与Bash交互的技巧。 使用严格模式编写Bash脚本 使用Bash严格模式,可以避免很多无谓的错误。在Bash脚本开始的地方放上这一行很有用: set -euo pipefail -e:当程序返回非0状态码时报错退出 -u:使用未初始化的变量时报错,而不是当成NULL -o pipefail:使用Pipe中出错命令的状态码(而不是最后一个)作为整个Pipe的状态码1。 执行SQL脚本的Bash包装脚本 通过psql运行SQL脚本时,我们期望有这么两个功能: 能向脚本中传入 …

    Read more

  • 用 Exclude 实现互斥约束

    2018年04月06日 in PG 开发

    Exclude约束是一个PostgreSQL扩展,它可以实现一些更高级,更巧妙的的数据库约束。 前言 数据完整性是极其重要的,但由应用保证的数据完整性并不总是那么靠谱:人会犯傻,程序会出错。如果能通过数据库约束来强制数据完整性那是再好不过了:后端程序员不用再担心竞态条件导致的微妙错误,数据分析师也可以对数据质量充满信心,不需要验证与清洗。 关系型数据库通常会提供PRIMARY KEY, FOREIGN KEY, UNIQUE, CHECK约束,然而并不是所有的业务约束都可以用这几种约束表达。一些 …

    Read more

  • 函数易变性等级分类

    2018年04月06日 in PG 开发

    PgSQL中的函数默认有三种易变性等级,合理使用可以显著改善性能。 核心种差 VOLATILE : 有副作用,不可被优化。 STABLE: 执行了数据库查询。 IMMUTABLE : 纯函数,执行结果可能会在规划时被预求值并缓存。 什么时候用? VOLATILE : 有任何写入,有任何副作用,需要看到外部命令所做的变更,或者调用了任何VOLATILE的函数 STABLE: 有数据库查询,但没有写入,或者函数的结果依赖于配置参数(例如时区) IMMUTABLE : 纯函数。 具体解释 每个函数都带 …

    Read more

  • Distinct On 去除重复数据

    2018年04月06日 in PG 开发

    Distinct On是PostgreSQL提供的特有语法,可以高效解决一些典型查询问题,例如,快速找出分组内具有最大最小值的记录。 前言 找出分组内具有最大最小值的记录,这是一个非常常见的需求。用传统SQL当然有办法解决,但是都不够优雅,PostgreSQL的SQL扩展语法Distinct ON能一步到位解决这一类问题。 DISTINCT ON 语法 SELECT DISTINCT ON (expression [, expression ...]) select_list ... Here …

    Read more

  • PostgreSQL例行维护

    2018年02月10日 in PG 管理

    汽车需要上油,数据库也需要维护保养。 PG中的维护工作 对Pg而言,有三项比较重要的维护工作:备份、重整、清理 备份(backup):最重要的例行工作,生命线。 制作基础备份 归档增量WAL 重整(repack) 重整表与索引能消除其中的膨胀,节约空间,确保查询性能不会劣化。 清理(vacuum) 维护表与库的年龄,避免事务ID回卷故障。 更新统计数据,生成更好的执行计划。 回收死元组。节约空间,提高性能。 备份 备份可以使用pg_backrest 作为一条龙解决方案,但这里考虑使用脚本进行备 …

    Read more

  • 备份恢复手段概览

    2018年02月09日 in PG 管理

    备份是DBA的安身立命之本,有备份,就不用慌。 备份有三种形式:SQL转储,文件系统备份,连续归档 1. SQL转储 SQL 转储方法的思想是: 创建一个由SQL命令组成的文件,服务器能利用其中的SQL命令重建与转储时状态一样的数据库。 1.1 转储 工具pg_dump、pg_dumpall用于进行SQL转储。结果输出到stdout。 pg_dump dbname > filename pg_dump dbname -f filename pg_dump是一个普通的PostgreSQL客户 …

    Read more

  • Pgbouncer快速上手

    2018年02月07日 in PG 管理

    Pgbouncer是一个轻量级的数据库连接池。 概要 pgbouncer [-d][-R][-v][-u user] <pgbouncer.ini> pgbouncer -V|-h 描述 pgbouncer 是一个PostgreSQL连接池。 任何目标应用程序都可以连接到 pgbouncer, 就像它是PostgreSQL服务器一样,pgbouncer 将创建到实际服务器的连接, 或者它将重用其中一个现有的连接。 pgbouncer 的目的是为了降低打开PostgreSQL新连接时的 …

    Read more

  • PgBackRest2中文文档

    2018年02月07日 in PG 管理

    pgBackRest主页:http://pgbackrest.org pgBackRest Github主页:https://github.com/pgbackrest/pgbackrest 前言 pgBackRest旨在提供一个简单可靠,容易纵向扩展的PostgreSQL备份恢复系统。 pgBackRest并不依赖像tar和rsync这样的传统备份工具,而在内部实现所有备份功能,并使用自定义协议来与远程系统进行通信。 消除对tar和rsync的依赖可以更好地解决特定于数据库的备份问题。 自定义 …

    Read more

  • 使用sysbench测试PostgreSQL性能

    2018年02月06日 in PG 管理

    sysbench首页:https://github.com/akopytov/sysbench 安装 二进制安装,在Mac上,使用brew安装sysbench。 brew install sysbench --with-postgresql 源代码编译(CentOS): yum -y install make automake libtool pkgconfig libaio-devel # For MySQL support, replace with mysql-devel on …

    Read more