1.环境准备
docker安装参考:Centos安装docker
2.容器搭建
拉取镜像
docker pull mysql:8.0
创建复制配置文件的容器
docker run -d --name mysql8.0 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:8.0
复制文件
宿主机创建以下目录
mkdir -p /home/docker/mysql8.0/conf \
/home/docker/mysql8.0/data \
/home/docker/mysql8.0/logs \
/home/docker/mysql8.0/bak
执行docker cp命令
docker cp mysql8.0:/etc/my.cnf /home/docker/mysql8.0/conf/my.cnf && \
docker cp mysql8.0:/etc/mysql/conf.d /home/docker/mysql8.0/conf/ && \
docker cp mysql8.0:/var/lib/mysql/. /home/docker/mysql8.0/data/
删除复制文件的容器
docker stop mysql8.0 && \
docker rm mysql8.0
创建容器
docker run --restart=always -d --name mysql8.0 -p 3306:3306 \
-v /home/docker/mysql8.0/conf/my.cnf:/etc/my.cnf \
-v /home/docker/mysql8.0/conf/conf.d:/etc/mysql/conf.d \
-v /home/docker/mysql8.0/logs:/logs \
-v /home/docker/mysql8.0/data:/var/lib/mysql \
-v /home/docker/mysql8.0/bak:/mysqlbak \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:8.0
参数解释
-v 挂载目录
-v /home/docker/mysql8.0/bak:/mysqlbak 备份数据的目录
设置mysql密码
-e MYSQL_ROOT_PASSWORD=123456
查看是否运行
docker ps # 查看运行容器
docker logs mysql8.0 # 查看运行日志
其它
mysql的定时数据备份与数据恢复
备份
mysql备份命令mysqldump,运行命令
# 使用这条命令会备份数据到容器内/mysqlbak/2024-8-18_ce_blog.sql文件里
docker exec -it mysql8.0 bash -c "mkdir -p /mysqlbak" && docker exec -it mysql8.0 bash -c \
> "mysqldump -uroot -p123456 --databases ce_blog > /mysqlbak/2024-8-18_ce_blog.sql"
# 使用这条命令会将容器内ce_blog数据库备份到宿主机的/home/docker/mysql8.0/bak/2024-8-18_ce_blog.sql文件里
docker exec -it mysql8.0 bash -c "mysqldump -uroot -p123456 --databases ce_blog" > /home/docker/mysql8.0/bak/2024-8-18_ce_blog.sql
定时运行执行以下命令
# 编辑定时任务
crontab -e
# 将命令写入进去
# 1.只设置定时备份
# */1 * * * * 每分钟执行一次 0 3 * * *每天凌晨3点执行
0 3 * * * docker exec mysql8.0 bash -c "mkdir -p /mysqlbak && mysqldump -uroot -p123456 --databases ce_blog > /mysqlbak/\$(date +\%Y-\%m-\%d-\%H-\%M-\%S).sql"
# 2.设置定时备份并设置备份时错误日志的输出目录宿主机目录/home/docker/mysql8.0/logs/mysql_backup_error.log
# */1 * * * * 每分钟执行一次 0 3 * * *每天凌晨3点执行
# 可能宿主机和docker时间不同 导致文件名时间显示看不懂 加上TZ='Asia/Shanghai'
0 3 * * * /usr/bin/docker exec mysql8.0 bash -c "mkdir -p /mysqlbak && mysqldump -uroot -p123456 --databases ce_blog > /mysqlbak/$(TZ='Asia/Shanghai' date +'\%Y-\%m-\%d-\%H-\%M-\%S').sql" 2>> /home/docker/mysql8.0/logs/mysql_backup_error.log
# 验证定时任务
crontab -l
恢复
mysql恢复命令mysql,运行命令
# 运行这条命令会将宿主机的/home/docker/mysql8.0/bak/ce_blog.sql这个文件数据恢复
docker exec -i mysql8.0 mysql -uroot -p123456 ce_blog < /home/docker/mysql8.0/bak/ce_blog.sql
# 可能会报错 ERROR 1067 (42000) at line 44: Invalid default value for 'comment_date'
# 这个错误是sql模式使用了严格模式,执行下面语句即可
docker exec -i mysql8.0 mysql -uroot -p123456 -e "SET GLOBAL sql_mode='';" && \
docker exec -i mysql8.0 mysql -uroot -p123456 ce_blog < /home/docker/mysql8.0/bak/ce_blog.sql && \
docker exec -i mysql8.0 mysql -uroot -p123456 -e "SET GLOBAL sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';"
Comments | 1 条评论
1