数据库的备份恢复

MySQL数据备份

所有备份数据都应放在非数据库本地,而且建议有多份副本。

备份:(将数据库文件保存在了其它地方。)能够防止由于机械故障及人为误操作带来的数据丢失。
冗余:(主备模式,数据库集群。)数据有多份冗余,但不等备份,只能防止机械故障带来的数据丢失。

备份过程中必须考虑的因素:
1、数据的一致性。
2、服务的可用性。

逻辑备份:备份的是建表、建库、插入等操作所执行SQL语句,适用于中小型数据库,效率相对较低。
mysqldump,binlog,mydumper,phpmyadmin

物理备份:直接复制数据库文件,适用于大型数据库环境,不受存储引擎的限制,但不能恢复到不同的MySQL版本。
tar,cp,mysqlhotcopy 只能用于备份MyISAM。
xtrabackup,inbackup,lvm,snapshot

逻辑备份(mysqldump)

mysqldump

mysqldump可以保证 数据一致,服务可用

mysqldump本身为客户端工具:
远程备份语法: mysqldump -h 服务器 -u用户名 -p密码 数据库名 > 备份文件.sql
本地备份语法: mysqldump -u用户名 -p密码 数据库名 > 备份文件.sql

1.常用备份选项
-A:–all-databases,备份所有库
-B:–databases bbs test mysql,备份多个数据库
-F:–flush-logs,备份之前刷新binlog日志
–default-character-set :指定导出数据时采用何种字符集,如果数据表不是采用默认的 latin1 字符集的话,那么导出 时必须指定该选项,否则再次导入数据后将产生乱码问题
-d:–no-data,不导出任何数据,只导出数据库表结构


使用mysqldump备份数据时,mysqldump会对当前数据库进行锁表,锁表后如果有数据的修改将不备份修改后的数据,所以对一个正在运行的数据库进行备份时请慎重。
如果一定要在服务运行期间备份,可以选择添加 –single-transaction选项:
mysqldump --single-transaction -u root -p123456 dbname > mysql.sql


库与表数据的备份及恢复

备份库
备份一个库:相当于将这个库里面的所有表全部备份。
备份前先创建好备份目录:/home/back/

[root@xiaobai] mysqldump -u root -p 'XiaoBai@123!' db1 > /home/back/db1.bak   #备份一个库
[root@xiaobai] musqldump -u root -p 'XiaoBai@123!' -B db1 db2 db3 > /home/back/db123.bak   #备份多个库
[root@xiaobai] mysqldump -u root -p 'XiaoBai@123!' -A > /home/back/allbase.bak   #备份所有库

备份表

[root@xiaobai] mysqldump -u root -p 'XiaoBai@123!' db1 t1 > /home/back/db1.t1.bak   #备份一个表
[root@xiaobai] mysqldump -u root -p 'XiaoBai@123!' db1 t1 t2 > /home/back/db1.t1_t2.bak   #备份多个表

库恢复
为保证数据一致性,应在恢复数据之前停止数据库对外的服务,停止binlog日志 ,因为binlog使用binlog日志恢复数据时,也会产生binlog日志

mysql> create database db1;   #登录mysql创建数据库后登出
[root@xiaobai] mysql -uroot -p 'XiaoBai@123!' db1 < /home/back/db1.bak   #恢复库

表恢复

mysql> use db1;   #进入db1库
mysql> set sql_log_bin=0;   #停止binlog日志
source /home/back/db1.t1.bak;   #恢复表
#关闭binlog日志
[root@xiaobai] mysql -uroot -p 'XiaoBai@123!' db1 < /home/back/db1.t1.bak   #恢复表

表结构

备份表结构:
语法:
mysqldump -uroot -p123456 -d database table > dump.sql
恢复表结构:
登陆数据库创建一个库
语法
mysql -uroot -p123456 -D database < dump.sql

[root@xiaobai] mysqldump -uroot -p 'XiaoBai@123!' -d db1 t1 > /home/back/emp.bak   #导出表结构
[root@xiaobai] mysqldump -uroot -p 'XiaoBai@123!' -D db1 > /home/back/emp.bak   #导入表结构

数据的导入导出。没有表结构,表的导出和导入只备份表内记录,不会备份表结构,需要通过mysqldump备份表结构,恢复时先恢复表结构,再导入数据。

