Linux中MySQL增量备份建议以及数据库日志操作详解

一、增量备份理论部分

linux中的mysql增量备份是通过数据库日志来实现备份恢复的一种备份方法,备份过程中只备份标记或者选中的文件和文件夹,这个标记可以是时间、也可以是系统默认自己做的动作标记(节点编号),这些都会在MySQL的日志中体现出来。
(日志中存放的是sql语句的动作而不是数据本身!!!)

优缺点

优点:节省空间并且备份恢复速度快
缺点:因为其中掺杂日志的操作,所以相对比较复杂

备份恢复方法

  • 按时间进行恢复
  • 通过日志中的节点编号进行恢复

增量备份图解

这张图是我在上一篇文章中使用的,红色圈表示备份的数据,在这张图中我们可以看到增量备份是首先对原始数据进行备份,然后依次对新添加的数据进行备份,节省空间并且备份恢复速度快。
(如果想了解差异备份、完整备份与增量备份的区别请看上一篇文章《linux中MySQL备份模式、方式以及工具详解》)
在这里插入图片描述

二、实践部分

1.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 ;				#----------会再次将结束符规定为;符号
......

2.通过系统标记进行恢复

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)
#成功恢复

3.按时间进行恢复

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)
#成功

三、对日志文件的操作

1. 可以直接对不同时间的日志文件备份,这种备份方法就称为增量备份

#使用tar命令进行备份(因为是文件使用cp也可以)
[root@localhost ~] cd /usr/local/mysql/data/ 
[root@localhost data] tar -zcvf /bak/mysql.tar.gz mysql-bin.000001 
mysql-bin.000001

2. 创建新的日志文件

#重新启动系统时会自动重新创建一个日志文件
#也可以使用命令创建新的日志文件
[root@localhost ~]# mysqladmin -u root -p flush-logs
Enter password: 
#输入密码再次查看mysql的data目录即可查询到新的日志文件
#这时就可以将原先的日志文件进行备份

3. 增量备份使用建议

因为增量备份备份的都是新增加或者修改的数据,并且速度相对于其他备份方式来说速度较快,恢复也较快,可以用在两次完整备份之间进行过渡使用,完整备份与增量备份结合的话不仅节省了空间的使用量,并且也增加了设备的可靠性!

原创文章 20 获赞 7 访问量 708

猜你喜欢

转载自blog.csdn.net/adsedfewf/article/details/105700520
今日推荐