linux下备份mysql数据
一、业务场景
自己现在做的项目基本上已经开发完成,正式开始上线运行,主要包含两个子项目一个是小程序的后台,一个是后台管理系统。
正式开始运行一段时间后,基本上也没什么BUG了,整个项目都已经能够正常的跑起来,程序也能够正常运转。这时候相对来说
系统也比较稳定。这时候自己就在考虑如何来备份数据库数据,做好备份工作是运维工作的必备技能之一,为的就是防止服务器
被黑客进行恶意攻击后,服务器上的所有数据都无法恢复的问题。
二、需求分析
由于自己之前做的工作主要是在内网进行开发,即使有的项目在公网可以正常访问,生产服务器这一块自己也基本接触不到。
这导致的问题就是对于真实的服务器一些操作,自己只会一些基本的操作,比如常规的软件安装,开端口,部署项目等等。对于
数据库备份这一块自己懂得不多,对于运维这一块了解得比较少。很多东西都需要现学现卖,使用谷歌和百度来解决遇到的各种问题。
自己也私下里问过之前的同事,主要是做后端开发工作的朋友,他们有没有好的数据库备份脚本。他们给出的意见是他们没有做备份
工作,对于安全这一块也只是做一些常规的操作,比如禁止root用户远程登录,使用非root用户登录后再切换为root用户进行项目部署。
所以需要自己去学习如何备份数据库数据,去学习如何写脚本,复制、粘贴也行。
三、解决方案
经过自己的寻找,找到一个比较实用的脚本,是一个已经写好的脚本,修改里面的一些参数即可。自己使用这个脚本,修改好参数后
立马进行测试,发现竟然可行。之后就使用这个脚本来进行修改,按照项目的实际需求来不断底改进脚本。反反复复底修改多次后
自己已经将改好的脚本直接上传到服务器上,也在linux系统上设置了定时任务来执行这个脚本。主要的操作为在星期一、三、五、日
的凌晨4点执行该脚本,脚本已经添加了可执行权限,之后使用邮件将数据发送到一个指定的邮箱。
设置的执行时间如下:
过了几天后,自己来查看执行结果。发现程序正常运行,可是自己去查看接收到的具体邮件时,发现里面收到的内容并不是自己想要的。
linux下的定时任务已经正常执行,邮件也已经正常发送,可是里面并没有自己需要的数据,说明数据库备份失败,不然怎么可能只有1kb
内存的大小。之后自己去排查问题,找了很久终于找到问题,导致这个问题的原因是在windows上写的脚本文件不能直接上传到linux服务器上
使用,因为windows和linux的字符编码不一样。解决办法之一是可以将在windows上写好的脚本文件内容复制、粘贴一份,然后在linux系统上
使用vim命令编辑脚本文件,将内容粘贴进行即可。自己做好之后,立马进行手动执行进行测试,发现这种方式可行。到此,在linux下自动备份
mysql数据库,然后将备份后的文件压缩打包发送到指定的邮件这个功能全部完成。
2022-01-07-后续问题
使用手动执行备份脚本没有问题,下面第一份数据是使用自动定时任务执行脚本的结果,大小就1kb,没有正常备份数据库数据。第二份数据是使用
手动执行的脚本,能够正常备份数据。
经过自己的仔细排查,发现那个数据库的备份脚本不是属于root用户的,推想可能只有root用户才能够执行改脚本,于是做如下尝试。
测试一:使用非root用户登录服务器之后,在使用 su root 命令切换到root用户,创建一个新目录,在创建新的数据库备份脚本,设置定时任务执行。
测试结果为还是不能正常备份。
测试二:使用不同的目录来执行脚本,看是不是因为不同的目录所属的用户不同,导致所拥有的执行权限不一致导致的问题。
测试结果为问题未解决,任然不能正常备份。
测试三:查看网友给出的建议,说可能是非root用户由于没有定时任务的权限,如下图所示
测试结果为仍然没有解决这个问题。
测试四:推测是否是由于非root用户不能直接执行备份数据库的命令。然后进行测试直接使用非root用户执行数据库备份脚本
测试结果能够正常备份。
说明非root用户已经可以正常执行备份数据库的命令,这并不是用户身份和用户权限的问题。
测试五:推测备份数据库数据时,是否存在没有添加当前数据库的主机地址导致不能正常备份。
按照上面的定时任务执行,测试结果为没有解决问题。
测试六:搜索关键词 linux下执行mysqldump后的文件大小为0kb 去查看相关的搜索结果。
网友给出的意见是在执行 mysqldump 命令的时候,需要加上全路径,参考博客如下
https://blog.csdn.net/u010615629/article/details/76146878
在查找 mysqldump 命令所在的目录,参考博文如下,
https://www.cnblogs.com/han019924/p/10445582.html
find / -name mysqldump -print
最终修改后的命令如下:
#! /bin/bash
export LANG=en_US.UTF-8
#注意:下面这几个变量需修改为你自己的
BackDir=/xxx/xxx
LogFile=/xxx/xxx/bak.log
DataBase=xxx
DataBaseUser=xxx
DataBasePWD=xxx
if [ ! -d "$BackDir" ];then
mkdir $BackDir
fi
if [ ! -f "$LogFile" ]; then
touch "$LogFile"
fi
#删除当前目录下以 .tgz 为后缀的文件
rm -rf *.tgz
Date=`date +%Y%m%d_%H%M%S`
Begin=`date +%Y%m%d_%H:%M:%S`
#到备份目录下
cd $BackDir
#设置导出脚本名称
DumpFile=$DataBase_$Date.sql
#设置压缩包名称
DumpFileZip=$DataBase_$Date.sql.tgz
#导出数据库数据
/opt/u01/software/mysql_5_7_20/bin/mysqldump -hlocalhost --add-drop-table -u$DataBaseUser -p$DataBasePWD $DataBase > $DumpFile
#压缩sql脚本
tar -czvf $DumpFileZip $DumpFile
#删除sql脚本
rm $DumpFile
Last=`date +"%Y%m%d_%H:%M:%S"`
echo start:$Begin end:$Last $DumpFileZip succ >> $LogFile
最终测试结果,问题解决。
参考