MySQL数据库—备份

Posted 南城诗客^

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL数据库—备份相关的知识,希望对你有一定的参考价值。

关于备份

备份原因:丢 删
备份目标:1. 数据的一致性 2. 服务的可用性

备份技术:物理备份/冷备份

直接复制数据库文件,适用于大型数据库环境,不受存储引擎的限制,但不能恢复到不同的mysql版本。
tar,cp,scp
拷贝数据,  优点快,缺点服务停止。

逻辑备份/热备份

备份的是建表、建库、插入等操作所执行SQL语句(DDL DML DCL),适用于中小型数据库。
mysqldump,mydumper
效率相对较低

备份方式

完全备份

增量备份
在这里插入图片描述

连续回复
特点:因每次仅备份自上一次备份(注意是上一次,不是第一次)以来有变化的文件,所 以备份体积小,备份速度快,但是恢复的时候,需要按备份时间顺序,逐个备份版本进行恢复,恢复时间长。

差异备份
在这里插入图片描述

跳跃恢复
特点:占用空间比增量备份大,比完整备份小,恢复时仅需要恢复第一个完整版本和最后 一次的差异版本(包含所有的差异),恢复速度介于完整备份和增量备份之间。

实战案例1

percona-xtrabackup

获得软件包
官方站点:

https://www.percona.com/

选择版本
在这里插入图片描述

安装

安装YUM仓库
安装percona需要的mysql包

mysql官方源

yum install -y  https://repo.mysql.com//mysql80-community-release-el7-3.noarch.rpm

yum工具

yum install -y yum-utils

查看mysql可用版本

yum repolist all | grep mysql

禁用80

yum-config-manager --disable mysql80-community

启用57

yum-config-manager --enable mysql57-community
yum  install mysql-community-libs-compat -y
yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm

YUM安装percona-xtrabackup

yum -y install percona-xtrabackup-24.x86_64

查询安装结果

rpm -ql percona-xtrabackup-24 

1-1 完全备份流程

innobackupex --user=root --password='Fr@123' /xtrabackup/full

连接数据库,开始备份。
请注意备份结果是否完成

xtrabackup: Transaction log of lsn (74182721) to (74182730) was copied.
171127 15:04:12 completed OK!

查看备份目录。数据库,配置文件,日志文件

ls /xtrabackup/full/
ls /xtrabackup/full/2017-08-01_00-00-02/

观看二进制日志位置

cat /xtrabackup/full/2017-08-01_00-00-18/xtrabackup_binlog_info 

1-2 完全恢复流程

停止数据库
清理环境(模拟损坏)

