|
| 1 | +#!/bin/sh |
| 2 | + |
| 3 | +START=`date +%s` |
| 4 | + |
| 5 | +XDB_PROTO="$DB_PROTOCOL" |
| 6 | +XDB_HOST="$DB_HOST" |
| 7 | +XDB_PORT="$DB_PORT" |
| 8 | +XDB_DEFAULT_CHARACTER_SET="$DB_DEFAULT_CHARACTER_SET" |
| 9 | +XDB_EXPORT_FILE="$DB_EXPORT_FILE_PATH" |
| 10 | +XDB_EXPORT_GZIP="$DB_EXPORT_GZIP" |
| 11 | +XDB_EXPORT= |
| 12 | + |
| 13 | +# Required env variables |
| 14 | +if [[ -z "$DB_NAME" ]]; then "ERROR: `DB_NAME` env variable is required."; exit 1; fi |
| 15 | +if [[ -z "$DB_USERNAME" ]]; then "ERROR: `DB_USERNAME` env variable is required."; exit 1; fi |
| 16 | +if [[ -z "$DB_PASSWORD" ]]; then "ERROR: `DB_PASSWORD` env variable is required."; exit 1; fi |
| 17 | + |
| 18 | +# Optional env variables |
| 19 | +if [[ -z "$XDB_PROTO" ]]; then XDB_PROTO="tcp"; fi |
| 20 | +if [[ -z "$XDB_HOST" ]]; then XDB_HOST="127.0.0.1"; fi |
| 21 | +if [[ -z "$XDB_PORT" ]]; then XDB_PORT="3306"; fi |
| 22 | +if [[ -z "$XDB_DEFAULT_CHARACTER_SET" ]]; then XDB_DEFAULT_CHARACTER_SET=utf8; fi |
| 23 | +if [[ -z "$DB_EXPORT_FILE_PATH" ]]; then XDB_EXPORT_FILE="./$DB_NAME.sql"; fi |
| 24 | +if [[ -n "$XDB_EXPORT_GZIP" ]] && [[ "$XDB_EXPORT_GZIP" = "true" ]]; then |
| 25 | + if [[ -z $DB_EXPORT_FILE_PATH ]]; then XDB_EXPORT_FILE="$XDB_EXPORT_FILE.gz"; fi |
| 26 | + |
| 27 | + XDB_EXPORT="| gzip -c > $XDB_EXPORT_FILE" |
| 28 | +else |
| 29 | + XDB_EXPORT="> $XDB_EXPORT_FILE" |
| 30 | +fi |
| 31 | + |
| 32 | +DB_PASSWORD=$(echo -n $DB_PASSWORD | sed 's/"/\\"/g') |
| 33 | + |
| 34 | +CMD="\ |
| 35 | +--protocol=$XDB_PROTO \ |
| 36 | +--host=$XDB_HOST \ |
| 37 | +--port=$XDB_PORT \ |
| 38 | +--default-character-set=$XDB_DEFAULT_CHARACTER_SET \ |
| 39 | +--user=$DB_USERNAME \ |
| 40 | +--password="\"$DB_PASSWORD"\" \ |
| 41 | +$DB_ARGS $DB_NAME $XDB_EXPORT" |
| 42 | + |
| 43 | +echo "MySQL 8 Client - Exporter" |
| 44 | +echo "=========================" |
| 45 | + |
| 46 | +mysqldump --version |
| 47 | + |
| 48 | +echo |
| 49 | +echo "Exporting database \`$DB_NAME\` into a SQL script file..." |
| 50 | + |
| 51 | +if [[ -n "$XDB_EXPORT_GZIP" ]] && [[ "$XDB_EXPORT_GZIP" = "true" ]]; then |
| 52 | + echo "Output file: $XDB_EXPORT_FILE (SQL GZipped)" |
| 53 | +else |
| 54 | + echo "Output file: $XDB_EXPORT_FILE (SQL Text)" |
| 55 | +fi |
| 56 | + |
| 57 | +OUTPUT=$(eval mysqldump ${CMD} 2>&1) |
| 58 | +exitcode=$? |
| 59 | + |
| 60 | +if [[ $exitcode != 0 ]]; then echo $OUTPUT; exit $exitcode; fi |
| 61 | + |
| 62 | +# Note: Ugly workaround here because `mysqldump` (unlike `mysql`) doesn't emit a proper exit code even in MySQL v8 |
| 63 | +# See https://bugs.mysql.com/bug.php?id=90538 |
| 64 | +if echo $OUTPUT | grep -qE '(.*)(mysqldump: Got error:|: eval:)(.*)'; then |
| 65 | + echo $OUTPUT |
| 66 | + exit 1 |
| 67 | +fi |
| 68 | + |
| 69 | +if [[ ! -z "$OUTPUT" ]]; then echo $OUTPUT; fi; |
| 70 | + |
| 71 | +FILE_SIZE=$(du -sh $XDB_EXPORT_FILE | cut -f1) |
| 72 | + |
| 73 | +END=`date +%s` |
| 74 | +RUNTIME=$((END-START)) |
| 75 | + |
| 76 | +echo "Database \`$DB_NAME\` was exported on ${RUNTIME}s successfully!" |
| 77 | + |
| 78 | +if [[ -n "$XDB_EXPORT_GZIP" ]] && [[ "$XDB_EXPORT_GZIP" = "true" ]]; then |
| 79 | + echo "File exported: $XDB_EXPORT_FILE ($FILE_SIZE / SQL GZipped)" |
| 80 | +else |
| 81 | + echo "File exported: $XDB_EXPORT_FILE ($FILE_SIZE / SQL Text)" |
| 82 | +fi |
0 commit comments