目錄 搜尋
前言 何为PostgreSQL? PostgreSQL简史 格式约定 更多信息 臭虫汇报指导 I. 教程 章1. 从头开始 1.1. 安装 1.2. 体系基本概念 1.3. 创建一个数据库 1.4. 访问数据库 章2. SQL语言 2.1. 介绍 2.2. 概念 2.3. 创建新表 2.4. 向表中添加行 2.5. 查询一个表 2.6. 表间链接 2.7. 聚集函数 2.8. 更新 2.9. 删除 章3. 高级特性 3.1. 介绍 3.2. 视图 3.3. 外键 3.4. 事务 3.5. 窗口函数 3.6. 继承 3.7. 结论 II. SQL语言 章4. SQL语法 4.1. 词法结构 4.2. 值表达式 4.3. 调用函数 章5. 数据定义 5.1. 表的基本概念 5.2. 缺省值 5.3. 约束 5.4. 系统字段 5.5. 修改表 5.6. 权限 5.7. 模式 5.8. 继承 5.9. 分区 5.10. 其它数据库对象 5.11. 依赖性跟踪 章 6. 数据操作 6.1. 插入数据 6.2. 更新数据 6.3. 删除数据 章7. 查询 7.1. 概述 7.2. 表表达式 7.3. 选择列表 7.4. 组合查询 7.5. 行排序 7.6. LIMIT和OFFSET 7.7. VALUES列表 7.8. WITH的查询(公用表表达式) 章8. 数据类型 8.1. 数值类型 8.2. 货币类型 8.3. 字符类型 8.4. 二进制数据类型 8.5. 日期/时间类型 8.6. 布尔类型 8.7. 枚举类型 8.8. 几何类型 8.9. 网络地址类型 8.10. 位串类型 8.11. 文本搜索类型 8.12. UUID类型 8.13. XML类型 8.14. 数组 8.15. 复合类型 8.16. 对象标识符类型 8.17. 伪类型 章 9. 函数和操作符 9.1. 逻辑操作符 9.2. 比较操作符 9.3. 数学函数和操作符 9.4. 字符串函数和操作符 9.5. 二进制字符串函数和操作符 9.6. 位串函数和操作符 9.7. 模式匹配 9.8. 数据类型格式化函数 9.9. 时间/日期函数和操作符 9.10. 支持枚举函数 9.11. 几何函数和操作符 9.12. 网络地址函数和操作符 9.13. 文本检索函数和操作符 9.14. XML函数 9.15. 序列操作函数 9.16. 条件表达式 9.17. 数组函数和操作符 9.18. 聚合函数 9.19. 窗口函数 9.20. 子查询表达式 9.21. 行和数组比较 9.22. 返回集合的函数 9.23. 系统信息函数 9.24. 系统管理函数 9.25. 触发器函数 章10. 类型转换 10.3. 函数 10.2. 操作符 10.1. 概述 10.4. 值存储 10.5. UNION 章11. 索引 11.1. 介绍 11.2. 索引类型 11.3. 多字段索引 11.4. 索引和ORDER BY 11.5. 组合多个索引 11.6. 唯一索引 11.7. 表达式上的索引 11.8. 部分索引 11.9. 操作类和操作簇 11.10. 检查索引的使用 章12. Full Text Search 12.1. Introduction 12.2. Tables and Indexes 12.3. Controlling Text Search 12.4. Additional Features 12.5. Parsers 12.6. Dictionaries 12.7. Configuration Example 12.8. Testing and Debugging Text Search 12.9. GiST and GIN Index Types 12.10. psql Support 12.11. Limitations 12.12. Migration from Pre-8.3 Text Search 章13. 并发控制 13.1. 介绍 13.2. 事务隔离 13.3. 明确锁定 13.4. 应用层数据完整性检查 13.5. 锁和索引 章14. 性能提升技巧 14.1. 使用EXPLAIN 14.2. 规划器使用的统计信息 14.3. 用明确的JOIN语句控制规划器 14.4. 向数据库中添加记录 14.5. 非持久性设置 III. 服务器管理 章15. 安装指导 15.1. 简版 15.2. 要求 15.3. 获取源码 15.4. 升级 15.5. 安装过程 15.6. 安装后的设置 15.7. 支持的平台 15.8. 特殊平台的要求 章16. Installation from Source Code on Windows 16.1. Building with Visual C++ or the Platform SDK 16.2. Building libpq with Visual C++ or Borland C++ 章17. 服务器安装和操作 17.1. PostgreSQL用户帐户 17.2. 创建数据库集群 17.3. 启动数据库服务器 17.4. 管理内核资源 17.5. 关闭服务 17.6. 防止服务器欺骗 17.7. 加密选项 17.8. 用SSL进行安全的TCP/IP连接 17.9. Secure TCP/IP Connections with SSH Tunnels 章18. 服务器配置 18.1. 设置参数 18.2. 文件位置 18.3. 连接和认证 18.4. 资源消耗 18.5. 预写式日志 18.6. 查询规划 18.7. 错误报告和日志 18.8. 运行时统计 18.9. 自动清理 18.10. 客户端连接缺省 18.12. 版本和平台兼容性 18.11. 锁管理 18.13. 预置选项 18.14. 自定义的选项 18.15. 开发人员选项 18.16. 短选项 章19. 用户认证 19.1. pg_hba.conf 文件 19.2. 用户名映射 19.3. 认证方法 19.4. 用户认证 章20. 数据库角色和权限 20.1. 数据库角色 20.2. 角色属性 20.3. 权限 20.4. 角色成员 20.5. 函数和触发器 章21. 管理数据库 21.1. 概述 21.2. 创建一个数据库 21.3. 临时库 21.4. 数据库配置 21.5. 删除数据库 21.6. 表空间 章22. 本土化 22.1. 区域支持 22.2. 字符集支持 章23. 日常数据库维护工作 23.1. Routine Vacuuming日常清理 23.2. 经常重建索引 23.3. 日志文件维护 章24. 备份和恢复 24.1. SQL转储 24.2. 文件系统级别的备份 24.3. 在线备份以及即时恢复(PITR) 24.4. 版本间迁移 章25. 高可用性与负载均衡,复制 25.1. 不同解决方案的比较 25.2. 日志传送备份服务器 25.3. 失效切换 25.4. 日志传送的替代方法 25.5. 热备 章26. 恢复配置 26.1. 归档恢复设置 26.2. 恢复目标设置 26.3. 备服务器设置 章27. 监控数据库的活动 27.1. 标准Unix工具 27.2. 统计收集器 27.3. 查看锁 27.4. 动态跟踪 章28. 监控磁盘使用情况 28.1. 判断磁盘的使用量 28.2. 磁盘满导致的失效 章29. 可靠性和预写式日志 29.1. 可靠性 29.2. 预写式日志(WAL) 29.3. 异步提交 29.4. WAL配置 29.5. WAL内部 章30. Regression Tests 30.1. Running the Tests 30.2. Test Evaluation 30.3. Variant Comparison Files 30.4. Test Coverage Examination IV. 客户端接口 章31. libpq-C库 31.1. 数据库联接函数 31.2. 连接状态函数 31.3. 命令执行函数 31.4. 异步命令处理 31.5. 取消正在处理的查询 31.6. 捷径接口 31.7. 异步通知 31.8. 与COPY命令相关的函数 31.9. Control Functions 控制函数 31.10. 其他函数 31.11. 注意信息处理 31.12. 事件系统 31.13. 环境变量 31.14. 口令文件 31.15. 连接服务的文件 31.16. LDAP查找连接参数 31.17. SSL支持 31.18. 在多线程程序里的行为 31.19. 制作libpq程序 31.20. 例子程序 章32. 大对象 32.1. 介绍 32.2. 实现特点 32.3. 客户端接口 32.4. 服务器端函数 32.5. 例子程序 章33. ECPG - Embedded SQL in C 33.1. The Concept 33.2. Connecting to the Database Server 33.3. Closing a Connection 33.4. Running SQL Commands 33.5. Choosing a Connection 33.6. Using Host Variables 33.7. Dynamic SQL 33.8. pgtypes library 33.9. Using Descriptor Areas 33.10. Informix compatibility mode 33.11. Error Handling 33.12. Preprocessor directives 33.13. Processing Embedded SQL Programs 33.14. Library Functions 33.15. Internals 章34. 信息模式 34.1. 关于这个模式 34.2. 数据类型 34.3. information_schema_catalog_name 34.4. administrable_role_authorizations 34.5. applicable_roles 34.6. attributes 34.7. check_constraint_routine_usage 34.8. check_constraints 34.9. column_domain_usage 34.10. column_privileges 34.11. column_udt_usage 34.12. 字段 34.13. constraint_column_usage 34.14. constraint_table_usage 34.15. data_type_privileges 34.16. domain_constraints 34.18. domains 34.17. domain_udt_usage 34.19. element_types 34.20. enabled_roles 34.21. foreign_data_wrapper_options 34.22. foreign_data_wrappers 34.23. foreign_server_options 34.24. foreign_servers 34.25. key_column_usage 34.26. parameters 34.27. referential_constraints 34.28. role_column_grants 34.29. role_routine_grants 34.30. role_table_grants 34.31. role_usage_grants 34.32. routine_privileges 34.33. routines 34.34. schemata 34.35. sequences 34.36. sql_features 34.37. sql_implementation_info 34.38. sql_languages 34.39. sql_packages 34.40. sql_parts 34.41. sql_sizing 34.42. sql_sizing_profiles 34.43. table_constraints 34.44. table_privileges 34.45. tables 34.46. triggered_update_columns 34.47. 触发器 34.48. usage_privileges 34.49. user_mapping_options 34.50. user_mappings 34.51. view_column_usage 34.52. view_routine_usage 34.53. view_table_usage 34.54. 视图 V. 服务器端编程 章35. 扩展SQL 35.1. 扩展性是如何实现的 35.2. PostgreSQL类型系统 35.3. User-Defined Functions 35.4. Query Language (SQL) Functions 35.5. Function Overloading 35.6. Function Volatility Categories 35.7. Procedural Language Functions 35.8. Internal Functions 35.9. C-Language Functions 35.10. User-Defined Aggregates 35.11. User-Defined Types 35.12. User-Defined Operators 35.13. Operator Optimization Information 35.14. Interfacing Extensions To Indexes 35.15. 用C++扩展 章36. 触发器 36.1. 触发器行为概述 36.3. 用 C 写触发器 36.2. 数据改变的可视性 36.4. 一个完整的例子 章37. 规则系统 37.1. The Query Tree 37.2. 视图和规则系统 37.3. 在INSERT,UPDATE和DELETE上的规则 37.4. 规则和权限 37.5. 规则和命令状态 37.6. 规则与触发器得比较 章38. Procedural Languages 38.1. Installing Procedural Languages 章39. PL/pgSQL - SQL过程语言 39.1. 概述 39.2. PL/pgSQL的结构 39.3. 声明 39.4. 表达式 39.5. 基本语句 39.6. 控制结构 39.7. 游标 39.8. 错误和消息 39.9. 触发器过程 39.10. PL/pgSQL Under the Hood 39.11. 开发PL/pgSQL的一些提示 39.12. 从OraclePL/SQL 进行移植 章40. PL/Tcl - Tcl Procedural Language 40.1. Overview 40.2. PL/Tcl Functions and Arguments 40.3. Data Values in PL/Tcl 40.4. Global Data in PL/Tcl 40.5. Database Access from PL/Tcl 40.6. Trigger Procedures in PL/Tcl 40.7. Modules and the unknown command 40.8. Tcl Procedure Names 章41. PL/Perl - Perl Procedural Language 41.1. PL/Perl Functions and Arguments 41.2. Data Values in PL/Perl 41.3. Built-in Functions 41.4. Global Values in PL/Perl 41.6. PL/Perl Triggers 41.5. Trusted and Untrusted PL/Perl 41.7. PL/Perl Under the Hood 章42. PL/Python - Python Procedural Language 42.1. Python 2 vs. Python 3 42.2. PL/Python Functions 42.3. Data Values 42.4. Sharing Data 42.5. Anonymous Code Blocks 42.6. Trigger Functions 42.7. Database Access 42.8. Utility Functions 42.9. Environment Variables 章43. Server Programming Interface 43.1. Interface Functions Spi-spi-connect Spi-spi-finish Spi-spi-push Spi-spi-pop Spi-spi-execute Spi-spi-exec Spi-spi-execute-with-args Spi-spi-prepare Spi-spi-prepare-cursor Spi-spi-prepare-params Spi-spi-getargcount Spi-spi-getargtypeid Spi-spi-is-cursor-plan Spi-spi-execute-plan Spi-spi-execute-plan-with-paramlist Spi-spi-execp Spi-spi-cursor-open Spi-spi-cursor-open-with-args Spi-spi-cursor-open-with-paramlist Spi-spi-cursor-find Spi-spi-cursor-fetch Spi-spi-cursor-move Spi-spi-scroll-cursor-fetch Spi-spi-scroll-cursor-move Spi-spi-cursor-close Spi-spi-saveplan 43.2. Interface Support Functions Spi-spi-fname Spi-spi-fnumber Spi-spi-getvalue Spi-spi-getbinval Spi-spi-gettype Spi-spi-gettypeid Spi-spi-getrelname Spi-spi-getnspname 43.3. Memory Management Spi-spi-palloc Spi-realloc Spi-spi-pfree Spi-spi-copytuple Spi-spi-returntuple Spi-spi-modifytuple Spi-spi-freetuple Spi-spi-freetupletable Spi-spi-freeplan 43.4. Visibility of Data Changes 43.5. Examples VI. 参考手册 I. SQL命令 Sql-abort Sql-alteraggregate Sql-alterconversion Sql-alterdatabase Sql-alterdefaultprivileges Sql-alterdomain Sql-alterforeigndatawrapper Sql-alterfunction Sql-altergroup Sql-alterindex Sql-alterlanguage Sql-alterlargeobject Sql-alteroperator Sql-alteropclass Sql-alteropfamily Sql-alterrole Sql-alterschema Sql-altersequence Sql-alterserver Sql-altertable Sql-altertablespace Sql-altertsconfig Sql-altertsdictionary Sql-altertsparser Sql-altertstemplate Sql-altertrigger Sql-altertype Sql-alteruser Sql-alterusermapping Sql-alterview Sql-analyze Sql-begin Sql-checkpoint Sql-close Sql-cluster Sql-comment Sql-commit Sql-commit-prepared Sql-copy Sql-createaggregate Sql-createcast Sql-createconstraint Sql-createconversion Sql-createdatabase Sql-createdomain Sql-createforeigndatawrapper Sql-createfunction Sql-creategroup Sql-createindex Sql-createlanguage Sql-createoperator Sql-createopclass Sql-createopfamily Sql-createrole Sql-createrule Sql-createschema Sql-createsequence Sql-createserver Sql-createtable Sql-createtableas Sql-createtablespace Sql-createtsconfig Sql-createtsdictionary Sql-createtsparser Sql-createtstemplate Sql-createtrigger Sql-createtype Sql-createuser Sql-createusermapping Sql-createview Sql-deallocate Sql-declare Sql-delete Sql-discard Sql-do Sql-dropaggregate Sql-dropcast Sql-dropconversion Sql-dropdatabase Sql-dropdomain Sql-dropforeigndatawrapper Sql-dropfunction Sql-dropgroup Sql-dropindex Sql-droplanguage Sql-dropoperator Sql-dropopclass Sql-dropopfamily Sql-drop-owned Sql-droprole Sql-droprule Sql-dropschema Sql-dropsequence Sql-dropserver Sql-droptable Sql-droptablespace Sql-droptsconfig Sql-droptsdictionary Sql-droptsparser Sql-droptstemplate Sql-droptrigger Sql-droptype Sql-dropuser Sql-dropusermapping Sql-dropview Sql-end Sql-execute Sql-explain Sql-fetch Sql-grant Sql-insert Sql-listen Sql-load Sql-lock Sql-move Sql-notify Sql-prepare Sql-prepare-transaction Sql-reassign-owned Sql-reindex Sql-release-savepoint Sql-reset Sql-revoke Sql-rollback Sql-rollback-prepared Sql-rollback-to Sql-savepoint Sql-select Sql-selectinto Sql-set Sql-set-constraints Sql-set-role Sql-set-session-authorization Sql-set-transaction Sql-show Sql-start-transaction Sql-truncate Sql-unlisten Sql-update Sql-vacuum Sql-values II. 客户端应用程序 App-clusterdb App-createdb App-createlang App-createuser App-dropdb App-droplang App-dropuser App-ecpg App-pgconfig App-pgdump App-pg-dumpall App-pgrestore App-psql App-reindexdb App-vacuumdb III. PostgreSQL服务器应用程序 App-initdb App-pgcontroldata App-pg-ctl App-pgresetxlog App-postgres App-postmaster VII. 内部 章44. PostgreSQL内部概览 44.1. 查询路径 44.2. 连接是如何建立起来的 44.3. 分析器阶段 44.4. ThePostgreSQL规则系统 44.5. 规划器/优化器 44.6. 执行器 章45. 系统表 45.1. 概述 45.2. pg_aggregate 45.3. pg_am 45.4. pg_amop 45.5. pg_amproc 45.6. pg_attrdef 45.7. pg_attribute 45.8. pg_authid 45.9. pg_auth_members 45.10. pg_cast 45.11. pg_class 45.12. pg_constraint 45.13. pg_conversion 45.14. pg_database 45.15. pg_db_role_setting 45.16. pg_default_acl 45.17. pg_depend 45.18. pg_description 45.19. pg_enum 45.20. pg_foreign_data_wrapper 45.21. pg_foreign_server 45.22. pg_index 45.23. pg_inherits 45.24. pg_language 45.25. pg_largeobject 45.26. pg_largeobject_metadata 45.27. pg_namespace 45.28. pg_opclass 45.29. pg_operator 45.30. pg_opfamily 45.31. pg_pltemplate 45.32. pg_proc 45.33. pg_rewrite 45.34. pg_shdepend 45.35. pg_shdescription 45.36. pg_statistic 45.37. pg_tablespace 45.38. pg_trigger 45.39. pg_ts_config 45.40. pg_ts_config_map 45.41. pg_ts_dict 45.42. pg_ts_parser 45.43. pg_ts_template 45.44. pg_type 45.45. pg_user_mapping 45.46. System Views 45.47. pg_cursors 45.48. pg_group 45.49. pg_indexes 45.50. pg_locks 45.51. pg_prepared_statements 45.52. pg_prepared_xacts 45.53. pg_roles 45.54. pg_rules 45.55. pg_settings 45.56. pg_shadow 45.57. pg_stats 45.58. pg_tables 45.59. pg_timezone_abbrevs 45.60. pg_timezone_names 45.61. pg_user 45.62. pg_user_mappings 45.63. pg_views 章46. Frontend/Backend Protocol 46.1. Overview 46.2. Message Flow 46.3. Streaming Replication Protocol 46.4. Message Data Types 46.5. Message Formats 46.6. Error and Notice Message Fields 46.7. Summary of Changes since Protocol 2.0 47. PostgreSQL Coding Conventions 47.1. Formatting 47.2. Reporting Errors Within the Server 47.3. Error Message Style Guide 章48. Native Language Support 48.1. For the Translator 48.2. For the Programmer 章49. Writing A Procedural Language Handler 章50. Genetic Query Optimizer 50.1. Query Handling as a Complex Optimization Problem 50.2. Genetic Algorithms 50.3. Genetic Query Optimization (GEQO) in PostgreSQL 50.4. Further Reading 章51. 索引访问方法接口定义 51.1. 索引的系统表记录 51.2. 索引访问方法函数 51.3. 索引扫描 51.4. 索引锁的考量 51.5. 索引唯一性检查 51.6. 索引开销估计函数 章52. GiST Indexes 52.1. Introduction 52.2. Extensibility 52.3. Implementation 52.4. Examples 52.5. Crash Recovery 章53. GIN Indexes 53.1. Introduction 53.2. Extensibility 53.3. Implementation 53.4. GIN tips and tricks 53.5. Limitations 53.6. Examples 章54. 数据库物理存储 54.1. 数据库文件布局 54.2. TOAST 54.3. 自由空间映射 54.4. 可见映射 54.5. 数据库分页文件 章55. BKI后端接口 55.1. BKI 文件格式 55.2. BKI命令 55.3. 系统初始化的BKI文件的结构 55.4. 例子 章56. 规划器如何使用统计信息 56.1. 行预期的例子 VIII. 附录 A. PostgreSQL错误代码 B. 日期/时间支持 B.1. 日期/时间输入解析 B.2. 日期/时间关键字 B.3. 日期/时间配置文件 B.4. 日期单位的历史 C. SQL关键字 D. SQL Conformance D.1. Supported Features D.2. Unsupported Features E. Release Notes Release-0-01 Release-0-02 Release-0-03 Release-1-0 Release-1-01 Release-1-02 Release-1-09 Release-6-0 Release-6-1 Release-6-1-1 Release-6-2 Release-6-2-1 Release-6-3 Release-6-3-1 Release-6-3-2 Release-6-4 Release-6-4-1 Release-6-4-2 Release-6-5 Release-6-5-1 Release-6-5-2 Release-6-5-3 Release-7-0 Release-7-0-1 Release-7-0-2 Release-7-0-3 Release-7-1 Release-7-1-1 Release-7-1-2 Release-7-1-3 Release-7-2 Release-7-2-1 Release-7-2-2 Release-7-2-3 Release-7-2-4 Release-7-2-5 Release-7-2-6 Release-7-2-7 Release-7-2-8 Release-7-3 Release-7-3-1 Release-7-3-10 Release-7-3-11 Release-7-3-12 Release-7-3-13 Release-7-3-14 Release-7-3-15 Release-7-3-16 Release-7-3-17 Release-7-3-18 Release-7-3-19 Release-7-3-2 Release-7-3-20 Release-7-3-21 Release-7-3-3 Release-7-3-4 Release-7-3-5 Release-7-3-6 Release-7-3-7 Release-7-3-8 Release-7-3-9 Release-7-4 Release-7-4-1 Release-7-4-10 Release-7-4-11 Release-7-4-12 Release-7-4-13 Release-7-4-14 Release-7-4-15 Release-7-4-16 Release-7-4-17 Release-7-4-18 Release-7-4-19 Release-7-4-2 Release-7-4-20 Release-7-4-21 Release-7-4-22 Release-7-4-23 Release-7-4-24 Release-7-4-25 Release-7-4-26 Release-7-4-27 Release-7-4-28 Release-7-4-29 Release-7-4-3 Release-7-4-30 Release-7-4-4 Release-7-4-5 Release-7-4-6 Release-7-4-7 Release-7-4-8 Release-7-4-9 Release-8-0 Release-8-0-1 Release-8-0-10 Release-8-0-11 Release-8-0-12 Release-8-0-13 Release-8-0-14 Release-8-0-15 Release-8-0-16 Release-8-0-17 Release-8-0-18 Release-8-0-19 Release-8-0-2 Release-8-0-20 Release-8-0-21 Release-8-0-22 Release-8-0-23 Release-8-0-24 Release-8-0-25 Release-8-0-26 Release-8-0-3 Release-8-0-4 Release-8-0-5 Release-8-0-6 Release-8-0-7 Release-8-0-8 Release-8-0-9 Release-8-1 Release-8-1-1 Release-8-1-10 Release-8-1-11 Release-8-1-12 Release-8-1-13 Release-8-1-14 Release-8-1-15 Release-8-1-16 Release-8-1-17 Release-8-1-18 Release-8-1-19 Release-8-1-2 Release-8-1-20 Release-8-1-21 Release-8-1-22 Release-8-1-23 Release-8-1-3 Release-8-1-4 Release-8-1-5 Release-8-1-6 Release-8-1-7 Release-8-1-8 Release-8-1-9 Release-8-2 Release-8-2-1 Release-8-2-10 Release-8-2-11 Release-8-2-12 Release-8-2-13 Release-8-2-14 Release-8-2-15 Release-8-2-16 Release-8-2-17 Release-8-2-18 Release-8-2-19 Release-8-2-2 Release-8-2-20 Release-8-2-21 Release-8-2-3 Release-8-2-4 Release-8-2-5 Release-8-2-6 Release-8-2-7 Release-8-2-8 Release-8-2-9 Release-8-3 Release-8-3-1 Release-8-3-10 Release-8-3-11 Release-8-3-12 Release-8-3-13 Release-8-3-14 Release-8-3-15 Release-8-3-2 Release-8-3-3 Release-8-3-4 Release-8-3-5 Release-8-3-6 Release-8-3-7 Release-8-3-8 Release-8-3-9 Release-8-4 Release-8-4-1 Release-8-4-2 Release-8-4-3 Release-8-4-4 Release-8-4-5 Release-8-4-6 Release-8-4-7 Release-8-4-8 Release-9-0 Release-9-0-1 Release-9-0-2 Release-9-0-3 Release-9-0-4 F. 额外提供的模块 F.1. adminpack F.2. auto_explain F.3. btree_gin F.4. btree_gist F.5. chkpass F.6. citext F.7. cube F.8. dblink Contrib-dblink-connect Contrib-dblink-connect-u Contrib-dblink-disconnect Contrib-dblink Contrib-dblink-exec Contrib-dblink-open Contrib-dblink-fetch Contrib-dblink-close Contrib-dblink-get-connections Contrib-dblink-error-message Contrib-dblink-send-query Contrib-dblink-is-busy Contrib-dblink-get-notify Contrib-dblink-get-result Contrib-dblink-cancel-query Contrib-dblink-get-pkey Contrib-dblink-build-sql-insert Contrib-dblink-build-sql-delete Contrib-dblink-build-sql-update F.9. dict_int F.10. dict_xsyn F.11. earthdistance F.12. fuzzystrmatch F.13. hstore F.14. intagg F.15. intarray F.16. isn F.17. lo F.18. ltree F.19. oid2name F.20. pageinspect F.21. passwordcheck F.22. pg_archivecleanup F.23. pgbench F.24. pg_buffercache F.25. pgcrypto F.26. pg_freespacemap F.27. pgrowlocks F.28. pg_standby F.29. pg_stat_statements F.30. pgstattuple F.31. pg_trgm F.32. pg_upgrade F.33. seg F.34. spi F.35. sslinfo F.36. tablefunc F.37. test_parser F.38. tsearch2 F.39. unaccent F.40. uuid-ossp F.41. vacuumlo F.42. xml2 G. 外部项目 G.1. 客户端接口 G.2. 过程语言 G.3. 扩展 H. The Source Code Repository H.1. Getting The Source Via Git I. 文档 I.1. DocBook I.2. 工具集 I.3. 制作文档 I.4. 文档写作 I.5. 风格指导 J. 首字母缩略词 参考书目 Bookindex Index
文字

