Docker安装Mysql以及数据库的定时备份

使用Docker安装Mysql

  • 首先,从阿里云的Docker Hub 上pull一个MySQL的image.
[centos@loovelj~]$ docker pull registry.cn-hangzhou.aliyuncs.com/acs-sample/mysql:5.7
5.7: Pulling from acs-sample/mysql
d4bce7fd68df: Pull complete 
a3ed95caeb02: Pull complete 
01588229585e: Pull complete 
ada32b818a1a: Pull complete 
ac7528e308ac: Pull complete 
44e3fb8779c7: Pull complete 
bfcca86efc6a: Pull complete 
32da415dff2e: Pull complete 
aae6d9712a36: Pull complete 
3148136ce9cc: Pull complete 
Digest: sha256:32ff2f404c3bd199aaec2e6d19d91d59673e40d7394732124f91dd72a2e1ed97
Status: Downloaded newer image for registry.cn-hangzhou.aliyuncs.com/acs-sample/mysql:5.7
  • 查看下载镜像,就会看到已经有了
[centos@loovelj~]$ docker images
REPOSITORY                                           TAG                 IMAGE ID            CREATED             SIZE
test/ubuntu                                          v1.0                523e7db0e264        11 minutes ago      98.3MB
ubuntu                                               latest              dd6f76d9cc90        7 days ago          122MB
hello-world                                          latest              725dcfab7d63        8 days ago          1.84kB
registry.cn-hangzhou.aliyuncs.com/acs-sample/mysql   5.7                 ec7e75e5260c        23 months ago       360MB
 
  • 名字太长,修改为短的tag
[centos@loovelj~]$ docker tag registry.cn-hangzhou.aliyuncs.com/acs-sample/mysql:5.7 mysql:5.7 
[centos@loovelj~]$ docker images
REPOSITORY                                           TAG                 IMAGE ID            CREATED             SIZE
test/ubuntu                                          v1.0                523e7db0e264        12 minutes ago      98.3MB
ubuntu                                               latest              dd6f76d9cc90        7 days ago          122MB
hello-world                                          latest              725dcfab7d63        8 days ago          1.84kB
mysql                                                5.7                 ec7e75e5260c        23 months ago       360MB
registry.cn-hangzhou.aliyuncs.com/acs-sample/mysql   5.7                 ec7e75e5260c        23 months ago       360MB
  • 根据镜像创建容器
[centos@loovelj~]$ docker create -it mysql:5.7
62c975b37ad25b03914eb61e05088019f37ff9cb049a682ac02f20fac1761a4d
  • 启动MySQL容器
[centos@loovelj~]$ docker run --name mysqlserver -e MYSQL_ROOT_PASSWORD=sgcc -d -i -p 3306:3306  mysql:5.7
2a7a85124400be6fd47e0d97cf5d602456b1db1a11c6331747fe662481eea537
[centos@loovelj~]$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
2a7a85124400        mysql:5.7           "/entrypoint.sh my..."   9 seconds ago       Up 8 seconds        0.0.0.0:3306->3306/tcp   mysqlserver
188099665d1e        ubuntu:latest       "/bin/bash"              23 hours ago        Up 23 hours                                  angry_spence
 
  • 进入MySQL终端
[centos@liujun ~]$ docker exec -it  2a7a85124400  /bin/bash
root@2a7a85124400:/# mysql -h 127.0.0.1 -u root -p 
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.9 MySQL Community Server (GPL)

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 
  • 3.访问Mysql数据库
  • 由于我们在上面使用了-p参数映射了容器的3306端口到宿主机的3306端口,此时我们可以直接访问宿主机的3306端口来访问Docker中的mysql服务
mysql -h 127.0.0.1 -u root -p 

数据库备份

docker exec -it da0c1f5490f6 mysqldump -uroot -proot mysqlserver > /dfq/mysqldata/mysqlbakup_20210523.sql
  • da0c1f5490f6 :容器的id
  • uroot :用户名rot
  • -proot :密码root
  • mysqlserver :所需要备份的数据库名字
  • /dfq/mysqldata/mysqlbakup_20210523.sql 备份文件地址

数据库恢复

  • 进入容器
docker exec -it mysql bash
  • 进入mysql
mysql -uroot -p
  • 打开数据库
use mysql;
  • 使用备份sql恢复数据库
