MySQL数据库备份与恢复详解附实例

数据库数据备份与恢复

  • 一、备份作用
      • 1.备份
      • 2.冗余
  • 二、备份内容
  • 三、备份类型
      • 1.物理备份
      • 2.逻辑备份
      • 3.区别
  • 四、备份工具
  • 五、物理备份方式
      • 1.完整备份(完全备份)
      • 2.增量备份
      • 3.差异备份
      • 4.小结
  • 六、物理备份 percona-xtrabackup (实例)
  • 七、逻辑备份 mysqldump
  • 八、通过Binlog恢复

一、备份作用

1.备份

  能够防止由于机械故障以及人为误操作带来的数据丢失,例如将数据库文件保存在了其它地方。比如把文件拷贝到U盘里,电脑出故障,数据还在。

2.冗余

  数据有多份冗余,但不等备份,只能防止机械故障带来的数据丢失,例如主备模式、数据库集群。类似于复制文件到本机上,电脑死机仍恢复不了。

二、备份内容

databases Binlog my.conf
  所有备份数据都应放在非数据库本地,而且建议有多份副本。测试环境中做日常恢复演练,恢复较备份更为重要。
  备份过程中必须考虑因素:数据的一致性和服务的可用性

三、备份类型

1.物理备份

  直接复制数据库文件,适用于大型数据库环境,不受存储引擎的限制,但不能恢复到不同的MySQL版本。

1)热备
  在线备份,数据库处于运行状态,这种备份方法依赖于数据库的日志文件。对应用基本无影响(但是性能还是会有下降,所以尽量不要在主上做备份,在从库上做)。

2)冷备
  备份数据文件,需要停机,是在关闭数据库的时候进行的。

3)温备
  针对myisam的备份(myisam不支持热备),备份时候实例只读不可写,数据库锁定表格(不可写入但可读)的状态下进行的。对应用影响很大,通常加一个读锁。

2.逻辑备份

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

3.区别

逻辑备份 物理备份
备份方式 备份数据库建表、建库、插入sql语句 备份数据库物理文件
优点 备份文件相对较小,只备份表中的数据与结构 恢复速度比较快
缺点 恢复速度较慢(需要重建索引,存储过程等) 备份文件相对较大(备份表空间,包含数据与索引)
对业务影响 I/O负载加大 I/O负载加大
代表工具 mysqldump ibbackup、xtrabackup,mysqlbackup

四、备份工具

1.ibbackup
官方备份工具,收费,物理备份

2.xtrabackup
开源社区备份工具,开源免费,上面的免费版本(老版本有问题,备份出来的数据 可能有问题),物理备份

3.mysqldump
官方自带备份工具,开源免费,逻辑备份(速度慢)

4.mysqlbackup
mysql 官方备份工具,innodb 引擎的表mysqlbackup可以进行热备,非innodb 表mysqlbackup就只能温备,物理备份,备份还原速度快,适合大规模数据使用

五、物理备份方式

1.完整备份(完全备份)

  每次对数据进行完整的备份,即对整个数据库的备份、数据库结构和文件结 构的备份,保存的是备份完成时刻的数据库,是差异备份与增量备份的基础。

优点:备份与恢复操作简单方便,恢复时一次恢复到位,恢复速度快。
缺点:占用空间大,备份速度慢。

2.增量备份

  每次备份上一次备份到现在产生的新数据。
  只有那些在上次完全备份或者增量备份后被修改的文件才会被备份。以上次 完整备份或上次的增量备份的时间为时间点,仅备份这之间的数据变化。

特点:
  因而备份的数据量小,占用空间小,备份速度快。但恢复时,需要从 上一次的完整备份起按备份时间顺序,逐个备份版本进行恢复,恢复时间长,如中 间某次的备份数据损坏,将导致数据的丢失。

3.差异备份

  只备份跟完整备份不一样的
  备份那些自从第一次次完全备份之后被修改过的所有文件,备份的时间起点 是从第一次次完整备份起,且以后每次备份都是和第一次完整备份进行比较(注意 是第一次,不是上一次),备份自第一次完整备份以来所有的修改过的文件。备份数据量会越来越大。

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

