pg_migrate 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. #!/bin/sh
  2. ##
  3. ## pg_migrate -- PostgreSQL Database Migration Utility
  4. ## Copyright (c) 2000-2005 OpenPKG Foundation e.V. <http://openpkg.net/>
  5. ## Copyright (c) 2000-2005 Ralf S. Engelschall <http://engelschall.com/>
  6. ##
  7. ## Permission to use, copy, modify, and distribute this software for
  8. ## any purpose with or without fee is hereby granted, provided that
  9. ## the above copyright notice and this permission notice appear in all
  10. ## copies.
  11. ##
  12. ## THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
  13. ## WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
  14. ## MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
  15. ## IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
  16. ## CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  17. ## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  18. ## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
  19. ## USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  20. ## ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  21. ## OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
  22. ## OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  23. ## SUCH DAMAGE.
  24. ##
  25. # configuration
  26. l_prefix="@l_prefix@"
  27. l_rusr="@l_rusr@"
  28. l_rgrp="@l_rgrp@"
  29. l_pguser="@l_pguser@"
  30. l_pgpass="@l_pgpass@"
  31. # establish sane environment
  32. LC_CTYPE=C
  33. export LC_CTYPE
  34. umask 022
  35. # check command line
  36. if [ $# -ne 1 ]; then
  37. echo "$0:ERROR: invalid command line" 1>&2
  38. echo "$0:USAGE: $0 dump|restore" 1>&2
  39. exit 1
  40. fi
  41. # dispatch into commands
  42. cmd="$1"
  43. shift
  44. case $cmd in
  45. dump )
  46. echo "++ enforcing full-superuser access policy"
  47. cp -p $l_prefix/var/postgresql/db/pg_hba.conf \
  48. $l_prefix/var/postgresql/db/pg_hba.conf.orig
  49. ( echo "local all trust"
  50. echo "host all 127.0.0.1 255.255.255.255 trust"
  51. ) >$l_prefix/var/postgresql/db/pg_hba.conf
  52. if [ ".`$l_prefix/etc/rc postgresql status 2>&1 | grep 'is running'`" != . ]; then
  53. echo "++ reloading already running database engine"
  54. $l_prefix/etc/rc postgresql reload
  55. sleep 2
  56. epilog=reload
  57. else
  58. echo "++ temporarily starting database engine"
  59. $l_prefix/etc/rc postgresql start
  60. sleep 4
  61. epilog=stop
  62. fi
  63. echo "++ rotating dump files $l_prefix/var/postgresql/db.dump*.sql.bz2"
  64. i=9
  65. rm -f $l_prefix/var/postgresql/db.dump.$i.sql.bz2 >/dev/null 2>&1 || true
  66. while [ $i -gt 0 ]; do
  67. j=$i
  68. i=`expr $i - 1`
  69. if [ $i -eq 0 ]; then
  70. prev="$l_prefix/var/postgresql/db.dump.sql.bz2"
  71. next="$l_prefix/var/postgresql/db.dump.$j.sql.bz2"
  72. else
  73. prev="$l_prefix/var/postgresql/db.dump.$i.sql.bz2"
  74. next="$l_prefix/var/postgresql/db.dump.$j.sql.bz2"
  75. fi
  76. if [ -f $prev ]; then
  77. mv $prev $next
  78. fi
  79. done
  80. echo "++ dumping all databases into $l_prefix/var/postgresql/db.dump.sql.bz2"
  81. PGPASSWORD="$l_pgpass" \
  82. $l_prefix/bin/pg_dumpall \
  83. -U $l_pguser -o |\
  84. $l_prefix/lib/openpkg/bzip2 -9 \
  85. >$l_prefix/var/postgresql/db.dump.sql.bz2
  86. chown ${l_rusr}:${l_rgrp} $l_prefix/var/postgresql/db.dump.sql.bz2
  87. chmod 700 $l_prefix/var/postgresql/db.dump.sql.bz2
  88. echo "++ restoring original access policy"
  89. cp -p $l_prefix/var/postgresql/db/pg_hba.conf.orig \
  90. $l_prefix/var/postgresql/db/pg_hba.conf
  91. rm -f $l_prefix/var/postgresql/db/pg_hba.conf.orig
  92. if [ ".$epilog" = .reload ]; then
  93. echo "++ reloading already running database engine (again)"
  94. $l_prefix/etc/rc postgresql reload
  95. sleep 2
  96. else
  97. echo "++ stopping temporarily started database engine"
  98. $l_prefix/etc/rc postgresql stop
  99. sleep 4
  100. fi
  101. ;;
  102. restore )
  103. if [ ".`$l_prefix/etc/rc postgresql status 2>&1 | grep 'is running'`" != . ]; then
  104. echo "++ stopping already running database engine"
  105. $l_prefix/etc/rc postgresql stop
  106. sleep 2
  107. epilog=start
  108. else
  109. epilog=none
  110. fi
  111. echo "++ rotating database directories $l_prefix/var/postgresql/db.old*/"
  112. i=9
  113. rm -rf $l_prefix/var/postgresql/db.old.$i >/dev/null 2>&1 || true
  114. while [ $i -gt 0 ]; do
  115. j=$i
  116. i=`expr $i - 1`
  117. if [ $i -eq 0 ]; then
  118. prev="$l_prefix/var/postgresql/db"
  119. next="$l_prefix/var/postgresql/db.old.$j"
  120. else
  121. prev="$l_prefix/var/postgresql/db.old.$i"
  122. next="$l_prefix/var/postgresql/db.old.$j"
  123. fi
  124. if [ -d $prev ]; then
  125. mv $prev $next
  126. fi
  127. done
  128. echo "++ creating new database directory $l_prefix/var/postgresql/db/"
  129. mkdir $l_prefix/var/postgresql/db
  130. chown ${l_rusr}:${l_rgrp} $l_prefix/var/postgresql/db
  131. chmod 700 $l_prefix/var/postgresql/db
  132. su - ${l_rusr} -c \
  133. "LC_CTYPE=C; export LC_CTYPE; umask 022; \
  134. echo $l_pgpass >$l_prefix/var/postgresql/run/pw; \
  135. $l_prefix/bin/pg_initdb \
  136. -U $l_pguser --pwfile=$l_prefix/var/postgresql/run/pw \
  137. -D $l_prefix/var/postgresql/db; \
  138. rm -f $l_prefix/var/postgresql/run/pw" 2>&1 |\
  139. $l_prefix/lib/openpkg/shtool prop \
  140. -p "++ creating new database data"
  141. echo "++ restoring database configurations"
  142. for conf in pg_hba.conf pg_ident.conf postgresql.conf; do
  143. cp -p $l_prefix/var/postgresql/db.old.1/$conf \
  144. $l_prefix/var/postgresql/db/
  145. done
  146. echo "++ enforcing full-superuser access policy"
  147. cp -p $l_prefix/var/postgresql/db/pg_hba.conf \
  148. $l_prefix/var/postgresql/db/pg_hba.conf.orig
  149. ( echo "local all trust"
  150. echo "host all 127.0.0.1 255.255.255.255 trust"
  151. ) >$l_prefix/var/postgresql/db/pg_hba.conf
  152. if [ ".$epilog" = .start ]; then
  153. echo "++ starting database engine"
  154. else
  155. echo "++ temporarily starting database engine"
  156. fi
  157. $l_prefix/etc/rc postgresql start
  158. sleep 4
  159. echo "++ restoring all databases from $l_prefix/var/postgresql/db.dump.sql.bz2"
  160. $l_prefix/lib/openpkg/bzip2 -c -d \
  161. $l_prefix/var/postgresql/db.dump.sql.bz2 |\
  162. $l_prefix/bin/psql -U $l_pguser -d template1 2>&1 |\
  163. tee $l_prefix/var/postgresql/db.log |\
  164. $l_prefix/lib/openpkg/shtool prop \
  165. -p "++ restoring data (see $l_prefix/var/postgresql/db.log)"
  166. echo "++ restoring original access policy"
  167. cp -p $l_prefix/var/postgresql/db/pg_hba.conf.orig \
  168. $l_prefix/var/postgresql/db/pg_hba.conf
  169. rm -f $l_prefix/var/postgresql/db/pg_hba.conf.orig
  170. if [ ".$epilog" = .start ]; then
  171. echo "++ reloading already running database engine"
  172. $l_prefix/etc/rc postgresql reload
  173. sleep 2
  174. else
  175. echo "++ stopping temporarily started database engine"
  176. $l_prefix/etc/rc postgresql stop
  177. sleep 4
  178. fi
  179. ;;
  180. * )
  181. echo "$0:ERROR: unknown command \"$cmd\"" 1>&2
  182. exit 1
  183. ;;
  184. esac