Docker安装MySQL及备份

文章首发vate,授权alpha转载。转载需标明出处,禁止未经授权转载。

MySQL容器创建

  1. 现在推荐MySQL8.4 LTSC版本
  2. docker compose 文件现在不需要version声明了

docker compose 文件

services:
  mysql-db:
    # 指定容器的名称
    container_name: mysql   
    # 指定镜像和版本
    image: mysql:8.0               
    ports:
      - "3306:3306"
    restart: always
    # 容器日志大小配置
    logging:
      driver: 'json-file'
      options:
        max-size: '5g'
    environment:
      # 配置root密码
      MYSQL_ROOT_PASSWORD: PASSWORD
    volumes:
      # 挂载数据目录
      - "./data:/var/lib/mysql" 
      # 挂载配置文件目录
      - "./config:/etc/mysql/conf.d"  

MySQL 用户权限

因为要从容器外面连入,所以MySQL用户的host不能为localhost。

权限不推荐照搬,建议最小权限原则,只提供需要的权限就好

-- 登入容器
docker exec -it mysql mysql -u username -p

CREATE USER 'user1'@'%' IDENTIFIED BY 'password';

ALTER USER 'user1'@'%' IDENTIFIED BY 'password';
-- 授予备份权限
GRANT PROCESS, SHOW VIEW ON *.* TO `user1`@`%`;
-- 增删改查权限
GRANT ALL PRIVILEGES ON `database`.* TO `user1`@`%` ;

-- 刷新权限
FLUSH PRIVILEGES;
-- 权限太大不建议使用:
--- GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
-- 如果已存在其他 host 的 root 用户,可以复制权限
-- GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' AS 'root'@'localhost';

MySQL数据导入

如果有需要,要提前创建数据库

-- 登入容器
docker exec -it mysql_container_name mysql -u username -p

mysql> create database database_name

注入数据

docker exec -i mysql mysql -uroot -p'PASSWORD'  database_name < ./data.sql

MySQL数据备份

用 crontab 创建定时计划

# crontab -e
0 6 * * * /usr/bin/docker exec mysql mysqldump -uroot -p'PASSWORD' halo > "/mysqlbk/$(date +\%Y\%m\%d_\%H\%M\%S).sql"