23.1. Routine Vacuuming日常清理

的PostgreSQL数据库需要定期维护为vacuuming。 对于许多安装,由autovacuum daemon执行清空操作足够了,其描述在Section 23.1.5。 要获得你想要的最佳结果,你可能需要调整所述的 autovacuuming 参数。某些数据库管理员将想要使用VACUUM命令, 补充或替换管理守护进程的活动,其将由cronTask Scheduler 脚本。要设置手动管理正确地清除,有必要了解在下面几个小节讨论的问题。那些依赖autovacuuming的管理员可能仍然希望略读这些资料, 帮助他们了解和调整autovacuuming。

23.1.1. 清理基础

PostgreSQL的 VACUUM 命令定期来处理每个表有以下几个原因:

  1. 通过更新或删除行恢复或重复使用所占用的磁盘空间。

  2. 通过PostgreSQL查询规划器更新数据统计分析。

  3. transaction ID wraparound可以防止由于非常旧的数据丢失

这些原因都决定了要执行不同的频率和范围的VACUUM操作,在下面的小节解释。

有两种VACUUM:标准的VACUUMVACUUM FULLVACUUM FULL可以回收更多的磁盘空间,但运行速度要慢得多。 VACUUM标准方式可以与产生的数据库操作并行运行。(像SELECTINSERTUPDATEDELETE命令可以工作正常, 但是当正在清理该表时,你不能使用像ALTER TABLE命令修改表定义。) VACUUM FULL需要在表上的一个排斥锁才能工作,并因此不能与其它使用该表的并行。 因此一般情况下管理员应尽量用标准的 VACUUM,并期避免使用VACUUM FULL

