MySQL数据的备份还原及数据修复


在日常的生产环境中为什么要进行备份

  备份可以使生产中的数据进行有效的灾难恢复:硬件故障、软件故障、自然灾害、误操作测试等数据丢失场景。

创新互联建站从2013年开始,先为金州等服务建站,金州等地企业,进行企业商务咨询服务。为金州企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。

备份注意要点

  1. 能容忍最多丢失多少数据
  2. 恢复数据需要在多长时间内完成
  3. 需要恢复哪些数据

还原要点

  1. 做还原测试,用于测试备份的可用性
  2. 还原演练

备份类型

完全备份、不分备份

  1. 完全备份:整个数据集
  2. 部分备份:只备份数据子集,如部分库或表

增量备份、差异备份

  1. 增量备份:仅备份最近一次完全备份或增量备份(如果存在增量)以来变化的数据,备份较快,还原复杂
  2. 差异备份:仅备份最近一次完全备份以来变化的数据,备份较慢,还原简单

冷、温、热备份

  1. 冷备:读写操作均不可进行
  2. 温备:读操作可执行;但写操作不可执行
  3. 热备:读写操作均可执行
    MyISAM:温备,不支持热备
    InnoDB:都支持

物理和逻辑备份

  1. 物理备份:直接复制数据文件进行备份,与存储引擎有关,占用较多的空间,速度快
  2. 逻辑备份:从数据库中“导出”数据另存而进行的备份,与存储引擎无关,占用空间少,速度慢,可能丢失精度

备份时需要考虑的因素

  1. 温备的持锁多久
  2. 备份产生的负载
  3. 备份过程的时长
  4. 恢复过程的时长

备份什么

  1. 数据
  2. 二进制日志、InnoDB的事务日志
  3. 程序代码(存储过程、函数、触发器、事件调度器)
  4. 服务器的配置文件

备份工具

  1. cp, tar等复制归档工具:物理备份工具,适用所有存储引擎;只支持冷备;完全和部分备份
  2. LVM的快照:先加锁,做快照后解锁,几乎热备;借助文件系统工具进行备份
  3. MySQLdump:逻辑备份工具,适用所有存储引擎,温备;支持完全或部分备份;对InnoDB存储引擎支持热备,结合binlog的增量备份
  4. xtrabackup:由Percona提供支持对InnoDB做热备(物理备份)的工具,支持完全备份、增量备份
  5. MariaDB Backup: 从MariaDB 10.1.26开始集成,基于Percona
    XtraBackup 2.3.8实现
  6. mysqlbackup:热备份, MySQL Enterprise Edition组件
  7. mysqlhotcopy:PERL 语言实现,几乎冷备,仅适用于MyISAM存储引擎,使用LOCK TABLES、 FLUSH TABLES和cp或scp来快速备份数据库

实验操作部分

物理备份:借助cp、tar执行冷备份(适用于可以停止数据库服务的业务)

1、停止服务器上的数据库服务进程

[root@CentOS7 ~]#service mysqld stop
Stopping mysqld (via systemctl):                           [  OK  ]

2、考虑到空间资源问题,将备份的数据文件进行打包压缩

[root@CentOS7 data]#tar -zcvf mysql.tar.gz mysql/*
mysql/aria_log.00000001
mysql/aria_log_control
mysql/hello/
mysql/hello/db.opt
mysql/hello/classes.frm
mysql/hello/classes.ibd
mysql/hello/coc.frm
mysql/hello/coc.ibd
mysql/hello/courses.frm
mysql/hello/courses.ibd
mysql/hello/scores.frm
....

3、备份二进制文件至备份主机

[root@CentOS7 data]#mkdir /data/bin
[root@CentOS7 data]#chown -R mysql.mysql /data/bin/
scp -p 可以保留文件的所属权限
[root@CentOS7 data]#scp -p /data/bin/* 192.168.36.6:/data/bin/

4、将备份的数据压缩文件scp至备份主机上

[root@CentOS7 data]#scp -p /data/mysql.tar.gz 192.168.36.6:/data/

5、备份配置文件

