mysql备份

这里我的mysql数据库是docker容器。假如你需要在每天晚上8点整执行定时任务,那么可以这么写。

首先执行命令crontab -e

0 8 * * * docker exec mysql_container mysqldump -uroot -proot_password database_name > /var/backups/mysql/$(date +%Y%m%d_%H%M%S).sql

mysql_container 为你的数据库容器名
mysqldump 是mysql数据库导出数据的指令
-u 填写root账号
-p 填写root密码
database_name 需要备份的数据库名
/var/backups/mysql/$(date +%Y%m%d_%H%M%S).sql 备份文件,后面是文件名的格式

 

crontab优化

我不建议直接在crontab -e里面写要执行的命令,任务多了就把这个文件写的乱七八招了。
建议把数据库备份的命令写成一个bash脚本。在crontab这里调用就好了
如:建立一个/var/backups/mysql/mysqldump.sh文件,内容如下

docker exec mysql_container mysqldump -uroot -pmypassword database_name > /var/backups/mysql/$(date +%Y%m%d_%H%M%S).sql

然后把文件改为当前用户可执行的:chmod 711 /var/backups/mysql/mysqldump.sh

执行crontab -e命令修改成如下:0 20 * * * /var/backups/mysql/mysqldump.sh

mysql备份优化

因为sql文件比较大,所以一般情况下都会对sql文件进行压缩,不然的话磁盘占用就太大了。 假设你做了上面这一步 crontab优化,我们可以把mysqldump.sh脚本改成下面这样:

export mysqldump_date=$(date +%Y%m%d_%H%M%S) && \ docker exec mysql_container mysqldump -uroot -pmypassword database_name> /var/backups/mysql/$mysqldump_date.sql && \ gzip /var/backups/mysql/$mysqldump_date.sql find /var/backups/mysql/ -name "*.sql" -mtime +15 -exec rm -f {} \;

export 在系统中自定义了个变量mysqldump_date,给备份和压缩命令使用
gzip 为压缩命令,默认压缩了之后会把源文件删除,压缩成.gz文件
find ... 这行命令的意思为,查询/var/backups/mysql/目录下,创建时间15天之前(-mtime +15),文件名后缀为.sql的所有文件 执行删除命令-exec rm -f {} \;。总的意思就是:mysql的备份文件只保留15天之内的。15天之前的都删除掉。

数据恢复

若一不小心你执行drop database,稳住,淡定。我们首先要创建数据库被删除的数据库

>mysql create database database_name;

然后恢复最近备份的数据。恢复备份的命令:

docker exec -i mysql_container mysql -uroot -proot_password database_name < /var/backups/mysql/20200619_120012.sql

虽然恢复了备份文件的数据,但是备份时间点之后的数据我们却没有恢复回来。
如:晚上8点进行定时备份,但是却在晚上9点drop database,那么晚上8点到晚上9点这一个小时之内的数据却没有备份到。这时候就要使用binlog日志了。

binlog日志

binlog 是mysql的一个归档日志,记录的数据修改的逻辑,如:给 ID = 3 的这一行的 money 字段 + 1。 首先登录mysql后查询当前有多少个binlog文件:

 

 

你可能感兴趣的:(mmysql)