一. 准备工作
MySql没有现成的增量备份功能,但是可以利用binlog实现增量备份,所以我们需要先开启binlog功能.同时全备份过程中避免对数据库进行操作.本文的场景是,已经配置好主从复制,我们用从库的日志文件来进行数据恢复.
1.1 修改配置文件
- 修改mysql配置文件
#linux
vi /etc/my.cnf
#windows
修改my.ini文件
- 在该文件下[mysqld]中指定Master的配置如下:
#启用从库的二进制日志
log-bin=mysql-bin
#配置更新的日志写入binlog
log_slave_updates = 1
1.2 重启MySql
#linux
service mysqld restart
#windows
net stop mysql
net start mysql
二. 全量备份
2.1 使用mysqldump进行全备份
#文件备份路径最好写绝对路径,如果只写文件名称,生成的文件在打开cmd窗口的位置
mysqldump -u 用户 -p 数据库 [表1 表2 …… 表N] > 备份文件路径
#实际上还要加一些别的参数控制
mysqldump -u root -p --single-transaction --flush-logs --master-data=2 liberty > backup_test.sql
--single-transaction,开启单一事务,整个备份过程只有一个事务,不适用该参数时,会频繁的开启事务,实现点对点的备份恢复.因为-single-transaction选项备份时涉及到的是select语句,所以dml语句是被允许的,ddl不被允许直到回滚保存点撤销select 语句
--flush-logs 为结束当前日志,生成新日志文件
--master-data=2 选项将会在输出SQL中记录下完全备份后新日志文件的名称,用于日后恢复时参考
三. 恢复
- 恢复前先关闭binlog并重启
vi /etc/my.cnf
#log-bin=mysql-bin
- 暂停同步
登录mysql
mysql>stop slave;
3.1 全量恢复
在shell命令下:
shell> mysql -u 用户名 -p 数据库名 < 备份文件.sql
在mysql命令下:
mysql> source 备份文件.sql;
3.2 增量恢复
- 用最后一次的全量备份文件进行恢复,见上一步
- 找到误操作所在的binlog文件
命令行:
# mysqlbinlog --no-defaults --base64-output=decode-rows -v mysql-bin.00000x [-d dbname]
mysql中:
mysql> show binlog events in 'mysql-bin.00000x';
- 比如说误操作在mysql-bin.000005中,找到误操作的位置或者时间
- 依次恢复:
# mysqlbinlog --no-defaults mysql-bin.000001 | mysql -u root -p
# mysqlbinlog --no-defaults mysql-bin.000002 | mysql -u root -p
# mysqlbinlog --no-defaults mysql-bin.000003 | mysql -u root -p
# mysqlbinlog --no-defaults mysql-bin.000004 | mysql -u root -p
- 基于时间的恢复:跳过误操作的时间
[亲测没有成功!]
# mysqlbinlog --no-defaults --stop-datetime='2018-07-03 18:19:49' /usr/local/mysql/data/mysql-bin.00000x | mysql -u root -p
# mysqlbinlog --no-defaults --start-datetime='2018-07-03 18:22:21' /usr/local/mysql/data/mysql-bin.00000x | mysql -u root -p
- 基于位置的恢复:跳过误操作的位置
# mysqlbinlog --no-defaults --stop-position=347 /usr/local/mysql/data/mysql-bin.00000x | mysql -u root -p
# mysqlbinlog --no-defaults --start-position=395 /usr/local/mysql/data/mysql-bin.00000x | mysql -u root -p