VACUUM 创建大量的I/O交互,这可能会导致其它活动会话性能表现不好。 这里有个配置参数,可以调整,以减少清理性能的影响, 请参阅 Section 18.4.3。

23.1.2. 恢复磁盘空间

在正常的 PostgreSQL 操作里,对一行的 UPDATEDELETE 并未立即删除旧版本的数据行。这个方法 对于获取多版本并发控制的好处是必要的(MVCC, 详情参阅章Chapter 13):如果一个行的版本仍有可能被其它事务看到, 那么你就不能删除它。但到了最后,不会有任何事务对过期的或者已经删除的 行感兴趣。而它占据的空间必须为那些新行的使用而回收,以避免对磁盘空间 的无休止需求。这件事是通过运行 VACUUM 实现的。

标准形式的VACUUM删除死行版本在表和索引标记以便将来重用的可用空间。 然而,它不会返回操作系统的空间,除非在特殊情况下,一个或多个表页成为完全自由,而且可以很容易获得一个独占表锁。 与此相反,VACUUM FULL积极压缩表,通过写完成没有死空间的表文件的新版本。这可以最大限度地减少表的大小,但可能需要很长一段时间。 这还需要额外的磁盘空间表的新副本,直到操作完成。 这可以最大限度地减少表的大小,但可能需要很长一段时间。这还需要额外的磁盘空间表的新副本,直到操作完成。

