+
95
-

mysql如何实现定时增量备份?

mysql如何实现定时增量备份?


网友回复

+
15
-

产品上线后,数据非常非常重要,万一哪天数据被误删,那么就gg了,准备跑路吧。

所以要对线上的数据库定时做全量备份和增量备份。

何为增量备份?

增量备份的优点是没有重复数据,备份量不大,时间短。但缺点也很明显,需要建立在上次完全备份及完全备份之后所有的增量才能恢复。

MySQL没有提供直接的增量备份方法,但是可以通过mysql二进制日志间接实现增量备份。

二进制日志对备份的意义如下:

二进制日志保存了所有更新或者可能更新数据的操作

二进制日志在启动MySQL服务器后开始记录,并在文件达到所设大小或者收到flush logs 命令后重新创建新的日志文件

只需定时执行flush logs 方法重新创建新的日志,生成二进制文件序列,并及时把这些文件保存到一个安全的地方,即完成了一个时间段的增量备份。

何为全量备份?

mysqldump --lock-all-tables --flush-logs --master-data=2 -u root -p test > backup_sunday_1_PM.sql

参数 --lock-all-tables

对于InnoDB将替换为 --single-transaction。

该选项在导出数据之前提交一个 BEGIN SQL语句,BEGIN 不会阻塞任何应用程序且能保证导出时数据库的一致性状态。它只适用于事务表,例如 InnoDB 和 BDB。本选项和 --lock-tables 选项是互斥的,因为 LOCK TABLES 会使任何挂起的事务隐含提交。要想导出大表的话,应结合使用 --quick 选项。 参数 --flush-logs,结束当前日志,生成并使用新日志文件 参数 --master-data=2,该选项将会在输出SQL中记录下完全备份后新日志文件的名称,用于日后恢复时参考,例如输出的备份SQL文件中含有:CHANGE MASTER TO MASTER_LOG_FILE='MySQL-bin.000002', MASTER_LOG_POS=106; 参数 test,该处的test表示数据库test,如果想要将所有的数据库备份,可以换成参数 --all-databases 参数 --databases 指定多个数据库 参数 --quick或-q,该选项在导出大表时很有用,它强制 MySQLdump 从服务器查询取得记录直接输出而不是取得所有记录后将它们缓存到内存中。 参数 --ignore-table,忽略某个数据表,如 --ignore-table test.user 忽略数据库test里的user表

全量备份脚本shell

#!/bin/bash
# mysql 数据库全量备份
# 用户名、密码、数据库名
username="root"
password="密码"
dbName="备份的数据库名"

beginTime=`date +"%Y年%m月%d日 %H:%M:%S"`
# 备份目录
bakDir=/home/mysql/backup
# 日志文件
logFile=/home/mysql/backup/bak.log
# 备份文件
nowDate=`date +%Y%m%d`
dumpFile="${dbName}_${nowDate}.sql"
gzDumpFile="${dbName}_${nowDate}.sql.tgz"

cd $bakDir
# 全量备份(对所有数据库备份,除了数据库goodthing里的village表)
/usr/local/mysql/bin/mysqldump -u${username} -p${password} --quick --events --databases ${dbName} --ignore-table=goodthing.village --ignore-table=goodthing.area --flush-logs --delete-master-logs --single-transaction > $dumpFile
# 打包
/bin/tar -zvcf $gzDumpFile $dumpFile
/bin/rm $dumpFile

endTime=`date +"%Y年%m月%d日 %H:%M:%S"`
echo 开始:$beginTime 结束:$endTime $gzDumpFile succ >> $logFile

# 删除所有增量备份
cd $bakDir/daily
/bin/rm -f *

增量备份

1. 检查log_bin是否开启 进入mysql命令行,执行 show variables like '%log_bin%' mysql> show variables like '%log_bin%'; +---------------------------------+-------+ | Variable_name | Value | +---------------------------------+-------+ | log_bin | OFF | | log_bin_basename | | | log_bin_index | | | log_bin_trust_function_creators | OFF | | log_bin_use_v1_row_events | OFF | | sql_log_bin | ON | +---------------------------------+-------+ 6 rows in set (0.01 sec) 如上所示,log_bin 未开启;如果log_bin开启,则跳过第2步,直接进入第3步。

2. 开启 log_bin,并重启mysql

编辑 mysql 的配置文件 vim /etc/my.cnf,在 mysqld 下面添加下面2条配置
[mysqld]
log-bin=/var/lib/mysql/mysql-bin
server_id=152

Tip1: 一定要加 server_id,否则会报错。至于server_id的值,随便设就可以。

Tip2: log_bin 中间可以下划线_相连,也可以-减号相连。同理server_id也一样。

重启mysql

service mysqld restart

再次在mysql命令行中执行 show variables like '%log_bin%'

mysql> show variables like '%log_bin%'; +---------------------------------+--------------------------------+ | Variable_name | Value | +---------...

点击查看剩余70%

我知道答案,我要回答