へっぽこびんぼう野郎のnewbie日記

けろけーろ(´・ω・`)! #vZkt8fc6J

Docker+MySQLで物理バックアップを取得 & リストアする

InnoDBなので、その他はしらん

docker-compose.yml とかに↓のようなものが書いてあると思う

version: "2"
services:
  db:
    image: "mysql:5.7.12"
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: ""
      MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
      MYSQL_DATABASE: ${DB_NAME}
      MYSQL_PASSWORD: ${DB_PASSWORD}
      MYSQL_USER: ${DB_USER}
    command: mysqld --character-set-server=utf8 --collation-server=utf8_general_ci
    restart: always
    volumes:
      - "./volume:/var/lib/mysql"

そうすると、volumeディレクトリがdocker-compose.yml下に作成されている

$ cd ./volume
$ ls
auto.cnf           ib_buffer_pool     ib_logfile1        ibtmp1             performance_schema
ib_logfile0        ibdata1            mysql              sys

↑こんなん

これが、コンテナ内のデータディレクトリと同期している。(適当なファイルを作ると確認できる)

データディレクトリは、mysqlで↓を打つとわかる

> SHOW GLOBAL VARIABLES LIKE 'datadir';

それでこれをどこかにコピーする(物理バックアップ完了)

$ cp -r ./volume ~/backup-directory-where-you-want-to-lay

その後データベースを触って煮るなり焼くなりしたあと、↓をやるとデータベースが復元する

$ cp -r ~/backup-directory-where-you-want-to-lay ~/docker-directory-which-you-created

それでmysqlを再起動

$ docker exec -it <your-docker-container-name> service mysql restart

これでうまくいく。

docker-compose.yml があるディレクトリに↓のスクリプトを置くのもアリ。

#!/bin/sh
cp -r ~/backup-directory-where-you-want-to-lay ~/docker-directory-which-you-created
docker exec -it <your-docker-container-name> service mysql restart

ステージングのデータとかでちょっとしたテストを何度もやるときに便利

おまけ

コンテナ内に入るときはこう

$ docker exec -it <your-docker-container-name> /bin/bash

Reference

innodb - How to take physical backup of MYSQL database - Database Administrators Stack Exchange

MySQL :: MySQL 5.7 Reference Manual :: 14.18.1 InnoDB Backup