mysqldump + binlog实现增量备份

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysqldump + binlog实现增量备份相关的知识,希望对你有一定的参考价值。

1、核心思路

搞明白一件事:到底什么是增量备份?

答:① 要有全量备份 ② 继续增删改数据 ③ 再次需要备份时,不需要进行全量备份,只需要备份binlog日志文件即可(因为binlog日志记录了增删改操作的所有SQL语句)

2、增量备份实验步骤

第一步:先准备数据(前提)

第二步:开启二进制,然后做全量备份(全库备份)

第三步:继续对数据库进行增删改操作

第四步:突然发生了硬件故障,数据库丢失了

第五步:恢复全量备份导出的数据(不完整,可能只有90%)

第六步:备份二进制日志,根据其信息(导入剩余的10%的数据)

...

完成

3、增量备份的具体实践

第一步:准备数据

mysql> create database db_itheima default charset=utf8;
mysql> use db_itheima;
mysql> create table tb_student(
id int not null auto_increment,
name varchar(20),
age tinyint unsigned default 0,
gender enum(male,female),
subject enum(ui,java,yunwei,python),
primary key(id)
) engine=innodb default charset=utf8;

mysql> insert into tb_student values (null,刘备,33,male,java);
mysql> insert into tb_student values (null,关羽,32,male,yunwei);
mysql> insert into tb_student values (null,张飞,30,male,python);
mysql> insert into tb_student values (null,貂蝉,18,female,ui);
mysql> insert into tb_student values (null,大乔,18,female,ui);

第二步:开启二进制日志,重启服务,然后进行全库备份

# vim my.cnf
[mysqld]
...
server-id=10
log-bin=/mysql_3306/data/binlog

# service mysql_3306 restart
# rm -rf /tmp/sqlbak/*
# mysqldump --single-transaction --flush-logs --master-data=2 --all-databases > /tmp/sqlbak/all.sql -p

第三步:继续对数据库进行增删改操作

mysql> insert into tb_student values (null,小乔,16,female,ui);
mysql> delete from tb_student where id = 3;

第四步:突然发生了硬件故障,数据库丢失了

# mysql -e "drop database db_itheima;" -p
Enter password:123

...故事开始了(删库)

第五步:动员运维工程师开始进行数据恢复,马上把最新的二进制文件进行备份

# cp /mysql_3306/data/binlog.000003 空格 /tmp/sqlbak/

第六步:先进行全库恢复

# mysql < /tmp/sqlbak/all.sql -p
Enter password:123

第七步:通过binlog增量备份还原数据到100%

学会读二进制日志文件,必须通过专业的工具

# mysqlbinlog /tmp/sqlbak/binlog.000003  =>  重点找事故的临界点,如drop database
at
# mysqlbinlog --start-position=4 --stop-position=740 /tmp/sqlbak/binlog.000003 |mysql -p

到此恢复100%数据


MySQL数据库逻辑备份

MySQL逻辑备份

MySQL安装脚本

一般逻辑备份的文件名后缀以.sql 居多

逻辑备份就是把数据库、数据表或者数据进行导出,导出到一个文本文件中

mysqldump基本备份

  • mysqldump 是MySQL自带的命令

本质: 导出的是sql语句文件

优点: 无论是什么存储引擎,都可以用mysqldump备成sql语句

缺点: 速度较慢,导入时可能会出现格式不兼容的突发状况.无法直接做增量备份.

提供三种级别的备份,表级,库级和全库级

mysqldump 基本语法:

命令格式:
	表级别备份:
		# mysqldump [OPTIONS] database [tables]


	库级别备份:
		# mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...]


	全库级别备份:
		#mysqldump [OPTIONS] --all-databases [OPTIONS]

创建测试数据:

创建表格:
mysql > create database db_sanguo default charset=utf8;
mysql > use db_sanguo;
mysql > create table tb_weiguo(
	id int not null auto_increment,
	name varchar(20),
	age tinyint unsigned default 0,
	profession varchar(20),
	primary key(id)
	) engine=innodb default charset=utf8;
插入测试数据:
mysql > insert into tb_weiguo values (null,'曹操','36','主帅'),(null,'郭嘉','22','军师'),(null,'张辽','30','战将'),(null,'甄宓','18','文昭皇后');

创建表格:
mysql > create table tb_shuguo(
	id int not null auto_increment,
	name varchar(20),
	age tinyint unsigned default 0,
	profession varchar(20),
	primary key(id)
	) engine=innodb default charset=utf8;