mysql> show variables like "secure_file_priv";   #查询导入导出的目录

安全目录配置

#修改安全文件目录
#1.创建一个目录:mkdir  路径目录 
[root@xiaobai] mkdir /sql 
#2.修改权限
[root@xiaobai] chown mysql.mysql /sql
#3.编辑配置文件
[root@xiaobai] vim /etc/my.cnf 
#在[mysqld]中追加 
secure_file_priv=/sql 
#4.重新启动mysql

数据导出

#导出数据 
#登陆数据查看数据 
mysql> show databases;   #查看当前有哪些库
text 
mysql> use test;   #进入test库 
mysql> show tables;   #查看test库有哪些表    
t3
  
mysql> select * from t3 into outfile '/sql/test.t3.bak';   #将t3表的数据导出到/sql/test.t3.bak文件中
  
#添加修饰
mysql> select * from t3 into outfile '/sql/test.t3.bak1' fields terminated by ',' lines terminated by '\n'; 
# fields terminated by ','   字段以逗号分割 
#lines terminated by '\n'   结尾换行
  
#导入数据 
#先将原来表里面的数据清除掉,只保留表结构 
mysql> delete from t3; 
mysql> load data infile '/sql/test.t3.bak' into table t3; 
#如果将数据导入别的表,需要创建这个表并创建相应的表结构

binlog日志恢复

开启binlog日志
打开mysql的主配置文件,在[mysqld]修改
在这里插入图片描述

[root@xiaobai] mkdir /var/log/sql-bin   #创建binlog日志目录
[root@xiaobai] chown mysql.mysql /var/log/sql-bin   #修改属主属组
[root@xiaobai] systemctl restart mysqld   #重启mysql服务

测试

mysql> flush logs;   #刷新binlog日志会产生新的日志文件
mysql> create table t3(id int);   #创建一个表

在终端上重启mysqld也可刷新bin-log日志

我们会看到有两个binlog日志,第二个里有我们的创表记录。

[root@xiaobai] mysqlbinlog mylog.000002   #查看binlog日志

找到我们要恢复的sql语句的起始位置和结束位置
在这里插入图片描述

登录我们的mysql将t3表删除后退出

[root@xiaobai] cd /var/log/sql-bin   #进入binlog日志目录
[root@xiaobai] mysqlbinlog --start-position 219 --stop-position 321 mylog.000002 |mysql -uroot -p'XiaoBai@123!'   #从219导321中间的数据恢复

物理备份

物理备份的方式

1.完全备份(完整备份):每次都将所有数据(不管自第一次备份以来有没有修改过),进行一次完整的复制。
特点:占用空间大,备份速度慢,但恢复时一次恢复到位,恢复速度快。

2.增量备份: 每次备份上一次备份到现在产生的新数据。
特点:因每次仅备份自上一次备份(注意是上一次,不是第一次)以来有变化的文件,所 以备份体积小,备份速度快,但是恢复的时候,需要按备份时间顺序,逐个备份版本进行恢 复,恢复时间长。

3.差异备份:只备份跟完整备份不一样的在第一次完整备份之后,第二次开始每次都将所有文件与第一次完整备份的文件做比较,把自第一次完整备份以来所有修改过的文件进行备份,且以后每次备份都是和第一次完整备份进行比较(注意是第一次,不是上一次),备份自第一次完整备份以来所有的修改过的文件。
特点:占用空间比增量备份大,比完整备份小,恢复时仅需要恢复第一个完整版本和最后一次的差异版本,恢复速度介于完整备份和增量备份之间。

简单的讲,完整备份就是不管三七二十一,每次都把指定的备份目录完整的复制一遍,不管目录下的文件有没有变化;增量备份就是每次将之前(第一次、第二次、直到前一次)做过备份之后有变化的文件进行备份;差异备份就是每次都将第一次完整备份以来有变化的文件进行备份。

热备份:数据库启动同时给客户端提供服务的情况下
冷备份:数据库要关掉或者不能给客户端提供服务

物理备份(percona-xtrabackup)

percona-xtrabackup是开源免费的支持MySQL 数据库热备份的软件,它能对InnoDB和XtraDB存储引擎的数据库非阻塞地备份。它不暂停服务创建Innodb热备份; 为mysql做增量备份;在mysql服务器之间做在线表迁移;使创建replication更加容易;备份mysql而不增加服务器的负载。 percona是一家老牌的mysql技术咨询公司。它不仅提供mysql的技术支持、培训、咨询,还发布了mysql的分支版本–percona Server。并围绕percona Server还发布了一系列的mysql工具。

