需求
现在有一台运行在阿里云上的mysql8.0服务,为了数据的安全性需要每天凌晨备份数据到本地,而且需要每个数据库需要单独备份。
思路
本地使用的也是linux系统,在本地上运行mysqldump命令,对于多个数据库需要循环遍历,并将以上内容写入脚本,为了保证数据库密码的安全可以对脚本进行加密,最后使用crontab完成每天凌晨功能。
安装mysql
因为只用到了mysqldump,所以可以将以下文件解压到任何一个文件夹中,然后通过绝对路径访问mysqldump
cd /usr/local
wget https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-8.0.21-linux-glibc2.12-x86_64.tar.xz
tar -xvf mysql-8.0.21-linux-glibc2.12-x86_64.tar.xz
mv mysql-8.0.21-linux-glibc2.12-x86_64 mysql8
备份
mkdir /opt/mysql_dump
cd /opt/mysql_dump
vim backup.sh
在 backup.sh中写入以下内容,并修改数据库名称列表、主机地址和密码
#!/bin/bash
# 数据库名称列表
databases=("auth" "user")
# 文件备份到的目录,这个目录要手动创建
dump_dir='/opt/mysql_dump'
for str in ${databases[@]};do
# 判断是否存在数据库相同名称的目录
if [ ! -d "$dump_dir/$str" ]; then
mkdir $dump_dir/$str
fi
# `date +\%Y\%m\%d\%H\%M\%S` 给文件添加一个时间戳
/usr/local/mysql8/bin/mysqldump -h host -P3306 -u root -p'pasword' --default-character-set=utf8 $str > $dump_dir/$str/`date +\%Y\%m\%d\%H\%M\%S`.sql
done
修改文件的执行权限
chmod u+x backup.sh
测试是否可以备份
./backup.sh
mysqldump的基本使用
备份整个数据库
/usr/local/mysql8/bin/mysqldump -u root -h host -p'password' dbname > backdb.sql
备份数据库中的某个表
/usr/local/mysql8/bin/mysqldump -u root -h host -p'password' dbname tbname1, tbname2 > backdb.sql
备份多个数据库
/usr/local/mysql8/bin/mysqldump -u root -h host -p'password' --databases dbname1, dbname2 > backdb.sql
备份系统中所有数据库
/usr/local/mysql8/bin/mysqldump -u root -h host -p'password' --all-databases > backdb.sql
脚本加密
由于脚本中涉及到数据库的密码问题,可以对shell脚本进行加密,gzexe(可以反编译成明文不是很全,是系统自带命令)或shc,这里我们使用gzexe进行加密
gzexe backup.sh
定时任务
每天凌晨备份一次
编辑工作表
crontab -e
打开编辑框填入以下内容
0 0 * * * /opt/mysql_dump/backup.sh
查看任务是否已经执行
crontab -l
crontab 相关操作
crontab [-u username] //省略用户表表示操作当前用户的crontab
-e (编辑工作表)
-l (列出工作表里的命令)
-r (删除工作作)
{minute} {hour} {day-of-month} {month} {day-of-week} {full-path-to-shell-script}
- o minute: 区间为 0 – 59
- o hour: 区间为0 – 23
- o day-of-month: 区间为0 – 31
- o month: 区间为1 – 12. 1 是1月. 12是12月.
- o Day-of-week: 区间为0 – 7. 周日可以是0或7.
版权声明:本文为maker_knz原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。