插入测试数据:
mysql > insert into tb_shuguo values (null,'刘备','36','主帅'),(null,'诸葛亮','22','军师'),(null,'赵子龙','30','战将'),(null,'孙尚香','18','弓腰姬');

mysqldump表级备份与还原

  • 备份:同一数据库下的表可以一起备份
  • 还原:还原的时候需要指定还原到哪个数据库

表级备份与还原基本语法:

命令格式:
	备份数据表:
		#l /mysql_3307/bin/mysqldump 数据库 数据表1  [数据表2] > .sql备份文件位置 -p		=>	指定哪个数据库下的哪些表要备份
			Enter password:

	还原数据表:
		第一种:
			# mysql > use 数据库;				=>	指定哪个数据库,还原的数据表就存放在哪个数据库下
			# mysql > source .sql备份文件位置;
		或
		第二种:
			#l /mysql_3307/bin/mysql 数据库 < .sql备份文件位置 -p
				Enter password:



演示:
	备份数据表:
		# mkdir /tmp/sqlbak		=>	创建一个目录用于放备份文件
		#l /mysql_3307/bin/mysqldump db_sanguo tb_weiguo [tb_shuguo] > /tmp/sqlbak/tb_weiguo.sql -p		=>	将数据表备份成tb_weiguo.sql文件
			Enter password:
				说明:如果需要备份多张表,只需要在其后面加上表名即可
	
	
	还原数据表:
		第一种:
			# mysql > use db_bbb;								=>	数据表会还原在db_sanguo数据库下
			# mysql > source  /tmp/sqlbak/tb_weiguo.sql;
		
		第二种:
		#l /mysql_3307/bin/mysql db_sanguo < /tmp/sqlbak/tb_weiguo.sql -p	=>	数据表会还原在db_sanguo数据库下

mysqldump库级备份与还原

  • 备份:需要在增加--databases选项,指定需要备份的数据库
  • 还原:直接还原(因为是数据库,没得指定数据库)

库级备份与还原基本语法:

命令格式:
	备份数据库:
		# /mysql_3307/bin/mysqldump --databases 数据库1 [数据库2] > .sql备份文件位置 -p		=>	指定需要备份的数据库进行备份


	还原数据库:
		第一种:
			# mysql > source .sql备份文件位置;		=>	直接使用命令还原
		或
		第二种:
			#l /mysql_3307/bin/mysql  < .sql备份文件位置 -p
				Enter password:

mysqldump全库级备份

  • 在MySQL中,如果想使用mysqldump进行全库级备份,必须开启二进制日志

开启日志文件:

# vim /mysql_3307/my.cnf
	[mysqld]
	...
	server-id=10
	log-bin=/mysql_3306/data/binlog
	
# service mysql_3307 restart

mysqldump高级选项说明:

常用选项描述说明
--flush-logs, -F开始备份前刷新日志(二进制日志)binlog.000001 => binlog.000002
--flush-privileges备份包含mysql数据库时刷新授权表 => 刷新用户和授权信息
--lock-all-tables, -xMyISAM一致性,服务可用性(针对所有库所有表) ,针对 MyISAM引擎
--lock-tables, -l备份前锁表(针对要备份的库)
--single-transaction适用InnoDB引擎,保证一致性,服务可用性
--master-data=2表示将二进制日志位置和文件名写入到备份文件并在dump文件中注释掉这一行
--master-data=1表示将二进制日志位置和文件名写入到备份文件,在dump文件中不注释这一行

--master-data参数其他说明:

  • 1)恢复时会执行,默认是1

  • 2)需要RELOAD privilege并必须打开二进制文件

  • 3)这个选项会自动打开–lock-all-tables,关闭–lock-tables

全库级备份和还原:

命令格式:
	备份全库:
		#  /mysql_3307/bin/mysqldump --all-databases --master-data --single-transaction > .sql文件 -p		=>	将数据库中所有数据库备份
		

	还原全库:
		第一种:
			# mysql > source .sql备份文件位置;		=>	直接使用命令还原
		或
		第二种:
			#l /mysql_3307/bin/mysql  < .sql备份文件位置 -p
				Enter password:		

总结:

  1. mysqldump工具备份的是SQL语句,故备份不需要停服务

  2. 使用备份文件恢复时,要保证数据库处于运行状态

  3. 只能实现全库,指定库,表级别的某一时刻的备份,本身不能增量备份

  4. 适用于中小型数据库

mysqldump + binlog实现增量备份