yum安装xtrabackup

www.percona.com
进入链接后下拉到底
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

[root@xiaobai] rpm -ivh percona-release-1.0-15.noarch.rpm
[root@xiaobai] cd /etc/yum.repos.d/
[root@xiaobai] vim percona-original-release.repo

在这里插入图片描述

[root@xiaobai] yum -y install percona-xtrabackup   #下载xtrabackup软件

xtrabackup与mysql兼容性解决

如果你yum安装出现了这种问题将环境清理一下
在这里插入图片描述

[root@xiaobai] yum -y erase percona-xtrabackup
[root@xiaobai] rm -rf percona-release.repo
[root@xiaobai] rm -rf percona-release-1.0-15.noarch.rpm

Percona XtraBackup 2.4.15
在这里插入图片描述
xtrabackup2.4.15与mysql5.7可以兼容

[root@xiaobai] rpm -ivh percona-xtrabackup-24-2.4.15-1.el7.x86_64.rpm
#解压完成后就可以直接使用了

完全备份

完全备份

[root@xiaobai] mkdir /xtrabackup/full -p   #创建备份目录
[root@xiaobai] innobackupex --user=root --password='XiaoBai@123!' /xtrabackup/full   #备份

在这里插入图片描述
备份恢复

#可以查看一下: 
[root@xiaobai] cd /xtrabackup/full/ 
[root@xiaobai] ls 
2020-03-15_19-01-26   #之前的备份文件

#完全备份恢复流程 
1. 停止数据库 
2. 清理环境 
3. 重演回滚--> 恢复数据 
4. 修改权限 
5. 启动数据库