4.小结

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

六、物理备份 percona-xtrabackup (实例)

1.简介
  Xtrabackup是开源免费的支持MySQL 数据库热备份的软件,在 Xtrabackup 包中主要有 Xtrabackup 和 innobackupex 两个工具。其中 Xtrabackup 只能备份InnoDB 和 XtraDB 两种引擎; innobackupex则是封装了Xtrabackup,同时增加了备 份MyISAM引擎的功能。它不暂停服务创建Innodb热备份。

2.安装XtraBackup

[root@cheng ~]#wget https://downloads.percona.com/downloads/percona
-release/percona-release-0.1-4/redhat/percona-release-0.1-4.noarch.rpm
[root@cheng ~]#rpm -ivh percona-release-0.1-4.noarch.rpm
[root@x yum.repos.d]#cd /etc/yum.repos.d
[root@x yum.repos.d]#vim percona-release.repo 		//修改如下

MySQL数据库备份与恢复详解附实例_第1张图片

[root@x yum.repos.d]#yum -y install percona-xtrabackup-24.x86_64
[root@x yum.repos.d]#innobackupex --version
innobackupex version 2.3.10 Linux (x86_64) (revision id: bd0d4403f36)

3.完整备份

1)进行备份

[root@x ~]#mkdir /xtrabackup/full -p		//创建备份目录
[root@x ~]#mysql -uroot -p'cheng@123'		//创建表
mysql> create database youngfit;
mysql> use youngfit;
mysql> create table t1(id int);
mysql> exit
[root@x ~]#innobackupex --user=root --password='cheng@123' /xtrabackup/full		//进行完整备份
[root@x ~]#cd /xtrabackup/full/
[root@x full]#ls							//查看备份
2020-12-31_14-31-13

2)完整备份恢复流程

1>停止数据库

[root@x ~]#systemctl stop mysqld

2>清理环境

[root@x ~]#rm -rf /var/lib/mysql/*		//删除所有数据
[root@x ~]#rm -rf /var/log/mysqld.log
[root@x ~]#rm -rf /var/log/mysql-slow/slow.log

3>重演回滚(恢复数据)

[root@x ~]#innobackupex --apply-log /xtrabackup/full/
2020-12-31_14-31-13			//回滚
[root@x ~]#cat /etc/my.cnf	//确认数据库端是否有指定目录,否则软件不清楚恢复到哪里,有则确认,无则添加
[mysqld]
datadir=/var/lib/mysql
[root@x ~]#innobackupex --copy-back /xtrabackup/full/
2020-12-31_14-31-13								//恢复数据

4>修改权限

[root@x ~]#chown mysql.mysql  /var/lib/mysql  -R

5>启动数据库

[root@x ~]#systemctl start mysqld

4.增量备份

1)完整备份

[root@x ~]#mysql -uroot -p'cheng@123'	//创建表并插入数据
mysql> create database testdb;
mysql> create table t1(id int);
mysql> insert into t1 values(1);
mysql> exit
[root@x ~]#rm -rf /xtrabackup/*		//删除之前的备份
[root@x ~]#innobackupex --user=root --password='cheng@123' /xtrabackup  //完整备份
[root@x ~]#cd /xtrabackup/
[root@x xtrabackup]#ls
2021-01-01_14-51-35

2)增量备份

