SlideShare a Scribd company logo
Advanced WAL File Management
                 With OmniPITR

                 Robert Treat, JDCon 2011 #pgeast


                           / Presentation



Thursday, March 31, 2011
Who Am I?

         • Robert
Treat
               • OmniTI
                       • Database
Management
and
Consulting
                       • We’re
Hiring!
               • Postgres
                       • Major
Contributor,
Web,
Advocacy,
Random
               • xzilla.net
                       • @robtreat2


Thursday, March 31, 2011
Who Am I?

         • Robert
Treat
               • OmniTI
                       • Database
Management
and
Consulting
                       • We’re
Hiring!
               • Postgres
                       • Major
Contributor,
Web,
Advocacy,
Random
               • xzilla.net
                       • @robtreat2


Thursday, March 31, 2011
What is PITR?




Thursday, March 31, 2011
What is PITR?



                      •Postgres emits WAL files




Thursday, March 31, 2011
Digression




Thursday, March 31, 2011
Digression




                      •WAL Logs?

                      •Write Ahead Log Logs?

                      •OTOH, they are stored in pg_xlog...




Thursday, March 31, 2011
What is PITR?




Thursday, March 31, 2011
What is PITR?



                      •Postgres emits WAL files




Thursday, March 31, 2011
What is PITR?



                      •Postgres emits WAL files

                      •Send the WAL file to another server




Thursday, March 31, 2011
What is PITR?



                      •Postgres emits WAL files

                      •Send the WAL file to another server

                      •The other server can replay the WAL




Thursday, March 31, 2011
What is PITR?




                              Use combination of
                              data files and WAL
                           to make more postgrezes

Thursday, March 31, 2011
What is PITR?



                      •Postgres emits WAL files




                              Use combination of
                              data files and WAL
                           to make more postgrezes

Thursday, March 31, 2011
What is PITR?



                      •Postgres emits WAL files

                      •Send the WAL file to another server




                              Use combination of
                              data files and WAL
                           to make more postgrezes

Thursday, March 31, 2011
What is PITR?



                      •Postgres emits WAL files

                      •Send the WAL file to another server

                      •The other server can replay the WAL


                              Use combination of
                              data files and WAL
                           to make more postgrezes

Thursday, March 31, 2011
A Brief History of PITR




Thursday, March 31, 2011
A Brief History of PITR



                      •8.1 (really)




Thursday, March 31, 2011
A Brief History of PITR



                      •8.1 (really)

                      •8.2 (warm standby)




Thursday, March 31, 2011
A Brief History of PITR



                      •8.1 (really)

                      •8.2 (warm standby)

                      •9.0 (hot standby)




Thursday, March 31, 2011
A Brief History of PITR



                      •8.1 (really)

                      •8.2 (warm standby)

                      •9.0 (hot standby)

                      •9.0 (streaming replication)



Thursday, March 31, 2011
Ghetto Style




                                         archive_command =
                           'rsync %p sdb2:/data/pgsql/sdb1/84/walarchive/% f'




Thursday, March 31, 2011
Ghetto Style



                      •Simple, Better Than You’d Think




                                         archive_command =
                           'rsync %p sdb2:/data/pgsql/sdb1/84/walarchive/% f'




Thursday, March 31, 2011
Early Version Of A PITR Script


       archive_command = ‘cp -i %p /data/pgsql/82_walarchives/%f </dev/null’




Thursday, March 31, 2011
Early Version Of A PITR Script
                      •Kind of Hacky
       archive_command = ‘cp -i %p /data/pgsql/82_walarchives/%f </dev/null’




Thursday, March 31, 2011
Early Version Of A PITR Script


       archive_command = ‘cp -i %p /data/pgsql/82_walarchives/%f </dev/null’

         opendir(DIR, ".");
         my @wals2move = grep {
                    -f $_ &&
                    (stat(_))[9] + $AGE < time() &&
                      (
                          # 000000010000007200000031
                          ( /^[0-9A-F]{24}$/ && (stat(_))[7] == $WALSIZE ) ||
                          # 000000010000007200000031.0012C968.backup
                          ( /^[0-9A-F]{24}.[0-9A-F]{8}.backup$/ )
                      ) &&
                    ( $mtime{$_} = (stat(_))[9] ) # Always true (for later)
              } readdir(DIR);
         closedir(DIR);




Thursday, March 31, 2011
Early Version Of A PITR Script
                      •Kind of Hacky
       archive_command = ‘cp -i %p /data/pgsql/82_walarchives/%f </dev/null’

         opendir(DIR, ".");
         my @wals2move = grep {
                    -f $_ &&
                    (stat(_))[9] + $AGE < time() &&
                      (
                          # 000000010000007200000031
                          ( /^[0-9A-F]{24}$/ && (stat(_))[7] == $WALSIZE ) ||
                          # 000000010000007200000031.0012C968.backup
                          ( /^[0-9A-F]{24}.[0-9A-F]{8}.backup$/ )
                      ) &&
                    ( $mtime{$_} = (stat(_))[9] ) # Always true (for later)
              } readdir(DIR);
         closedir(DIR);




