linux下每天备份MySQL数据库

197 阅读1分钟

本文已参与[新人创作礼]活动,一起开启掘金创作之路

currentTime=date +%Y%m%d
sql="/www/sqlbackup/fpbk_currentTime.sql" mysqldumpurootpcc1314,.fbwechat>currentTime.sql"\ mysqldump -uroot -pcc1314,. fbwechat > sql
#$currentTime是变量,这里设置的是年月日这种格式(20181112),mysqldump是mysql的语法,如果mysql 不是添加到环境变量的话,就需要从目录指定到mysql执行文件,例如(/usr/local/bin/mysql,目录可能会有差异),最后把上面的命令存入back.sh脚本文件

#linux运行脚本文件,直接sh 路径/back.sh

\

特别注意

脚本文件最好是用命令在xshell上创建,不然很可能会因为编码格式等问题,无法从FTP软件导出来(会报错:文件名、目录名或卷标语法不正确。)

linux定时器

crontab -e 进入到编辑定时器页面

0 3 * * * /var/backup/back.sh

时间的格式是

分 时 日 月 周

上面的例子是指定每天3点备份一次数据库(每一分钟执行,时间格式就应该*/1 * * * *)

\

//下面是为整个数据库备份的例子

#!/bin/bash\

MYSQLDBUSERNAME是MySQL数据库的用户名,可自定义\

MYSQLDBUSERNAME=root\

MYSQLDBPASSWORD是MySQL数据库的密码,可自定义\

MYSQLDBPASSWORD=cc1314,.\

MYSQBASEDIR是MySQL数据库的安装目录,--prefix=$MYSQBASEDIR,可自定义\

MYSQBASEDIR=/usr/local/mysql\

MYSQL是mysql命令的绝对路径,可自定义\

MYSQL=$MYSQBASEDIR/bin/mysql\

MYSQLDUMP是mysqldump命令的绝对路径,可自定义\

MYSQLDUMP=$MYSQBASEDIR/bin/mysqldump\

BACKDIR是数据库备份的存放地址,可以自定义修改成远程地址\

BACKDIR=/backup/db\

获取当前时间,格式为:年-月-日,用于生成以这种时间格式的目录名称\

DATEFORMATTYPE1=$(date +%Y-%m-%d)\

获取当前时间,格式为:年月日时分秒,用于生成以这种时间格式的文件名称\

DATEFORMATTYPE2=$(date +%Y%m%d%H%M%S)\

如果存在MYSQBASEDIR目录,则将MYSQDATADIR设置为$MYSQBASEDIR/data,具体是什么路径,就把data改成什么路径,否则将MYSQBASEDIR设定为/var/lib/mysql,可自定义\

[ -d MYSQBASEDIR ] && MYSQDATADIR=MYSQBASEDIR/data || MYSQDATADIR=/usr/local/mysql/data\

如果mysql命令存在并可执行,则继续,否则将MYSQL设定为mysql,默认路径下的mysql\

[ -x $MYSQL ] || MYSQL=mysql\

如果mysqldump命令存在并可执行,则继续,否则将MYSQLDUMP设定为mysqldump,默认路径下的mysqldump\

[ -x $MYSQLDUMP ] || MYSQLDUMP=mysqldump\

如果不存在备份目录则创建这个目录\

[ -d BACKDIR]mkdirp{BACKDIR} ] || mkdir -p {BACKDIR}
[ -d BACKDIR/{BACKDIR}/{DATEFORMATTYPE1} ] || mkdir BACKDIR/{BACKDIR}/{DATEFORMATTYPE1}\

获取MySQL中有哪些数据库,根据mysqldatadir下的目录名字来确认,此处可以自定义,TODO\

DBLIST=ls -p $MYSQDATADIR | grep / |tr -d /\

从数据库列表中循环取出数据库名称,执行备份操作\

for DBNAME in DBLIST\     # mysqldump skip one table\     # -- Warning: Skipping the data of table mysql.event. Specify the --events option explicitly.\     # mysqldump --ignore-table=mysql.event\     # http://serverfault.com/questions/376904/mysqldump-skip-one-table\     # --routines,备份存储过程和函数\     # --events,跳过mysql.event表\     # --triggers,备份触发器\     # --single-transaction,针对InnoDB,在单次事务中通过转储所有数据库表创建一个一致性的快照,此选项会导致自动锁表,因此不需要--lock-all-tables\     # --flush-logs,在dump转储前刷新日志\     # --ignore-table,忽略某个表,--ignore-table=database.table\     # --master-data=2 ,如果启用MySQL复制功能,则可以添加这个选项\     # 将dump出的sql语句用gzip压缩到一个以时间命名的文件\     do {MYSQLDUMP}  DBNAME>{DBNAME} > {BACKDIR}/DATEFORMATTYPE1/{DATEFORMATTYPE1}/{DBNAME}-backup-{DATEFORMATTYPE2}.sql\     # 检查执行结果,如果错误代码为0则输出成功,否则输出失败\     [ ? -eq 0 ] && echo "DBNAMEhasbeenbackupedsuccessful"echo"{DBNAME} has been backuped successful" || echo "{DBNAME} has been backuped failed"
# 等待5s,可自定义
/bin/sleep 1
done