Linux 定时备份MySQL数据库

一、创建备份专用的账号,并赋予相应的权限

/**
* 假设给本地mysql的test数据库创建一个dumper备份专用账号,密码为123456
**/
/*创建一个数据库备份的专用账号*/
CREATE USER dumper@localhost IDENTIFIED BY '123456'; 

/*如果备份时指定 --all-databases,需要赋予show databases权限*/
GRANT SHOW DATABASES ON *.* TO dumper@localhost; 

/*如果备份时指定 -F,需要赋予截断二进制日志的权限*/
GRANT Reload ON *.* TO dumper@localhost;

/*如果备份时指定 -R,需要赋予查看自定义函数、存储过程的权限*/
GRANT SELECT ON `mysql`.`proc` TO dumper@localhost;

/*赋予查询数据的权限*/
GRANT SELECT ON test.* TO dumper@localhost; 

/*赋予查看视图ddl的权限*/
GRANT SHOW VIEW ON test.* TO dumper@localhost; 

/*赋予锁表权限*/
GRANT LOCK TABLES ON tesst.* TO dumper@localhost; 

/*触发器的权限*/
GRANT TRIGGER ON test.* TO dumper@localhost;

二、创建备份目录

> cd /home/gmd
> mkdir mysql_dumper

## 创建mysql_dumper文件夹,用于存放配置文件和备份文件。该文件需要较大的存储空间,可以通过以下指令寻找存储空间比较大的文件夹路径。
> df -h

三、创建备份配置文件

3.1 创建备份配置文件(my.cnf)

## 文件名 my.cnf 

## 查询被修改过的数据库 用的用户名和密码
[mysql]
user=dumper
password=123456

## 备份数据库用的用户名和密码
[mysqldump]
user=dumper
password=123456


# 如果有一些表不需要备份,可以添加如下配置,注意,必须放在[mysqldump]下面,必须写成库名.表名的格式。
# 也可以在mysqldump后面带上参数--ignore-table=edu.table1
ignore-table=edu.table1
ignore-table=edu.table2

3.2 创建查询需备份的数据库的SQL文件(sql文件)

/*3d.sql 查询最近3天有更改的数据库*/

SET GROUP_CONCAT_MAX_LEN = 102400;

SELECT 
    GROUP_CONCAT(DISTINCT t.TABLE_SCHEMA SEPARATOR ' ') table_schema
FROM (
    SELECT
        t.TABLE_SCHEMA
    FROM
        information_schema.TABLES t
    WHERE
        t.TABLE_SCHEMA NOT IN ('information_schema', 'mysql', 'performance_schema', 'sys')
    GROUP BY
        t.TABLE_SCHEMA
    HAVING
        MAX(IFNULL(t.UPDATE_TIME, t.CREATE_TIME)) >= DATE_SUB(NOW(), INTERVAL 3 DAY)
) t
GROUP BY ''
/*all.sql 查询所有非系统库*/

SET GROUP_CONCAT_MAX_LEN = 102400;
 
SELECT
  GROUP_CONCAT(DISTINCT t.TABLE_SCHEMA SEPARATOR ' ') table_schema
FROM
  information_schema.TABLES t
WHERE
  t.TABLE_SCHEMA NOT IN ('information_schema', 'mysql', 'performance_schema', 'sys')
GROUP BY ''

四、编写备份脚本(backups.sh)

备份策略:每月01号备份所有数据库,其余每天备份最近3天有变动的数据库

## 文件名 backups.sh

# 定义变量
dir=/home/gmd/mysql_dumper             # 备份主目录
dir_date=`date +%Y%m%d`                # 备份日期目录
file_time=`date +%H%M`                 # 备份文件时间标识
mysqldump="mysqldump --defaults-file=${dir}/my.cnf"     # MySQL备份程序位置
mysql="mysql --defaults-file=${dir}/my.cnf"             # MySQL程序路径
 
# 每月01日,备份所有的库,其余日期只备份3日内变动的库
if [ "`date +%d`" = "01" ]
then
  mysql --defaults-file=${dir}/my.cnf < ${dir}/all.sql > ${dir}/tmp
else
  mysql --defaults-file=${dir}/my.cnf < ${dir}/3d.sql > ${dir}/tmp
fi
dbname=(`tail -n1 ${dir}/tmp`)                # 数据库名
file_name=("${dbname[@]}")                    # 备份文件名
dbnum=${#dbname[*]}                           # 数据库数量
rm -f ${dir}/tmp

# 删除30天前的备份
if test -d ${dir}/`date -d"30 days ago" +%Y%m%d`/
then
    rm -rf ${dir}/`date -d"30 days ago" +%Y%m%d`
fi

# 创建今天的文件夹
if test ! -d ${dir}/${dir_date}/
then
    mkdir ${dir}/${dir_date}
fi

# 备份、压缩数据
for ((i=0;i<${dbnum};i++)); do
  echo ${i}/${dbnum}:bak ${dbname[${i}]} to ${file_name[${i}]}
  ${mysqldump} -R -F ${dbname[${i}]} > ${dir}/${dir_date}/${file_name[${i}]}_${file_time}.sql
  zip -j ${dir}/${dir_date}/${file_name[${i}]}_${file_time}.zip ${dir}/${dir_date}/${file_name[${i}]}_${file_time}.sql
  rm -f ${dir}/${dir_date}/${file_name[${i}]}_${file_time}.sql
done

至此,可以直接通过 ./backup.sh 指令看看程序是否有问题。 

五、添加Linux定时任务

## 查看当前用户的定时任务
> crontab -l

## 添加定时任务
> crontab -e

## 内容如下:
MAILTO=""
0 1 * * * /home/gmd/mysql_dumper/backups.sh         # MySQL定时备份每天晚上1点定时执行

六、将备份的文件上传至其他文件服务器

如果无需将文件上传至文件服务器,那么至此就结束了。如果除了本地备份之外,还需要将文件备份至其他文件服务器的话,只需要在backup.sh文件后添加如下语句即可。

说明:你需要准备一个文件服务器。

## 文件服务器信息,可以添加多个,
ftp_server=("192.168.1.121 192.168.1.122")      # ftp服务器ip数组
ftp_user=("ftp_user1 ftp_user2")                # 对应ftp服务器的账号
ftp_pw=("ftp_pwd01 ftp_pwd02")                  # 对应的ftp账号的密码
ftpnum=${#ftp_server[*]}                        # ftp数量
ftpdir=my_project01                  # ftp相对路径(可以用本机ip或项目名称)


# 上传到ftp服务器
for ((i=0;i<${ftpnum};i++)); do
ftp -n<<!
open ${ftp_server[${i}]}
user ${ftp_user[${i}]} ${ftp_pw[${i}]}
prompt off
binary
hash
mkdir ${ftpdir}
mkdir ${ftpdir}/${dir_date}
cd ${ftpdir}/${dir_date}
lcd ${dir}/${dir_date}/
mput *_${file_time}.zip
close
bye
!
done

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值