[root@x ~]#mysql -uroot -p'cheng@123'			//插入数据
mysql> insert into testdb.t1 values(2);
mysql> exit
[root@x ~]#innobackupex --user=root --password='cheng@123' --incremental/xtrabackup/ --incremental-basedir=/xtrabackup/2021-01-01_14-51-35/      ``//--incremental-basedir:基于哪个增量
[root@x ~]#cd /xtrabackup/
[root@x xtrabackup]#ls
2021-01-01_14-51-35		2021-01-01_15-51-35
[root@x ~]#mysql -uroot -p'cheng@123'			//模拟第二次备份
mysql> insert into testdb.t1 values(3);
mysql> exit
[root@x ~]#innobackupex --user=root --password='cheng@123' --incremental /xtrabackup/ --incremental-basedir=/xtrabackup/2021-01-01_15-51-35/
[root@x ~]#cd /xtrabackup/
[root@x xtrabackup]#ls
2021-01-01_14-51-35		2021-01-01_15-51-35		2021-01-01_16-51-35

3)恢复数据

[root@x ~]#systemctl stop mysqld
[root@x ~]#rm -rf /var/lib/mysql/*				//清理环境
依次重演回滚redo log:
[root@x ~]#innobackupex --apply-log --redo-only /xtrabackup/2021-01-01_1
4-51-35
[root@x ~]#innobackupex --apply-log --redo-only /xtrabackup/2019-08-20_1
4-51-35 --incremental-dir=/xtrabackup/2021-01-01_15-51-35   							//incremental-dir:增量目录
[root@x ~]#innobackupex --apply-log --redo-only /xtrabackup/2021-01-01_1
4-51-35 --incremental-dir=/xtrabackup/2021-01-01_16-51-35/
[root@x ~]#innobackupex --copy-back /xtrabackup/2021-01-01_14-51-35/	 	//恢复数据
[root@x ~]#chown -R mysql.mysql /var/lib/mysql
[root@x ~]#systemctl start mysqld

5.差异备份

[root@x ~]#rm -rf /xtrabackup/*			//清理环境
mysql> delete from testdb.t1;
mysql> insert into testdb.t1 values(1);		//插入数据
[root@x ~]#innobackupex --user=root --password='qf123' /xtrabackup   	 //完整备份
mysql> insert into testdb.t1 values(2);		//插入数据
[root@x ~]#innobackupex --user=root --password='cheng@123' --incremental 				//差异备份目录基于上一次完整备份 
/xtrabackup --incremental-basedir=/xtrabackup/2021-01-01_18-42-02/  	 				
mysql> insert into testdb.t1 values(3);		//插入数据
[root@x ~]#innobackupex --user=root --password='cheng@123' --incremental 				//差异备份目录基于上一次完整备份 
/xtrabackup --incremental-basedir=/xtrabackup/2021-01-01_18-42-02/   					
[root@x ~]#ls /xtrabackup/
2021-01-01_18-42-02		2021-01-01_19-42-02		2021-01-01_20-42-02
[root@x ~]#systemctl stop mysqld
[root@x ~]#rm -rf /var/lib/mysql/*
[root@x ~]#innobackupex --apply-log --redo-only /xtrabackup/							//恢复完整备份
2021-01-01_18-42-02/			
[root@x ~]#innobackupex --apply-log --redo-only /xtrabackup/
2021-01-01_18-42-02/ --incremental-dir=/xtrabackup/2021-01-01_19-42-02/ 				//可选择恢复,类似于快照,不同的是先恢复完整备份 
[root@x ~]#innobackupex --copy-back /xtrabackup/2021-01-01_18-42-02/					//恢复数据
[root@x ~]#chown -R mysql.mysql /var/lib/mysql
[root@x ~]#systemctl start mysqld

七、逻辑备份 mysqldump

1.简介
  mysqldump 是 MySQL 自带的逻辑备份工具。可以保证数据的一致性和服务的可用性。在备份的时候进行锁表会自动锁表,锁住之后在备份。

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

常用参数:

-A, --all-databases //备份所有库
-B, --databases //备份多个数据库
-F, --flush-logs //备份之前刷新binlog日志
–default-character-set //指定导出数据时采用何种字符集,如果数据表不是采用默认的latin1字符集的话,那么导出时必须指定该选项,否则再次导入数据后将产生乱码问题。
–no-data,-d //不导出任何数据,只导出数据库表结构。
–lock-tables //备份前,锁定所有数据库表
–single-transaction //保证数据的一致性和服务的可用性
-f, --force //即使在一个表导出期间得到一个SQL错误,继续。
注意:使用Mysqldump时避免锁表,即对一个正在运行的数据库备份时要慎重,可以选择添加–single-transaction选项,防止部分数据备份时未记录。