rm -rf /var/lib/mysql/*
rm -rf /var/log/mysqld.log 

生成回滚日志

innobackupex --apply-log /xtrabackup/full/2017-08-01_00-00-18/

指定备份点
恢复文件

innobackupex --copy-back /xtrabackup/full/2017-08-01_00-00-18/

登陆验证
ls /var/lib/mysql
chown -R mysql.mysql /var/lib/mysql
systemctl start mysqld
mysql -uroot -p’Fr@123’

2-1 增量备份流程

准备工作
使用指定的数据库

create database testdb;
use testdb;
create table test(id int);
 insert into test values (1);
 select * from test;
 mysql> select * from test;
+------+
| id   |
+------+
|    1 |
+------+
1 row in set (0.00 sec)

完整备份:周一

rm -rf /xtrabackup/*
date 09010000   时间建议靠后设置。
innobackupex --user=root --password='Fr@123' /xtrabackup
ll /xtrabackup/  
2017-09-01_00-00-04

增量备份:周二

date 09020000  更新时间
mysql -uroot -p'Fr@123' -e  'insert into testdb.test values (2)'

basedir基于周一的备份。
会生成一个今天的。

innobackupex --user=root --password='Fr@123' 
--incremental /xtrabackup/ 
--incremental-basedir=/xtrabackup/2017-09-01_00-00-04
ls  /xtrabackup/

2017-09-01_00-00-04  
2017-09-02_00-00-58

增量备份:周三

date 09030000
mysql -uroot -p'Fr@123' -e  'insert into testdb.test values (3)'

basedir基于周2的备份。
会生成一个今天的。

innobackupex --user=root --password='Fr@123' 
--incremental /xtrabackup/ 
--incremental-basedir=/xtrabackup/2017-09-02_00-00-26
ls  /xtrabackup/
2017-09-01_00-00-04  
2017-09-02_00-00-58
2017-09-03_00-00-36

周四。。周五。。周六

2-2 增量恢复流程

停止数据库

 systemctl stop mysqld

清理环境

 rm -rf /var/lib/mysql/*

周一

 innobackupex --apply-log --redo-only /xtrabackup/2017-09-01_00-00-04

回滚合并

周二

  innobackupex --apply-log --redo-only /xtrabackup/2017-09-01_00-00-04 
--incremental-dir=/xtrabackup/2017-09-02_00-00-26

恢复

innobackupex --copy-back /xtrabackup/2017-09-01_00-00-06  
chown -R mysql.mysql /var/lib/mysql
systemctl start mysqld

想回复3,怎么办

 systemctl stop mysqld
  innobackupex --apply-log --redo-only /xtrabackup/2017-09-01_00-00-04  
--incremental-dir=/xtrabackup/2017-09-03_00-00-27
#rm -rf /var/lib/mysql/*
innobackupex --copy-back /xtrabackup/2017-09-01_00-00-04 
chown -R mysql.mysql /var/lib/mysql
systemctl start mysqld
mysql -uroot -p'Fr@123' -e 'select * from testdb.test'

3-1 差异备份流程

rm -rf /xtrabackup/*

1.完整备份: 周一

date 10010000
create database testdb;
use testdb;
create table test2(id int);
insert into test2 values(1);
select * from test2;
innobackupex --user=root --password='Fr@123' /xtrabackup
ll /xtrabackup/
du -sh /xtrabackup/
2017-10-01_00-00-54

2.差异备份
周二:

date 10020000
mysql -uroot -p'Fr@123' -e 'insert into testdb.test2 values(2)'
 innobackupex --user=root --password='Fr@123'
 --incremental /xtrabackup 
--incremental-basedir=/xtrabackup/2017-10-01_00-01-12

完全备份目录(周一)

ll /xtrabackup/
du -sh /xtrabackup/

周三

date 10030000
mysql -uroot -p'Fr@123' -e 'insert into testdb.test2 values(3)'
 innobackupex --user=root --password='QianFeng@123' 
--incremental /xtrabackup 
--incremental-basedir=/xtrabackup/2017-10-01_00-01-12

完全备份目录(周一)

ll /xtrabackup/
du -sh /xtrabackup/

周四

date 10040000
mysql -uroot -p'Fr@123' -e 'insert into testdb.test2 values(4)'
 innobackupex --user=root --password='Fr123' 
--incremental /xtrabackup 
--incremental-basedir=/xtrabackup/2017-10-01_00-01-12

完全备份目录(周一)

ll /xtrabackup/
du -sh /xtrabackup/

3-2 差异恢复流程

停止数据库

systemctl stop mysqld

清理环境

rm -rf /var/lib/mysql/*

重演回滚redo log(周一,某次差异)--> 恢复数据

innobackupex --apply-log --redo-only /xtrabackup/2017-10-01_00-01-12
innobackupex --apply-log --redo-only 
/xtrabackup/2017-10-01_00-01-12 
--incremental-dir=/xtrabackup/2017-10-04_00-00-29
 innobackupex --copy-back /xtrabackup/2017-10-01_00-01-12

修改权限

chown -R mysql.mysql /var/lib/mysql/

启动mysqld

systemctl start mysqld

通过binlog增量恢复(略)

实战案例2

mysqldump + binlog

优势
1 自动记录日志position位置。

(show master  status\\G;

2 可用性,一致性: 锁表机制。

语法

 mysqldump  -h 服务器  -u用户名  -p密码   数据库名  > 备份文件.sql

参数说明
库的范围

-A, --all-databases	所有库
school	数据库名
school stu_info t1	是指school数据库的表stu_info、t1
-B, --databases bbs test mysql	多个数据库
 --single-transaction                    #InnoDB 一致性 服务可用性
 --master-data=1|2	#该选项将会记录binlog的日志位置与文件名并追加到文件中,或添加注释

高级选项

 --opt 		#同时启动各种高级选项
 -R, --routines			 #备份存储过程和存储函数
  -F, --flush-logs		#备份之前刷新日志,截断日志。备份之后新binlog。
  --triggers		#备份触发器

备份实战

请准备两套root密码
准备库1
注意
请清理掉之前的test库。实验后半部分,需要继续创建test库,避免混淆。
testdb1.t1

mysql> select * from testdb1.t1;
+------+
| id   |
+------+
|    1 |
|    2 |
|    3 |
+------+

执行备份

[root@localhost ~]# mysqldump -p'Fr@123' \\
--all-databases --single-transaction \\
 --master-data=2 \\
--flush-logs \\
>  /backup/`date +%F-%H`-mysql-all.sql
master-data=2 注释掉日志记录

观察备份细节

vim /backup/2016-11-25-14-mysql-all.sql
LOCK TABLES `user` WRITE;

观察各种锁机制,用来保证数据一致性

22 CHANGE MASTER TO MASTER_LOG_FILE='localhost-bin.000004', MASTER_LOG_POS=154;

二进制日志截断位置。第22行

业务正常推进…
备份后的,数据变更行为

在testdb2.t2 中插入数据1,2,3;
创testdb3库
切断二进制日志(重启数据库)


在testdb2.t2 中插入数据4;
删testdb3库
在testdb2.t2 中插入数据5;
mysql> select * from testdb2.t2;
+------+
| id   |
+------+
|    1 |
|    2 |
|    3 |
+------+
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| testdb1            |
| testdb2            |
+--------------------+
12 rows in set (0.00 sec)

mysql> 

恢复实战

1 备份二进制日志文件

cp /var/lib/mysql/*bin* ~
  1. 停止数据库
systemctl stop mysqld
  1. 清理环境
rm -rf /var/lib/mysql/*

4.启动数据库

systemctl start mysqld
grep 'password' /var/log/mysqld.log

找密码,再改一下密码。请使用密码

2Kyzw;u2dq<mh
mysqladmin -uroot -p'Kyzw;u2dq<mh' password 'Fr@1234'

注意
语法要求password后面有空格。

5.mysql恢复数据

 mysql -p'Fr@1234' < /backup/2016-12-08-04-mysql-all.sql
mysql -p'Fr@1234' -e 'flush privileges'

请使用备份时密码
登陆并验证数据恢复结果。

6.二进制日志恢复
观察二进制截取记录

vim /backup/2016-11-25-14-mysql-all.sql
CHANGE MASTER TO MASTER_LOG_FILE='localhost-bin.0000010', MASTER_LOG_POS=154;
mysqlbinlog localhost-bin.000002 localhost-bin.000003
 --start-position=154  | mysql -p'Fr@123'

注意后续有多少日志,要跟多少日志名字。

7.观察数据
完整数据

实战案例3

记录的导出和导入
记录导出
注意目录权限

vim /etc/my.cnf
secure-file-priv=/backup

mysql不信任该目录

chown mysql.mysql /backup

mysql用户没有权限

SELECT... INTO OUTFILE 导出文本文件
mysql> SELECT * FROM testdb1.t1 INTO OUTFILE '/backup/testdb1.t1.txt';

mysql 命令导出文本文件

mysql -uroot -p'Fr@123' -e 'select * from testdb1.t1' > /backup/testdb1.t2.txt
mysql -u root -p'Fr@123' --xml -e 'select * from testdb1.t1' > /backup/testdb1.t3.txt
mysql -u root -p'Fr@123' --html -e 'select * from testdb1.t1' > /backup/index.html

LOAD DATA INFILE 导入文本文件
注意目录权限

vim /etc/my.cnf
secure-file-priv=/backup
mysql不信任该目录

chown mysql.mysql /backup
mysql用户没有权限
DELETE FROM testdb1.t1;

删除表的内容
表的导出和导入只备份表记录,不会备分表结构。因此需要通过mysqldump备份表结构,恢复时先恢复表结构,再导入数据。

LOAD DATA INFILE '/backup/testdb1.t1.txt'  INTO TABLE testdb1.t1;

读取记录备份文件

select * from testdb1.t1;

以上是关于MySQL数据库—备份的主要内容,如果未能解决你的问题,请参考以下文章

linux中怎么查看mysql数据库版本

部分代码片段

Oracle数据库从RMAN备份集片段还原指定单个归档日志进行日志挖掘分析

如何用Java实现MySQL数据库的备份和恢复

Java 备份mysql数据库的问题

web服务文件更新自动同步数据库主从复制shell脚本实现网站代码备份和mysql备份