PostgreSQL 介绍及发展历史 介绍 发展历史 克隆 PostgreSQL 的源代码 找到其第一次提交记录 看下第一次提交的信息 发布策略、版本号及生命周期 探索 PostgreSQL 中的术语 总结 PostgreSQL 安装 编译方式安装 yum 方式安装 apt 方式安装 Docker 方式运行 Mac/Windows 方式安装 Mac 方式安装 Windows 方式安装 pgAdmin 安装 启动/停止/重启 启动 停止 重启 总结 PG 多环境部署 了解我们的 PG 集群 pg_ctl PostgreSQL 进程一览 模板数据库 探索 PGDATA 磁盘布局 PGDATA 目录中的对象 Tablespaces PostgreSQL vs. MySQL 数据定义语言(DDL) 创建数据库 创建表 数据操纵语言(DML) 插入数据 查询数据 更新数据 删除数据 数据控制语言(DCL) 授权 撤销授权 结论 MySQL 与 PostgreSQL 中的数据类型对比 1. 数据类型 2. 索引 3. 约束 4. 事务处理 客户端连接的区别 基本操作命令的区别 建表语句的区别 MySQL 与 PostgreSQL 中的概念对比:Database 与 Schema MySQL 中的 Database 与 Schema PostgreSQL 中的 Database 与 Schema 总结 PostgreSQL 用户及授权管理 用户及组介绍 角色管理 创建角色 角色密码、连接和可用性 角色作为组 移除角色 检查已有角色 角色级别的连接管理 pg_hba.conf 语法 pg_hba.conf 中的规则顺序 多规则合并 授权规则中使用组 授权规则中使用文件 检查 pg_hba.conf 规则 pg_hba.conf 中引入其他文件 附录 命令行执行查询 查看用户的授权 总结 PostgreSQL 用户及授权管理 02:深入理解角色 深入理解角色 与新建对象相关的属性 与超级用户相关的属性 与复制相关的属性 与 RLS 相关的属性 修改角色属性:ALTER ROLE 语句 重命名角色 SESSION_USER vs. CURRENT_USER 为角色配置参数 查看角色信息 角色继承 权限是如何解析的 角色继承回顾 总结 PostgreSQL 用户及授权管理 03:ACLs ACLs 默认 ACLs 了解默认 ACLs 总结 PostgreSQL 用户及授权管理 04:授予及回收权限 授予及回收权限 表相关的权限 基于列的权限 序列相关的权限 schema 相关的权限 schema 中的所有对象 编程语言相关的权限 例程相关的权限 database 相关的权限 授予对象所有者 获取 ACL 信息 总结 PostgreSQL 用户及授权管理 05:RLS RLS 总结 PostgreSQL 用户及授权管理 06:启用 SSL 及验证 SSL 连接加密 生成相关的证书 通过 openssl 的方式创建证书 通过云厂商申请免费证书 为集群配置 SSL 通过 SSL 连接集群 附录 PostgreSQL 不支持 SSL 问题解决 抓包验证连接是否加密 没开启 SSL 的连接验证 已开启 SSL 的连接验证 总结 PostgreSQL 基础 SQL 创建及管理数据库 创建数据库 Schema 介绍 public 模式介绍 search_path 变量介绍 正确的打开方式 查看所有的表 从已修改的模板创建数据库 删除表及库 创建数据库副本 查看数据库的大小 创建 database 的时候发生了什么 表的管理 EXISTS 选项 临时表的管理 管理 unlogged 表 创建表 为表及字段添加注释 表操纵语句 插入及查询数据 NULL 值 NULL 值的排序 表的复制 更新数据 删除数据 总结 PostgreSQL 高级语句 01:高级 SELECT 探索 SELECT 语句 使用 like 子句 使用 ilike 子句 使用 distinct 使用 limit 及 offset 使用子查询 子查询和 IN/NOT IN 条件 子查询和 EXISTS/NOT EXISTS 条件 PostgreSQL 高级语句 02:连接查询 连接查询 内连接(INNER JOIN) INNER JOIN vs. EXISTS/IN 左连接(LEFT JOIN) 右连接(RIGHT JOIN) 全外连接(FULL OUTTER JOIN) 横向连接(LATERAL JOIN) PostgreSQL 高级语句 03:聚合函数 聚合函数 UNION/UNION ALL EXCEPT/INTERSECT PostgreSQL 高级语句 04:RETURNING 子句 UPSERT 语句 INSERT 的 RETURNING 子句 更新相关的多条记录 MERGE UPDATE 的 RETURNING 子句 DELETE 的 RETURNING 子句 PostgreSQL 高级语句 05:CTEs 探索 CTEs 什么是 CTE CTE - 使用场景 递归查询 递归 CTEs 总结 PostgreSQL 之 psql 命令定制 登录数据库 使用 psql 进阶功能 psql 定制 定制提示符 打开时间统计 执行系统命令 观察语句执行 常用的命令总结 查看当前的连接信息 查看数据库的运行时间 查看数据库目录 查看库里面有多少表 数据库及表占用磁盘空间大小 查看当前连接的信息 最大的 Top N 表是哪个 Window 函数 基础窗口函数 使用 PARTITION BY 函数及 WINDOW 子句 一些有用的函数 ROW_NUMBER 函数 ORDER BY 子句 FIRST_VAULE LAST_VAULE RANK DENSE_RANK LAG 及 LEAD 函数 CUME_DIST 函数 NTILE 函数 高级窗口函数 frame 子句 start_point 与 end_point 之间的行 RANGE BETWEEN 子句 总结 服务端编程 数据类型 什么是可扩展性 标准数据类型 布尔类型 数值类型 整型 固定精度的数值类型 任意精度的数值类型 字符类型 固定长度的字符类型 可变长度的字符类型(varchar) 可变长度的字符类型(text) 日期/时间戳类型 date 类型 区域设置和格式 timestamp 类型 NoSQL 数据类型 hstore 类型 JSON 类型 函数及编程语言 函数 SQL 函数 基础函数 返回一组数据的 SQL 函数 返回一个表的 SQL 函数 SQL 函数的多态 PL/pgSQL 函数 一个例子 删除函数 声明函数参数 输入/输出参数 函数波动性(易变性、稳定性)类别 控制结构 条件语句 IF 语句 CASE 语句 循环语句 record 类型 异常处理语句 安全定义 总结 触发器及规则 PostgreSQL 中的规则 理解 OLD 及 NEW 变量 INSERT 相关规则 ALSO 选项 INSTEAD 选项 INSTEAD NOTHING 选项 DELETE/UPDATE 相关规则 创建 new_tags 表 创建两个表 管理 INSERT/DELETE/UPDATE 事件上的规则 INSERT 规则 DELETE 规则 UPDATE 规则 PostgreSQL 中的触发器 触发器语法 INSERT 相关的触发器 TG_OP 变量 UPDATE/DELETE 相关的触发器 事件触发器 事件触发器示例 总结 分区 基本概念 范围分区 列表分区 哈希分区 表继承 drop 表 声明式分区 列表分区 范围分区 分区维护 附加新分区 分离现有分区 将现有表附加到父表 默认分区 分区及表空间 一个例子 总结 事务处理 事务介绍 隐式与显式事务对比 事务中的时间 事务 ID 相关问题 虚拟和真实事务 ID 多版本并发控制(MVCC) 事务隔离级别 读未提交 读已提交 可重复读 可串行化 MVCC 详解 Savepoints Deadlocks 持久性及一致性的保证:WALs WALs 如何保证宕机恢复 Checkpoints Checkpoints 配置参数 checkpoint_timeout 与 max_wal_size Checkpoints 限制 手工触发一个 checkpoint VACUUM 手工 VACUUM 自动 VACUUM 总结 扩展 PostgreSQL 扩展介绍 Extension 生态 Gnu/Linux 的输出 Mac 的输出 Extension 的组成 控制文件 脚本文件 管理扩展 创建扩展 查看已安装的扩展 查看可用的扩展版本 更改已有扩展 删除扩展 PGXN 客户端 Debian 系列安装 pgxnclient RHEL 系列安装 pgxnclient 源码安装 pgxnclient pgxnclient 命令行介绍 安装扩展 通过 pgxnclient 安装扩展 手工安装扩展 使用安装的扩展 删除已安装的扩展 通过 pgxnclient 删除扩展 删除手工编译的扩展 创建自己的扩展 定义一个扩展 创建扩展文件 安装自定义的扩展 扩展升级 执行扩展升级 总结 调优 语句的执行 执行阶段 优化器 优化器使用的节点 顺序节点 顺序扫描 索引扫描 连接节点 并行节点 收集节点 并行扫描 并行连接 并行聚合 优化器何时选择并行计划? 其他实用节点 节点的成本 索引 索引类型 创建索引 查看索引 删除索引 索引失效 重建索引 EXPLAIN 语句 EXPLAIN 的输出格式 EXPLAIN ANALYZE 语句 EXPLAIN 选项 查询优化示例 ANALYZE 更新统计数据 Auto-explain 总结 日志及审计 01:日志 日志介绍 日志存放哪里 何时记录日志 需要记录什么 使用 pgBadger 抽取日志信息 安装 pgBadger 配置 PostgreSQL 以使用 pgBadger 使用 pgBadger 定时执行 pgBadger 总结 日志及审计 02:审计 实施审计 安装 PgAudit 配置 PostgreSQL 以使用 PgAudit 配置 PgAudit 会话级别审计 角色级别审计 总结 备份及恢复 备份及恢复类型介绍 逻辑备份 单库备份 单库恢复 备份指定的表及序列 压缩 备份格式及 pg_restore 我们查看一下里面的内容 选择性恢复 备份整个集群 并行备份 定时备份 COPY 命令 物理备份 手动物理备份 pg_verifybackup 启动克隆的集群 从物理备份恢复 PITR 背后的基本概念 总结 集群配置 集群配置 查看所有的配置参数 查看配置错误 配置嵌套 配置上下文 主配置相关设置 WAL 配置 其输出如下,仅截取部分输出 内存相关配置 进程信息配置 网络相关配置 归档及同步相关配置 Vacuum 及 autovacuum 相关配置 统计收集 配置修改 生成配置 总结 集群监控 查询及会话相关的信息 检查锁 检查数据库 检查表及索引 更多统计信息 pg_stat_statements 安装 pg_stat_statments 扩展 使用 pg_stat_statments 重置 pg_stat_statements 收集的数据 微调 pg_stat_statments 总结 PostgreSQL 监控实战 安装及配置 PMM 服务端 安装 PMM 服务端 卸载旧的 Docker 软件包 安装及配置 PMM 客户端 安装 PMM 客户端 Debian 系列安装 RHEL 系列安装 PMM 客户端注册 PMM 客户端取消注册 添加服务 创建数据库的 PMM 账号 安装及配置扩展 通过 UI 界面添加 通过命令行添加 删除服务 物理复制 物理复制的基本概念 物理复制及 WALs wal_level 指令 流复制环境准备 管理流复制 流复制的基本概念 异步复制环境 wal_keep_segments 选项 复制槽 pg_basebackup 命令 异步复制 复制监控 同步复制 PostgreSQL 设置 主节点配置 从节点配置 级联复制 延迟复制 从节点提升为主节点 总结 逻辑复制 逻辑复制的一些基本概念 逻辑复制与物理复制的对比 探索逻辑复制 逻辑复制环境设置 创建复制角色 主服务器的 postgresql.conf 复制服务器的 postgresql.conf pg_hba.conf 文件 开始配置逻辑复制 监控逻辑复制 只读 vs. 可写 DDL 问题 关闭逻辑复制 同时使用物理复制与逻辑复制 总结 有用的工具及扩展 Exploring the pg_trgm extension 使用 postgres_fdw 扩展 pgloader 迁移工具 从 MySQL 迁移到 PostgreSQL