This commit is contained in:
parent
1ea25ff238
commit
56ad6595a3
89
README.md
89
README.md
@ -1,29 +1,30 @@
|
||||
[![Build Status](https://drone.asperti.com/api/badges/paspo/docker-mariadb-backup-slave/status.svg)](https://drone.asperti.com/paspo/docker-mariadb-backup-slave)
|
||||
|
||||
|
||||
# docker-mariadb-backup-slave
|
||||
|
||||
Setup a mariadb slave server with automysqlbackup
|
||||
[![Build Status](https://drone.asperti.com/api/badges/paspo/docker-mariadb-backup-slave/status.svg)](https://drone.asperti.com/paspo/docker-mariadb-backup-slave)
|
||||
|
||||
Setup a mariadb slave server with automysqlbackup
|
||||
|
||||
## Parameters
|
||||
|
||||
### SERVER_ID
|
||||
|
||||
This is used to customize slave server ID. The default value is 33. You should use an unique ID for each server.
|
||||
|
||||
### READONLY
|
||||
|
||||
When set to **1**, the slave server is set as readonly. This is the default. If you set this variable to something different, the database will be read/write.
|
||||
|
||||
### REPLICATE_DO_DB
|
||||
This is used to specify a single database to backup. It is generally advised to set this variable to the database name you want to backup.
|
||||
|
||||
This is used to specify a single database to backup. It is generally advised to set this variable to the database name you want to backup.
|
||||
|
||||
## How to setup a mysql slave for backup
|
||||
|
||||
### Configure the master node
|
||||
|
||||
Examine all mariadb config files, they're usually located in **/etc/mysql/**. You must have these instructions:
|
||||
|
||||
```
|
||||
```ini
|
||||
[mysqld]
|
||||
server_id = 1
|
||||
log_bin
|
||||
@ -41,7 +42,7 @@ After these modifications, restart mariadb.
|
||||
|
||||
Execute this statement on the master node:
|
||||
|
||||
```
|
||||
```sql
|
||||
grant replication slave on *.* to repluser@backupslave.host identified by 'aRandomPassword'; flush privileges;
|
||||
```
|
||||
|
||||
@ -51,7 +52,7 @@ Replace **repluser**, **backupslave.host**, **aRandomPassword** with something m
|
||||
|
||||
We use docker-compose here, but you can do the same with plain docker. Here's a sample **docker-compose.yaml** file:
|
||||
|
||||
```
|
||||
```yaml
|
||||
version: "3"
|
||||
services:
|
||||
|
||||
@ -69,12 +70,14 @@ services:
|
||||
```
|
||||
|
||||
Start the container:
|
||||
```
|
||||
|
||||
```bash
|
||||
docker-compose up -d
|
||||
```
|
||||
|
||||
Create the database:
|
||||
```
|
||||
|
||||
```bash
|
||||
docker exec my-container sh -c 'echo "create database aWordpressDatabase;" | exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD"'
|
||||
```
|
||||
|
||||
@ -82,7 +85,8 @@ docker exec my-container sh -c 'echo "create database aWordpressDatabase;" | exe
|
||||
|
||||
To obtain a consistant slave, you first have to freeze the master, and then transfer the data.
|
||||
Execute this on the master:
|
||||
```
|
||||
|
||||
```sql
|
||||
FLUSH TABLES WITH READ LOCK;
|
||||
show master status;
|
||||
```
|
||||
@ -92,6 +96,7 @@ show master status;
|
||||
Take note of file and position, we'll need these informations later.
|
||||
|
||||
### Import initial data
|
||||
|
||||
We have two ways to copy the data from the master to the slave: we'll call these "live" and "classic".
|
||||
The classic way is the usual mysqldump + file transfer + import.
|
||||
The live way is dump + import at the same time, without an intermediate file.
|
||||
@ -99,47 +104,62 @@ The live way is preferred when you have small databases (less than 5Gb) and a go
|
||||
The classic way is preferred when you have a big database because it locks the database for less time.
|
||||
|
||||
### Import initial data (live version)
|
||||
|
||||
Now, we need to import the backup from the master, so as we started the slave as readwrite, we can now do this on the slave:
|
||||
|
||||
```
|
||||
```bash
|
||||
docker exec my-container sh -c 'mysqldump -C --lock-tables=false --quick -u repluser -h master.host --password="aRandomPassword" aWordpressDatabase | mysql -u root -p"$MYSQL_ROOT_PASSWORD" aWordpressDatabase'
|
||||
```
|
||||
|
||||
Replace **my-container**, **repluser**, **master.host**, **aRandomPassword**, **aWordpressDatabase** with the correct values.
|
||||
Replace **my-container**, **repluser**, **master.host**, **aRandomPassword**, **aWordpressDatabase** with the correct values.
|
||||
|
||||
Now that the slave has got some data, we can release the lock in the master:
|
||||
```
|
||||
|
||||
```bash
|
||||
UNLOCK TABLES;
|
||||
```
|
||||
|
||||
### Import initial data (classic version)
|
||||
|
||||
In the master we run mysqldump in a shell:
|
||||
```
|
||||
|
||||
```bash
|
||||
mysqldump -u root -p aWordpressDatabase | gzip > thedump.sql.gz
|
||||
```
|
||||
|
||||
When the export is finished, we can let the master resume his work, by issuing this command in the previous mysql session:
|
||||
```
|
||||
|
||||
```bash
|
||||
UNLOCK TABLES;
|
||||
```
|
||||
|
||||
We can proceed to transfer the dump file to the slave; use the method you prefer.
|
||||
On the slave, copy the dump file in the running container, like this:
|
||||
```
|
||||
|
||||
```bash
|
||||
docker cp thedump.sql.gz my-container:/thedump.sql.gz
|
||||
```
|
||||
Then we import it:
|
||||
```
|
||||
|
||||
Then we import it:
|
||||
|
||||
```bash
|
||||
docker exec my-container sh -c 'zcat /thedump.sql.gz | mysql -u root -p"$MYSQL_ROOT_PASSWORD" aWordpressDatabase'
|
||||
docker exec my-container sh -c 'rm /thedump.sql.gz'
|
||||
```
|
||||
Replace **my-container**, **aWordpressDatabase** with the correct values.
|
||||
|
||||
### Start the slave
|
||||
Replace **my-container**, **aWordpressDatabase** with the correct values.
|
||||
|
||||
### Start the slave
|
||||
|
||||
Open a mysql console in the slave:
|
||||
```
|
||||
|
||||
```bash
|
||||
docker exec -ti my-container sh -c 'mysql -u root -p"$MYSQL_ROOT_PASSWORD" aWordpressDatabase'
|
||||
```
|
||||
|
||||
And configure the replication:
|
||||
```
|
||||
|
||||
```sql
|
||||
STOP SLAVE;
|
||||
RESET SLAVE;
|
||||
CHANGE MASTER TO
|
||||
@ -153,12 +173,16 @@ CHANGE MASTER TO
|
||||
MASTER_CONNECT_RETRY=10;
|
||||
START SLAVE;
|
||||
```
|
||||
|
||||
### Check replication status
|
||||
```
|
||||
|
||||
```bash
|
||||
docker exec -ti my-container sh -c 'mysql -u root -p"$MYSQL_ROOT_PASSWORD" aWordpressDatabase -e "SHOW SLAVE STATUS\G;"'
|
||||
```
|
||||
|
||||
Example output:
|
||||
```
|
||||
|
||||
```sql
|
||||
*************************** 1. row ***************************
|
||||
Slave_IO_State: Waiting for master to send event
|
||||
Master_Host: master.host
|
||||
@ -209,18 +233,23 @@ Master_SSL_Verify_Server_Cert: No
|
||||
Parallel_Mode: conservative
|
||||
1 row in set (0.00 sec)
|
||||
```
|
||||
|
||||
In a normal condition, **Slave_IO_Running** and **Slave_SQL_Running** should be **Yes**: this means that the communication between master and slave is ok and no sync error has occourred. **Seconds_Behind_Master** is usually 0, except wen the communication has just been established and the slave has to catch up with the master. This situation usually resolves in some time.
|
||||
|
||||
### Make the slave read-only
|
||||
|
||||
For a safety measure, we're enabling read-only mode for the slave: we don't have to run any query on this host, we're just using it for scheduled backups.
|
||||
Reopen **docker-compose.yaml**, change **READONLY=0** to **READONLY=1** and restart the container:
|
||||
```
|
||||
|
||||
```bash
|
||||
docker-compose up -d
|
||||
```
|
||||
|
||||
## How to use different mariadb version
|
||||
The default is mariadb 10.4.
|
||||
If you want, you can use mariadb 10.3, 10.2 or 10.1 by changing this line in **docker-compose.yaml**:
|
||||
```
|
||||
|
||||
The default is mariadb 10.5.
|
||||
If you want, you can use mariadb 10.4, 10.3, or 10.2 by changing this line in **docker-compose.yaml**:
|
||||
|
||||
```yaml
|
||||
image: docker.asperti.com/paspo/mariadb-backup-slave:maria-10.1
|
||||
```
|
||||
```
|
||||
|
Loading…
Reference in New Issue
Block a user