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 , -x | MyISAM一致性,服务可用性(针对所有库所有表) ,针对 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:
总结:
-
mysqldump工具备份的是SQL语句,故备份不需要停服务
-
使用备份文件恢复时,要保证数据库处于运行状态
-
只能实现全库,指定库,表级别的某一时刻的备份,本身不能增量备份
-
适用于中小型数据库
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实现增量备份的主要内容,如果未能解决你的问题,请参考以下文章