You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

78 lines
1.7 KiB

  1. #!/bin/bash
  2. usage="$exname [--host HOST] [DATABASE...]"
  3. DBS=()
  4. host=
  5. while [ "$1" ]; do
  6. case "$1" in
  7. "--help"|"-h")
  8. echo "$usage" >&2
  9. exit 0
  10. ;;
  11. "--host")
  12. host="$2"
  13. shift
  14. ;;
  15. *)
  16. DBS+=("$1")
  17. ;;
  18. esac
  19. shift
  20. done
  21. mysql_opts=()
  22. if [ "$host" ]; then
  23. mysql_opts+=(-h "$host")
  24. fi
  25. m() {
  26. mysql "${mysql_opts[@]}" -Bs "$@"
  27. }
  28. md() {
  29. mysqldump "${mysql_opts[@]}" "$@"
  30. }
  31. mysql_databases() {
  32. echo "SHOW DATABASES" | m
  33. }
  34. mysql_tables() {
  35. local db="$1"
  36. echo "SHOW TABLES" | m "$db"
  37. }
  38. if [ "${#DBS[@]}" == 0 ]; then
  39. DBS=($(mysql_databases)) || exit 1
  40. fi
  41. mkdir -p /var/backups/mysql
  42. for db in "${DBS[@]}"; do
  43. if [[ "$db" == "information_schema" || "$db" == "performance_schema" || "$db" == "mysql" ]]; then
  44. continue
  45. fi
  46. echo "Dumping database $db..." >&2
  47. # omitting all the rotation logic
  48. dst=/"var/backups/mysql/$db"
  49. [ -d "$dst.old" ] && rm -rf "$dst.old"
  50. [ -d "$dst" ] && mv "$dst" "$dst.old"
  51. mkdir -p "$dst.inprogress"
  52. (( start = SECONDS ))
  53. md "$db" --routines --no-data --add-drop-database --database "$db" | gzip --rsyncable > "$dst.inprogress/00-schema.sql.gz"
  54. tables=$(mysql_tables "$db")
  55. for table in $tables; do
  56. backup_file="$dst.inprogress/${table}.sql.gz"
  57. echo " Dumping $table into ${backup_file}"
  58. md "$db" "$table" | gzip --rsyncable > "$backup_file" || break
  59. done
  60. mv "$dst.inprogress" "$dst"
  61. [ -d "$dst.old" ] && rm -rf "$dst.old"
  62. (( elapsed = SECONDS - start ))
  63. echo " ..dumped $db to $dst ($(du -sh "$dst" | cut -f 1) in ${elapsed}s)" >&2
  64. done