做标准VACUUM通常能够满足用日常清理的目标避免需要做VACUUM FULL。 autovacuum守护进程试图以这种方式工作,其实从不做 VACUUM FULL。 在这种方法中,这个想法不是保持表为最小尺寸,但要保持稳定状态的磁盘空间使用情况: 每张表占用的空间相当于其最小尺寸,加,获取到清理之间使用的多少空间。 尽管VACUUM FULL可用于收缩表为其最小尺寸,并返回磁盘空间给操作系统。 有一点在此不多如果表只会在将来再次增长。因此,适度频次运行标准VACUUM 要较好于 不频发的运行VACUUM FULL保持大量更新表。

有些管理员喜欢调度的清理本身,例如,晚上当负荷低时,做所有的工作。 按照一个固定的时间做清理表的困难是,如果一个表有更新活动的意外大增。 可能会庞大到确实需要VACUUM FULL回收空间。使用autovacuum守护进程,缓解这一问题, 因为守护进程的时间表清理动态响应更新的活动。完全禁用守护进程是不明智的,除非你有一个非常可预见的工作量。 一个可能的折衷办法就是设置守护进程的参数,以便它将只对异常繁重更新活动作出反应,因此可以从失控保持这些事情, 当典型的负载时,调度VACUUM还期望做批量的工作。