[root@CentOS7 data]#scp -p /etc/my.cnf 192.168.36.6:/etc/

6、启动服务

[root@CentOS7 data]#service mysqld start
Starting mysqld (via systemctl):                           [  OK  ]

7、停止服务,删除数据

[root@CentOS7 data]#service mysqld stop
Stopping mysqld (via systemctl):                           [  OK  ]
[root@CentOS7 data]#rm -rf /data/mysql/*

8、解压备份的数据文件到/data/mysql目录中

[root@CentOS7 data]#gzip -d mysql.tar.gz
[root@CentOS7 data]#tar -xvf mysql.tar -C ./

9、启动服务测试,并进行数据检查

[root@CentOS7 data]#service mysqld start
Starting mysqld (via systemctl):                           [  OK  ]

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| hello              |
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+
5 rows in set (0.01 sec)

MariaDB [(none)]> use hello;
Database changed
MariaDB [hello]> show tables;
+-----------------+
| Tables_in_hello |
+-----------------+
| classes         |
| coc             |
| courses         |
| scores          |
| students        |
| teachers        |
| toc             |
+-----------------+
7 rows in set (0.00 sec)

MariaDB [hello]> select *from students;
+-------+---------------+-----+--------+---------+-----------+
| StuID | Name          | Age | Gender | ClassID | TeacherID |
+-------+---------------+-----+--------+---------+-----------+
|     1 | Shi Zhongyu   |  22 | M      |       2 |         3 |
|     2 | Shi Potian    |  22 | M      |       1 |         7 |
|     3 | Xie Yanke     |  53 | M      |       2 |        16 |
|     4 | Ding Dian     |  32 | M      |       4 |         4 |
|     5 | Yu Yutong     |  26 | M      |       3 |         1 |
|     6 | Shi Qing      |  46 | M      |       5 |      NULL |
|     7 | Xi Ren        |  19 | F      |       3 |      NULL |
|     8 | Lin Daiyu     |  17 | F      |       7 |      NULL |
|     9 | Ren Yingying  |  20 | F      |       6 |      NULL |
|    10 | Yue Lingshan  |  19 | F      |       3 |      NULL |
|    11 | Yuan Chengzhi |  23 | M      |       6 |      NULL |
|    12 | Wen Qingqing  |  19 | F      |       1 |      NULL |
|    13 | Tian Boguang  |  33 | M      |       2 |      NULL |
|    14 | Lu Wushuang   |  17 | F      |       3 |      NULL |
|    15 | Duan Yu       |  19 | M      |       4 |      NULL |
|    16 | Xu Zhu        |  21 | M      |       1 |      NULL |
|    17 | Lin Chong     |  25 | M      |       4 |      NULL |
|    18 | Hua Rong      |  23 | M      |       7 |      NULL |
|    19 | Xue Baochai   |  18 | F      |       6 |      NULL |
|    20 | Diao Chan     |  19 | F      |       7 |      NULL |
|    21 | Huang Yueying |  22 | F      |       6 |      NULL |
|    22 | Xiao Qiao     |  20 | F      |       1 |      NULL |
|    23 | Ma Chao       |  23 | M      |       4 |      NULL |
|    24 | Xu Xian       |  27 | M      |    NULL |      NULL |
|    25 | Sun Dasheng   | 100 | M      |    NULL |      NULL |
+-------+---------------+-----+--------+---------+-----------+
25 rows in set (0.00 sec)

基于LVM的备份

1、请求锁定所有表

mysql> FLUSH TABLES WITH READ LOCK;

2、记录二进制日志文件及事件位置

mysql> FLUSH LOGS;
mysql> SHOW MASTER STATUS;
mysql -e 'SHOW MASTER STATUS' > /PATH/TO/SOMEFILE

3、创建快照

lvcreate -L # -s -p r -n NAME /DEV/VG_NAME/LV_NAME

4.、释放锁

mysql> UNLOCK TABLES;
  1. 挂载快照卷,执行数据备份
  2. 备份完成后,删除快照卷
  3. 制定好策略,通过原卷备份二进制日志
    注意:此实验前提是数据文件处于LVM逻辑卷中

