这个世界虽然爱情有价,但数据无价,数据备份尤为重要。以后哪天不小心把数据库删了,也不用担心跑路了。本文介绍的解决方案是利用Linux自身的crontab定时任务功能,定时执行备份数据库的脚本。技术要点:数据库备份转储命令shell脚本Linux定时任务crontab数据备份转储数据库有个命令可以导出数据库中的数据和结构,也就是备份。恢复备份数据会将原数据中的表删除重建,然后在备份中插入数据,即恢复。这一点需要注意的是,如果恢复前的数据多于备份,恢复后多的数据会消失。列出我常用的两个数据库postgresql的备份恢复命令:backuppg_dump-h[ip]-U[用户名][库名]>[导出的.sql文件]restorepsql-s[库名]-f[export.sql文件]mysql:backupmysqldump-h-u[用户名]-p[库名]>[导出的.sql文件]restoremysql-u[用户名]-p[库名]<[导出的.sql文件]Shell脚本需要Shell脚本来完成功能齐全的备份解决方案。我们要将这个脚本备份到指定路径,并压缩保存,最多30条,如果超过30条,删除最旧的,记录运行日志。什么都不说,话都在剧本里,搞定!#用户名username=root#密码password=nicai#要备份的数据库database_name=l_love_you#保存最大备份文件数count=30#备份保存路径backup_path=/app/mysql_backup#datedate_time=`date+%Y-%m-%d-%H-%M`#如果文件夹不存在则创建if[!-d$备份路径];然后mkdir-p$backup_path;fi#开始备份mysqldump-u$username-p$password$database_name>$backup_path/$database_name-$date_time.sql#开始压缩cd$backup_pathtar-zcvf$database_name-$date_time.tar.gz$database_name-$date_time.sql#删除源文件rm-rf$backup_path/$database_name-$date_time.sql#更新备份日志echo"create$backup_path/$database_name-$date_time.tar.gz">>$backup_path/dump.log#找出备份需要删除的delfile=`ls-l-crt$backup_path/*.tar.gz|awk'{print$9}'|head-1`#判断当前备份数量是否大于阈值number=`ls-l-crt$backup_path/*.tar.gz|awk'{print$9}'|wc-l`if[$number-gt$count]then#删除最早生成的备份,只保留count个备份rm$delfile#更新和删除文件日志echo"delete$delfile">>$backup_path/dump.logfito脚本有个漂亮的名字dump_mysql.sh,顾名思义,赋予脚本可执行权限chmod+xdump_mysql.sh、执行后脚本变为绿色,为可执行文件执行方法:./add脚本名chmod命令参数含义--+代表增加某些权限x代表可执行权限。我们可以用它每天早上执行dump_mysql.sh脚本crontab使用:crontab-l查看计划任务列表crontab-e编辑(添加/删除)计划任务运行crontab-e命令打开一个可编辑的文本,输入0001***/app/dump_mysql.sh省钱退出完成添加。内容解释:0001***/app/dump_mysql.sh分为两部分。第一部分0001***是定时任务的周期,第二部分/app/dump_mysql.sh是到了时间做什么。周期表达式是五个占位符,分别代表:分、时、日、月、周。占位符用*表示every,第一位是每分钟,第二位是每小时,以此类推。符号用具体的数字表示具体的时间,第1位用10表示10分钟,第三位用占位符表示10,以此类推。7分,用在第五位表示第5周到星期日,以此类推。占位符用/表示间隔,第一个用5-10/2,即5分钟到10分钟之间间隔2分钟,第二个用占位符表示2小时之间5点钟和10点钟,依此类推。占位符用,代表列表,第一个用5和10代表5分钟和10分钟,第四个代表5月和10月。以此类推,2020年7月20日更新脚本中的密码安全问题。感谢Siyouhack提醒,直接把数据库密码放在脚本里是不安全的。我们的脚本执行后,msyql也会打印一行警告:mysqldump:[Warning]Usingapasswordonthecommandlineinterfacecanbeinsecuremysqldump命令去掉-uusername-ppassword参数,使用--defaults-file参数读取配置的用户名和密码。也是官网给出的解决方案:在命令行指定密码应该算是不安全的。为避免在命令行上提供密码,请使用选项文件。请参阅第6.1.2.1节:用户密码安全指南。编辑my.cnf编辑数据库主目录的my.cnf,我的路径是/etc/my.cnf。在【client】下添加密码,如果没有【client】,就写一个,否则下面的密码无效。[client]password="nicai"默认使用当前登录linux服务器的账号作为连接数据库的账号。我刚好是root,所以用户名不需要匹配。如果不一致,需要加一个user=xxx。编辑好后,最好送给我的。cnf设置权限为600,即只有所有者有读写权限。shell>chmod600my.cnf如果密码包含特殊字符,必须用双引号括起来,否则mysqldump命令会报错mysqldump:Goterror:1045:Accessdeniedforuser'root'@'localhost'(usingpassword:YES)当尝试连接修改参数并运行mysqldump命令时,使用--defaults-file=/etc/my.cnf参数而不是-uroot-ppassword参数。去掉脚本中的用户名和密码,修改mysqldump命令如下:mysqldump--defaults-file=/etc/my.cnf$database_name>$backup_path/$database_name-$date_time.sql虽然上面的方法是官方的provided,仍然是Writingplaintextinthefile只是增加了读写权限,还是不太有说服力。使用SHC加密脚本可以考虑如下方法:Linux下的脚本加密工具SHC对shell脚本进行加密,SHC可以对shell脚本进行加密。将shell脚本转换为可执行的二进制文件也是一种方式。备份文件也需要加密:tar配合openssl完成加密压缩:tar-czvf-sourcefile|openssldes3-salt-kpassword-out压缩加密文件。tar.gz解密:openssldes3-d-kpassword-salt-inencrypted-file.tar.gz|焦油xvf-