对于那些不使用autovacuum,一个典型的方法是在低使用时一天做一次的调度数据库范围的VACUUM, 补充下更新频繁的表有必要更频繁的清理。 (有些安装更新率非常高,清理的最繁忙的表往往每隔几分钟一次。) 如果你有个多数据库的集群,别忘了每一个的VACUUMvacuumdb这个程序有帮助的。

Tip: 当一个表中包含大量死行版本,作为一个大规模的更新或删除活动的结果,平常的VACUUM未必令人满意。 如果你有这样的表,并且你需要回收过多占用的磁盘空间,你将需要使用VACUUM FULL,或者选择CLUSTER或者 ALTER TABLE表重写的变体之一。这些命令重写整个表的新副本,并建立新的索引。 所有这些选项需要独占锁。 请注意他们也暂时使用额外的磁盘空间大约等于大小的表中,因为不能发布的表和索引的旧副本,直到新的完成。

Tip: 如果你有一个表,它的内容经常被完全删除, 那么可以考虑用 TRUNCATE 而不是后面跟着 VACUUMDELETETRUNCATE 立即删除整个表的内容,而不要求 随后的 VACUUMVACUUM FULL 来恢复现在未使用的磁盘空间。

23.1.3. 更新规划器统计

PostgreSQL 的查询规划器依赖一些有关 表内容的统计信息用以为查询生成好的规划。这些统计是通过 ANALYZE命令获得的,你可以直接调用这条命令, 也可以把它当做 VACUUM 里的一个可选步骤来调用。 拥有合理准确的统计是非常重要的,否则,选择了恶劣的规划很可能 降低数据库的性能。

