Sulyok Csaba
3 years ago
4 changed files with 136 additions and 0 deletions
-
21mysql-restore-s3/Dockerfile
-
37mysql-restore-s3/README.md
-
16mysql-restore-s3/install.sh
-
62mysql-restore-s3/restore.sh
@ -0,0 +1,21 @@ |
|||
FROM alpine:latest |
|||
|
|||
ADD install.sh install.sh |
|||
RUN sh install.sh && rm install.sh |
|||
|
|||
ENV MYSQL_HOST **None** |
|||
ENV MYSQL_PORT 3306 |
|||
ENV MYSQL_USER **None** |
|||
ENV MYSQL_PASSWORD **None** |
|||
ENV S3_ACCESS_KEY_ID **None** |
|||
ENV S3_SECRET_ACCESS_KEY **None** |
|||
ENV S3_BUCKET **None** |
|||
ENV S3_REGION us-west-1 |
|||
ENV S3_ENDPOINT **None** |
|||
ENV S3_S3V4 no |
|||
ENV S3_PREFIX 'backup' |
|||
ENV S3_FILENAME **None** |
|||
|
|||
ADD restore.sh restore.sh |
|||
|
|||
CMD ["sh", "restore.sh"] |
@ -0,0 +1,37 @@ |
|||
# mysql-restore-s3 |
|||
|
|||
Restore a MySQL backup from S3 to MySQL |
|||
|
|||
## Warning |
|||
|
|||
This will potentially put your database in a very bad state or complete destroy your data, be very careful. |
|||
|
|||
## Limitations |
|||
|
|||
This is made to restore a backup made from mysql-backup-s3, if you backup came from somewhere else please check your format. |
|||
|
|||
* Your s3 bucket must only contain backups which you wish to restore - it will always grabs the 'latest' based on unix sort with no filtering, unless exact name provided |
|||
* They must be gzip encoded text sql files |
|||
* If your bucket has more than a 1000 files the latest may not be restore, only one s3 ls command is made |
|||
|
|||
## Usage |
|||
|
|||
Docker: |
|||
```sh |
|||
$ docker run -e S3_ACCESS_KEY_ID=key -e S3_SECRET_ACCESS_KEY=secret -e S3_BUCKET=my-bucket -e S3_PREFIX=backup -e MYSQL_USER=user -e MYSQL_PASSWORD=password -e MYSQL_HOST=localhost schickling/mysql-restore-s3 |
|||
``` |
|||
|
|||
## Environment variables |
|||
|
|||
- `MYSQL_HOST` the mysql host *required* |
|||
- `MYSQL_PORT` the mysql port (default: 3306) |
|||
- `MYSQL_USER` the mysql user *required* |
|||
- `MYSQL_PASSWORD` the mysql password *required* |
|||
- `S3_ACCESS_KEY_ID` your AWS access key *required* |
|||
- `S3_SECRET_ACCESS_KEY` your AWS secret key *required* |
|||
- `S3_BUCKET` your AWS S3 bucket path *required* |
|||
- `S3_PREFIX` path prefix in your bucket (default: 'backup') |
|||
- `S3_FILENAME` filename from S3 used for backup. If not set, it will use the latest snapshot file. |
|||
- `S3_REGION` the AWS S3 bucket region (default: us-west-1) |
|||
- `S3_ENDPOINT` the AWS Endpoint URL, for S3 Compliant APIs such as [minio](https://minio.io) (default: none) |
|||
- `S3_S3V4` set to `yes` to enable AWS Signature Version 4, required for [minio](https://minio.io) servers (default: no) |
@ -0,0 +1,16 @@ |
|||
#!/bin/sh |
|||
|
|||
# exit if a command fails |
|||
set -eo pipefail |
|||
|
|||
apk update |
|||
|
|||
# install mysqldump |
|||
apk add mysql-client |
|||
|
|||
# install s3 tools |
|||
apk add python3 py3-pip |
|||
pip install awscli |
|||
|
|||
# cleanup |
|||
rm -rf /var/cache/apk/* |
@ -0,0 +1,62 @@ |
|||
#!/bin/sh |
|||
|
|||
set -eo pipefail |
|||
|
|||
if [ "${S3_ACCESS_KEY_ID}" == "**None**" ]; then |
|||
echo "Warning: You did not set the S3_ACCESS_KEY_ID environment variable." |
|||
fi |
|||
|
|||
if [ "${S3_SECRET_ACCESS_KEY}" == "**None**" ]; then |
|||
echo "Warning: You did not set the S3_SECRET_ACCESS_KEY environment variable." |
|||
fi |
|||
|
|||
if [ "${S3_BUCKET}" == "**None**" ]; then |
|||
echo "You need to set the S3_BUCKET environment variable." |
|||
exit 1 |
|||
fi |
|||
|
|||
if [ "${MYSQL_HOST}" == "**None**" ]; then |
|||
echo "You need to set the MYSQL_HOST environment variable." |
|||
exit 1 |
|||
fi |
|||
|
|||
if [ "${MYSQL_USER}" == "**None**" ]; then |
|||
echo "You need to set the MYSQL_USER environment variable." |
|||
exit 1 |
|||
fi |
|||
|
|||
if [ "${MYSQL_PASSWORD}" == "**None**" ]; then |
|||
echo "You need to set the MYSQL_PASSWORD environment variable or link to a container named MYSQL." |
|||
exit 1 |
|||
fi |
|||
|
|||
if [ "${S3_IAMROLE}" != "true" ]; then |
|||
# env vars needed for aws tools - only if an IAM role is not used |
|||
export AWS_ACCESS_KEY_ID=$S3_ACCESS_KEY_ID |
|||
export AWS_SECRET_ACCESS_KEY=$S3_SECRET_ACCESS_KEY |
|||
export AWS_DEFAULT_REGION=$S3_REGION |
|||
fi |
|||
|
|||
if [ "${S3_ENDPOINT}" == "**None**" ]; then |
|||
AWS_ARGS="" |
|||
else |
|||
AWS_ARGS="--endpoint-url ${S3_ENDPOINT}" |
|||
fi |
|||
|
|||
if [ "${S3_FILENAME}" == "**None**" ]; then |
|||
echo "Finding latest backup" |
|||
S3_FILENAME=$(aws $AWS_ARGS s3 ls s3://$S3_BUCKET/$S3_PREFIX/ | sort | tail -n 1 | awk '{ print $4 }') |
|||
fi |
|||
|
|||
MYSQL_HOST_OPTS="${MYSQL_OPTS} -h $MYSQL_HOST -P $MYSQL_PORT -u$MYSQL_USER -p$MYSQL_PASSWORD" |
|||
|
|||
echo "Fetching ${S3_FILENAME} from S3" |
|||
|
|||
aws $AWS_ARGS s3 cp s3://$S3_BUCKET/$S3_PREFIX/${S3_FILENAME} dump.sql.gz |
|||
gzip -d dump.sql.gz |
|||
|
|||
echo "Restoring ${S3_FILENAME}" |
|||
|
|||
mysql $MYSQL_HOST_OPTS < dump.sql |
|||
|
|||
echo "MySQL Restore complete" |
Write
Preview
Loading…
Cancel
Save
Reference in new issue