mysql-bkup

command module
v0.0.0-...-082ef09 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Feb 25, 2024 License: MIT Imports: 1 Imported by: 0

README

MySQL Backup

MySQL Backup and Restoration tool. Backup database to AWS S3 storage or any S3 Alternatives for Object Storage.

Build Go Report Docker Image Size (latest by date) Docker Pulls

Logo

Runs on:

  • Docker
  • Kubernetes

Links:

PostgreSQL solution :

Storage:

  • local
  • s3
  • Object storage

Volumes:

  • /s3mnt => S3 mounting path
  • /backup => local storage mounting path

Usage

Options Shorts Usage
mysql-bkup bkup CLI utility
backup Backup database operation
restore Restore database operation
history Show the history of backup
--storage -s Set storage. local or s3 (default: local)
--file -f Set file name for restoration
--path Set s3 path without file name. eg: /custom_path
--dbname -d Set database name
--port -p Set database port (default: 3306)
--mode -m Set execution mode. default or scheduled (default: default)
--disable-compression Disable database backup compression
--prune Delete old backup, default disabled
--keep-last Delete old backup created more than specified days ago, default 7 days
--period Set crontab period for scheduled mode only. (default: "0 1 * * *")
--timeout -t Set timeout (default: 60s)
--help -h Print this help message and exit
--version -V Print version information and exit

Environment variables