增量备份原理:

  • 首先需要有一份全量备份
  • 数据库经过一段时间的增删改操作,再次备份就不需要全备了
  • 只需要备份binlog日志文件即可(因为binlog日志记录了增删改操作的所有SQL语句)

增量备份实验步骤 :

①先准备数据(前提),
②开启二进制,然后做全量备份(全库备份)
③继续对数据库进行增删改操作
④突然发生了硬件故障,数据库丢失了
⑤恢复全量备份导出的数据(不完整,因为在备份时数据库可能会产生增删改操作,可能只有90%)
⑥备份二进制日志,根据其信息(导入剩余的10%的数据)

增量备份实验步骤:

第一步:准备测试数据,直接拿上面的魏国数据表来测试

在这里插入图片描述

第二步:开启二进制文件,重启服务,然后进行全库备份

  • 增量备份与全库备份的差异是在备份时使用--flush-logs刷新了日志,这样在恢复全备数据后,只需要找到最新的二进制文件查看并恢复即可
  • 如果不刷新日志,你得在旧的二进制文件中找,可能旧的二进制文件较大,查找比较麻烦
开启二进制文件:
	# vim /mysql_3307/my.cnf
		...
		server-id=1
		log-bin=/mysql_3307/data/binlog
# service mysql_3307 restart 


mysqldump 全库备份:
	# mkdir /tmp/mysqlbak	=>	创建全备的保存路径
	# /mysql_3307/bin/mysqldump --single-transaction --flush-logs --master-data=2 --all-databases > /tmp/mysqlbak/all_1.sql -p
		选项说明:
			--flush-logs:表示刷新日志文件,那么增量备份直接备份新的日志文件即可	

第三步:对数据库进行增删改操作

# mysql > use db_sanguo
# mysql > insert into tb_weiguo values (null,'孙权','11','谋略家');
# mysql > delete from tb_weiguo where name='张辽';
# mysql > update tb_weiguo set profession='人妻曹' where name='曹操';
  • 全备后数据经过增删改
    在这里插入图片描述

第四步:模拟发生硬件故障,数据库丢失(手动删库)

# mysql_3307 -e "drop database db_sanguo;" -p 
	Enter password:

第五步:进行数据恢复到全备时候状态

需要把最新的二进制日志文件进行备份:
	# cp /mysql_3307/data/binlog.00000x /tmp/mysqlbak/


先进行全库恢复:
	# mysql_3307 < /tmp/mysqlbak/all_1.sql -p
  • 恢复到全备状态
  • 在这里插入图片描述

第六步:通过binlog增量备份还原数据库到100%

  • 学会看二进制日志文件,通过mysqlbinlog命令查看和恢复二进制日志文件
  • 通过mysqlbinlog 命令查看
  • 重点查看事故临界点,如: drop database,这样的语句
  • 还原的时候不要把事故点也还原了,注意at 编号
先查看一下二进制日志文件
	#l /mysql_3307/bin/mysqlbinlog /tmp/mysqlbak/binlog.00000x
		备注:binlog.00000x 代表产生的最新二进制日志文件	
	


找到事故临界点后开始还原数据:
	#l /mysql_3307/bin/mysqlbinlog --start-position=4  --stop-position=1057  /tmp/mysqlbak/binlog.00000x |mysql_3307 -p

在这里插入图片描述
在这里插入图片描述

  • 恢复全备后的增删改状态
    在这里插入图片描述

到此增量备份实现完成

逻辑的导入和导出

导出(数据备份):into outfile

无论是什么存储引擎,以下方式本身是一种数据导出的方法,同时可以用来辅助备份,它可以对一个表的其中一列或者某几列做备份。备份的是数据记录。

secure_file_priv在配置文件开启数据导入导出功能,并指定其路径
into outfile执行导出的命令

重点:

  • 导出前需要在配置文件中指定MySQL逻辑导出的路径
  • 还需要给予mysql用户对逻辑导出的路径文件夹有写入的权限
  • 导出的文件后缀不重要

基本语法:

命令格式:
	修改MySQL配置文件,开启数据导入导入导出功能:
		# vim /mysql_3307/my.cnf	=>	增加一行配置
			...
			secure_file_priv=逻辑导入导出的路径


	导出语法:
		# mysql > select * into outfile '逻辑导出的路径' from 数据库.数据表;

演示:

指定逻辑导出的路径:
	# vim /mysql_3307/my.cnf
		...
		secure_file_priv=/tmp/mysqlbak/
	# service mysql_3307 restart


增加mysql用户对路径的写入权限:
	# setfacl -m u:mysql:rwx /tmp/mysqlbak