2.备份表

mysql > mysqldump -u root -p’密码’ 库名 表名 > 备份目标文件路径
mysql > mysqldump -u root -p’密码’ 库名 表1名 表2名… >备份目标文件路径

3.备份库

mysql > mysqldump -u root -p’密码’ 库名 > 备份目标文件路径
mysql > mysqldump -u root -p’密码’ 库1名 库2名… > 备份目标文件路径
mysql > mysqldump -u root -p’密码’ -A > 备份目标文件路径 //备份所有库

4.恢复数据库和表

恢复之前停止服务,并关闭Binlog日志,为了减少记录产生冗余。
#mysql -uroot -p’密码’ 库名 < 备份库文件路径 //会覆盖该库,最好为空库
#mysql -uroot -p’密码’ 库名 < 备份表文件路径
mysql> source 备份表文件路径; //恢复表,先进入要添加该表的数据库里

5.备份及恢复表结构

备份表结构语法:
#mysqldump -uroot -p’密码’ -d 库名 表名 > 备份文件

恢复表结构语法:
#mysql -u root -p’密码’ -D 表名 < 备份文件

6.导出导入数据
  恢复时只会导入数据,因此,需要先恢复表结构,再导入数据。

mysql> show variables like "secure_file_priv";		//查询导入导出的文件目录名
+------------------+-----------------------+
| Variable_name    | Value                 |
+------------------+-----------------------+
| secure_file_priv | /var/lib/mysql-files/ |
+------------------+-----------------------+
[root@mysql-server ~]# mkdir /sql
[root@mysql-server ~]# chown mysql.mysql /sql
[root@mysql-server ~]#vim /etc/my.cnf		//在[mysqld]里追加
secure_file_priv=/sql
[root@mysql-server ~]#service mysqld restart
[root@mysql-server ~]#mysql -uroot -p'cheng@123'
mysql> use test  
mysql> select * from t3 into outfile '/sql/test.t3.bak';		//导出数据
mysql> delete from t3;			//删除表数据
mysql> load data infile '/sql/test.t3.bak' into table t3;		//导入数据

八、通过Binlog恢复

1.开启binlog日志

[root@mysql-server ~]# vim /etc/my.cnf			//追加
log-bin=/var/log/sql-bin/mylog

2.创建binlog日志存储目录

[root@mysql-server ~]# mkdir /var/log/sql-bin
[root@mysql-server ~]# chown mysql.mysql /var/log/sql-bin
[root@mysql-server ~]# systemctl restart mysqld

3.查看binlog日志文件

mysql> flush logs;	//每次刷新都会截断产生新的binlog日志,重启也会截断
mysql> create table testdb.t3(id int);		//创建新表
[root@mysql-server ~]#cd /var/log/sql-bin
[root@x sql-bin]#mysqlbinlog mylog.000002  	//查看此日志文件内容

MySQL数据库备份与恢复详解附实例_第2张图片
4.测试

[root@mysql-server ~]# mysql -uroot -p'cheng@123'
mysql> drop table testdb.t3;   		//将这个表删除
[root@mysql-server ~]# cd /var/log/sql-bin/
[root@mysql-server sql-bin]# mysqlbinlog --start-position 219 --stop-position 321 	mylog.000002 | mysql -uroot -p'qf123'	//恢复,即执行binlog日志里该部分的语句
[root@mysql-server ~]# mysql -uroot -p'cheng@123'
mysql> use testdb
mysql> show tables;
+------------------+
| Tables_in_testdb |
+------------------+
| t1               |
| t3               |
+------------------+
2 rows in set (0.00 sec)

你可能感兴趣的:(MySQL数据库,笔记,数据库,mysql,linux,centos)