Thursday, March 31, 2011
Early Version Of A PITR Script


       archive_command = ‘cp -i %p /data/pgsql/82_walarchives/%f </dev/null’

      @wals2move = sort { $mtime{$a} <=> $mtime{$b} } @wals2move;
      if($TARGET) {
        foreach (@wals2move) {
          if($NOOP) {
            print "$RSYNC -essh --rsync-path=$REMOTE_RSYNC -a $_
      $TARGET/$_n";
            print "mv $_ $_.slavedn";
          } else {
            if(system("$RSYNC -essh --rsync-path=$REMOTE_RSYNC -a $_
      $TARGET/$_") != 0) {
              print STDERR "Error moving wal to target: $?n";
              last;
            }
            if(!rename("$_", "$_.slaved")) {
              print STDERR "Error renaming $_ to $_.slavedn";
              last;
            }
          }
        }
      }




Thursday, March 31, 2011
Early Version Of A PITR Script
                      •Kind of Hacky
       archive_command = ‘cp -i %p /data/pgsql/82_walarchives/%f </dev/null’

      @wals2move = sort { $mtime{$a} <=> $mtime{$b} } @wals2move;
      if($TARGET) {
        foreach (@wals2move) {
          if($NOOP) {
            print "$RSYNC -essh --rsync-path=$REMOTE_RSYNC -a $_
      $TARGET/$_n";
            print "mv $_ $_.slavedn";
          } else {
            if(system("$RSYNC -essh --rsync-path=$REMOTE_RSYNC -a $_
      $TARGET/$_") != 0) {
              print STDERR "Error moving wal to target: $?n";
              last;
            }
            if(!rename("$_", "$_.slaved")) {
              print STDERR "Error renaming $_ to $_.slavedn";
              last;
            }
          }
        }
      }




Thursday, March 31, 2011
Customizations




Thursday, March 31, 2011
Customizations



                      •Multiple Destinations




Thursday, March 31, 2011
Customizations



                      •Multiple Destinations

                      •WAL File Delay




Thursday, March 31, 2011
Customizations



                      •Multiple Destinations

                      •WAL File Delay

                      •Archive Storage (gzip & friends)




Thursday, March 31, 2011
Customizations



                      •Multiple Destinations

                      •WAL File Delay

                      •Archive Storage (gzip & friends)

                      •Better Backups



Thursday, March 31, 2011
ENTER: OmniPITR




Thursday, March 31, 2011
ENTER: OmniPITR



                      •Consolidate various scripts




Thursday, March 31, 2011
ENTER: OmniPITR



                      •Consolidate various scripts

                      •Deploy across ‘Nixes




Thursday, March 31, 2011
ENTER: OmniPITR



                      •Consolidate various scripts

                      •Deploy across ‘Nixes

                      •Reusable




Thursday, March 31, 2011
ENTER: OmniPITR



                      •Consolidate various scripts

                      •Deploy across ‘Nixes

                      •Reusable

                      •Complete Solution



Thursday, March 31, 2011
OmniPITR-Archive




Thursday, March 31, 2011
OmniPITR-Archive


                      •Lots of options




Thursday, March 31, 2011
OmniPITR-Archive


                      •Lots of options

                           •compression




Thursday, March 31, 2011
OmniPITR-Archive


                      •Lots of options

                           •compression

                           •custom log file




Thursday, March 31, 2011
OmniPITR-Archive


                      •Lots of options

                           •compression

                           •custom log file

                           •special paths




Thursday, March 31, 2011
OmniPITR-Archive


                      •Lots of options

                           •compression

                           •custom log file

                           •special paths

                           •multiple destinations


Thursday, March 31, 2011
OmniPITR-Archive Example

                                     archive_command =
                            '/opt/OMNIpitr/bin/omnipitr-archive
                       -l "/var/log/omnipitr/omnipitr-^Y-^m-^d.log"
                               -s /var/lib/pgsql/omnipitr/state/
                                          -t /var/tmp/
                          -dr gzip=db4:/mnt/db/prod/walarchive/
                           -dr db4:/mnt/db/prod/db4-walarchive/
                          -db /var/lib/pgsql/omnipitr/backup.xlogs
                                              "%p"'




Thursday, March 31, 2011
OmniPITR-Archive Example

                                     archive_command =
                            '/opt/OMNIpitr/bin/omnipitr-archive
                       -l "/var/log/omnipitr/omnipitr-^Y-^m-^d.log"
                               -s /var/lib/pgsql/omnipitr/state/
                                          -t /var/tmp/
                          -dr gzip=db4:/mnt/db/prod/walarchive/
                           -dr db4:/mnt/db/prod/db4-walarchive/
                          -db /var/lib/pgsql/omnipitr/backup.xlogs
                                              "%p"'

                                 Location of OmniPITR

Thursday, March 31, 2011
OmniPITR-Archive Example

                                     archive_command =
                            '/opt/OMNIpitr/bin/omnipitr-archive
                       -l "/var/log/omnipitr/omnipitr-^Y-^m-^d.log"
                               -s /var/lib/pgsql/omnipitr/state/
                                          -t /var/tmp/
                          -dr gzip=db4:/mnt/db/prod/walarchive/
                           -dr db4:/mnt/db/prod/db4-walarchive/
                          -db /var/lib/pgsql/omnipitr/backup.xlogs
                                              "%p"'

                            Custom Log File Name/Location

Thursday, March 31, 2011
OmniPITR-Archive Example

                                     archive_command =
                            '/opt/OMNIpitr/bin/omnipitr-archive
                       -l "/var/log/omnipitr/omnipitr-^Y-^m-^d.log"
                               -s /var/lib/pgsql/omnipitr/state/
                                          -t /var/tmp/
                          -dr gzip=db4:/mnt/db/prod/walarchive/
                           -dr db4:/mnt/db/prod/db4-walarchive/
                          -db /var/lib/pgsql/omnipitr/backup.xlogs
                                              "%p"'

        state-directory to handle errors when sending wal to
                         multiple destinations

Thursday, March 31, 2011
OmniPITR-Archive Example

                                     archive_command =
                            '/opt/OMNIpitr/bin/omnipitr-archive
                       -l "/var/log/omnipitr/omnipitr-^Y-^m-^d.log"
                               -s /var/lib/pgsql/omnipitr/state/
                                          -t /var/tmp/
                          -dr gzip=db4:/mnt/db/prod/walarchive/
                           -dr db4:/mnt/db/prod/db4-walarchive/
                          -db /var/lib/pgsql/omnipitr/backup.xlogs
                                              "%p"'

                              Where To Create Temp Files

Thursday, March 31, 2011
OmniPITR-Archive Example

                                     archive_command =
                            '/opt/OMNIpitr/bin/omnipitr-archive
                       -l "/var/log/omnipitr/omnipitr-^Y-^m-^d.log"
                               -s /var/lib/pgsql/omnipitr/state/
                                          -t /var/tmp/
                          -dr gzip=dbx:/mnt/db/prod/walstorage/
                           -dr db4:/mnt/db/prod/db4-walarchive/
                          -db /var/lib/pgsql/omnipitr/backup.xlogs
                                              "%p"'

                 send to remote server (dbx) compressed (gzip)

Thursday, March 31, 2011
OmniPITR-Archive Example

                                     archive_command =
                            '/opt/OMNIpitr/bin/omnipitr-archive
                       -l "/var/log/omnipitr/omnipitr-^Y-^m-^d.log"
                               -s /var/lib/pgsql/omnipitr/state/
                                          -t /var/tmp/
                          -dr gzip=db4:/mnt/db/prod/walarchive/
                           -dr db4:/mnt/db/prod/db4-walarchive/
                          -db /var/lib/pgsql/omnipitr/backup.xlogs
                                              "%p"'

                      send to remote server (db4) uncompressed

Thursday, March 31, 2011
OmniPITR-Archive Example

                                     archive_command =
                            '/opt/OMNIpitr/bin/omnipitr-archive
                       -l "/var/log/omnipitr/omnipitr-^Y-^m-^d.log"
                               -s /var/lib/pgsql/omnipitr/state/
                                          -t /var/tmp/
                          -dr gzip=db4:/mnt/db/prod/walarchive/
                           -dr db4:/mnt/db/prod/db4-walarchive/
                          -db /var/lib/pgsql/omnipitr/backup.xlogs
                                              "%p"'

                   Where to store xlogs when building a backup

Thursday, March 31, 2011
OmniPITR-Archive Example

                                     archive_command =
                            '/opt/OMNIpitr/bin/omnipitr-archive
                       -l "/var/log/omnipitr/omnipitr-^Y-^m-^d.log"
                               -s /var/lib/pgsql/omnipitr/state/
                                          -t /var/tmp/
                          -dr gzip=db4:/mnt/db/prod/walarchive/
                           -dr db4:/mnt/db/prod/db4-walarchive/
                          -db /var/lib/pgsql/omnipitr/backup.xlogs
                                              "%p"'

                                     The xlog file :-)

Thursday, March 31, 2011
OmniPITR-Restore




Thursday, March 31, 2011
OmniPITR-Restore


                      •Lots of options (though not as many)




Thursday, March 31, 2011
OmniPITR-Restore


                      •Lots of options (though not as many)

                           •compressed files?




Thursday, March 31, 2011
OmniPITR-Restore


                      •Lots of options (though not as many)

                           •compressed files?

                           •custom log file




Thursday, March 31, 2011
OmniPITR-Restore


                      •Lots of options (though not as many)

                           •compressed files?

                           •custom log file

                           •special paths




Thursday, March 31, 2011
OmniPITR-Restore Example

                               restore_command = '
                       /opt/OMNIpitr/bin/omnipitr-restore
              -l /var/lib/pgsql/data/pg_log/omnipitr-^Y-^m-^d.log
                           -s /var/lib/pgsql/wal_archive/
                        -p /var/lib/pgsql/wal_archives.pause
                                          -v
                                          -r
                                        %f %p'


                           location of omnipitr-restore program

Thursday, March 31, 2011
OmniPITR-Restore Example

                               restore_command = '
                       /opt/OMNIpitr/bin/omnipitr-restore
              -l /var/lib/pgsql/data/pg_log/omnipitr-^Y-^m-^d.log
                           -s /var/lib/pgsql/wal_archive/
                        -p /var/lib/pgsql/wal_archives.pause
                                          -v
                                          -r
                                        %f %p'


                               custom log file format

Thursday, March 31, 2011
OmniPITR-Restore Example

                               restore_command = '
                       /opt/OMNIpitr/bin/omnipitr-restore
              -l /var/lib/pgsql/data/pg_log/omnipitr-^Y-^m-^d.log
                           -s /var/lib/pgsql/wal_archive/
                        -p /var/lib/pgsql/wal_archives.pause
                                          -v
                                          -r
                                        %f %p'


                           Source of WAL Files to Use For Restore

Thursday, March 31, 2011
OmniPITR-Restore Example

                               restore_command = '
                       /opt/OMNIpitr/bin/omnipitr-restore
              -l /var/lib/pgsql/data/pg_log/omnipitr-^Y-^m-^d.log
                           -s /var/lib/pgsql/wal_archive/
                        -p /var/lib/pgsql/wal_archives.pause
                                          -v
                                          -r
                                        %f %p'


                           pause xlog removal if this file exists
                                      (foreshadow: used for making backups)




Thursday, March 31, 2011
OmniPITR-Restore Example

                               restore_command = '
                       /opt/OMNIpitr/bin/omnipitr-restore
              -l /var/lib/pgsql/data/pg_log/omnipitr-^Y-^m-^d.log
                           -s /var/lib/pgsql/wal_archive/
                        -p /var/lib/pgsql/wal_archives.pause
                                          -v
                                          -r
                                        %f %p'


                                     verbose

Thursday, March 31, 2011
OmniPITR-Restore Example

                               restore_command = '
                       /opt/OMNIpitr/bin/omnipitr-restore
              -l /var/lib/pgsql/data/pg_log/omnipitr-^Y-^m-^d.log
                           -s /var/lib/pgsql/wal_archive/
                        -p /var/lib/pgsql/wal_archives.pause
                                          -v
                                          -r
                                        %f %p'


           Remove Xlogs Files Which Are No Longer Needed

Thursday, March 31, 2011
OmniPITR-Restore Example

                               restore_command = '
                       /opt/OMNIpitr/bin/omnipitr-restore
              -l /var/lib/pgsql/data/pg_log/omnipitr-^Y-^m-^d.log
                           -s /var/lib/pgsql/wal_archive/
                        -p /var/lib/pgsql/wal_archives.pause
                                          -v
                                          -r
                                        %f %p'

               standard macros for “basename of segment” and
                         “destination of recovery”

Thursday, March 31, 2011
OmniPITR-Master-Backup




Thursday, March 31, 2011
OmniPITR-Master-Backup



                      •Goal




Thursday, March 31, 2011
OmniPITR-Master-Backup



                      •Goal

                           •simple “tarball” for backup




Thursday, March 31, 2011
OmniPITR-Master-Backup



                      •Goal

                           •simple “tarball” for backup

                             •one for $PGDATA and xlogs




Thursday, March 31, 2011
OmniPITR-Master-Backup



                      •Goal

                           •simple “tarball” for backup

                             •one for $PGDATA and xlogs

                             •simple to blow open and use



Thursday, March 31, 2011
OmniPITR-Master-Backup Example

                       /opt/OMNIpitr/bin/omnipitr-backup-master
                                                -v
                       -l "/var/log/omnipitr/omnipitr-^Y-^m-^d.log"
                           -x /var/lib/pgsql/omnipitr/backup.xlogs
                            -dr gzip=db4:/mnt/db/prod/backups/
                                          -t /var/tmp/
                                  -pp /usr/pgsql-9.0/bin/psql
                                      -D /pg_data/90data


                           location of OmniPITR-backup-master

Thursday, March 31, 2011
OmniPITR-Master-Backup Example

                       /opt/OMNIpitr/bin/omnipitr-backup-master
                                                -v
                       -l "/var/log/omnipitr/omnipitr-^Y-^m-^d.log"
                           -x /var/lib/pgsql/omnipitr/backup.xlogs
                            -dr gzip=db4:/mnt/db/prod/backups/
                                          -t /var/tmp/
                                  -pp /usr/pgsql-9.0/bin/psql
                                      -D /pg_data/90data


                                        verbose

Thursday, March 31, 2011
OmniPITR-Master-Backup Example

                       /opt/OMNIpitr/bin/omnipitr-backup-master
                                                -v
                       -l "/var/log/omnipitr/omnipitr-^Y-^m-^d.log"
                           -x /var/lib/pgsql/omnipitr/backup.xlogs
                            -dr gzip=db4:/mnt/db/prod/backups/
                                          -t /var/tmp/
                                  -pp /usr/pgsql-9.0/bin/psql
                                      -D /pg_data/90data


                                     custom log file

Thursday, March 31, 2011
OmniPITR-Master-Backup Example

                       /opt/OMNIpitr/bin/omnipitr-backup-master
                                                -v
                       -l "/var/log/omnipitr/omnipitr-^Y-^m-^d.log"
                           -x /var/lib/pgsql/omnipitr/backup.xlogs
                            -dr gzip=db4:/mnt/db/prod/backups/
                                          -t /var/tmp/
                                  -pp /usr/pgsql-9.0/bin/psql
                                      -D /pg_data/90data


                directory to store xlogs during backup creation

Thursday, March 31, 2011
OmniPITR-Master-Backup Example

                       /opt/OMNIpitr/bin/omnipitr-backup-master
                                                -v
                       -l "/var/log/omnipitr/omnipitr-^Y-^m-^d.log"
                           -x /var/lib/pgsql/omnipitr/backup.xlogs
                            -dr gzip=db4:/mnt/db/prod/backups/
                                          -t /var/tmp/
                                  -pp /usr/pgsql-9.0/bin/psql
                                      -D /pg_data/90data


                  copy backup file to remote server, compressed

Thursday, March 31, 2011
OmniPITR-Master-Backup Example

                       /opt/OMNIpitr/bin/omnipitr-backup-master
                                                -v
                       -l "/var/log/omnipitr/omnipitr-^Y-^m-^d.log"
                           -x /var/lib/pgsql/omnipitr/backup.xlogs
                            -dr gzip=db4:/mnt/db/prod/backups/
                                          -t /var/tmp/
                                  -pp /usr/pgsql-9.0/bin/psql
                                      -D /pg_data/90data


                       location for temporary files whilst working

Thursday, March 31, 2011
OmniPITR-Master-Backup Example

                       /opt/OMNIpitr/bin/omnipitr-backup-master
                                                -v
                       -l "/var/log/omnipitr/omnipitr-^Y-^m-^d.log"
                           -x /var/lib/pgsql/omnipitr/backup.xlogs
                            -dr gzip=db4:/mnt/db/prod/backups/
                                          -t /var/tmp/
                                  -pp /usr/pgsql-9.0/bin/psql
                                      -D /pg_data/90data


                                      path to psql

Thursday, March 31, 2011
OmniPITR-Master-Backup Example

                       /opt/OMNIpitr/bin/omnipitr-backup-master
                                                -v
                       -l "/var/log/omnipitr/omnipitr-^Y-^m-^d.log"
                           -x /var/lib/pgsql/omnipitr/backup.xlogs
                            -dr gzip=db4:/mnt/db/prod/backups/
                                          -t /var/tmp/
                                  -pp /usr/pgsql-9.0/bin/psql
                                      -D /pg_data/90data


                                       $PGDATA

Thursday, March 31, 2011
Programmers Say:




                           “I love it when people use
                           my software to do cool
                           things that I didn’t expect”




Thursday, March 31, 2011
Treat’s Maxim?




                             “Try not to let the way
                           software was designed get
                             in the way of how you
                                 want to use it”




Thursday, March 31, 2011
OmniPITR-Slave-Backup




Thursday, March 31, 2011
OmniPITR-Slave-Backup

                      •On MySQL, you could dump on slave
                       for a long time




Thursday, March 31, 2011
OmniPITR-Slave-Backup

                      •On MySQL, you could dump on slave
                       for a long time

                      •On ZFS, we use snapshots to make
                       slaves on the backups




Thursday, March 31, 2011
OmniPITR-Slave-Backup

                      •On MySQL, you could dump on slave
                       for a long time

                      •On ZFS, we use snapshots to make
                       slaves on the backups

                      •While “we” prefer to use Postgres,
                       some of us prefer to use Linux




Thursday, March 31, 2011
OmniPITR-Slave-Backup

                      •On MySQL, you could dump on slave
                       for a long time

                      •On ZFS, we use snapshots to make
                       slaves on the backups

                      •While “we” prefer to use Postgres,
                       some of us prefer to use Linux

                      •But, you still don’t want to pay the
                       price for backups on master

Thursday, March 31, 2011
OmniPITR-Slave-Backup Example

             /opt/OMNIpitr/bin/omnipitr-backup-slave
                                    -v
   -l "/var/log/omnipitr/omnipitr-slave-backup-^Y-^m-^d.log"
                   -s /mnt/db/prod/db4-walarchive
              -p /var/lib/pgsql/omnipitr/pause.removal
                          -D /pg_data/90data/
                              -t /var/tmp/
                            -gp /usr/bin/pigz
                   -dl gzip=/mnt/db/prod/backups/
               -pp /usr/pgsql-9.0/bin/pg_controldata

                           Location of omni-pitr-slave command

Thursday, March 31, 2011
OmniPITR-Slave-Backup Example

             /opt/OMNIpitr/bin/omnipitr-backup-slave
                                    -v
   -l "/var/log/omnipitr/omnipitr-slave-backup-^Y-^m-^d.log"
                   -s /mnt/db/prod/db4-walarchive
              -p /var/lib/pgsql/omnipitr/pause.removal
                          -D /pg_data/90data/
                              -t /var/tmp/
                            -gp /usr/bin/pigz
                   -dl gzip=/mnt/db/prod/backups/
               -pp /usr/pgsql-9.0/bin/pg_controldata

                              verbose

Thursday, March 31, 2011
OmniPITR-Slave-Backup Example

             /opt/OMNIpitr/bin/omnipitr-backup-slave
                                    -v
   -l "/var/log/omnipitr/omnipitr-slave-backup-^Y-^m-^d.log"
                   -s /mnt/db/prod/db4-walarchive
              -p /var/lib/pgsql/omnipitr/pause.removal
                          -D /pg_data/90data/
                              -t /var/tmp/
                            -gp /usr/bin/pigz
                   -dl gzip=/mnt/db/prod/backups/
               -pp /usr/pgsql-9.0/bin/pg_controldata

                           custom log location / format

Thursday, March 31, 2011
OmniPITR-Slave-Backup Example

             /opt/OMNIpitr/bin/omnipitr-backup-slave
                                    -v
   -l "/var/log/omnipitr/omnipitr-slave-backup-^Y-^m-^d.log"
                   -s /mnt/db/prod/db4-walarchive
              -p /var/lib/pgsql/omnipitr/pause.removal
                          -D /pg_data/90data/
                              -t /var/tmp/
                            -gp /usr/bin/pigz
                   -dl gzip=/mnt/db/prod/backups/
               -pp /usr/pgsql-9.0/bin/pg_controldata

                           source of wal files

Thursday, March 31, 2011
OmniPITR-Slave-Backup Example

             /opt/OMNIpitr/bin/omnipitr-backup-slave
                                    -v
   -l "/var/log/omnipitr/omnipitr-slave-backup-^Y-^m-^d.log"
                   -s /mnt/db/prod/db4-walarchive
              -p /var/lib/pgsql/omnipitr/pause.removal
                          -D /pg_data/90data/
                              -t /var/tmp/
                            -gp /usr/bin/pigz
                   -dl gzip=/mnt/db/prod/backups/
               -pp /usr/pgsql-9.0/bin/pg_controldata
              file to pause removal of xlogs no longer needed for
                       restore but still needed by backup

Thursday, March 31, 2011
OmniPITR-Slave-Backup Example

             /opt/OMNIpitr/bin/omnipitr-backup-slave
                                    -v
   -l "/var/log/omnipitr/omnipitr-slave-backup-^Y-^m-^d.log"
                   -s /mnt/db/prod/db4-walarchive
              -p /var/lib/pgsql/omnipitr/pause.removal
                          -D /pg_data/90data/
                              -t /var/tmp/
                            -gp /usr/bin/pigz
                   -dl gzip=/mnt/db/prod/backups/
               -pp /usr/pgsql-9.0/bin/pg_controldata

                             $PGDATA

Thursday, March 31, 2011
OmniPITR-Slave-Backup Example

             /opt/OMNIpitr/bin/omnipitr-backup-slave
                                    -v
   -l "/var/log/omnipitr/omnipitr-slave-backup-^Y-^m-^d.log"
                   -s /mnt/db/prod/db4-walarchive
              -p /var/lib/pgsql/omnipitr/pause.removal
                          -D /pg_data/90data/
                              -t /var/tmp/
                            -gp /usr/bin/pigz
                   -dl gzip=/mnt/db/prod/backups/
               -pp /usr/pgsql-9.0/bin/pg_controldata

                           location for temp files whilst working

Thursday, March 31, 2011
OmniPITR-Slave-Backup Example

             /opt/OMNIpitr/bin/omnipitr-backup-slave
                                    -v
   -l "/var/log/omnipitr/omnipitr-slave-backup-^Y-^m-^d.log"
                   -s /mnt/db/prod/db4-walarchive
              -p /var/lib/pgsql/omnipitr/pause.removal
                          -D /pg_data/90data/
                              -t /var/tmp/
                            -gp /usr/bin/pigz
                   -dl gzip=/mnt/db/prod/backups/
               -pp /usr/pgsql-9.0/bin/pg_controldata

                           location of our “gzip”

Thursday, March 31, 2011
OmniPITR-Slave-Backup Example

             /opt/OMNIpitr/bin/omnipitr-backup-slave
                                    -v
   -l "/var/log/omnipitr/omnipitr-slave-backup-^Y-^m-^d.log"
                   -s /mnt/db/prod/db4-walarchive
              -p /var/lib/pgsql/omnipitr/pause.removal
                          -D /pg_data/90data/
                              -t /var/tmp/
                            -gp /usr/bin/pigz
                   -dl gzip=/mnt/db/prod/backups/
               -pp /usr/pgsql-9.0/bin/pg_controldata

                           local storage, compressed

Thursday, March 31, 2011
OmniPITR-Slave-Backup Example

             /opt/OMNIpitr/bin/omnipitr-backup-slave
                                    -v
   -l "/var/log/omnipitr/omnipitr-slave-backup-^Y-^m-^d.log"
                   -s /mnt/db/prod/db4-walarchive
              -p /var/lib/pgsql/omnipitr/pause.removal
                          -D /pg_data/90data/
                              -t /var/tmp/
                            -gp /usr/bin/pigz
                   -dl gzip=/mnt/db/prod/backups/
               -pp /usr/pgsql-9.0/bin/pg_controldata

                           path to pg_controldata

Thursday, March 31, 2011
Production Use?




Thursday, March 31, 2011
Production Use?

                      •Versions 8.2, 8.3, 8.4, 9.0




Thursday, March 31, 2011
Production Use?

                      •Versions 8.2, 8.3, 8.4, 9.0

                      •Linux, Solaris




Thursday, March 31, 2011
Production Use?

                      •Versions 8.2, 8.3, 8.4, 9.0

                      •Linux, Solaris

                      •TB+ Databases, with multiple
                       tablespaces




Thursday, March 31, 2011
Production Use?

                      •Versions 8.2, 8.3, 8.4, 9.0

                      •Linux, Solaris

                      •TB+ Databases, with multiple
                       tablespaces

                      •Thousands of txn/sec




Thursday, March 31, 2011
Production Use?

                      •Versions 8.2, 8.3, 8.4, 9.0

                      •Linux, Solaris

                      •TB+ Databases, with multiple
                       tablespaces

                      •Thousands of txn/sec

                      •Cross Datacenter


Thursday, March 31, 2011
Where’s The Code?




                           https://labs.omniti.com/labs/pgtreats

          svn co https://labs.omniti.com/pgtreats/trunk/omnipitr/


Thursday, March 31, 2011
Where’s The Code?

                      •Currently in “PGTreats” Repo




                           https://labs.omniti.com/labs/pgtreats

          svn co https://labs.omniti.com/pgtreats/trunk/omnipitr/


Thursday, March 31, 2011
Where’s The Code?

                      •Currently in “PGTreats” Repo

                      •Available Via SVN Pull




                           https://labs.omniti.com/labs/pgtreats

          svn co https://labs.omniti.com/pgtreats/trunk/omnipitr/


Thursday, March 31, 2011
Where’s The Code?

                      •Currently in “PGTreats” Repo

                      •Available Via SVN Pull

                      •“BSD” Licensed


                           https://labs.omniti.com/labs/pgtreats

          svn co https://labs.omniti.com/pgtreats/trunk/omnipitr/


Thursday, March 31, 2011
TODO




Thursday, March 31, 2011
TODO

                      •Better Monitoring




Thursday, March 31, 2011
TODO

                      •Better Monitoring

                      •Parallel Multi-Destination




Thursday, March 31, 2011
TODO

                      •Better Monitoring

                      •Parallel Multi-Destination

                      •Multiple-Source Restores




Thursday, March 31, 2011
BUGS

                           Failover of a streaming replication
                           based slave created from a slave
                           based backup file against a stream
                           replication based slave doesn’t
                           work




Thursday, March 31, 2011
BUGS

                           Failover of a streaming replication
                           based slave created from a slave
                           based backup file against a stream
                           replication based slave doesn’t
                           work, sometimes,




Thursday, March 31, 2011
BUGS

                           Failover of a streaming replication
                           based slave created from a slave
                           based backup file against a stream
                           replication based slave doesn’t
                           work, sometimes, when under load




Thursday, March 31, 2011
BUGS

                           Failover of a streaming replication
                           based slave created from a slave
                           based backup file against a stream
                           replication based slave doesn’t
                           work, sometimes, when under load


                               We think it’s a flaw in Postgres,
                                 but hard to say for sure



Thursday, March 31, 2011
THE END




                                 Thanks!
                              pgeast, pgus


                                   Slides
                              http://www.xzilla.net/




Thursday, March 31, 2011

More Related Content

PDF
Out of the Box Replication in Postgres 9.4(PgCon)
PDF
Think_your_Postgres_backups_and_recovery_are_safe_lets_talk.pptx
PDF
The Essential PostgreSQL.conf
PDF
PostgreSQL Disaster Recovery with Barman
PDF
Scaling postgres
PPTX
Backups
PDF
Intro to pl/PHP Oscon2007
PPT
Scaling With Postgres
Out of the Box Replication in Postgres 9.4(PgCon)
Think_your_Postgres_backups_and_recovery_are_safe_lets_talk.pptx
The Essential PostgreSQL.conf
PostgreSQL Disaster Recovery with Barman
Scaling postgres
Backups
Intro to pl/PHP Oscon2007
Scaling With Postgres

Viewers also liked (20)

PDF
Database Scalability Patterns
PDF
A Guide To PostgreSQL 9.0
PDF
What Ops Can Learn From Design
PDF
Postgres 9.4 First Look
PDF
Less Alarming Alerts - SRECon 2016
PDF
plProxy, pgBouncer, pgBalancer
PDF
Managing Databases In A DevOps Environment
PDF
Managing Databases In A DevOps Environment 2016
PDF
Pro Postgres 9
PDF
Out of the box replication in postgres 9.4
PDF
Best Practices for a Complete Postgres Enterprise Architecture Setup
 
PDF
Managing PostgreSQL with PgCenter
PPTX
The Magic of Tuning in PostgreSQL
PDF
PostgreSQL performance improvements in 9.5 and 9.6
ODP
PostgreSQL Administration for System Administrators
PDF
PostgreSQL 9.6 Performance-Scalability Improvements
PDF
PostgreSQL Performance Tables Partitioning vs. Aggregated Data Tables
PDF
Mastering PostgreSQL Administration
 
PDF
Best Practices for Becoming an Exceptional Postgres DBA
 
PDF
Postgres in Production - Best Practices 2014
 
Database Scalability Patterns
A Guide To PostgreSQL 9.0
What Ops Can Learn From Design
Postgres 9.4 First Look
Less Alarming Alerts - SRECon 2016
plProxy, pgBouncer, pgBalancer
Managing Databases In A DevOps Environment
Managing Databases In A DevOps Environment 2016
Pro Postgres 9
Out of the box replication in postgres 9.4
Best Practices for a Complete Postgres Enterprise Architecture Setup
 
Managing PostgreSQL with PgCenter
The Magic of Tuning in PostgreSQL
PostgreSQL performance improvements in 9.5 and 9.6
PostgreSQL Administration for System Administrators
PostgreSQL 9.6 Performance-Scalability Improvements
PostgreSQL Performance Tables Partitioning vs. Aggregated Data Tables
Mastering PostgreSQL Administration
 
Best Practices for Becoming an Exceptional Postgres DBA
 
Postgres in Production - Best Practices 2014
 
Ad

Similar to Advanced WAL File Management With OmniPITR (20)

PDF
PostgreSQL WAL for DBAs
PDF
PostgreSQL Development Today: 9.0
PDF
잘 알려지지 않은 Php 코드 활용하기
PDF
PostgreSQL Write-Ahead Log (Heikki Linnakangas)
PDF
international PHP2011_ilia alshanetsky_Hidden Features of PHP
PDF
Puppet camp europe 2011 hackability
KEY
PL/Parrot San Francisco Perl Mongers 2010/05/25
PDF
Plugin Memcached%20 Study
PDF
Memcached
PDF
Check Please!
PDF
Perl Critic In Depth
PDF
PDF
Continuous Deployment at Disqus (Pylons Minicon)
PDF
An Empirical Study on the Risks of Using Off-the-Shelf Techniques for Process...
PDF
Big Bad "Upgraded" Postgres
PDF
newperl5
PDF
newperl5
PPT
7.1.intro perl
PDF
Pig and Python to Process Big Data
PDF
Python Cookbook 1st Edition Alex Martelli
PostgreSQL WAL for DBAs
PostgreSQL Development Today: 9.0
잘 알려지지 않은 Php 코드 활용하기
PostgreSQL Write-Ahead Log (Heikki Linnakangas)
international PHP2011_ilia alshanetsky_Hidden Features of PHP
Puppet camp europe 2011 hackability
PL/Parrot San Francisco Perl Mongers 2010/05/25
Plugin Memcached%20 Study
Memcached
Check Please!
Perl Critic In Depth
Continuous Deployment at Disqus (Pylons Minicon)
An Empirical Study on the Risks of Using Off-the-Shelf Techniques for Process...
Big Bad "Upgraded" Postgres
newperl5
newperl5
7.1.intro perl
Pig and Python to Process Big Data
Python Cookbook 1st Edition Alex Martelli
Ad

More from Robert Treat (14)

PDF
Advanced Int->Bigint Conversions
PDF
Explaining Explain
PDF
the-lost-art-of-plpgsql
PDF
Managing Chaos In Production: Testing vs Monitoring
PDF
Less Alarming Alerts!
PDF
Past, Present, and Pachyderm - All Things Open - 2013
PDF
Scaling with Postgres (Highload++ 2010)
PDF
Intro to Postgres 9 Tutorial
PDF
Intro to Postgres 8.4 Tutorial
PDF
The Essential postgresql.conf
PDF
PostgreSQL Partitioning, PGCon 2007
ODP
Pro PostgreSQL, OSCon 2008
PDF
Database Anti Patterns
ODP
Pro PostgreSQL
Advanced Int->Bigint Conversions
Explaining Explain
the-lost-art-of-plpgsql
Managing Chaos In Production: Testing vs Monitoring
Less Alarming Alerts!
Past, Present, and Pachyderm - All Things Open - 2013
Scaling with Postgres (Highload++ 2010)
Intro to Postgres 9 Tutorial
Intro to Postgres 8.4 Tutorial
The Essential postgresql.conf
PostgreSQL Partitioning, PGCon 2007
Pro PostgreSQL, OSCon 2008
Database Anti Patterns
Pro PostgreSQL

Recently uploaded (20)

PPTX
breach-and-attack-simulation-cybersecurity-india-chennai-defenderrabbit-2025....
PPT
Teaching material agriculture food technology
PDF
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
PDF
Advanced IT Governance
PDF
Advanced methodologies resolving dimensionality complications for autism neur...
PDF
Advanced Soft Computing BINUS July 2025.pdf
PDF
Shreyas Phanse Resume: Experienced Backend Engineer | Java • Spring Boot • Ka...
PDF
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
DOCX
The AUB Centre for AI in Media Proposal.docx
PDF
Spectral efficient network and resource selection model in 5G networks
PDF
Mobile App Security Testing_ A Comprehensive Guide.pdf
PDF
GDG Cloud Iasi [PUBLIC] Florian Blaga - Unveiling the Evolution of Cybersecur...
PDF
The Rise and Fall of 3GPP – Time for a Sabbatical?
PDF
Electronic commerce courselecture one. Pdf
PDF
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
PDF
Unlocking AI with Model Context Protocol (MCP)
PPTX
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
PDF
Dropbox Q2 2025 Financial Results & Investor Presentation
PDF
Per capita expenditure prediction using model stacking based on satellite ima...
PDF
NewMind AI Weekly Chronicles - August'25 Week I
breach-and-attack-simulation-cybersecurity-india-chennai-defenderrabbit-2025....
Teaching material agriculture food technology
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
Advanced IT Governance
Advanced methodologies resolving dimensionality complications for autism neur...
Advanced Soft Computing BINUS July 2025.pdf
Shreyas Phanse Resume: Experienced Backend Engineer | Java • Spring Boot • Ka...
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
The AUB Centre for AI in Media Proposal.docx
Spectral efficient network and resource selection model in 5G networks
Mobile App Security Testing_ A Comprehensive Guide.pdf
GDG Cloud Iasi [PUBLIC] Florian Blaga - Unveiling the Evolution of Cybersecur...
The Rise and Fall of 3GPP – Time for a Sabbatical?
Electronic commerce courselecture one. Pdf
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
Unlocking AI with Model Context Protocol (MCP)
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
Dropbox Q2 2025 Financial Results & Investor Presentation
Per capita expenditure prediction using model stacking based on satellite ima...
NewMind AI Weekly Chronicles - August'25 Week I

Advanced WAL File Management With OmniPITR

  • 1. Advanced WAL File Management With OmniPITR Robert Treat, JDCon 2011 #pgeast / Presentation Thursday, March 31, 2011
  • 2. Who Am I? • Robert
Treat • OmniTI • Database
Management
and
Consulting • We’re
Hiring! • Postgres • Major
Contributor,
Web,
Advocacy,
Random • xzilla.net • @robtreat2 Thursday, March 31, 2011
  • 3. Who Am I? • Robert
Treat • OmniTI • Database
Management
and
Consulting • We’re
Hiring! • Postgres • Major
Contributor,
Web,
Advocacy,
Random • xzilla.net • @robtreat2 Thursday, March 31, 2011
  • 4. What is PITR? Thursday, March 31, 2011
  • 5. What is PITR? •Postgres emits WAL files Thursday, March 31, 2011
  • 7. Digression •WAL Logs? •Write Ahead Log Logs? •OTOH, they are stored in pg_xlog... Thursday, March 31, 2011
  • 8. What is PITR? Thursday, March 31, 2011
  • 9. What is PITR? •Postgres emits WAL files Thursday, March 31, 2011
  • 10. What is PITR? •Postgres emits WAL files •Send the WAL file to another server Thursday, March 31, 2011
  • 11. What is PITR? •Postgres emits WAL files •Send the WAL file to another server •The other server can replay the WAL Thursday, March 31, 2011
  • 12. What is PITR? Use combination of data files and WAL to make more postgrezes Thursday, March 31, 2011
  • 13. What is PITR? •Postgres emits WAL files Use combination of data files and WAL to make more postgrezes Thursday, March 31, 2011
  • 14. What is PITR? •Postgres emits WAL files •Send the WAL file to another server Use combination of data files and WAL to make more postgrezes Thursday, March 31, 2011
  • 15. What is PITR? •Postgres emits WAL files •Send the WAL file to another server •The other server can replay the WAL Use combination of data files and WAL to make more postgrezes Thursday, March 31, 2011
  • 16. A Brief History of PITR Thursday, March 31, 2011
  • 17. A Brief History of PITR •8.1 (really) Thursday, March 31, 2011
  • 18. A Brief History of PITR •8.1 (really) •8.2 (warm standby) Thursday, March 31, 2011
  • 19. A Brief History of PITR •8.1 (really) •8.2 (warm standby) •9.0 (hot standby) Thursday, March 31, 2011
  • 20. A Brief History of PITR •8.1 (really) •8.2 (warm standby) •9.0 (hot standby) •9.0 (streaming replication) Thursday, March 31, 2011
  • 21. Ghetto Style archive_command = 'rsync %p sdb2:/data/pgsql/sdb1/84/walarchive/% f' Thursday, March 31, 2011
  • 22. Ghetto Style •Simple, Better Than You’d Think archive_command = 'rsync %p sdb2:/data/pgsql/sdb1/84/walarchive/% f' Thursday, March 31, 2011
  • 23. Early Version Of A PITR Script archive_command = ‘cp -i %p /data/pgsql/82_walarchives/%f </dev/null’ Thursday, March 31, 2011
  • 24. Early Version Of A PITR Script •Kind of Hacky archive_command = ‘cp -i %p /data/pgsql/82_walarchives/%f </dev/null’ Thursday, March 31, 2011
  • 25. Early Version Of A PITR Script archive_command = ‘cp -i %p /data/pgsql/82_walarchives/%f </dev/null’ opendir(DIR, "."); my @wals2move = grep { -f $_ && (stat(_))[9] + $AGE < time() && ( # 000000010000007200000031 ( /^[0-9A-F]{24}$/ && (stat(_))[7] == $WALSIZE ) || # 000000010000007200000031.0012C968.backup ( /^[0-9A-F]{24}.[0-9A-F]{8}.backup$/ ) ) && ( $mtime{$_} = (stat(_))[9] ) # Always true (for later) } readdir(DIR); closedir(DIR); Thursday, March 31, 2011
  • 26. Early Version Of A PITR Script •Kind of Hacky archive_command = ‘cp -i %p /data/pgsql/82_walarchives/%f </dev/null’ opendir(DIR, "."); my @wals2move = grep { -f $_ && (stat(_))[9] + $AGE < time() && ( # 000000010000007200000031 ( /^[0-9A-F]{24}$/ && (stat(_))[7] == $WALSIZE ) || # 000000010000007200000031.0012C968.backup ( /^[0-9A-F]{24}.[0-9A-F]{8}.backup$/ ) ) && ( $mtime{$_} = (stat(_))[9] ) # Always true (for later) } readdir(DIR); closedir(DIR); Thursday, March 31, 2011
  • 27. Early Version Of A PITR Script archive_command = ‘cp -i %p /data/pgsql/82_walarchives/%f </dev/null’ @wals2move = sort { $mtime{$a} <=> $mtime{$b} } @wals2move; if($TARGET) { foreach (@wals2move) { if($NOOP) { print "$RSYNC -essh --rsync-path=$REMOTE_RSYNC -a $_ $TARGET/$_n"; print "mv $_ $_.slavedn"; } else { if(system("$RSYNC -essh --rsync-path=$REMOTE_RSYNC -a $_ $TARGET/$_") != 0) { print STDERR "Error moving wal to target: $?n"; last; } if(!rename("$_", "$_.slaved")) { print STDERR "Error renaming $_ to $_.slavedn"; last; } } } } Thursday, March 31, 2011
  • 28. Early Version Of A PITR Script •Kind of Hacky archive_command = ‘cp -i %p /data/pgsql/82_walarchives/%f </dev/null’ @wals2move = sort { $mtime{$a} <=> $mtime{$b} } @wals2move; if($TARGET) { foreach (@wals2move) { if($NOOP) { print "$RSYNC -essh --rsync-path=$REMOTE_RSYNC -a $_ $TARGET/$_n"; print "mv $_ $_.slavedn"; } else { if(system("$RSYNC -essh --rsync-path=$REMOTE_RSYNC -a $_ $TARGET/$_") != 0) { print STDERR "Error moving wal to target: $?n"; last; } if(!rename("$_", "$_.slaved")) { print STDERR "Error renaming $_ to $_.slavedn"; last; } } } } Thursday, March 31, 2011
  • 30. Customizations •Multiple Destinations Thursday, March 31, 2011
  • 31. Customizations •Multiple Destinations •WAL File Delay Thursday, March 31, 2011
  • 32. Customizations •Multiple Destinations •WAL File Delay •Archive Storage (gzip & friends) Thursday, March 31, 2011
  • 33. Customizations •Multiple Destinations •WAL File Delay •Archive Storage (gzip & friends) •Better Backups Thursday, March 31, 2011
  • 35. ENTER: OmniPITR •Consolidate various scripts Thursday, March 31, 2011
  • 36. ENTER: OmniPITR •Consolidate various scripts •Deploy across ‘Nixes Thursday, March 31, 2011
  • 37. ENTER: OmniPITR •Consolidate various scripts •Deploy across ‘Nixes •Reusable Thursday, March 31, 2011
  • 38. ENTER: OmniPITR •Consolidate various scripts •Deploy across ‘Nixes •Reusable •Complete Solution Thursday, March 31, 2011
  • 40. OmniPITR-Archive •Lots of options Thursday, March 31, 2011
  • 41. OmniPITR-Archive •Lots of options •compression Thursday, March 31, 2011
  • 42. OmniPITR-Archive •Lots of options •compression •custom log file Thursday, March 31, 2011
  • 43. OmniPITR-Archive •Lots of options •compression •custom log file •special paths Thursday, March 31, 2011
  • 44. OmniPITR-Archive •Lots of options •compression •custom log file •special paths •multiple destinations Thursday, March 31, 2011
  • 45. OmniPITR-Archive Example archive_command = '/opt/OMNIpitr/bin/omnipitr-archive -l "/var/log/omnipitr/omnipitr-^Y-^m-^d.log" -s /var/lib/pgsql/omnipitr/state/ -t /var/tmp/ -dr gzip=db4:/mnt/db/prod/walarchive/ -dr db4:/mnt/db/prod/db4-walarchive/ -db /var/lib/pgsql/omnipitr/backup.xlogs "%p"' Thursday, March 31, 2011
  • 46. OmniPITR-Archive Example archive_command = '/opt/OMNIpitr/bin/omnipitr-archive -l "/var/log/omnipitr/omnipitr-^Y-^m-^d.log" -s /var/lib/pgsql/omnipitr/state/ -t /var/tmp/ -dr gzip=db4:/mnt/db/prod/walarchive/ -dr db4:/mnt/db/prod/db4-walarchive/ -db /var/lib/pgsql/omnipitr/backup.xlogs "%p"' Location of OmniPITR Thursday, March 31, 2011
  • 47. OmniPITR-Archive Example archive_command = '/opt/OMNIpitr/bin/omnipitr-archive -l "/var/log/omnipitr/omnipitr-^Y-^m-^d.log" -s /var/lib/pgsql/omnipitr/state/ -t /var/tmp/ -dr gzip=db4:/mnt/db/prod/walarchive/ -dr db4:/mnt/db/prod/db4-walarchive/ -db /var/lib/pgsql/omnipitr/backup.xlogs "%p"' Custom Log File Name/Location Thursday, March 31, 2011
  • 48. OmniPITR-Archive Example archive_command = '/opt/OMNIpitr/bin/omnipitr-archive -l "/var/log/omnipitr/omnipitr-^Y-^m-^d.log" -s /var/lib/pgsql/omnipitr/state/ -t /var/tmp/ -dr gzip=db4:/mnt/db/prod/walarchive/ -dr db4:/mnt/db/prod/db4-walarchive/ -db /var/lib/pgsql/omnipitr/backup.xlogs "%p"' state-directory to handle errors when sending wal to multiple destinations Thursday, March 31, 2011
  • 49. OmniPITR-Archive Example archive_command = '/opt/OMNIpitr/bin/omnipitr-archive -l "/var/log/omnipitr/omnipitr-^Y-^m-^d.log" -s /var/lib/pgsql/omnipitr/state/ -t /var/tmp/ -dr gzip=db4:/mnt/db/prod/walarchive/ -dr db4:/mnt/db/prod/db4-walarchive/ -db /var/lib/pgsql/omnipitr/backup.xlogs "%p"' Where To Create Temp Files Thursday, March 31, 2011
  • 50. OmniPITR-Archive Example archive_command = '/opt/OMNIpitr/bin/omnipitr-archive -l "/var/log/omnipitr/omnipitr-^Y-^m-^d.log" -s /var/lib/pgsql/omnipitr/state/ -t /var/tmp/ -dr gzip=dbx:/mnt/db/prod/walstorage/ -dr db4:/mnt/db/prod/db4-walarchive/ -db /var/lib/pgsql/omnipitr/backup.xlogs "%p"' send to remote server (dbx) compressed (gzip) Thursday, March 31, 2011
  • 51. OmniPITR-Archive Example archive_command = '/opt/OMNIpitr/bin/omnipitr-archive -l "/var/log/omnipitr/omnipitr-^Y-^m-^d.log" -s /var/lib/pgsql/omnipitr/state/ -t /var/tmp/ -dr gzip=db4:/mnt/db/prod/walarchive/ -dr db4:/mnt/db/prod/db4-walarchive/ -db /var/lib/pgsql/omnipitr/backup.xlogs "%p"' send to remote server (db4) uncompressed Thursday, March 31, 2011
  • 52. OmniPITR-Archive Example archive_command = '/opt/OMNIpitr/bin/omnipitr-archive -l "/var/log/omnipitr/omnipitr-^Y-^m-^d.log" -s /var/lib/pgsql/omnipitr/state/ -t /var/tmp/ -dr gzip=db4:/mnt/db/prod/walarchive/ -dr db4:/mnt/db/prod/db4-walarchive/ -db /var/lib/pgsql/omnipitr/backup.xlogs "%p"' Where to store xlogs when building a backup Thursday, March 31, 2011
  • 53. OmniPITR-Archive Example archive_command = '/opt/OMNIpitr/bin/omnipitr-archive -l "/var/log/omnipitr/omnipitr-^Y-^m-^d.log" -s /var/lib/pgsql/omnipitr/state/ -t /var/tmp/ -dr gzip=db4:/mnt/db/prod/walarchive/ -dr db4:/mnt/db/prod/db4-walarchive/ -db /var/lib/pgsql/omnipitr/backup.xlogs "%p"' The xlog file :-) Thursday, March 31, 2011
  • 55. OmniPITR-Restore •Lots of options (though not as many) Thursday, March 31, 2011
  • 56. OmniPITR-Restore •Lots of options (though not as many) •compressed files? Thursday, March 31, 2011
  • 57. OmniPITR-Restore •Lots of options (though not as many) •compressed files? •custom log file Thursday, March 31, 2011
  • 58. OmniPITR-Restore •Lots of options (though not as many) •compressed files? •custom log file •special paths Thursday, March 31, 2011
  • 59. OmniPITR-Restore Example restore_command = ' /opt/OMNIpitr/bin/omnipitr-restore -l /var/lib/pgsql/data/pg_log/omnipitr-^Y-^m-^d.log -s /var/lib/pgsql/wal_archive/ -p /var/lib/pgsql/wal_archives.pause -v -r %f %p' location of omnipitr-restore program Thursday, March 31, 2011
  • 60. OmniPITR-Restore Example restore_command = ' /opt/OMNIpitr/bin/omnipitr-restore -l /var/lib/pgsql/data/pg_log/omnipitr-^Y-^m-^d.log -s /var/lib/pgsql/wal_archive/ -p /var/lib/pgsql/wal_archives.pause -v -r %f %p' custom log file format Thursday, March 31, 2011
  • 61. OmniPITR-Restore Example restore_command = ' /opt/OMNIpitr/bin/omnipitr-restore -l /var/lib/pgsql/data/pg_log/omnipitr-^Y-^m-^d.log -s /var/lib/pgsql/wal_archive/ -p /var/lib/pgsql/wal_archives.pause -v -r %f %p' Source of WAL Files to Use For Restore Thursday, March 31, 2011
  • 62. OmniPITR-Restore Example restore_command = ' /opt/OMNIpitr/bin/omnipitr-restore -l /var/lib/pgsql/data/pg_log/omnipitr-^Y-^m-^d.log -s /var/lib/pgsql/wal_archive/ -p /var/lib/pgsql/wal_archives.pause -v -r %f %p' pause xlog removal if this file exists (foreshadow: used for making backups) Thursday, March 31, 2011
  • 63. OmniPITR-Restore Example restore_command = ' /opt/OMNIpitr/bin/omnipitr-restore -l /var/lib/pgsql/data/pg_log/omnipitr-^Y-^m-^d.log -s /var/lib/pgsql/wal_archive/ -p /var/lib/pgsql/wal_archives.pause -v -r %f %p' verbose Thursday, March 31, 2011
  • 64. OmniPITR-Restore Example restore_command = ' /opt/OMNIpitr/bin/omnipitr-restore -l /var/lib/pgsql/data/pg_log/omnipitr-^Y-^m-^d.log -s /var/lib/pgsql/wal_archive/ -p /var/lib/pgsql/wal_archives.pause -v -r %f %p' Remove Xlogs Files Which Are No Longer Needed Thursday, March 31, 2011
  • 65. OmniPITR-Restore Example restore_command = ' /opt/OMNIpitr/bin/omnipitr-restore -l /var/lib/pgsql/data/pg_log/omnipitr-^Y-^m-^d.log -s /var/lib/pgsql/wal_archive/ -p /var/lib/pgsql/wal_archives.pause -v -r %f %p' standard macros for “basename of segment” and “destination of recovery” Thursday, March 31, 2011
  • 67. OmniPITR-Master-Backup •Goal Thursday, March 31, 2011
  • 68. OmniPITR-Master-Backup •Goal •simple “tarball” for backup Thursday, March 31, 2011
  • 69. OmniPITR-Master-Backup •Goal •simple “tarball” for backup •one for $PGDATA and xlogs Thursday, March 31, 2011
  • 70. OmniPITR-Master-Backup •Goal •simple “tarball” for backup •one for $PGDATA and xlogs •simple to blow open and use Thursday, March 31, 2011
  • 71. OmniPITR-Master-Backup Example /opt/OMNIpitr/bin/omnipitr-backup-master -v -l "/var/log/omnipitr/omnipitr-^Y-^m-^d.log" -x /var/lib/pgsql/omnipitr/backup.xlogs -dr gzip=db4:/mnt/db/prod/backups/ -t /var/tmp/ -pp /usr/pgsql-9.0/bin/psql -D /pg_data/90data location of OmniPITR-backup-master Thursday, March 31, 2011
  • 72. OmniPITR-Master-Backup Example /opt/OMNIpitr/bin/omnipitr-backup-master -v -l "/var/log/omnipitr/omnipitr-^Y-^m-^d.log" -x /var/lib/pgsql/omnipitr/backup.xlogs -dr gzip=db4:/mnt/db/prod/backups/ -t /var/tmp/ -pp /usr/pgsql-9.0/bin/psql -D /pg_data/90data verbose Thursday, March 31, 2011
  • 73. OmniPITR-Master-Backup Example /opt/OMNIpitr/bin/omnipitr-backup-master -v -l "/var/log/omnipitr/omnipitr-^Y-^m-^d.log" -x /var/lib/pgsql/omnipitr/backup.xlogs -dr gzip=db4:/mnt/db/prod/backups/ -t /var/tmp/ -pp /usr/pgsql-9.0/bin/psql -D /pg_data/90data custom log file Thursday, March 31, 2011
  • 74. OmniPITR-Master-Backup Example /opt/OMNIpitr/bin/omnipitr-backup-master -v -l "/var/log/omnipitr/omnipitr-^Y-^m-^d.log" -x /var/lib/pgsql/omnipitr/backup.xlogs -dr gzip=db4:/mnt/db/prod/backups/ -t /var/tmp/ -pp /usr/pgsql-9.0/bin/psql -D /pg_data/90data directory to store xlogs during backup creation Thursday, March 31, 2011
  • 75. OmniPITR-Master-Backup Example /opt/OMNIpitr/bin/omnipitr-backup-master -v -l "/var/log/omnipitr/omnipitr-^Y-^m-^d.log" -x /var/lib/pgsql/omnipitr/backup.xlogs -dr gzip=db4:/mnt/db/prod/backups/ -t /var/tmp/ -pp /usr/pgsql-9.0/bin/psql -D /pg_data/90data copy backup file to remote server, compressed Thursday, March 31, 2011
  • 76. OmniPITR-Master-Backup Example /opt/OMNIpitr/bin/omnipitr-backup-master -v -l "/var/log/omnipitr/omnipitr-^Y-^m-^d.log" -x /var/lib/pgsql/omnipitr/backup.xlogs -dr gzip=db4:/mnt/db/prod/backups/ -t /var/tmp/ -pp /usr/pgsql-9.0/bin/psql -D /pg_data/90data location for temporary files whilst working Thursday, March 31, 2011
  • 77. OmniPITR-Master-Backup Example /opt/OMNIpitr/bin/omnipitr-backup-master -v -l "/var/log/omnipitr/omnipitr-^Y-^m-^d.log" -x /var/lib/pgsql/omnipitr/backup.xlogs -dr gzip=db4:/mnt/db/prod/backups/ -t /var/tmp/ -pp /usr/pgsql-9.0/bin/psql -D /pg_data/90data path to psql Thursday, March 31, 2011
  • 78. OmniPITR-Master-Backup Example /opt/OMNIpitr/bin/omnipitr-backup-master -v -l "/var/log/omnipitr/omnipitr-^Y-^m-^d.log" -x /var/lib/pgsql/omnipitr/backup.xlogs -dr gzip=db4:/mnt/db/prod/backups/ -t /var/tmp/ -pp /usr/pgsql-9.0/bin/psql -D /pg_data/90data $PGDATA Thursday, March 31, 2011
  • 79. Programmers Say: “I love it when people use my software to do cool things that I didn’t expect” Thursday, March 31, 2011
  • 80. Treat’s Maxim? “Try not to let the way software was designed get in the way of how you want to use it” Thursday, March 31, 2011
  • 82. OmniPITR-Slave-Backup •On MySQL, you could dump on slave for a long time Thursday, March 31, 2011
  • 83. OmniPITR-Slave-Backup •On MySQL, you could dump on slave for a long time •On ZFS, we use snapshots to make slaves on the backups Thursday, March 31, 2011
  • 84. OmniPITR-Slave-Backup •On MySQL, you could dump on slave for a long time •On ZFS, we use snapshots to make slaves on the backups •While “we” prefer to use Postgres, some of us prefer to use Linux Thursday, March 31, 2011
  • 85. OmniPITR-Slave-Backup •On MySQL, you could dump on slave for a long time •On ZFS, we use snapshots to make slaves on the backups •While “we” prefer to use Postgres, some of us prefer to use Linux •But, you still don’t want to pay the price for backups on master Thursday, March 31, 2011
  • 86. OmniPITR-Slave-Backup Example /opt/OMNIpitr/bin/omnipitr-backup-slave -v -l "/var/log/omnipitr/omnipitr-slave-backup-^Y-^m-^d.log" -s /mnt/db/prod/db4-walarchive -p /var/lib/pgsql/omnipitr/pause.removal -D /pg_data/90data/ -t /var/tmp/ -gp /usr/bin/pigz -dl gzip=/mnt/db/prod/backups/ -pp /usr/pgsql-9.0/bin/pg_controldata Location of omni-pitr-slave command Thursday, March 31, 2011
  • 87. OmniPITR-Slave-Backup Example /opt/OMNIpitr/bin/omnipitr-backup-slave -v -l "/var/log/omnipitr/omnipitr-slave-backup-^Y-^m-^d.log" -s /mnt/db/prod/db4-walarchive -p /var/lib/pgsql/omnipitr/pause.removal -D /pg_data/90data/ -t /var/tmp/ -gp /usr/bin/pigz -dl gzip=/mnt/db/prod/backups/ -pp /usr/pgsql-9.0/bin/pg_controldata verbose Thursday, March 31, 2011
  • 88. OmniPITR-Slave-Backup Example /opt/OMNIpitr/bin/omnipitr-backup-slave -v -l "/var/log/omnipitr/omnipitr-slave-backup-^Y-^m-^d.log" -s /mnt/db/prod/db4-walarchive -p /var/lib/pgsql/omnipitr/pause.removal -D /pg_data/90data/ -t /var/tmp/ -gp /usr/bin/pigz -dl gzip=/mnt/db/prod/backups/ -pp /usr/pgsql-9.0/bin/pg_controldata custom log location / format Thursday, March 31, 2011
  • 89. OmniPITR-Slave-Backup Example /opt/OMNIpitr/bin/omnipitr-backup-slave -v -l "/var/log/omnipitr/omnipitr-slave-backup-^Y-^m-^d.log" -s /mnt/db/prod/db4-walarchive -p /var/lib/pgsql/omnipitr/pause.removal -D /pg_data/90data/ -t /var/tmp/ -gp /usr/bin/pigz -dl gzip=/mnt/db/prod/backups/ -pp /usr/pgsql-9.0/bin/pg_controldata source of wal files Thursday, March 31, 2011
  • 90. OmniPITR-Slave-Backup Example /opt/OMNIpitr/bin/omnipitr-backup-slave -v -l "/var/log/omnipitr/omnipitr-slave-backup-^Y-^m-^d.log" -s /mnt/db/prod/db4-walarchive -p /var/lib/pgsql/omnipitr/pause.removal -D /pg_data/90data/ -t /var/tmp/ -gp /usr/bin/pigz -dl gzip=/mnt/db/prod/backups/ -pp /usr/pgsql-9.0/bin/pg_controldata file to pause removal of xlogs no longer needed for restore but still needed by backup Thursday, March 31, 2011
  • 91. OmniPITR-Slave-Backup Example /opt/OMNIpitr/bin/omnipitr-backup-slave -v -l "/var/log/omnipitr/omnipitr-slave-backup-^Y-^m-^d.log" -s /mnt/db/prod/db4-walarchive -p /var/lib/pgsql/omnipitr/pause.removal -D /pg_data/90data/ -t /var/tmp/ -gp /usr/bin/pigz -dl gzip=/mnt/db/prod/backups/ -pp /usr/pgsql-9.0/bin/pg_controldata $PGDATA Thursday, March 31, 2011
  • 92. OmniPITR-Slave-Backup Example /opt/OMNIpitr/bin/omnipitr-backup-slave -v -l "/var/log/omnipitr/omnipitr-slave-backup-^Y-^m-^d.log" -s /mnt/db/prod/db4-walarchive -p /var/lib/pgsql/omnipitr/pause.removal -D /pg_data/90data/ -t /var/tmp/ -gp /usr/bin/pigz -dl gzip=/mnt/db/prod/backups/ -pp /usr/pgsql-9.0/bin/pg_controldata location for temp files whilst working Thursday, March 31, 2011
  • 93. OmniPITR-Slave-Backup Example /opt/OMNIpitr/bin/omnipitr-backup-slave -v -l "/var/log/omnipitr/omnipitr-slave-backup-^Y-^m-^d.log" -s /mnt/db/prod/db4-walarchive -p /var/lib/pgsql/omnipitr/pause.removal -D /pg_data/90data/ -t /var/tmp/ -gp /usr/bin/pigz -dl gzip=/mnt/db/prod/backups/ -pp /usr/pgsql-9.0/bin/pg_controldata location of our “gzip” Thursday, March 31, 2011
  • 94. OmniPITR-Slave-Backup Example /opt/OMNIpitr/bin/omnipitr-backup-slave -v -l "/var/log/omnipitr/omnipitr-slave-backup-^Y-^m-^d.log" -s /mnt/db/prod/db4-walarchive -p /var/lib/pgsql/omnipitr/pause.removal -D /pg_data/90data/ -t /var/tmp/ -gp /usr/bin/pigz -dl gzip=/mnt/db/prod/backups/ -pp /usr/pgsql-9.0/bin/pg_controldata local storage, compressed Thursday, March 31, 2011
  • 95. OmniPITR-Slave-Backup Example /opt/OMNIpitr/bin/omnipitr-backup-slave -v -l "/var/log/omnipitr/omnipitr-slave-backup-^Y-^m-^d.log" -s /mnt/db/prod/db4-walarchive -p /var/lib/pgsql/omnipitr/pause.removal -D /pg_data/90data/ -t /var/tmp/ -gp /usr/bin/pigz -dl gzip=/mnt/db/prod/backups/ -pp /usr/pgsql-9.0/bin/pg_controldata path to pg_controldata Thursday, March 31, 2011
  • 97. Production Use? •Versions 8.2, 8.3, 8.4, 9.0 Thursday, March 31, 2011
  • 98. Production Use? •Versions 8.2, 8.3, 8.4, 9.0 •Linux, Solaris Thursday, March 31, 2011
  • 99. Production Use? •Versions 8.2, 8.3, 8.4, 9.0 •Linux, Solaris •TB+ Databases, with multiple tablespaces Thursday, March 31, 2011
  • 100. Production Use? •Versions 8.2, 8.3, 8.4, 9.0 •Linux, Solaris •TB+ Databases, with multiple tablespaces •Thousands of txn/sec Thursday, March 31, 2011
  • 101. Production Use? •Versions 8.2, 8.3, 8.4, 9.0 •Linux, Solaris •TB+ Databases, with multiple tablespaces •Thousands of txn/sec •Cross Datacenter Thursday, March 31, 2011
  • 102. Where’s The Code? https://labs.omniti.com/labs/pgtreats svn co https://labs.omniti.com/pgtreats/trunk/omnipitr/ Thursday, March 31, 2011
  • 103. Where’s The Code? •Currently in “PGTreats” Repo https://labs.omniti.com/labs/pgtreats svn co https://labs.omniti.com/pgtreats/trunk/omnipitr/ Thursday, March 31, 2011
  • 104. Where’s The Code? •Currently in “PGTreats” Repo •Available Via SVN Pull https://labs.omniti.com/labs/pgtreats svn co https://labs.omniti.com/pgtreats/trunk/omnipitr/ Thursday, March 31, 2011
  • 105. Where’s The Code? •Currently in “PGTreats” Repo •Available Via SVN Pull •“BSD” Licensed https://labs.omniti.com/labs/pgtreats svn co https://labs.omniti.com/pgtreats/trunk/omnipitr/ Thursday, March 31, 2011
  • 107. TODO •Better Monitoring Thursday, March 31, 2011
  • 108. TODO •Better Monitoring •Parallel Multi-Destination Thursday, March 31, 2011
  • 109. TODO •Better Monitoring •Parallel Multi-Destination •Multiple-Source Restores Thursday, March 31, 2011
  • 110. BUGS Failover of a streaming replication based slave created from a slave based backup file against a stream replication based slave doesn’t work Thursday, March 31, 2011
  • 111. BUGS Failover of a streaming replication based slave created from a slave based backup file against a stream replication based slave doesn’t work, sometimes, Thursday, March 31, 2011
  • 112. BUGS Failover of a streaming replication based slave created from a slave based backup file against a stream replication based slave doesn’t work, sometimes, when under load Thursday, March 31, 2011
  • 113. BUGS Failover of a streaming replication based slave created from a slave based backup file against a stream replication based slave doesn’t work, sometimes, when under load We think it’s a flaw in Postgres, but hard to say for sure Thursday, March 31, 2011
  • 114. THE END Thanks! pgeast, pgus Slides http://www.xzilla.net/ Thursday, March 31, 2011