Name Requirement Description
DB_PORT Optional, default 3306 Database port number
DB_HOST Required Database host
DB_NAME Optional if it was provided from the -d flag Database name
DB_USERNAME Required Database user name
DB_PASSWORD Required Database password
ACCESS_KEY Optional, required for S3 storage AWS S3 Access Key
SECRET_KEY Optional, required for S3 storage AWS S3 Secret Key
BUCKET_NAME Optional, required for S3 storage AWS S3 Bucket Name
S3_ENDPOINT Optional, required for S3 storage AWS S3 Endpoint
FILE_NAME Optional if it was provided from the --file flag Database file to restore (extensions: .sql, .sql.gz

Note:

Creating a user for backup tasks who has read-only access is recommended!

create read-only user

mysql -u root -p
CREATE USER read_only_user IDENTIFIED BY 'your_strong_password';

GRANT SELECT, SHOW VIEW ON *.* TO read_only_user;
FLUSH PRIVILEGES;

Backup database :

Simple backup usage

mysql-bkup backup --dbname database_name
mysql-bkup backup -d database_name
S3
mysql-bkup backup --storage s3 --dbname database_name

Docker run:

docker run --rm --network your_network_name --name mysql-bkup -v $PWD/backup:/backup/ -e "DB_HOST=database_host_name" -e "DB_USERNAME=username" -e "DB_PASSWORD=password" jkaninda/mysql-bkup:latest  mysql-bkup backup -d database_name

Docker compose file:

version: '3'
services:
  mariadb:
    container_name: mariadb
    image: mariadb
    environment:
      MYSQL_DATABASE: mariadb
      MYSQL_USER: mariadb
      MYSQL_PASSWORD: password
      MYSQL_ROOT_PASSWORD: password
  mysql-bkup:
    image: jkaninda/mysql-bkup
    container_name: mysql-bkup
    command:
      - /bin/sh
      - -c
      - mysql-bkup backup -d database_name
    volumes:
      - ./backup:/backup
    environment:
      - DB_PORT=3306
      - DB_HOST=mariadb
      - DB_USERNAME=mariadb
      - DB_PASSWORD=password

Restore database :

Simple database restore operation usage

mysql-bkup restore --dbname database_name --file database_20231217_115621.sql
mysql-bkup restore -f database_20231217_115621.sql 
S3
mysql-bkup restore --storage s3 --file database_20231217_115621.sql 

Docker run:

docker run --rm --network your_network_name --name mysql-bkup -v $PWD/backup:/backup/ -e "DB_HOST=database_host_name" -e "DB_USERNAME=username" -e "DB_PASSWORD=password" jkaninda/mysql-bkup  mysql-bkup backup -d database_name -f db_20231219_022941.sql.gz

Docker compose file:

version: '3'
services:
  mariadb:
    container_name: mariadb
    image: mariadb:latest
    environment:
      MYSQL_DATABASE: mariadb
      MYSQL_USER: mariadb
      MYSQL_PASSWORD: password
      MYSQL_ROOT_PASSWORD: password
  mysql-bkup:
    image: jkaninda/mysql-bkup
    container_name: mysql-bkup
    command:
      - /bin/sh
      - -c
      - mysql-bkup restore --file database_20231217_115621.sql --dbname database_name
    volumes:
      - ./backup:/backup
    environment:
      #- FILE_NAME=mariadb_20231217_040238.sql # Optional if file name is set from command
      - DB_PORT=3306
      - DB_HOST=mariadb
      - DB_NAME=mariadb
      - DB_USERNAME=mariadb
      - DB_PASSWORD=password

Run

docker-compose up -d

Backup to S3

docker run --rm --privileged --device /dev/fuse --name mysql-bkup -e "DB_HOST=db_hostname" -e "DB_USERNAME=username" -e "DB_PASSWORD=password" -e "ACCESS_KEY=your_access_key" -e "SECRET_KEY=your_secret_key" -e "BUCKETNAME=your_bucket_name" -e "S3_ENDPOINT=https://s3.us-west-2.amazonaws.com" jkaninda/mysql-bkup  mysql-bkup backup -s s3 -d database_name

To change s3 backup path add this flag : --path /myPath . default path is /mysql_bkup

Simple S3 backup usage

bkup backup --storage s3 --dbname mydatabase 
version: '3'
services:
  mysql-bkup:
    image: jkaninda/mysql-bkup
    container_name: mysql-bkup
    privileged: true
    devices:
    - "/dev/fuse"
    command:
      - /bin/sh
      - -c
      - mysql-bkup restore --storage s3 -f database_20231217_115621.sql.gz
    environment:
      - DB_PORT=3306
      - DB_HOST=mysql
      - DB_NAME=mariadb
      - DB_USERNAME=mariadb
      - DB_PASSWORD=password
      - ACCESS_KEY=${ACCESS_KEY}
      - SECRET_KEY=${SECRET_KEY}
      - BUCKET_NAME=${BUCKET_NAME}
      - S3_ENDPOINT=${S3_ENDPOINT}

Run in Scheduled mode

This tool can be run as CronJob in Kubernetes for a regular backup which makes deployment on Kubernetes easy as Kubernetes has CronJob resources. For Docker, you need to run it in scheduled mode by adding --mode scheduled flag and specify the periodical backup time by adding --period "0 1 * * *" flag.

Make an automated backup on Docker

Syntax of crontab (field description)

The syntax is:

  • 1: Minute (0-59)
  • 2: Hours (0-23)
  • 3: Day (0-31)
  • 4: Month (0-12 [12 == December])
  • 5: Day of the week(0-7 [7 or 0 == sunday])

Easy to remember format:

* * * * * command to be executed
- - - - -
| | | | |
| | | | ----- Day of week (0 - 7) (Sunday=0 or 7)
| | | ------- Month (1 - 12)
| | --------- Day of month (1 - 31)
| ----------- Hour (0 - 23)
------------- Minute (0 - 59)

At every 30th minute

*/30 * * * *

“At minute 0.” every hour

0 * * * *

“At 01:00.” every day

0 1 * * *

Example of scheduled mode

Docker run :

docker run --rm --name mysql-bkup -v $BACKUP_DIR:/backup/ -e "DB_HOST=$DB_HOST" -e "DB_USERNAME=$DB_USERNAME" -e "DB_PASSWORD=$DB_PASSWORD" jkaninda/mysql-bkup  mysql-bkup backup --dbname $DB_NAME --mode scheduled --period "0 1 * * *"

With Docker compose

version: "3"
services:
  mysql-bkup:
    image: jkaninda/mysql-bkup
    container_name: mysql-bkup
    privileged: true
    devices:
    - "/dev/fuse"
    command:
      - /bin/sh
      - -c
      - mysql-bkup backup --storage s3 --path /mys3_custome_path --dbname database_name --mode scheduled --period "*/30 * * * *"
    environment:
      - DB_PORT=3306
      - DB_HOST=mysqlhost
      - DB_USERNAME=userName
      - DB_PASSWORD=${DB_PASSWORD}
      - ACCESS_KEY=${ACCESS_KEY}
      - SECRET_KEY=${SECRET_KEY}
      - BUCKET_NAME=${BUCKET_NAME}
      - S3_ENDPOINT=${S3_ENDPOINT}

Kubernetes CronJob

For Kubernetes you don't need to run it in scheduled mode.

Simple Kubernetes CronJob usage:

apiVersion: batch/v1
kind: CronJob
metadata:
  name: mysql-bkup-job
spec:
  schedule: "0 1 * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: mysql-bkup
            image: jkaninda/mysql-bkup
            securityContext:
              privileged: true
            command:
            - /bin/sh
            - -c
            - mysql-bkup backup -s s3 --path /custom_path
            env:
              - name: DB_PORT
                value: "3306" 
              - name: DB_HOST
                value: ""
              - name: DB_NAME
                value: ""
              - name: DB_USERNAME
                value: ""
              # Please use secret!
              - name: DB_PASSWORD
                value: "password"
              - name: ACCESS_KEY
                value: ""
              - name: SECRET_KEY
                value: ""
              - name: BUCKET_NAME
                value: ""
              - name: S3_ENDPOINT
                value: "https://s3.us-west-2.amazonaws.com"
          restartPolicy: Never

Contributing

Contributions are welcome! If you encounter any issues or have suggestions for improvements, please create an issue or submit a pull request. Make sure to follow the existing coding style and provide tests for your changes.

License

This project is licensed under the MIT License. See the LICENSE file for details.

Authors

Jonas Kaninda

Copyright (c) [2023] [Jonas Kaninda]

Documentation

The Go Gopher

There is no documentation for this package.

Directories

Path Synopsis
Package cmd /*
Package cmd /*
Package pkg /*
Package pkg /*

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL