linux中的mysql增量备份是通过数据库日志来实现备份恢复的一种备份方法,备份过程中只备份标记或者选中的文件和文件夹,这个标记可以是时间、也可以是系统默认自己做的动作标记(节点编号),这些都会在MySQL的日志中体现出来。
(日志中存放的是sql语句的动作而不是数据本身!!!)
优点:节省空间并且备份恢复速度快
缺点:因为其中掺杂日志的操作,所以相对比较复杂
这张图是我在上一篇文章中使用的,红色圈表示备份的数据,在这张图中我们可以看到增量备份是首先对原始数据进行备份,然后依次对新添加的数据进行备份,节省空间并且备份恢复速度快。
(如果想了解差异备份、完整备份与增量备份的区别请看上一篇文章《linux中MySQL备份模式、方式以及工具详解》)
日志文件记录的内容:
1.日志中存放的是sql语句的动作而不是数据本身
2.日志文件存放的sql语句是出去查看动作(select、show)其他的所有动作
#在linux的mysql中默认是将日志关闭的,所以第一步我们要先在mysql的主配置文件中添加一条选项并开启日志
1)修改mysql主配置文件,并重启mysql
[root@localhost ~] echo "log-bin=mysql-bin" >> /etc/my.cnf
#>>:符号在echo命令中代表的是追加内容,而不是覆盖内容,如果只使用>则将内容输入到文件后则文件中只有这一行内容
[root@localhost ~] systemctl restart mysqld
#重启服务,让mysqld读取my.cnf主配置文件
2)查看mysql的data目录内容
#当重启完成后,则mysql会自动创建两个文件,这就是日志文件
[root@localhost ~]# ll /usr/local/mysql/data/
......
-rw-rw----. 1 mysql mysql 120 4月 23 10:12 mysql-bin.000001
-rw-rw----. 1 mysql mysql 19 4月 23 10:12 mysql-bin.index
......
mysql-bin.index文件详解
-----------------------mysql-bin.index文件详解---------------------------------------
#这个文件中存放的是所有日志文件的索引,当mysql存放许多日志文件时,该文件将会存放这些日志文件的相对路径位置
#该文件的内容,只是存放的日志文件的名称并没有存放日志内容
[root@localhost ~] cat /usr/local/mysql/data/mysql-bin.index
./mysql-bin.000001
./mysql-bin.000001文件详解
#这个文件重存放的是日志文件的内容,后面跟的数字后缀只是系统标记的名称,这个文件名称可以自定义
#日志文件是由二进制编写的,所以无法直接读取,需要使用mysql特有的工具进行查看
-----------------------mysql-bin.000001文件详解---------------------------------------
[root@localhost ~] cat /usr/local/mysql/data/mysql-bin.000001
\tx5.6.36-log8
ˋ[G
1)查看没有对数据库做任何操作的日志文件
#使用mysqlbinlog工具进行查看日志文件
#默认情况下系统创建这个文件时里面的内容会自动有一个at4到at119的
#这里介绍该日志文件中的一部分
[root@localhost ~] mysqlbinlog /usr/local/mysql/data/mysql-bin.000001 | more
......
DELIMITER /*!*/; #----------定义结束符为/*!*/
# at 4 #----------at节点编号,这个编号不是随机产生的,是根据sql语句的二进制编码长度产生的
#200423 10:12:23 server id 1 end_log_pos 120 CRC32 0x475b8bcb Start: binlog v 4, server v 5.6.36-log created 200423 10:12:23 at star
#----------200423:创建日志的时间编号,20是当前年份的后两位,04代表的是4月份,23代表的是23号
#----------serer id 1:证明该数据库的ID为1,当做数据库群集时需要用户自定义该ID,并且使用该ID作为标记
#----------end_log_pos 120:下一个事务开始的at号
#----------CRC32 0x475b8bcb:这是每个事务的摘要信息,每个摘要信息都是不同的
tup
# Warning: this binlog is either in use or was not closed properly.
ROLLBACK/*!*/; #----------回滚标识符
BINLOG '
h/mgXg8BAAAAdAAAAHgAAAABAAQANS42LjM2LWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAACH+aBeEzgNAAgAEgAEBAQEEgAAXAAEGggAAAAICAgCAAAACgoKGRkAAcuL
W0c=
'/*!*/; #----------结束标识符
DELIMITER ; #----------再次定义结束符为;符号
......
2)查看当对数据库进行操作后的日志文件
#由于内容太多,这里只取出一段来介绍
[root@localhost ~] mysqlbinlog /usr/local/mysql/data/mysql-bin.000001
.....
DELIMITER /*!*/;
# at 4
#200423 10:12:23 server id 1 end_log_pos 120 CRC32 0x475b8bcb Start: binlog v 4, server v 5.6.36-log created 200423 10:12:23 at startup
# Warning: this binlog is either in use or was not closed properly.
ROLLBACK/*!*/;
BINLOG '
h/mgXg8BAAAAdAAAAHgAAAABAAQANS42LjM2LWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAACH+aBeEzgNAAgAEgAEBAQEEgAAXAAEGggAAAAICAgCAAAACgoKGRkAAcuL
W0c=
'/*!*/;
# at 120 #----------at标记是120,这也是上一个事务的结束
#200423 10:37:45 server id 1 end_log_pos 262 CRC32 0x28c1352f Query thread_id=3 exec_time=0 error_code=0
SET TIMESTAMP=1587609465/*!*/;
SET @@session.pseudo_thread_id=3/*!*/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
SET @@session.sql_mode=1075838976/*!*/;
SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
/*!\C utf8 *//*!*/;
SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=33/*!*/;
SET @@session.lc_time_names=0/*!*/;
SET @@session.collation_database=DEFAULT/*!*/;
SET PASSWORD FOR 'root'@'localhost'='*AC241830FFDDC8943AB31CBD47D758E79F7953EA'
/*!*/;
#----------最后这一行是定义root的登录方式并且将密码进行加密
......
# at 550
#200423 10:38:56 server id 1 end_log_pos 667 CRC32 0xb9f2f0b6 Query thread_id=4 exec_time=0 error_code=0
SET TIMESTAMP=1587609536/*!*/;
insert into biao1(id,name) values(1,'chen') #----------这里可以看到添加数据的动作,并记录的是sql语句,而不是数据本身
/*!*/;
# at 667
#200423 10:38:56 server id 1 end_log_pos 698 CRC32 0xda47c07c Xid = 17
COMMIT/*!*/; #----------提交事务会到最后面
DELIMITER ; #----------会再次将结束符规定为;符号
......
1)删除biao1内数据
[root@localhost ~] mysql -u root -h localhost -p
Enter password:
mysql> use demo
mysql> select * from biao1;
+------+------+
| id | name |
+------+------+
| 1 | chen |
+------+------+
1 row in set (0.00 sec)
mysql> delete from biao1;
Query OK, 1 row affected (0.00 sec)
#删除成功
mysql> select * from biao1;
Empty set (0.00 sec)
#查看数据,数据为空
mysql> exit
Bye
2)使用mysqlbinlog工具查看日志内的节点标记号
[root@localhost ~] mysqlbinlog /usr/local/mysql/data/mysql-bin.000001
......
# at 550 #----------开始节点
#200423 10:38:56 server id 1 end_log_pos 667 CRC32 0xb9f2f0b6 Query thread_id=4 exec_time=0 error_code=0
SET TIMESTAMP=1587609536/*!*/;
insert into biao1(id,name) values(1,'chen') #----------这里可以看到添加数据的动作,并记录的是sql语句,而不是数据本身
/*!*/;
# at 667 #----------结束节点
......
3)使用mysqlbinlog工具来恢复数据
[root@localhost ~] mysqlbinlog --start-position='550' --stop-position='667' /usr/local/mysql/data/mysql-bin.000001 | mysql -u root -p
Enter password:
#使用mysqlbinlog工具进行恢复数据
#命令格式:mysqlbinlog --start-position='开始节点' --stop-position='结束节点' [日志存放路径] | mysql -u root -p
#--start-position:是指定开始节点
#--stop-position:是指定结束节点
#只指定开始节点不指定结束节点则是从开始节点开始恢复
#只指定结束节点不指定结束节点则是恢复到指定节点位置
4)查看恢复数据结果
[root@localhost ~] mysql -u root -h localhost -p
Enter password:
mysql> use demo
Database changed
mysql> select * from biao1;
+------+------+
| id | name |
+------+------+
| 1 | chen |
+------+------+
1 row in set (0.00 sec)
#成功恢复
1)删除biao1内的内容
[root@localhost ~] mysql -u root -h localhost -p
Enter password:
mysql> use demo
mysql> select * from biao1;
+------+------+
| id | name |
+------+------+
| 1 | chen |
+------+------+
1 row in set (0.00 sec)
mysql> delete from biao1;
Query OK, 1 row affected (0.00 sec)
#删除成功
mysql> select * from biao1;
Empty set (0.00 sec)
#查看数据,数据为空
mysql> exit
Bye
2)查看日志文件中的日期时间
[root@localhost ~] mysqlbinlog /usr/local/mysql/data/mysql-bin.000001
.......
# at 550
#200423 10:38:56 server id 1 end_log_pos 667 CRC32 0xb9f2f0b6 Query thread_id=4 exec_time=0 error_code=0
#-------200423为时间日期,前面已经介绍过,20是年份后面两位,04为4月,23是23号,后面的为24小时制时间格式
SET TIMESTAMP=1587609536/*!*/;
insert into biao1(id,name) values(1,'chen')
/*!*/;
# at 667
#200423 10:38:56 server id 1 end_log_pos 698 CRC32 0xda47c07c Xid = 17
COMMIT/*!*/;
......
3)使用mysqlbinlog工具恢复数据
[root@localhost ~]# mysqlbinlog --start-datetime='2020-04-23 10:38:56' --stop-datetime='2020-04-23 10:38:57' /usr/local/mysql/data/mysql-bin.000001 | mysql -u root -p
Enter password:
#命令格式: mysqlbinlog --start-datetime='开始日期' --stop-datetime='结束日期' 日志文件路径 | mysql -u root -p
4)查看是否恢复成功
[root@localhost ~]# mysql -u root -h localhost -p
Enter password:
mysql> use demo
Database changed
mysql> select * from biao1;
+------+------+
| id | name |
+------+------+
| 1 | chen |
+------+------+
1 row in set (0.00 sec)
#成功
#使用tar命令进行备份(因为是文件使用cp也可以)
[root@localhost ~] cd /usr/local/mysql/data/
[root@localhost data] tar -zcvf /bak/mysql.tar.gz mysql-bin.000001
mysql-bin.000001
#重新启动系统时会自动重新创建一个日志文件
#也可以使用命令创建新的日志文件
[root@localhost ~]# mysqladmin -u root -p flush-logs
Enter password:
#输入密码再次查看mysql的data目录即可查询到新的日志文件
#这时就可以将原先的日志文件进行备份
因为增量备份备份的都是新增加或者修改的数据,并且速度相对于其他备份方式来说速度较快,恢复也较快,可以用在两次完整备份之间进行过渡使用,完整备份与增量备份结合的话不仅节省了空间的使用量,并且也增加了设备的可靠性!