Course Objectives
- Understand the PostgreSQL architecture
 - Installing PostgreSQL
 - Create databases
 - Get used to the command line interface: psql
 - Understand backup and restore procedures in PostgreSQL
 - Understand extensions in PostgreSQL
 - Create a hot standby database
 - Understand the optimizer, statistics and vacuum
 - Understand monitoring tools
 - Upgrades in PostgreSQL
 
Training Method
- Recording of Presentation with numerous exercises, case studies, and live demos
 - Discussions forums and ask a question.
 - Hands on Lab assignments
 - Handouts for reference
 - Doubt clearing sessions by sharing screen one on one.
 
Target Audience
- Database administrators (DBA) as well as network, system and application administrators responsible for or supporting PostgreSQL databases
 
PostgreSQL Course Topics
- 
	
PostgreSQL Introduction and Features
 
- Introduction and History PostgreSQL
 - PostgreSQL Features
	
- ACID compliant
 - MVCC
 - Write ahead logging
 - Point in time recovery
 - Standby server and high availability
 - Streaming replication
 - Procedural languages
 - Partitioning
 - Cost based optimizer
 - Multi platform support
 - Tablespaces
 - Triggers
 - Views
 - Constraint enforcement
 - Extension system
 
 
- 
	
PostgreSQL Architecture
 
- Understanding the Architecture
 - PostgreSQL Architecture
 - Shared Memory
 - Shared Buffer
 - WAL Buffer
 - PostgreSQL Process Types
 - Postmaster Process
 - Backend Process
 - Client Process
 - Database Structure
 
- 
	
Installing PostgreSQL
 
- Installing PostgreSQL using RPMs on CentOS
 - Initializing a PostgreSQL cluster using initdb
 - Starting a PostgreSQL cluster using pg_ctl
 - The core binaries
	
- postgres
 - pg_ctl
 - initdb
 - psql
 - pg_dump
 - pg_restore
 - pg_controldata
 - pg_resetxlog
 
 - Wrappers and contributed modules
	
- The create and drop utilities
 - clusterdb
 - reindexdb
 - vacuumdb
 - vacuumlo
 
 
- 
	
Getting Started with PostgreSQL
 
- Running Tests
 - Clusters in PostgreSQL
 - Databases in PostgreSQL
 - Create User Database
 - Shutting down a PostgreSQL cluster using different shutdown modes
 - Identifying a PostgreSQL data directory and its contents
 - Moving pg_wal to another location
 - Running the psql client and some psql shortcuts
 - Running a SQL server using psql
 - Getting a list of databases
 - Finding the database's size
 - Connecting to a database
 - Getting the list of schemas in a database
 - Getting the list of tables
 - Describing a table
 - SQLs behind the shortcuts
 - Locating the Postgres configuration file
 - Modifying the location of a postgresql.conf file in PostgreSQL
 - Modifying the postgresql.auto.conf file in PostgreSQL
 - Enable archiving in PostgreSQL
 
- 
	
The logical layout of PostgreSQL
 
- The connection .
 - Databases .
 - Tables .
	
- Logged tables .
 - Unlogged tables .
 - Temporary tables .
 - Foreign tables .
 
 - Table inheritance
 - Indices
	
- b-tree
 - hash
 - GiST
 - GIN
 
 - Views
 - Tablespaces
 - Transactions
	
- Snapshot exports
 
 
- 
	
The Physical Layout
 
- Data files .
	
- Free space map .
 - Visibility map .
 - Initialisation fork .
 - pg_class
 
 - Pages
 - Tuples
 - TOAST
 - Tablespaces
 - MVCC
 
- 
	
PostgreSQL Cluster Management
 
- Creating and dropping databases
 - Locating a database and a table on the file system
 - Creating a schema in PostgreSQL
 - Checking table and index sizes in PostgreSQL
 - Create User Tablespace
 - How to Change Tablespace Location
 - What is Vacuum
 - Creating a user in PostgreSQL
 - Dropping a user in PostgreSQL
 - Assigning and revoking a privilege to/from a user or a role
 - Creating a group role for role-based segregation
 - MVCC implementation in PostgreSQL
 
- 
	
PostgreSQL Data Integrity
 
- Primary keys
 - Unique keys
 - Foreign keys
 - Check constraints
 - Not null
 
- 
	
Backup and Recovery in PostgreSQL
 
- Backing up and restoring a database using pg_dump and pg_restore
 - The RPM package for CentOS/Red Hat distributions
 - Backing up and restoring one or more tables using pg_dump and pg_restore
 - Backing up and restoring globals or an entire cluster using pg_dumpall and psql
 - Parallel backup and restore using pg_dump and pg_restore
 - Backing up a database cluster using pg_basebackup
 - Restoring a backup taken using pg basebackup
 - Installing pgBackRest on CentOS/RedHat OS
 - Backing up a database cluster using pgBackRest
 - Performance tips
	
- Avoid remote backups
 - Skip replicated tables
 - Check for slow cpu cores
 - Check for the available locks
 
 - Backup validation
 - Restoring a backup taken using pgBackRest
	
- The plain format and binary format
 
 - Restore performances
	
- shared buffers
 - wal level
 - fsync
 - checkpoint segments, checkpoint timeout
 - autovacuum
 - max connections
 - port and listen addresses
 - maintenance work memory
 
 
- 
	
Advanced Replication Techniques in PostgreSQL
 