基于mysqldump工具进行备份

mysqldump常见选项

  -A, --all-databases 备份所有数据库,含create database
 -B , --databases db_name… 指定备份的数据库,包括create database语句
 -E, --events:备份相关的所有event scheduler
 -R, --routines:备份所有存储过程和自定义函数
 --triggers:备份表相关触发器,默认启用,用--skip-triggers,不备份触发器
 --default-character-set=utf8 指定字符集
 --master-data[=#]: 此选项须启用二进制日志
    1:所备份的数据之前加一条记录为CHANGE MASTER TO语句,非注释,不指定#,默认为1
    2:记录为注释的CHANGE MASTER TO语句此选项会自动关闭--lock-tables功能,自动打开-x | --lock-all-tables功能(除非开启--single-transaction)
 -F, --flush-logs :备份前滚动日志,锁定表完成后,执行flush logs命令,生成新的二进制日志文件,配合-A 或 -B 选项时,会导致刷新多次数据库。 建议在同一时刻执行转储和日志刷新,可通过和--single-transaction或-x,--master-data 一起使用实现,此时只刷新一次日志
 --compact 去掉注释,适合调试,生产不使用
 -d, --no-data 只备份表结构
 -t, --no-create-info 只备份数据,不备份create table
 -n,--no-create-db 不备份create database,可被-A或-B覆盖
 --flush-privileges 备份mysql或相关时需要使用
 -f, --force 忽略SQL错误,继续执行
 --hex-blob 使用十六进制符号转储二进制列,当有包括BINARY,VARBINARY,BLOB,BIT的数据类型的列时使用,避免乱码
 -q, --quick 不缓存查询,直接输出,加快备份速度

mysqldump实验部分

单个数据库的备份

1、利用mysqldump生成备份文件

[root@CentOS7 data]#mysqldump hello >/data/backup/hello.sql

2、实现删库跑路的功能

[root@CentOS7 data]#mysql -e 'drop database hello'

3、创建一个数据库,实现数据恢复

[root@CentOS7 data]#mysql -e 'create database hello'
[root@CentOS7 data]#mysql hello 

4、数据检查

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| hello              |
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+
5 rows in set (0.00 sec)

MariaDB [(none)]> use hello;
Database changed
MariaDB [hello]> show tables;
+-----------------+
| Tables_in_hello |
+-----------------+
| classes         |
| coc             |
| courses         |
| scores          |
| students        |
| teachers        |
| toc             |
+-----------------+
7 rows in set (0.00 sec)
注:mysqldump hello命令可以罗列出数据库hello的数据表的结构以及字符集等数据,利用这些数据可完成数据的备份与恢复,缺陷是没有创建数据库的功能,还需要手动创建数据库名称。所以并不能确保创建的数据库名称与之前数据库名称的一致性
解决上述缺陷的办法:使用 -B 参数(-B等价于--databases),可以备份出数据库的定义,推荐使用
[root@CentOS7 data]#mysqldump -B hello >/data/backup/hello_bak.sql
[root@CentOS7 data]#grep '^CREATE DATABASE' /data/backup/hello_bak.sql
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `hello` /*!40100 DEFAULT CHARACTER SET latin1 */;
数据库中表的备份

利用mysqldump可以实现数据库中指定表的备份功能
1、备份hello库中students表的数据

[root@CentOS7 data]#mysqldump hello students >/data/backup/students.sql

查看备份数据
[root@CentOS7 data]#cat /data/backup/students.sql
-- MySQL dump 10.16  Distrib 10.2.23-MariaDB, for Linux (x86_64)
--
-- Host: localhost    Database: hello
-- ------------------------------------------------------
-- Server version   10.2.23-MariaDB-log

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

--
-- Table structure for table `students`
--

DROP TABLE IF EXISTS `students`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `students` (
  `StuID` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `Name` varchar(50) NOT NULL,
  `Age` tinyint(3) unsigned NOT NULL,
  `Gender` enum('F','M') NOT NULL,
  `ClassID` tinyint(3) unsigned DEFAULT NULL,
  `TeacherID` int(10) unsigned DEFAULT NULL,
  PRIMARY KEY (`StuID`)
) ENGINE=InnoDB AUTO_INCREMENT=26 DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `students`
--

LOCK TABLES `students` WRITE;
/*!40000 ALTER TABLE `students` DISABLE KEYS */;
INSERT INTO `students` VALUES (1,'Shi Zhongyu',22,'M',2,3),(2,'Shi Potian',22,'M',1,7),(3,'Xie Yanke',53,'M',2,16),(4,'Ding Dian',32,'M',4,4),(5,'Yu Yutong',26,'M',3,1),(6,'Shi Qing',46,'M',5,NULL),(7,'Xi Ren',19,'F',3,NULL),(8,'Lin Daiyu',17,'F',7,NULL),(9,'Ren Yingying',20,'F',6,NULL),(10,'Yue Lingshan',19,'F',3,NULL),(11,'Yuan Chengzhi',23,'M',6,NULL),(12,'Wen Qingqing',19,'F',1,NULL),(13,'Tian Boguang',33,'M',2,NULL),(14,'Lu Wushuang',17,'F',3,NULL),(15,'Duan Yu',19,'M',4,NULL),(16,'Xu Zhu',21,'M',1,NULL),(17,'Lin Chong',25,'M',4,NULL),(18,'Hua Rong',23,'M',7,NULL),(19,'Xue Baochai',18,'F',6,NULL),(20,'Diao Chan',19,'F',7,NULL),(21,'Huang Yueying',22,'F',6,NULL),(22,'Xiao Qiao',20,'F',1,NULL),(23,'Ma Chao',23,'M',4,NULL),(24,'Xu Xian',27,'M',NULL,NULL),(25,'Sun Dasheng',100,'M',NULL,NULL);
/*!40000 ALTER TABLE `students` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

-- Dump completed on 2019-05-06 15:22:32

2、删除数据库中的students表

[root@CentOS7 data]#mysql -e 'drop tables hello.students'

3、数据恢复

MariaDB [hello]> show tables;
+-----------------+
| Tables_in_hello |
+-----------------+
| classes         |
| coc             |
| courses         |
| scores          |
| teachers        |
| toc             |
+-----------------+
6 rows in set (0.00 sec)

MariaDB [hello]> source /data/backup/students.sql
Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)
....

MariaDB [hello]> show tables;
+-----------------+
| Tables_in_hello |
+-----------------+
| classes         |
| coc             |
| courses         |
| scores          |
| students        |
| teachers        |
| toc             |
+-----------------+
7 rows in set (0.00 sec)
备份数据库中所有数据

1、利用mysqldump -A功能进行备份数据库所有数据

[root@CentOS7 data]#grep '^CREATE DATABASE' /data/backup/all.sql
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `hello` /*!40100 DEFAULT CHARACTER SET latin1 */;
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mysql` /*!40100 DEFAULT CHARACTER SET latin1 */;
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `test` /*!40100 DEFAULT CHARACTE

2、清空数据库数据

[root@CentOS7 data]#rm -rf /data/mysql/*

3、重启服务,还原数据

[root@CentOS7 data]#service mysqld restart
Restarting mysqld (via systemctl):                         [  OK  ]

[root@CentOS7 data]#mysql < /data/backup/all.sql

[root@CentOS7 data]#ll /data/mysql/
total 110620
-rw-rw---- 1 mysql mysql    16384 May  6 15:41 aria_log.00000001
-rw-rw---- 1 mysql mysql       52 May  6 15:41 aria_log_control
drwx------ 2 mysql mysql      272 May  6 15:41 hello
-rw-rw---- 1 mysql mysql      860 May  6 15:41 ib_buffer_pool
-rw-rw---- 1 mysql mysql 12582912 May  6 15:41 ibdata1
-rw-rw---- 1 mysql mysql 50331648 May  6 15:41 ib_logfile0
-rw-rw---- 1 mysql mysql 50331648 May  6 15:41 ib_logfile1
drwx------ 2 mysql mysql     4096 May  6 15:41 mysql
drwx------ 2 mysql mysql       20 May  6 15:41 test

关于mysqldump的扩展

MyISAM备份选项:

  支持温备;不支持热备,所以必须先锁定要备份的库,而后启动备份操作
 锁定方法如下:
   -x,--lock-all-tables:加全局读锁,锁定所有库的所有表,同时加--singletransaction或--lock-tables选项会关闭此选项功能
   注意:数据量大时,可能会导致长时间无法并发访问数据库
   -l,--lock-tables:对于需要备份的每个数据库,在启动备份之前分别锁定其所有表,默认为on,--skip-lock-tables选项可禁用,对备份MyISAM的多个库,可能
会造成数据不一致
 注:以上选项对InnoDB表一样生效,实现温备,但不推荐使用

InnoDB备份选项:

  支持热备,可用温备但不建议用
 --single-transaction
   此选项Innodb中推荐使用,不适用MyISAM,此选项会开始备份前,先执行START TRANSACTION指令开启事务
   此选项通过在单个事务中转储所有表来创建一致的快照。 仅适用于存储在支持多版本控制的存储引擎中的表(目前只有InnoDB可以); 转储不保证与其他存储引擎保持一致。 在进行单事务转储时,要确保有效的转储文件(正确的表内容和二进制日志位置),没有其他连接应该使用以下语句:ALTER TABLE,DROP TABLE,RENAME TABLE,TRUNCATE TABLE
   此选项和--lock-tables(此选项隐含提交挂起的事务)选项是相互排斥
   备份大型表时,建议将--single-transaction选项和--quick结合一起使用

InnoDB建议备份策略
mysqldump –uroot –A –F –E –R --single-transaction --master-data=1 --flush-privileges --triggers --default-character-set=utf8 --hex-blob > $BACKUP/fullbak_$BACKUP_TIME.sql
MyISAM建议备份策略
mysqldump –uroot –A –F –E –R –x --master-data=1 --flush-privileges --triggers --default-character-set=utf8 --hex-blob > $BACKUP/fullbak_$BACKUP_TIME.sql
由于某公司指定时间进行数据的备份,然而备份完数据发生了修改,此时出现故障导致数据丢失,请尝试恢复至最近数据

1、备份数据并压缩

[root@CentOS7 data]# mysqldump -A --single-transaction --master-data=2 | xz > /data/all.sql.xz

[root@CentOS7 data]#ll /data/all.sql.xz
-rw-r--r-- 1 root root 105104 May  6 16:42 /data/all.sql.xz

2、添加数据

MariaDB [hello]> insert students(name,age)values('Darius',23);
Query OK, 1 row affected (0.03 sec)

MariaDB [hello]> select *from students;
+-------+---------------+-----+--------+---------+-----------+
| StuID | Name          | Age | Gender | ClassID | TeacherID |
+-------+---------------+-----+--------+---------+-----------+
|     1 | Shi Zhongyu   |  22 | M      |       2 |         3 |
|     2 | Shi Potian    |  22 | M      |       1 |         7 |
....
|    26 | Darius        |  23 | F      |    NULL |      NULL |
+-------+---------------+-----+--------+---------+-----------+
26 rows in set (0.00 sec)

3、 删库

[root@CentOS7 data]#rm -rf mysql/*

[root@CentOS7 data]#ll mysql/
total 0

4、重启服务

[root@CentOS7 data]#service mysqld restart

5、因无需二进制日志改变,所以临时关闭二进制日志

MariaDB [(none)]> set sql_log_bin=off;
Query OK, 0 rows affected (0.00 sec)

6、恢复数据库,先恢复完全备份

解压
[root@CentOS7 data]#xz -d all.sql.xz
恢复完全备份数据
[root@CentOS7 data]#mysql  show databases;
+--------------------+
| Database           |
+--------------------+
| hello              |
| information_schema |
| mysql              |
| test               |
+--------------------+
4 rows in set (0.00 sec)

MariaDB [(none)]> use hello
Database changed
MariaDB [hello]> show tables;
+-----------------+
| Tables_in_hello |
+-----------------+
| classes         |
| coc             |
| courses         |
| scores          |
| students        |
| teachers        |
| toc             |
+-----------------+
7 rows in set (0.00 sec)

>> 此时备份之后的数据还没有进行恢复

7、查看完全备份时二进制文件的位置

[root@CentOS7 data]#vim all.sql
....
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000005', MASTER_LOG_POS=4882960;
....

8、查看完全备份时二进制日志的位置,从此位置后的日志导出到inc.sql

[root@CentOS7 data]# mysqlbinlog --start-position=4882960 /data/bin/mysql-bin.000005 > /data/inc.sql

9、导入数据

MariaDB [mysql]> source /data/inc.sql;

开启二进制日志
MariaDB [(none)]> set sql_log_bin=on;
Query OK, 0 rows affected (0.00 sec)

10、成功恢复数据

MariaDB [hello]> select *from students;
+-------+---------------+-----+--------+---------+-----------+
| StuID | Name          | Age | Gender | ClassID | TeacherID |
+-------+---------------+-----+--------+---------+-----------+
|     1 | Shi Zhongyu   |  22 | M      |       2 |         3 |
|     2 | Shi Potian    |  22 | M      |       1 |         7 |
....
|    26 | Darius        |  23 | F      |    NULL |      NULL |
+-------+---------------+-----+--------+---------+-----------+
26 rows in set (0.00 sec)

基于 xtrabackup 工具完全备份及还原

简介

  percona提供的mysql数据库备份工具,惟一开源的能够对innodb和xtradb数据库进行热备的工具

特点

  1. 备份还原过程快速、可靠
  2. 备份过程不会打断正在执行的事务
  3. 能够基于压缩等功能节约磁盘空间和流量
  4. 自动实现备份检验
  5. 开源,免费

关于xtrabackup

  xtrabackup 是用来备份 InnoDB 表的,不能备份非 InnoDB 表,和 MySQL Server 没有交互

  innobackupex 脚本用来备份非 InnoDB 表,同时会调用 xtrabackup 命令来备份 InnoDB 表,还会和 MySQL Server 发送命令进行交互,如加全局读锁(FTWRL)、获取位点(SHOW SLAVE STATUS)等。即innobackupex是在xtrabackup 之上做了一层封装实现的

xtrabackup备份过程

MySQL数据的备份还原及数据修复

xtrabackup的新版变化

xtrabackup版本升级到2.4后,相比之前的2.1有了比较大的变化:innobackupex 功能全部集成到 xtrabackup 里面,只有一个 binary程序,另外为了兼容考虑,innobackupex作为 xtrabackup 的软链接,即xtrabackup现在支持非Innodb表备份,并且 Innobackupex 在下一版本中移除,建议通过xtrabackup替换innobackupex

xtrabackup安装

xtrabackup工具在EPEL中,需要通过EPEL源进行下载
[root@CentOS7 ~]#yum install percona-xtrabackup

通过官网下载最新版本
https://www.percona.com/downloads/XtraBackup/LATEST/
贴心的人儿,给各位奉上阿里云的EPEL源
[epel]
name=epel
baseurl=http://mirrors.aliyun.com/epel/7/x86_64
gpgcheck=0

xtrabackup用法

   备份:innobackupex [option] BACKUP-ROOT-DIR
  选项说明:https://www.percona.com/doc/percona-xtrabackup/LATEST/genindex.html
     --user:该选项表示备份账号
     --password:该选项表示备份的密码
     --host:该选项表示备份数据库的地址
     --databases:该选项接受的参数为数据库名,如果要指定多个数据库,彼此间需要以空格隔开;如:"xtra_test dba_test",同时,在指定某数据库时,也可以只指定其中的某张表。如:"mydatabase.mytable"。该选项对innodb引擎表无效,还是会备份所有innodb表
     --defaults-file:该选项指定从哪个文件读取MySQL配置,必须放在命令行第一个选项位置
     --incremental:该选项表示创建一个增量备份,需要指定--incremental-basedir
     --incremental-basedir:该选项指定为前一次全备份或增量备份的目录,与--incremental同时使用
     --incremental-dir:该选项表示还原时增量备份的目录
     --include=name:指定表名,格式:databasename.tablename
  Prepare:innobackupex --apply-log [option] BACKUP-DIR
  选项说明:
  --apply-log:一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备
份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。因此,此时数据文件仍处理不一致状态。此选项作用是通过回滚未提交的事务及同步已经提交的事务至数据文件使数据文件处于一致性状态
  --use-memory:和--apply-log选项一起使用,当prepare 备份时,做crash recovery分配的内存大小,单位字节,也可1MB,1M,1G,1GB等,推荐1G
  --export:表示开启可导出单独的表之后再导入其他Mysql中
  --redo-only:此选项在prepare base full backup,往其中合并增量备份时候使用,但不包括对最后一个增量备份的合并
  还原:innobackupex --copy-back [选项] BACKUP-DIR
  innobackupex --move-back [选项] [--defaults-group=GROUP-NAME] BACKUP-DIR
  选项说明:
  --copy-back:做数据恢复时将备份数据文件拷贝到MySQL服务器的datadir
  --move-back:这个选项与--copy-back相似,唯一的区别是它不拷贝文件,而是移动文件到目的地。这个选项移除backup文件,用时候必须小心。使用场景:没有足够的磁盘空间同事保留数据文件和Backup副本
  还原注意事项:
     1.datadir 目录必须为空。除非指定innobackupex --force-non-emptydirectorires选项指定,否则--copy-backup选项不会覆盖
     2.在restore之前,必须shutdown MySQL实例,不能将一个运行中的实例restore到datadir目录中
     3.由于文件属性会被保留,大部分情况下需要在启动实例之前将文件的属主改为mysql,这些文件将属于创建备份的用户
        chown -R mysql:mysql /data/mysql
        以上需要在用户调用innobackupex之前完成
        --force-non-empty-directories:指定该参数时候,使得innobackupex --copy-back或--move-back选项转移文件到非空目录,已存在的文件不会被覆盖。如果--copy-back和--move-back文件需要从备份目录拷贝一个在datadir已经存在的文件,会报错失败

备份生成的相关文件

使用innobackupex备份时,其会调用xtrabackup备份所有的InnoDB表,复制所有关于表结构定义的相关文件(.frm)、以及MyISAM、 MERGE、 CSV和ARCHIVE表的相关文件,同时还会备份触发器和数据库配置信息相关的文件。这些文件会被保存至一个以时间命名的目录中,在备份时,innobackupex还会在备份目录中创建如下文件:
  (1)xtrabackup_info:innobackupex工具执行时的相关信息,包括版本,备份选项,备份时长,备份LSN(log sequence number日志序列号),BINLOG的位置
  (2)xtrabackup_checkpoints:备份类型(如完全或增量)、备份状态(如是否已经为prepared状态)和LSN范围信息,每个InnoDB页(通常为16k大小)都会包含一个日志序列号LSN。 LSN是整个数据库系统的系统版本号,每个页面相关的LSN能够表明此页面最近是如何发生改变的
  (3)xtrabackup_binlog_info:MySQL服务器当前正在使用的二进制日志文件及至备份这一刻为止二进制日志事件的位置,可利用实现基于binlog的恢复
  (4)backup-my.cnf:备份命令用到的配置选项信息
  (5)xtrabackup_logfile:备份生成的日志文件

使用旧版本 xtrabackup 工具进行备份及还原

1、在原主机

innobackupex --user=root /backup
scp -r /backup/2018-02-23_11-55-57/ 目标主机:/data/

2、在目标主机

innobackupex --apply-log /data/2019-05-06_20-34-35/

systemctl stop mariadb

rm -rf /var/lib/mysql/*

innobackupex --copy-back /data/2019-05-06_20-34-35/

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

systemctl start mariadb

使用新版本 xtrabackup 工具进行备份及还原

1、在原主机做完全备份到/backups

xtrabackup --backup --target-dir=/backup/
scp -r /backup/* 目标主机:/backup

2、在目标主机上

  1)预准备:确保数据一致,提交完成的事务,回滚未完成的事务

xtrabackup --prepare --target-dir=/backup/

  2)复制到数据库目录
    注意:数据库目录必须为空,MySQL服务不能启动

xtrabackup --copy-back --target-dir=/backup/

  3)还原属性

chown -R mysql:mysql /var/lib/mysql

  4)启动服务

systemctl start mariadb

旧版xtrabackup完全,增量备份及还原

  1、在原主机

innobackupex /backup

mkdir /backup/inc{1,2}

  修改数据库内容

innobackupex --incremental /backup/inc1 --incrementalbasedir=/backups/2019-05-06_20-34-35(完全备份生成的路径)

  再次修改数据库内容

innobackupex --incremental /backup/inc2 --incrementalbasedir=/backup/inc1/2019-05-06_20-34-35 (上次增量备份生成的路径)

scp -r /backup/* 目标主机:/data/

  2、在目标主机

不启动mariadb

rm -rf /var/lib/mysql/*

innobackupex --apply-log --redo-only /data/2019-05-06_20-34-35/

innobackupex --apply-log --redo-only /data/2019-05-06_20-34-35/ --incremental-dir=/data/inc1/2018-02-23_14-26-17

innobackupex --apply-log /data/2019-05-06_20-34-35/ --incrementaldir=/data/inc2/2018-02-23_14-28-29/

innobackupex --copy-back /data/2019-05-06_20-34-35/

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

systemctl start mariadb

新版xtrabackup完全,增量备份及还原

  1. 备份过程

  1)完全备份:

xtrabackup --backup --target-dir=/backup/base

  2)第一次修改数据
 3)第一次增量备份

xtrabackup --backup --target-dir=/backup/inc1 --incrementalbasedir=/backup/base

  4)第二次修改数据
 5)第二次增量

xtrabackup --backup --target-dir=/backup/inc2 --incrementalbasedir=/backup/inc1

  6)scp到目标主机

scp -r /backup/* 目标主机:/backup/

  备份过程生成三个备份目录

/backup/{base,inc1,inc2}

  2. 还原过程

  1)预准备完成备份,此选项--apply-log-only 阻止回滚未完成的事务

xtrabackup --prepare --apply-log-only --target-dir=/backup/base

  2)合并第1次增量备份到完全备份

xtrabackup --prepare --apply-log-only --target-dir=/backup/base --incremental-dir=/backup/inc1

  3)合并第2次增量备份到完全备份:最后一次还原不需要加选项--apply-log-only

xtrabackup --prepare --target-dir=/backup/base --incremental-dir=/backup/inc2

  4)复制到数据库目录,注意数据库目录必须为空,MySQL服务不能启动

xtrabackup --copy-back --target-dir=/backup/base

  5)还原属性

chown -R mysql:mysql /var/lib/mysql

  6)启动服务

systemctl start mariadb

xtrabackup 单表导入导出

1、单表备份

innobackupex --include='hellodb.students' /backups

2、备份表结构

mysql -e 'show create table hellodb.students' > student.sql

3、删除表

mysql -e 'drop table hellodb.students'

4、

innobackupex --apply-log --export /backups/2019-05-06_20-34-35/

5、创建表

mysql>CREATE TABLE `students` (

`StuID` int(10) unsigned NOT NULL AUTO_INCREMENT,

`Name` varchar(50) NOT NULL,

`Age` tinyint(3) unsigned NOT NULL,

`Gender` enum('F','M') NOT NULL,

`ClassID` tinyint(3) unsigned DEFAULT NULL,

`TeacherID` int(10) unsigned DEFAULT NULL,
PRIMARY KEY (`StuID`)
) ENGINE=InnoDB AUTO_INCREMENT=26 DEFAULT CHARSET=utf8

6、删除表空间

alter table students discard tablespace;

7、复制

cp /backups/2019-05-06_20-34-35/hellodb/students.{cfg,exp,ibd} /var/lib/mysql/hellodb/

8、添加属组权限

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

9 、

mysql>alter table students import tablespace;

本文名称:MySQL数据的备份还原及数据修复
网页URL:http://scjbc.cn/article/gshogg.html