source /usr/src/mysql20200706.sql

定时备份数据库

  • 编辑一个脚本文件dataBaseName.sh

    简单写法

    #!/bin/bash
    
    docker exec -it da0c1f5490f6 mysqldump -uroot -proot gowork > /dfq/mysqldata/mysql_gowork_$(date +%Y%m%d_%H%M%S).sql
    #删除10天前的备份文件(-exec rm -rf {} \是固定写法,删除查询出来的数据)
    find /dfq/mysqldata/ -mtime +10 -name  "*.tar.gz" -exec rm -rf {} \;
    
    
    

    复杂写法

#!/bin/bash
#完成数据库的定时备份
#备份的路径
BACKUP=/dfq/mysqldata/gowork
#当前的时间作为文件名
DATETIME=$(date +%Y_%m_%d_%H%M%S)
#可以输出变量调试
#echo ${DATETIME}
echo "==========开始备份==========="
echo "备份的路径是 $BACKUP/$DATETIME.tar.gz"


#容器ID
DOCKER_ID=da0c1f5490f6
#用户名
DB_USER=root
#密码
DB_PWD=root
#备份数据库名
DATABASE=yuanchangliang
#创建备份的路径
#如果备份的路径文件夹存在就使用,否则创建
[ ! -d "$BACKUP/$DATETIME"  ]  && mkdir -p "$BACKUP/$DATETIME" 
#执行mysql的备份数据库的指令
docker exec -it ${DOCKER_ID}  mysqldump -u${DB_USER} -p${DB_PWD}   $DATABASE | gzip  > $BACKUP/$DATETIME/$DATETIME.sql

#打包备份文件
cd $BACKUP
tar -zcvf  $DATETIME.tar.gz  $DATETIME
#删除临时目录
rm -rf  $BACKUP/$DATETIME

#删除10天前的备份文件(-exec rm -rf {} \是固定写法,删除查询出来的数据)
find $BACKUP -mtime +10 -name  "*.tar.gz" -exec rm -rf {} \;
echo "==========备份完成==========="

目前我正在使用的:

BACKUP=/dfq/mysqldata/gowork
#当前时间作为文件名
DATETIME=$(date +%Y-%m-%d-%H%M%S)
#可以输出变量调试
#echo ${DATETIME}
echo "==========开始备份==========="
echo "备份路径是 $BACKUP/$DATETIME.sql"
#容器ID
DOCKER_ID=da0c1f5490f6
echo "备份的容器是 $DOCKER_ID"
#用户名
DB_USER=root
#密码
DB_PWD=root
#数据库
DATABASE=gowork
echo "备份的数据库$DATABASE"
#创建备份路径
#如果备份路径存在就使用,否则就创建
[ ! -d "$BACKUP"  ]  && mkdir -p "$BACKUP" 
#ִ执行备份命令
docker exec -it da0c1f5490f6 mysqldump -u$DB_USER -p$DB_PWD $DATABASE > $BACKUP/$DATETIME.sql
#删除10天前的备份文件(-exec rm -rf {} \固定写法删除查询出来的数据)
find $BACKUP -mtime +10 -name  "*.sql" -exec rm -rf {} \;
echo "==========备份完成==========="


  • 添加可执行权限;chmod +x dataBaseName.sh
  • contab -e ,添加 定时任务

crontab时间规则

5 * * * *     每小时第5分钟执行
*/5 * * * *5分钟执行
0 2 * * *     每天凌晨2点执行

cron是一个linux下的定时执行工具,可以在无需人工干预的情况下运行作业。由于Cron 是Linux的内置服务,但它不自动起来,可以用以下的方法启动、关闭这个服务:

/bin/systemctl start crond.service //启动服务
/bin/systemctl stop crond.service //关闭服务
/bin/systemctl restart crond.service //重启服务
/bin/systemctl reload crond.service //重新载入配置


crontab -u //设定某个用户的cron服务,一般root用户在执行这个命令的时候需要此参数
crontab -l //列出某个用户cron服务的详细内容
crontab -r //删除某个用户的cron服务
crontab -e //编辑某个用户的cron服务

注意

如果在使用crontab过程中出现了一下错误

You have mail in /var/spool/mail/root

你可以到、var/mail目录下 找到你的用户文件,使用

cat 文件名

可以查看错误信息

你可能感兴趣的:(数据库,服务器)