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

Viewers also liked (20)

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

Similar to Advanced WAL File Management With OmniPITR (20)

PDF
PostgreSQL WAL for DBAs
PGConf APAC
 
PDF
PostgreSQL Development Today: 9.0
PostgreSQL Experts, Inc.
 
PDF
잘 알려지지 않은 Php 코드 활용하기
형우 안
 
PDF
PostgreSQL Write-Ahead Log (Heikki Linnakangas)
Ontico
 
PDF
international PHP2011_ilia alshanetsky_Hidden Features of PHP
smueller_sandsmedia
 
PDF
Puppet camp europe 2011 hackability
Puppet
 
KEY
PL/Parrot San Francisco Perl Mongers 2010/05/25
David Fetter
 
PDF
Plugin Memcached%20 Study
Liu Lizhi
 
PDF
Memcached
elliando dias
 
PDF
Check Please!
Robert Treat
 
PDF
Perl Critic In Depth
Jeffrey Ryan Thalhammer
 
PDF
Unit VI
Bhavsingh Maloth
 
PDF
Continuous Deployment at Disqus (Pylons Minicon)
zeeg
 
PDF
An Empirical Study on the Risks of Using Off-the-Shelf Techniques for Process...
Nicolas Bettenburg
 
PDF
Big Bad "Upgraded" Postgres
Robert Treat
 
PDF
newperl5
tutorialsruby
 
PDF
newperl5
tutorialsruby
 
PPT
7.1.intro perl
Varun Chhangani
 
PDF
Pig and Python to Process Big Data
Shawn Hermans
 
PDF
Python Cookbook 1st Edition Alex Martelli
bnisitek
 
PostgreSQL WAL for DBAs
PGConf APAC
 
PostgreSQL Development Today: 9.0
PostgreSQL Experts, Inc.
 
잘 알려지지 않은 Php 코드 활용하기
형우 안
 
PostgreSQL Write-Ahead Log (Heikki Linnakangas)
Ontico
 
international PHP2011_ilia alshanetsky_Hidden Features of PHP
smueller_sandsmedia
 
Puppet camp europe 2011 hackability
Puppet
 
PL/Parrot San Francisco Perl Mongers 2010/05/25
David Fetter
 
Plugin Memcached%20 Study
Liu Lizhi
 
Memcached
elliando dias
 
Check Please!
Robert Treat
 
Perl Critic In Depth
Jeffrey Ryan Thalhammer
 
Continuous Deployment at Disqus (Pylons Minicon)
zeeg
 
An Empirical Study on the Risks of Using Off-the-Shelf Techniques for Process...
Nicolas Bettenburg
 
Big Bad "Upgraded" Postgres
Robert Treat
 
newperl5
tutorialsruby
 
newperl5
tutorialsruby
 
7.1.intro perl
Varun Chhangani
 
Pig and Python to Process Big Data
Shawn Hermans
 
Python Cookbook 1st Edition Alex Martelli
bnisitek
 
Ad

More from Robert Treat (14)

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

Recently uploaded (20)

PDF
How do you fast track Agentic automation use cases discovery?
DianaGray10
 
PDF
Future-Proof or Fall Behind? 10 Tech Trends You Can’t Afford to Ignore in 2025
DIGITALCONFEX
 
PDF
Transforming Utility Networks: Large-scale Data Migrations with FME
Safe Software
 
PPTX
Agentforce World Tour Toronto '25 - MCP with MuleSoft
Alexandra N. Martinez
 
PDF
AI Agents in the Cloud: The Rise of Agentic Cloud Architecture
Lilly Gracia
 
PDF
NLJUG Speaker academy 2025 - first session
Bert Jan Schrijver
 
PDF
Newgen 2022-Forrester Newgen TEI_13 05 2022-The-Total-Economic-Impact-Newgen-...
darshakparmar
 
PDF
“Computer Vision at Sea: Automated Fish Tracking for Sustainable Fishing,” a ...
Edge AI and Vision Alliance
 
DOCX
Python coding for beginners !! Start now!#
Rajni Bhardwaj Grover
 
PDF
UPDF - AI PDF Editor & Converter Key Features
DealFuel
 
PPTX
From Sci-Fi to Reality: Exploring AI Evolution
Svetlana Meissner
 
DOCX
Cryptography Quiz: test your knowledge of this important security concept.
Rajni Bhardwaj Grover
 
PDF
Mastering Financial Management in Direct Selling
Epixel MLM Software
 
PPTX
COMPARISON OF RASTER ANALYSIS TOOLS OF QGIS AND ARCGIS
Sharanya Sarkar
 
PDF
Transcript: Book industry state of the nation 2025 - Tech Forum 2025
BookNet Canada
 
PDF
[Newgen] NewgenONE Marvin Brochure 1.pdf
darshakparmar
 
PDF
LOOPS in C Programming Language - Technology
RishabhDwivedi43
 
PPTX
Designing_the_Future_AI_Driven_Product_Experiences_Across_Devices.pptx
presentifyai
 
PDF
Bitcoin for Millennials podcast with Bram, Power Laws of Bitcoin
Stephen Perrenod
 
PDF
“NPU IP Hardware Shaped Through Software and Use-case Analysis,” a Presentati...
Edge AI and Vision Alliance
 
How do you fast track Agentic automation use cases discovery?
DianaGray10
 
Future-Proof or Fall Behind? 10 Tech Trends You Can’t Afford to Ignore in 2025
DIGITALCONFEX
 
Transforming Utility Networks: Large-scale Data Migrations with FME
Safe Software
 
Agentforce World Tour Toronto '25 - MCP with MuleSoft
Alexandra N. Martinez
 
AI Agents in the Cloud: The Rise of Agentic Cloud Architecture
Lilly Gracia
 
NLJUG Speaker academy 2025 - first session
Bert Jan Schrijver
 
Newgen 2022-Forrester Newgen TEI_13 05 2022-The-Total-Economic-Impact-Newgen-...
darshakparmar
 
“Computer Vision at Sea: Automated Fish Tracking for Sustainable Fishing,” a ...
Edge AI and Vision Alliance
 
Python coding for beginners !! Start now!#
Rajni Bhardwaj Grover
 
UPDF - AI PDF Editor & Converter Key Features
DealFuel
 
From Sci-Fi to Reality: Exploring AI Evolution
Svetlana Meissner
 
Cryptography Quiz: test your knowledge of this important security concept.
Rajni Bhardwaj Grover
 
Mastering Financial Management in Direct Selling
Epixel MLM Software
 
COMPARISON OF RASTER ANALYSIS TOOLS OF QGIS AND ARCGIS
Sharanya Sarkar
 
Transcript: Book industry state of the nation 2025 - Tech Forum 2025
BookNet Canada
 
[Newgen] NewgenONE Marvin Brochure 1.pdf
darshakparmar
 
LOOPS in C Programming Language - Technology
RishabhDwivedi43
 
Designing_the_Future_AI_Driven_Product_Experiences_Across_Devices.pptx
presentifyai
 
Bitcoin for Millennials podcast with Bram, Power Laws of Bitcoin
Stephen Perrenod
 
“NPU IP Hardware Shaped Through Software and Use-case Analysis,” a Presentati...
Edge AI and Vision Alliance
 

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