增量备份可以在完全备份的基础上,减少备份文件的大小,从而加快备份和恢复的速度
二进制日志对备份的意义如下:
- 二进制日志保存了所有更新或者可能更新数据库的操作
- 二进制日志在启动 MySQL 服务器后开始记录,并在文件达到 max_binlog_size 所设置的大小或者接收到 flush logs 命令后重新创建新的日志文件
- 只需要定时执行 flush logs 方法重新创建新的日志,生成二进制文件序列,并及时把这些日志保存到安全的地方就完成了一个时间段的增量备份
vim /etc/my.cnf
...
[mysqld]
log-bin=mysql-bin
binlog_format = MIXED
#指定二进制日志(binlog)的记录格式为 MIXED
systemctl restart mysqld.service
#重启服务
cd /usr/local/mysql/data
ls -l /usr/local/mysql/data/mysql-bin.*
#查看二进制文件
#二进制日志(binlog)有3种不同的记录格式:STATEMENT(基于SQL语句)、ROW(基于行)、MIXED(混合模式)
#默认格式是 STATEMENT
mysqldump -uroot -p123123 SCHOOL CLASS01 > /opt/SCHOOL_CLASS01_$(date +%F).sql
#对表进行完全备份
mysqldump -uroot -p123123 --all-databases SCHOOL > /opt/SCHOOL_$(date +%F).sql
#对库进行完全备份
crontab -e
#也可以使用计划性任务来执行
30 3 * * 3 mysqldump -uroot -p123123 SCHOOL CLASS01 > /opt/SCHOOL_CLASS01_$(date +%F).sql
30 3 * * 3 mysqldump -uroot -p123123 --all-databases SCHOOL > /opt/SCHOOL_$(date +%F).sql
每周三的凌晨 3:00 对数据库和表进行完全备份
ls /usr/local/mysql/data
mysqladmin -uroot -p123123 flush-logs
use SCHOOL;
insert into CLASS01 values(3,'wangsan','woman','games');
insert into CLASS01 values(4,'wangsi','man','runing');
select * from CLASS01;
cd /usr/local/mysql/data/
ls
mysqladmin -uroot -p123123 flush-logs
cp mysql-bin.000002 /opt/
#将记录变更的二进制文件02复制至/opt目录下
cd /opt/
ls
mysqlbinlog --no-defaults --base64-output=decode-rows -v /opt/mysql-bin.000002
#使用64位编码机制去解码,按行读取详细内容
mysql -uroot -p123123
use SCHOOL;
delete from CLASS1 where id=3;
delete from CLASS1 where id=4;
#删除插入的两条数据,模拟完全备份后数据丢失的故障
select * from CLASS01;
#检查
quit
mysqlbinlog --no-defaults /opt/mysql-bin.000002 | mysql -uroot -p123123
#使用二进制文件进行恢复操作
mysql -uroot -p123123 -e "select * from SCHOOL.CLASS01;"
#检查表内容是否恢复
mysql -uroot -p123123
use SCHOOL;
drop table CLASS01;
#直接删除整个表,假设完全备份后所有数据都丢失了
quit
mysql -uroot -p123123 SCHOOL < /opt/SCHOOL_CLASS01_2021-02-06.sql
mysql -uroot -p123123 -e "select * from SCHOOL.CLASS01;"
#进行完全备份后查看一下
mysqlbinlog --no-defaults /opt/mysql-bin.000002 | mysql -uroot -p123123
#增量备份
mysql -uroot -p123123 -e "select * from SCHOOL.CLASS01;"
#恢复用户“wangsan”的数据,而不恢复“wangsi”
mysql -uroot -p123123 -e "truncate table SCHOOL.CLASS01;"
mysql -uroot -p123123 -e "select * from SCHOOL.CLASS01;"
mysqlbinlog --no-defaults --stop-datetime='2021-02-06 15:58:39' /opt/mysql-bin.000002 |mysql -uroot -p123123
mysql -uroot -p123123 -e "select * from SCHOOL.CLASS01;"
#恢复“wangsi”的数据
mysqlbinlog --no-defaults --start-datetime='2021-02-06 15:58:39' /opt/mysql-bin.000002 |mysql -uroot -p
mysqlbinlog --no-defaults --stop-position='609' /opt/mysql-bin.000002 | mysql -uroot -p
#使用64位编码机制去解码并按行读取二进制文件02(增量备份)的详细内容
...
...略
#仅恢复“1810”之前的数据,即不恢复“wangsi”的数据
mysql -uroot -p123123 -e "select * from SCHOOL.CLASS01;"
mysql -uroot -p123123 -e "truncate table SCHOOL.CLASS01;"
mysql -uroot -p123123 -e "select * from SCHOOL.CLASS01;"
mysqlbinlog --no-defaults --stop-position='1810' /opt/mysql-bin.000002 | mysql -uroot -p
mysql -uroot -p123123 -e "select * from SCHOOL.CLASS01;"
#仅恢复“wangsi”的数据,跳过“wangsan”的数据恢复,即仅有第四条记录
mysql -uroot -p123123 -e "select * from SCHOOL.CLASS01;"
mysqlbinlog --no-defaults --start-position='1810' /opt/mysql-bin.000002 | mysql -uroot -p123123
mysql -uroot -p123123 -e "select * from SCHOOL.CLASS01;"