#1.关闭数据库
[root@xiaobai] systemctl stop mysqld 
[root@xiaobai] rm -rf /var/lib/mysql/* 
[root@xiaobai] rm -rf /var/log/mysqld.log 
[root@xiaobai] rm -rf /var/log/mysql-slow/slow.log 

#2.重演恢复
[root@xiaobai] innobackupex --apply-log /xtrabackup/full/2020-03-15_19-01-26 

#3.确认数据库目录
#恢复之前需要确认配置文件内有指定数据库目录,不然xtrabackup不知道恢复到哪里
[root@xiaobai] vim /etc/my.cnf 
#在配置文件中添加   
[mysqld] 
datadir=/var/lib/mysql

#4.恢复数据
[root@xiaobai] innobackupex --copy-back /xtrabackup/full/2020-03-15_19-01-26 

#5.修改权限
[root@xiaobai] chown mysql.mysql /var/lib/mysql -R 

#6.启动数据库 
[root@xiaobai] systemctl start mysqld

增量备份

原理:每次备份上一次备份到现在产生的新数据
增量备份

#清理环境
#1.完整备份:周一
[root@xiaobai] rm -rf /xtrabackup/* 
[root@xiaobai] innobackupex --user=root --password='XiaoBai@123!' /xtrabackup/full/ 
[root@xiaobai] ls /xtrabackup/
2020-03-15_19-30-42  

#2.在数据库中插入周二的数据: 模拟周二
mysql> insert into testdb.t1 values(2);   #sql语句 
[root@xiaobai] innobackupex --user=root --password='XiaoBai@123!' --incremental /xtrabackup/full/ --incremental-basedir=/xtrabackup/full/2020-03-15_19-30-42/   #--incremental-basedir:基于哪个文件增量   
[root@xiaobai] ls /xtrabackup/full/
2020-03-15_19-30-42   2020-03-15_19-35-42
#2020-03-15_19-30-42相当于周二的增量备份

#3.在数据库中插入周三的数据: 模拟周三 
mysql> insert into testdb.t1 values(3);   #sql语句
[root@xiaobai] innobackupex --user=root --password='XiaoBai@123!' --incremental /xtrabackup/full/ --incremental-basedir=/xtrabackup/full/2020-03-15_19-35-42/   #基于前 一天的备份为目录 
[root@xiaobai] ls /xtrabackup/full/
2020-03-15_19-30-42   2020-03-15_19-35-42   2020-03-15_19-48-04
#2020-03-15_19-48-04相当于周三的增量

备份恢复

#增量备份恢复流程 
1. 停止数据库 
2. 清理环境 
3. 依次重演回滚redo log--> 恢复数据 
4. 修改权限 
5. 启动数据库

#停止数据库及清理环境
[root@xiaobai] systemctl stop mysqld 
[root@xiaobai] rm -rf /var/lib/mysql/* 

#依次重演回滚redo log: 
[root@xiaobai] innobackupex --apply-log --redo-only /xtrabackup/full/2020-03-15_19-30-42 
#周二---周三 
[root@xiaobai] innobackupex --apply-log --redo-only /xtrabackup/full/2020-03-15_19-30-42 --incremental-dir=/xtrabackup/full/2020-03-15_19-35-42   #--incremental-dir:增量目录 
[root@xiaobai] innobackupex --apply-log --redo-only /xtrabackup/full/2020-03-15_19-30-42 --incremental-dir=/xtrabackup/full/2020-03-15_19-48-04/ 

#恢复数据
[root@xiaobai] innobackupex --copy-back /xtrabackup/full/2020-03-15_19-30-42/ 

#修改权限及启动服务 
[root@xiaobai] chown -R mysql.mysql /var/lib/mysql 
[root@xiaobai] systemctl start mysqld

差异备份

差异备份

#清理备份的环境
[root@xiaobai] rm -rf /xtrabackup/* 
#登陆数据库,准备环境 :模拟周一
mysql> delete from testdb.t1;    #sql语句
mysql> insert into testdb.t1 values(1);   #sql语句

#1、完整备份:周一
[root@xiaobai] innobackupex --user=root --password='XiaoBai@123!' /xtrabackup/full/
root@xiaobai] ls /xtrabackup/full/
2020-03-15_20-03-53

#登陆mysql添加数据:模拟周二
mysql> insert into testdb.t1 values(2);   #sql语句
#差异备份周二的
[root@xiaobai] innobackupex --user=root --password='XiaoBai@123!'  --incremental /xtrabackup/full/ --incremental-basedir=/xtrabackup/full/2020-03-15_20-03-53/
[root@xiaobai] ls /xtrabackup/full/
2020-03-15_20-03-53   2020-03-15_20-10-31

#再次登陆mysql:添加数据
mysql> insert into testdb.t1 values(3);   #sql语句
[root@xiaobai] innobackupex --user=root --password='XiaoBai@123!' --incremental /xtrabackup/full/ --incremental-basedir=/xtrabackup/full/2020-03-15_20-03-53/    #差异备份每次都是基于第一次完整备份的
[root@xiaobai] ls /xtrabackup/full/
2020-03-15_20-03-53    2020-03-15_20-10-31    2020-03-15_20-16-17

备份恢复

#差异备份恢复流程 
1. 停止数据库 
2. 清理环境 
3. 重演回滚redo log(周一,某次差异)--> 恢复数据 
4. 修改权限 
5. 启动数据库

#停止数据库并清理环境
[root@xiaobai] systemctl stop mysqld 
[root@xiaobai] rm -rf /var/lib/mysql/*

#恢复全量的redo log
[root@xiaobai] innobackupex --apply-log --redo-only /xtrabackup/full/2020-03-15_20-03-53/

#恢复差异的redo log
#我们这里可以直接恢复周三的差异备份 
[root@xiaobai] innobackupex --apply-log --redo-only /xtrabackup/full/2020-03-15_20-03-53/ --incremental-dir=/xtrabackup/full/2020-03-15_20-16-17/

#恢复数据
[root@xiaobai] innobackupex --copy-back /xtrabackup/full/2020-03-15_20-03-53/ 
#修改权限
[root@xiaobai] chown -R mysql.mysql /var/lib/mysql 
[root@xiaobai] systemctl start mysqld

总结

差异备份每天的备份相当于一个独立的整体,可以直接与第一天的完整备份对接,而增量备份则需要依靠前一天的数据备份来对接,总的来说差异备份恢复时不易出错方便,但是占用系统资源较多,而增量备份占用较少,但容易出错,恢复起来且麻烦,如果中间数据丢失则无法恢复。

文中内容适用于初学者 @小白

发布了17 篇原创文章 · 获赞 19 · 访问量 1109

猜你喜欢

转载自blog.csdn.net/little_baixb/article/details/104874928