导出数据表:	
	# mysql > select * into outfile '/tmp/mysqlbak/tb_shuguo.txt' from db_sanguo.tb_shuguo;

在这里插入图片描述

导入(数据还原): load data local infile、mysqlimport

典型应用场景: 可以把一些规则的文本文件导入到数据表中

基本语法:

命令格式:
	第一种:
		# mysql > load data local infile '导入数据文件路径' into table 数据表;
	
	第二种:
		#l /mysql_3307/bin/mysqlimport 数据库名称 [选项] 导入路径 -p
			注意:导入的文件必须和数据表名称保持一致,否则无法识别导入哪个表
			选项说明:
				--fields-terminated-by=':',指定导出文件的分隔符为冒号:
				--lines-terminated-by='\\n',指定每一行的结尾使用的符号,\\n代表换行符

演示:比如将/etc/passwd 的内容导入数据表

第一步: 创建一个数据表(字段必须和文件列相等)

创建数据表:
# mysql > create database db_test;		=>	创建一个数据库
# mysql > use db_test;
# mysql > create table `password`(
	`uname` varchar(50) default null,
	`passwd` varchar(2) default null,
	`uid` varchar(11) default null,
	`gid` varchar(11) default null,
	`comment` varchar(255) default null,
	`home` varchar(50) default null,
	`shell` varchar(50) default null
	) engine=innodb default charset=utf8mb4;


	说明:password是mysql保留关键字(有特殊作用),建议使用``两个反撇号括起来
		  字段有可能也是保留关键字,建议也引起来,不影响表的创建

第二步:把需要导入的文件拷贝到逻辑导入导出路径,然后进行导入

  • 必须将需要导入的文件放置在secure_file_priv 指定的文件夹下,然后再导入
第一步:拷贝文件
	# cp /etc/passwd /tmp/mysqlbak/password.txt				


第二步:使用mysqlimport命令将文件导入数据表
	#l /mysql_3307/bin/mysqlimport db_test --fields-terminated-by=':' --lines-terminated-by='\\n' /tmp/mysqlbak/password.txt -p
		选项说明:
			--fields-terminated-by=':',指定导出文件的分隔符为冒号:
			--lines-terminated-by='\\n',指定每一行的结尾使用的符号,\\n代表换行符
			db_test :指定数据库,因为文件名叫password.txt,这个库下面有一个相同的数据表,会自动匹配导入数据


或第二步:进入mysql执行语句进行导入
	先将冒号转换为空格符:
		# sed '1,22y/:/ /' /etc/passwd > /tmp/mysqlbak/password.sql# awk 'BEGIN{FS=":"}{print $1,$2,$3,$4,$5,$6,$7}' /etc/passwd >  /tmp/mysqlbak/password.sql
	然后进入mysql导入数据文件:
		# mysql > use db_tast;
		# mysql > load data local infile '/tmp/mysqlbak/password.sql' into table password;

逻辑备份还原小工具:Navicat

MySQL其实还支持很多管理软件(Windows版):MySQL-Front、Navicat

使用Navicat 工具必须得有远程连接的账号

在这里插入图片描述

数据的备份和还原

  • 通过这两个选项可以对数据进行导出导入
  • 注意:导出与导入的选项需一致

数据逻辑导出:

创建数据库和数据表
在这里插入图片描述

插入数据
在这里插入图片描述

数据导出:导出结束后关闭即可,一般导出的数据文件在桌面
在这里插入图片描述

数据逻辑导入:

人为删除数据表中的记录再导入
在这里插入图片描述

数据表的备份和还原

数据表备份:

在这里插入图片描述

数据表的还原:

在这里插入图片描述

数据库的备份与还原

数据库备份:

  • 一般生产的转储文件会放在桌面
    在这里插入图片描述

数据库还原:

  • 还原后右键刷新一下数据库下的数据表就出来了

删除原有数据库,但是在数据库还原的时候需要创建一个数据库,因为数据库备份的是库下表的数据
在这里插入图片描述

在创建的数据库下选中之前数据库备份导出的文件
在这里插入图片描述
需要注意导入时的编码格式,与文件内不一致会导致数据乱码
在这里插入图片描述

以上是关于mysqldump + binlog实现增量备份的主要内容,如果未能解决你的问题,请参考以下文章

Mysql备份系列--mysqldump备份(全量+增量)方案操作记录

使用mysqldump进行全量+增量备份方案操作记录

MySQL数据库逻辑备份

MySQL数据库逻辑备份

mysql 备份恢复

MySQL数据库之Percona全量增量备份与恢复