- Setting up streaming replication in PostgreSQL
 - Adding a delayed standby for faster point-in-time recovery
 - Promoting a standby to a master
 - Adding a cascaded streaming replica
 - Promoting a standby in a replication cluster with multiple standby servers
 - Using pg_rewind to re-synchronize a demoted master
 - Enabling synchronous streaming replication
 - Setting up logical replication in PostgreSQL
 
- 
	
High Availability and Automatic Failover
 
- Automatic failover using Patroni
 - Enabling distributed consensus using etcd
 - Avoiding split-brain using Watchdog/softdog
 - Installing Patroni along with its Python dependencies
 - Creating a Patroni configuration file
 - Starting Patroni as a service using systemd
 - Initializing a PostgreSQL primary database using Patroni
 - Adding a standby to a Patroni cluster
 - Performing a manual switchover using Patroni
 
- 
	
Connection Pooling and Load Balancing
 
- Installing pgBouncer on a Linux server
 - Creating a pgBouncer configuration file
 - Configuring the pool settings on pgBouncer
 - Starting and stopping the pgBouncer service
 - Installing HAProxy on Linux servers
 - Using xinetd to detect a primary or a standby
 - Creating an HAProxy configuration file
 - Starting and stopping the HAProxy service
 - Building a robust HA cluster using Patroni, pgBouncer, and HAProxy
 
- 
	
Securing Through Authentication
 
- Securing client connections using the pg_hba.conf file
 - Categories in the pg_hba.conf file
 - Performing authorization using roles and privileges
 - Setting up row-level security
 - Configuring encryption of data over the wire using SSL
 - Enabling certificate authentication using SSL
 - Auditing PostgreSQL through logging
 - Auditing PostgreSQL using pgaudit
 - Setting up object-level auditing using pgaudit
 
- 
	
Logging and Analyzing PostgreSQL Servers
 
- Setting up slow query logging in PostgreSQL
 - Logging runtime execution plans in PostgreSQL using auto_explain
 - Global level
 - Session level
 - Logging locks, waits, and temp in PostgreSQL
 - Logging autovacuum and analyzing activity in PostgreSQL
 - Generating a pgBadger report
 - Configuring pg_stat_statements as an extension
 - Query analysis using pg_stat_statements
 - Getting the kernel-level statistics of a query using pg_stat_kcache
 
- 
	
PostgreSQL Services Monitoring
 
- Installation of Grafana and its dependencies
 - Prometheus as a data source on the monitoring server
 - Configuring Node Exporter on Postgres servers to monitor
 - operating system metrics
 - Adding metrics being collected using node_exporter to Prometheus
 - Collecting PostgreSQL metrics using postgres_exporter
 - Adding metrics exposed by postgres_exporter to Prometheus
 - Importing a dashboard for monitoring Linux metrics
 - How to import a dashboard for monitoring Postgres metrics
 - Adding custom queries to postgres_exporter
 
- 
	
PostgreSQL Performance Tuning
 
- Installing and creating pg_repack to rebuild objects online
 - Installing pg_repack on CentOS
 - Installing pg_repack on Ubuntu
 - How to rebuild a table online using pg_repack
 - How to rebuild indexes of a table online using pg_repack
 - Rebuilding all the indexes of a table
 - Rebuilding a specific index
 - Moving a table or an index to another tablespace online
 - Warming up the cache using pg_prewarm
 - How to tune a function or a stored procedure using plprofiler
 - Capturing statements that require tuning using pg_stat_statements
 - Viewing the execution plans using EXPLAIN in PostgreSQL
 
- 
	
PostgreSQL Upgrades and Patches
 
- Finding the difference between a major and minor release in PostgreSQL
 - What is an obsolete version?
 - Technical requirements
 - Major version upgrade to PostgreSQL using pg_dumpall
 - Major version upgrade to PostgreSQL using pg_dump and pg_restore
 - Major version upgrade to PostgreSQL using pg_upgrade with downtime
 - Major version upgrade to PostgreSQL using pg_upgrade with
 - hard links for seamless downtime
 - Installing the pglogical extension to upgrade older versions to PostgreSQL
 - Upgrading to PostgreSQL using the pglogical extension
 - Upgrading to PostgreSQL using logical replication and logical decoding
 - Updating the minor version of PostgreSQL
 
- 
	
PostgreSQL Maintenance
 
- VACUUM
	
- vacuum freeze table age
 - vacuum freeze min age
 - vacuum multixact freeze table age
 - vacuum multixact freeze min age
 - vacuum defer cleanup age
 - vacuum cost delay
 - vacuum cost limit
 - vacuum cost page hit
 - vacuum cost page miss
 - vacuum cost page dirty
 
 - ANALYZE
 - REINDEX
 - VACUUM FULL and CLUSTER
 - The autovacuum
	
- autovacuum
 - autovacuum max workers
 - autovacuum naptime
 - autovacuum vacuum scale factor
 - autovacuum vacuum threshold
 - autovacuum analyze scale factor
 - autovacuum analyze threshold
 - autovacuum freeze max age
 - autovacuum multixact freeze max age
 - autovacuum vacuum cost delay
 - autovacuum vacuum cost limit
 
 
- 
	
Things to know before starting
 
- SQL is your friend
 - The design comes first
 - Clean coding
	
- The identifier’s name
 - Self explaining schema
 - Query formatting
 
 - Get DBA advice