当一张表的内容足够改变时,如果启用了 autovacuum 守护进程,将发出ANALYZE命令。 不过,管理员可能更愿意依靠手工设定的ANALYZE选项,尤其,如果已知表的更新活动当没有生效在"感兴趣" 的表字段统计。 这个守护进程调度是严格的作为一个插入或更新的行数的功能;它没有了解是否会导致有意义的统计变化。

和为了回收空间做清理一样,经常更新统计信息也是对更新频繁的表 更有用。不过,即使是更新非常频繁的表,如果它的数据的统计分布 并不经常改变,那么也不需要更新统计信息。一条简单的拇指定律就 是想想表中字段的最大跟最小值改变的幅度。比如,一个包含行更新 时间的 timestamp 字段将随着行的追加和更新稳定 增长最大值;这样的字段可能需要比那些包含访问网站的 URL 的字段 更频繁一些更新统计信息。那些 URL 字段可能改变得一样频繁, 但是其数值的统计分布的改变相对要缓慢得多。

我们可以在特定的表,甚至是表中特定的字段上运行ANALYZE ,所以如果你的应用有需求的话,可以对某些信息更新得比其它信息更 频繁。不过,在实际中,这种做法的有用性是值得怀疑的。因为 ANALYZE 使用了统计学上的随机采样的方法进行行采样, 而不是把每一行都读取进来,所以即使在大表上也是一项相当快的操作。

Tip: 尽管用 ANALYZE 针对每个字段进行挖掘的方式可能不是很实用, 但你可能还是会发现值得针对每个字段对 ANALYZE 收集的统计 信息的详细级别进行调整。那些经常在 WHERE 子句里使用的字段 如果有非常不规则的数据分布,那么就可能需要比其它字段更细致的数据图表。 参阅ALTER TABLE SET STATISTICS 或更改数据库的使用默认在 default_statistics_target的配置参数 。

此外,缺省情况下 选择这些函数是有限制信息的。 但是,如果你创建表达式的索引,它使用一个函数调用,可以极大地提高使用表达式索引的查询计划收集有关函数的有用的统计数据。

23.1.4. 避免事务ID重叠造成的问题

PostgreSQL 的 MVCC 事务语意依赖于比较 事务 ID(XID)的数值:一条带有大于当前事务 XID 的插入 XID 的行版本是"在将来" ,并且不应为当前事务可见。 但是因为事务 ID 的大小有限(在我们写这些的时候是 32 位), 如果集群一次运行的时间很长(大于 40 亿次事务),那么它就要受到 transaction ID wraparound的折磨:XID 计数器回到零位, 然后突然间所有以前的事务就变成看上去是在将来的,这意味着它们的 输出将变得可见。简而言之,可怕的数据丢失。实际上数据仍然在那里, 但是如果你无法获取数据,这么说也只是自我安慰罢了。若要避免此问题, 有必要以清理的每个数据库的每张表每20亿的事务至少一次。

周期性的运行 VACUUM 可以解决这个问题的原因在于 PostgreSQL 可以辨别特殊的 XID (FrozenXID)。这个 XID 总是被认为比任何普通的 XID 旧。 普通的 XID 使用 模-231 算法进行比较。这就意味着对于每个普通的 XID , 总是有二十亿个 XID 是"older"以及二十亿个 XID "newer";表达这个意思 的另外一个方法是普通的 XID 空间是没有终点的环。因此, 一旦某行带着特定的普通 XID 创建出来,那么该行将在以后的 二十亿次事务中表现得是"过去时",而不管我们说的是哪个普通 XID 。如果该行在超过二十亿次事务之后仍然存在,那么它就 会突然变成在将来的行。为了避免数据丢失,老的行必须在 到达二十亿次事务标记之前的某个时候赋予 FrozenXID。 一旦它被赋予了这个特殊的 XID ,那么它们在所有普通事务 面前表现为"过去时",而不管事务 ID 是否重叠,因此这样的 行不管保存多长时间,直到删除之前都会完好。这个 XID 的重新赋值是 VACUUM 控制的。

vacuum_freeze_min_age controls how old an XID value has to be before it's replaced with FrozenXID. 较大的值,此设置的保留事务性信息更长,而较小的值增加可以经过改值前必须再次清理表事务的数目。

通常VACUUM跳过没有任何死行版本的页,但是那些页可能仍有旧XID值的行版本。 为了确保所有的旧XID值由FrozenXID替换,需要整表扫描。当VACUUM做这些时,vacuum_freeze_table_age控制: vacuum_freeze_table_age controls when VACUUM does that:如果表尚未完全扫描 vacuum_freeze_table_age减去 vacuum_freeze_min_age事务,则强制全表扫描。 设置它为0,强制VACUUM总是扫描所有页,有效的忽略可见映射。

表在清理之前允许执行的最大事务次数是 20 亿减去上次清理时的 vacuum_freeze_min_age 值。如果超过这个限制就很 可能造成数据丢失。为了保证数据安全,必须在任何可能包含旧于 autovacuum_freeze_max_age 指定的 XID 的表上调用autovacuum 。(甚至在autovacuum 被禁用的情况下也可以调用。)

这就意味着,每 autovacuum_freeze_max_age 减去 vacuum_freeze_min_age 次事务后将自动清理未被清理的表。对于那些周期性 清理以回收空间的表来说,这个并不重要。对于静态表(包括只插入不更新/删除的表), 因为不需要回收空间的清理,所以可以尝试最大化强制清理的时间间隔, 也就是增加 autovacuum_freeze_max_age 的值或减少vacuum_freeze_min_age 的值。

对于vacuum_freeze_table_age最大有效值为0.95 * autovacuum_freeze_max_age; 一个设置高于这个将是最大上限。值高于autovacuum_freeze_max_age将没有任何意义,因为无论如何此时 将触发反重叠的autovacuum,在这发生前0.95乘数留下了一些闲余空间要运行VACUUM来处理。 作为一个经验法则,vacuum_freeze_table_age应该设置为低于autovacuum_freeze_max_age的某个值, 留下足够的差距因此定期调度VACUUM或者在该窗口中运行正常删除和更新活动的引发autovacuum。 设置太近,可能会导致反重叠autovacuums,即使表最近清理过回收空间,而较低的值导致更多频繁的全表扫描。

增加 autovacuum_freeze_max_age(以及一起的 vacuum_freeze_table_age )的唯一不利之处在于数据库 集群的pg_clog 子目录将会占用更多空间,因为它必须 为所有 autovacuum_freeze_max_age 之后的事务存储 提交状态。每个事务提交状态使用 2 字节,因此如果 autovacuum_freeze_max_age 的值略小于 20 亿, pg_clog 将会增加到大约 500M 。如果这个尺寸比起 你的数据库来只是小菜一碟,我们推荐你将 autovacuum_freeze_max_age 设为允许的最大值。否则,如何设置将取决于你愿意给 pg_clog 多大的空间。默认值是 2 亿,大约需要 50MB 的 pg_clog 存储空间。

减小 vacuum_freeze_min_age 的不利之处是可能导致 VACUUM 做无用功:如果行在不久之后就被修改,那么将 XID 修改 为 FrozenXID 就是在浪费时间,因为它很快就将获得一个新 的 XID 。因此这个设置应当足够大以使得行不被过早的冻结。 减小 vacuum_freeze_min_age 的另一个不利之处是事务插入或修改行的 准确细节将会很快丢失。这个信息有时迟早会派上用场,特别是数据库本 扩之后分析究竟发生了什么错误的时候。因为这两个原因,在完全静态的 表上减小这个值是不明智的。

为了跟踪数据库中最老的 XID 寿命,VACUUM 在系统表 pg_classpg_database 里存储了 事务 ID 统计。尤其是一个数据库的 pg_class 行中 的 relfrozenxid 字段包含了最后一个 VACUUM 命令使用的冻结终止 XID 。系统保证在该数据库中所有比这个终止 XID 老的普通 XID 都被 FrozenXID 代替。同样, 一个数据库的 pg_database 行中的datfrozenxid 字段是普通 XID 的下界,它只是数据库中每个表 relfrozenxid 的最小值。检查这个信息的一个便利方法是执行下面的查询

SELECT relname, age(relfrozenxid) FROM pg_class WHERE relkind = 'r';
SELECT datname, age(datfrozenxid) FROM pg_database;

age 字段用于测量从中止 XID 到当前事务 XID 的数目。

VACUUM 通常只扫描自上次清理修改的页,但是整表扫描时,relfrozenxid 只能提前。当 relfrozenxidvacuum_freeze_table_age事务旧, 使用VACUUMFREEZE选项,或者所有页发生需要清理或删除死行版本时做整表扫描。 当VACUUM扫描整表时,在结束age(relfrozenxid),其应该设置的一个比 vacuum_freeze_min_age 多一点之后使用。 (自VACUUM启动后,更多数量的事务启动)。如果该表上没有整表扫描的VACUUM直到达到autovacuum_freeze_max_age, 将会很快在该表上强制autovacuum处理。

如果从表中清理旧 XID 失败,那么当数据库的旧 XID 到达 1000 万个事务以后, 系统将发出类似下面这样的警告信息:

WARNING:  database "mydb" must be vacuumed within 177009986 transactions
HINT:  To avoid a database shutdown, execute a database-wide VACUUM in "mydb".

(作为提示的建议,应用手工VACUUM 解决这个问题;但是注意必须超级用户执行VACUUM,否则处理系统目录是会失败, 因此不能提前数据库的 datfrozenxid。) 如果忽略了上面的警告信息,那么系统将在距离重叠小于 100 万次的 时候关闭,并且拒绝执行任何新的事务:

ERROR:  database is not accepting commands to avoid wraparound data loss in database "mydb"
HINT:  Stop the postmaster and use a standalone backend to VACUUM in "mydb".

这个 100 万的事务安全边界留下来用于让管理员在不丢失数据的情况下 进行恢复,方法是手工执行所需要的 VACUUM 命令。不过, 因为一旦进入了安全关闭模式,系统就不能再执行命令,做这件事情的 唯一的方法是停止主服务器,使用一个单独运行的后端来执行 VACUUM 。 关闭模式不会强制于独立运行的后端。参阅 postgres 手册获取有关使用独立运行后端的细节。

23.1.5. autovacuum 守护进程

PostgreSQL系统带有一个额外的可选服务进程, 叫做 autovacuum 守护进程, 它的目的是自动执行 VACUUMANALYZE 命令。 在打开这个选项之后,autovacuum 守护进程将周期性运行并且检查那些 有大量插入、更新、删除行操作的表。这些检查使用行级别的统计收集设施; 因此,除非把 track_counts设置为 true ,否则无法使用 autovacuum 守护。 在缺省配置,autovacuuming启用适当的设置和相关配置参数。

" autovacuum 守护进程"实际上包含多个进程。有一种持久性的守护进程,名叫autovacuum launcher, 其负责启动所有数据库的autovacuum worker进程。这个启动程序将跨越时间分配的工作, 尝试每隔autovacuum_naptime秒为每个数据库启动一个工作者。 (因此,如果安装的有N个数据库,则每隔autovacuum_naptime/N秒启动一个新工作者。) 允许最多autovacuum_max_workers工作者进程同时运行。 如果有超过 autovacuum_max_workers要处理的数据库, 在接下来的数据库将尽快处理的第一个工作者完成。在每个工作者进程将检查数据库中的每张表,并执行VACUUM ,需要时 ANALYZE

如果几个较大的表都有资格在短时间内清理,所有 autovacuum工作者可能成为一段长时间都忙于清除这些表。 这会导致不清理其它表和数据库直到一个工作者变得可用。在单个数据库中多少工作者可能是没有限制的,但工作者还是尽量避免重复做已完成的其它工作者的工作。 请注意运行的工作者数目不计关于max_connections或superuser_reserved_connections 的限制。

将总是清理那些 relfrozenxid 大于 autovacuum_freeze_max_age 的表。(这也适用于那些表的冻结最大寿命已通过修改存储参数,见下文) 否则如果上次 VACUUM 之后的过期行的数量超过了 "vacuum threshold",那么就清理该表。清理阈值定义为:

vacuum threshold = vacuum base threshold + vacuum scale factor * number of tuples

这里的清理基本阈值是 autovacuum_vacuum_threshold , 清理缩放系数是 autovacuum_vacuum_scale_factor , 行数是 pg_class.reltuples。 过期行的数量是从统计收集器里面获取的, 这是一个半精确的计数,由每次 UPDATEDELETE 操作更新。 半精确的原因是在重负载时有些信息可能会丢失。 如果表的relfrozenxid 值比vacuum_freeze_table_age的事务更旧, 则要冻结行和relfrozenxid做整表扫描, 否则只扫描最后一个清理后修改过的页。

为了分析,使用了一个类似的条件:分析阈值,定义为

analyze threshold = analyze base threshold + analyze scale factor * number of tuples

它会和上次 ANALYZE 插入、更新、删除的总行数进行比较。

通过 autovacuum不能访问临时表。因此,应通过会话的 SQL 命令适当地清理和分析操作。

缺省的阈值和伸缩系数是从 postgresql.conf 里面 取得的,不过,可以针对每个表独立设置, 参阅节存储参数获取更多信息。 如果 pg_autovacuum 里面存在针对特定表的行,那么就使用该特定的设置; 否则使用全局设置。参阅节Section 18.9 获取有关全局设置的更多细节。

除了基本阈值和缩放系数之外,在 pg_autovacuum 里还有 6 个参数 可以为每个表进行设置。首先, autovacuum_enabled 可以设置为 false 让 autovacuum 守护进程 完全忽略某个表。这种情况下,autovacuum 只有在为了避免事务 ID 重叠必须清理整个数据库的时候才会动那个表。接下来两个参数, 清理开销延迟autovacuum_vacuum_cost_delay 和清理开销限制autovacuum_vacuum_cost_limit, ,用于针对特定的表为vacuum_freeze_min_age 和vacuum_freeze_table_age 特性设置数值。

当多个工作者正在运行,成本的限制是"平衡"之间的所有正在运行的工作者,使系统总的影响是相同的, 不管实际运行的工作者数目。

上一篇: 下一篇: