Mysql的备份(下)

本文涉及的产品
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介: Mysql的备份(下)

三、Xtrabackup工具


(1)Xtrabackup概述


Xtrabackup是由percona公司开发、用于Mysql数据库物理备份的备份工具,支持Mysql、oracle、percona Server、mariaDB数据库,是一个开源的数据库备份工具


使用Xtrabackup需要安装percona-toolkit-2.2.19-1.noarch.rpm和percona-xtrabackup-2.4.5-Linux-x86_64.tar.gz


在Xtrabackup软件包安装完成后,在bin目录下,一共有六个文件:


[root@rzy ~]# cd /usr/src/percona-xtrabackup-2.4.5-Linux-x86_64/
[root@rzy percona-xtrabackup-2.4.5-Linux-x86_64]# ll
总用量 4
drwxr-xr-x  2 root root  111 11月 25 2016 bin
drwxr-xr-x  3 root root   18 11月 25 2016 man
drwxr-xr-x 14 root root 4096 11月 25 2016 percona-xtrabackup-2.4-test
[root@rzy percona-xtrabackup-2.4.5-Linux-x86_64]# cd bin/
[root@rzy bin]# ll
总用量 225988
lrwxrwxrwx 1 root root        10 11月 25 2016 innobackupex -> xtrabackup
-rwxr-xr-x 1 root root   5179300 11月 25 2016 xbcloud
-rwxr-xr-x 1 root root      3020 11月 25 2016 xbcloud_osenv
-rwxr-xr-x 1 root root   5001985 11月 25 2016 xbcrypt  #加解密使用
-rwxr-xr-x 1 root root   5071619 11月 25 2016 xbstream #类似于tar
-rwxr-xr-x 1 root root 216142648 11月 25 2016 xtrabackup  

其中最主要的是innobackupex和Xtrabackup,innobackupex是一个perl脚本,Xtrabackup是C\C++编译的二进制


Xtrabackup是用来备份innoDB引擎的表的,不能备份非innoDB引擎的表,和mysqld server没有交互


可以看到innobackupex与Xtrabackup做了软连接,innobackupex脚本用来备份非innoDB引擎的表,但是可以调用Xtrabackup命令来备份innoDB引擎的表,还会发送命令与mysqld server进行交互,比如加读锁、获取位点等,简单的来说,innobackupex在Xtrabackup上做了一层封装,使之既能备份非innoDB表也可以调用Xtrabackup备份innoDB表


mysql的系统表使用的是MyISAM存储引擎,当我们备份系统表时一般都是通过innobackupex命令进行备份


(2)备份原理


  • Xtrabackup和innobackupex两个工具之间的交互和协调是通过文件的创建、删除来实现的,主要的文件有:


  1. Xtrabackup_suspended_1
  2. Xtrabackup_suspended_2
  3. Xtrabackup_log_copied


  • 交互的过程:


  1. innobackupex在启动Xtrabackup进程后,会一直等待Xtrabackup备份完innoDB文件。


  1. (而innobackupex如何知道Xtrabackup有没有备份完呢,其实在Xtrabackup备份完后会创建名叫Xtrabackup_suspended_2的文件,当innobackupex检测到这个文件被创建出来之后,就知道Xtrabackup已经备份完innoDB文件了)


  1. 在Xtrabackup备份完innoDB文件后,创建除了Xtrabackup_suspended_2文件,它会等待innobackupex把这个文件删除,才会继续往下执行操作


  1. innobackupex在检测到Xtrabackup_suspended_2被创建出来后就会继续往下执行操作


  1. innobackupex在备份完非innoDB表后,会删除Xtrabackup_suspended_2文件,接着等待Xtrabackup_log_copied创建


  1. Xtrabackup检测到Xtrabackup_suspended_2文件被删除后,会继续往下执行操作


(3)备份过程


(4)安装Xtrabackup


-实验环境


系统 主机名 mysql版本 使用的软件包
centos7.4 rzy Mysql-5.7.12 percona-toolkit-2.2.19-1.noarch.rpm percona-xtrabackup-2.4.5-Linux-x86_64.tar.gz


-实验步骤

[root@rzy ~]# ll #上传两个软件包
总用量 225988
-rw-------. 1 root root     1264 1?. 12 18:27 anaconda-ks.cfg
-rw-r--r--  1 root root 70389425 5?. 11 14:35 boost_1_59_0.tar.bz2
-rw-r--r--  1 root root 50571897 5?. 11 14:30 mysql-5.7.12.tar.gz
-rw-r--r--  1 root root  1736921 5?. 22 17:21 percona-toolkit-2.2.19-1.noarch.rpm
-rw-r--r--  1 root root 82404945 5?. 22 17:21 percona-xtrabackup-2.4.5-Linux-x86_64.tar.gz
[root@rzy ~]# tar xf percona-xtrabackup-2.4.5-Linux-x86_64.tar.gz -C /usr/src/
[root@rzy ~]# cd /usr/src/percona-xtrabackup-2.4.5-Linux-x86_64/
[root@rzy percona-xtrabackup-2.4.5-Linux-x86_64]# cp bin/* /usr/bin/ #优化命令执行路径,和修改环境变量是一样的
[root@rzy percona-xtrabackup-2.4.5-Linux-x86_64]# cd 
[root@rzy ~]# mount /dev/cdrom /mnt/
mount: /dev/sr0 写保护,将以只读方式挂载
mount: /dev/sr0 已经挂载或 /mnt 忙
       /dev/sr0 已经挂载到 /mnt 上
[root@rzy ~]# yum -y install perl-DBI perl-DBD-MySQL perl-Time-HiRes perl-IO-Socket-SSL perl-TermReadKey.x86_64 perl-Digest-MD5 #安装依赖包
。。。。。。
完毕!
[root@rzy ~]# rpm -ivh percona-toolkit-2.2.19-1.noarch.rpm  #安装rpm包

使用Xtrabackup工具


  • 常用选项:



选项 作用
–host 指定主机
–user 指定用户名
–password 指定密码
–port 指定端口
–databases 指定数据库
–incremental 创建增量备份
–incremental-basedir 指定包含完全备份的目录
–incremental-dir 指定包含增量备份的目录
–apply-log 对备份进行预处理操作
–redo-only 不回滚未提交事务
–copy-back 恢复备份目录


一般情况下,在备份完成后,数据是不能立即用于恢复操作的,因为备份的数据可能会包含尚未提交的事务或已经提交但是没有同步至数据文件的事务,这导致了数据文件的数据不一致,而apply-log选项的作用正是通过回滚未提交的事务以及同步已经提交的事务至数据文件的方法,使得数据文件的数据重新保证了一致性


-完全备份

[root@rzy bin]# innobackupex --user=root --password=123123 /beifen/ #直接完全备份至/beifen目录
。。。。。。
210522 17:51:48 completed OK! #ok表示备份成功
[root@rzy bin]# ll /beifen/
总用量 0
drwxr-x--- 5 root root 193 5月  22 17:51 2021-05-22_17-51-45
[root@rzy bin]# ll /beifen/2021-05-22_17-51-45/ #从备份的目录可以看出,是物理备份
总用量 12336 
-rw-r----- 1 root root      425 5月  22 17:51 backup-my.cnf #备份使用到的配置选项信息文件
-rw-r----- 1 root root      352 5月  22 17:51 ib_buffer_pool
-rw-r----- 1 root root 12582912 5月  22 17:51 ibdata1
drwxr-x--- 2 root root     4096 5月  22 17:51 mysql
drwxr-x--- 2 root root     8192 5月  22 17:51 performance_schema
drwxr-x--- 2 root root     8192 5月  22 17:51 sys
-rw-r----- 1 root root      113 5月  22 17:51 xtrabackup_checkpoints #备份的类型、状态和LSN状态信息文件
-rw-r----- 1 root root      417 5月  22 17:51 xtrabackup_info #mysql服务器当前正在使用的二进制日志文件和此时二进制日志时间的位置信息文件
-rw-r----- 1 root root     2560 5月  22 17:51 xtrabackup_logfile #备份的日志文件 

-恢复

[root@rzy ~]# innobackupex --apply-log /beifen/2021-05-22_17-51-45/ #先对备份进行预处理,使数据一致
。。。。。。
210522 18:19:01 completed OK! 
[root@rzy ~]# rm -rf /usr/local/mysql/data/* #删除mysql文件
[root@rzy ~]# innobackupex --copy-back /beifen/2021-05-22_17-51-45/ #进行恢复
。。。。。。
210522 18:19:53 completed OK!
[root@rzy ~]# chown -R mysql:mysql /usr/local/mysql/data/ #增加属主和属组
[root@rzy ~]# ll /usr/local/mysql/data/ #查看是否已经恢复
总用量 122916
-rw-r----- 1 mysql mysql      352 5月  22 18:19 ib_buffer_pool
-rw-r----- 1 mysql mysql 12582912 5月  22 18:19 ibdata1
-rw-r----- 1 mysql mysql 50331648 5月  22 18:19 ib_logfile0
-rw-r----- 1 mysql mysql 50331648 5月  22 18:19 ib_logfile1
-rw-r----- 1 mysql mysql 12582912 5月  22 18:19 ibtmp1
drwxr-x--- 2 mysql mysql     4096 5月  22 18:19 mysql
drwxr-x--- 2 mysql mysql     8192 5月  22 18:19 performance_schema
drwxr-x--- 2 mysql mysql     8192 5月  22 18:19 sys
-rw-r----- 1 mysql mysql      417 5月  22 18:19 xtrabackup_info
[root@rzy ~]# mysql -u root -p123123 -e "show databases;" #进入mysql查看是否可以正常操作
mysql: [Warning] Using a password on the command line interface can be insecure.
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
——————————————————————————————————————————————————————————
恢复三部曲
1.先把备份进行预操作,使数据一致
2.恢复备份至mysql
3.增加属主和属组
——————————————————————————————————————————————————————————

-增量备份

[root@rzy ~]# mysql -u root -p123123 #进入mysql创建表
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.7.12 Source distribution
Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> create database aaa;
Query OK, 1 row affected (0.00 sec)
mysql> use aaa;
Database changed
mysql> create table aaa(id int);
Query OK, 0 rows affected (0.13 sec)
mysql> insert into aaa values(1);
Query OK, 1 row affected (0.07 sec)
mysql> insert into aaa values(2);
Query OK, 1 row affected (0.00 sec)
mysql> insert into aaa values(3);
Query OK, 1 row affected (0.00 sec)
mysql> exit
Bye
[root@rzy ~]# innobackupex --user=root --password=123123 --incremental /beifen/ --incremental-basedir=/beifen/2021-05-22_17-51-45/ #进行增量备份要记得使用--incremental-basedir=指定完全备份
。。。。。。
210522 18:31:39 completed OK!
[root@rzy ~]# ll /beifen/
总用量 0
drwxr-x--- 5 root root 245 5月  22 18:19 2021-05-22_17-51-45 #完全备份
drwxr-x--- 6 root root 230 5月  22 18:31 2021-05-22_18-31-36 #增量备份
[root@rzy 2021-05-22_18-31-36]# cat xtrabackup_checkpoints  #查看增量备份的xtrabackup_checkpoints文件
backup_type = incremental #备份类型为增量备份
from_lsn = 2522130 #lsn从2522130开始
to_lsn = 2522673   #lsn到2522673结束
last_lsn = 2522673
compact = 0
recover_binlog_info = 0
[root@rzy 2021-05-22_18-31-36]# cat /beifen/2021-05-22_17-51-45/xtrabackup_checkpoints  #查看完全备份的
backup_type = full-prepared #备份类型为完全备份
from_lsn = 0 #lsn从0开始
to_lsn = 2522130  #lsn从255130结束
last_lsn = 2522139
compact = 0
recover_binlog_info = 0

-恢复增量备份

[root@rzy 2021-05-22_18-31-36]# innobackupex --apply-log --redo-only /beifen/2021-05-22_17-51-45/ #先把完全备份的数据保持一致性
。。。。。。
210522 18:40:17 completed OK!
[root@rzy 2021-05-22_18-31-36]# innobackupex --apply-log --redo-only /beifen/2021-05-22_17-51-45/ --incremental-dir=/beifen/2021-05-22_18-31-36/ #把增量备份和全局备份的数据目录合并--incremental-dir=指定增量备份目录
。。。。。。
210522 18:41:24 completed OK!
[root@rzy 2021-05-22_18-31-36]# cat /beifen/2021-05-22_17-51-45/xtrabackup_checkpoints  #查看合并后的完全备份的数据目录的xtrabackup_checkpoints文件的lsn是否增加到了增量备份的数字
backup_type = log-applied
from_lsn = 0
to_lsn = 2522673 #发现lsn结束的数字和上面的增量备份的数字一致了
last_lsn = 2522673
compact = 0
recover_binlog_info = 0
[root@rzy 2021-05-22_18-31-36]# innobackupex --copy-back /beifen/2021-05-22_17-51-45/ #恢复数据
。。。。。。
210522 18:42:43 completed OK!
[root@rzy 2021-05-22_18-31-36]# chown -R mysql:mysql /usr/local/mysql/data/ #修改属主和属组
[root@rzy 2021-05-22_18-31-36]# mysql -u root -p123123 -e "show databases;" #确认mysql可以正常使用
mysql: [Warning] Using a password on the command line interface can be insecure.
+--------------------+
| Database           |
+--------------------+
| information_schema |
| aaa                |
| mysql              |
| performance_schema |
| sys                |
+--------------------+


-使用Xtrabackup的总结


  • 增量备份需要使用参数–incremental指定需要备份到那个目录,在恢复增量备份和完全备份时,要使用–incremental-dir参数指定增量备份目录和完全备份目录合并
  • 进行数据备份恢复时,要先使用参数–apply-log和redo-only使数据目录的数据保持一致
  • 如果有多个增量备份,要把增量备份逐一和完全备份进行合并,可以查看完全备份的lsn值是否达到最近一次的增量备份的lsn值
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
存储 关系型数据库 MySQL
mysql数据库备份与恢复
MySQL数据库的备份与恢复是确保数据安全性和业务连续性的关键操作。
616 4
|
5月前
|
存储 关系型数据库 MySQL
在CentOS 8.x上安装Percona Xtrabackup工具备份MySQL数据步骤。
以上就是在CentOS8.x上通过Perconaxtabbackup工具对Mysql进行高效率、高可靠性、无锁定影响地实现在线快速全量及增加式数据库资料保存与恢复流程。通过以上流程可以有效地将Mysql相关资料按需求完成定期或不定期地保存与灾难恢复需求。
425 10
|
10月前
|
关系型数据库 MySQL Shell
MySQL 备份 Shell 脚本:支持远程同步与阿里云 OSS 备份
一款自动化 MySQL 备份 Shell 脚本,支持本地存储、远程服务器同步(SSH+rsync)、阿里云 OSS 备份,并自动清理过期备份。适用于数据库管理员和开发者,帮助确保数据安全。
|
7月前
|
存储 关系型数据库 MySQL
【赵渝强老师】使用select...into outfile语句备份MySQL
本文介绍了MySQL中使用`SELECT...INTO OUTFILE`语句将表数据导出为文本文件的方法。通过示例演示了如何备份员工表(emp)的数据,包括创建存储目录、设置权限、配置参数`secure_file_priv`以及解决相关错误的过程。字段分隔符和行终止符可自定义,确保数据格式符合需求。最后展示了备份文件的内容,验证操作成功。
496 36
|
7月前
|
存储 SQL 关系型数据库
【赵渝强老师】使用mysqldump备份MySQL
本文介绍了 MySQL 自带的逻辑备份工具 mysqldump 的使用方法。通过 mysqldump,可以将数据库中的数据转换为对应的 SQL 插入语句,便于备份和还原。文章详细说明了如何备份所有数据库、指定数据库及特定表,排除某些表不备份的操作,以及删除数据库后如何通过备份文件恢复数据。同时提供了视频讲解和具体命令示例,帮助用户更好地理解和应用该工具。
438 5
|
7月前
|
存储 SQL 关系型数据库
【赵渝强老师】使用mydumper备份MySQL
本文介绍了使用mydumper工具进行MySQL数据库备份与恢复的操作方法。相比单线程工作的mysqldump,mydumper支持多线程,速度提升可达10倍。其功能包括事务性表快照、快速压缩、导出binlog等,并提供详细的参数说明和操作步骤。文章通过实例演示了安装mydumper、创建存储目录、全库备份、指定数据库及表备份、删除数据库以及使用myloader恢复数据的完整流程,并附带视频讲解,帮助用户更好地理解和应用该工具。
407 0
|
9月前
|
关系型数据库 MySQL Linux
在Linux环境下备份Docker中的MySQL数据并传输到其他服务器以实现数据级别的容灾
以上就是在Linux环境下备份Docker中的MySQL数据并传输到其他服务器以实现数据级别的容灾的步骤。这个过程就像是一场接力赛,数据从MySQL数据库中接力棒一样传递到备份文件,再从备份文件传递到其他服务器,最后再传递回MySQL数据库。这样,即使在灾难发生时,我们也可以快速恢复数据,保证业务的正常运行。
408 28
|
9月前
|
存储 关系型数据库 MySQL
利用Cron表达式实现MySQL数据库的定时备份
以上就是如何使用Cron表达式和mysqldump命令实现MySQL数据库的定时备份。这种方法的优点是简单易用,而且可以根据需要定制备份的时间和频率。但是,它也有一些限制,例如,它不能备份MySQL服务器的配置文件和用户账户信息,也不能实现增量备份。如果需要更复杂的备份策略,可能需要使用专门的备份工具或服务。
233 15
|
关系型数据库 MySQL Linux
Linux环境下MySQL数据库自动定时备份实践
数据库备份是确保数据安全的重要措施。在Linux环境下,实现MySQL数据库的自动定时备份可以通过多种方式完成。本文将介绍如何使用`cron`定时任务和`mysqldump`工具来实现MySQL数据库的每日自动备份。
765 3
|
监控 关系型数据库 MySQL
Linux环境下MySQL数据库自动定时备份策略
在Linux环境下,MySQL数据库的自动定时备份是确保数据安全和可靠性的重要措施。通过设置定时任务,我们可以每天自动执行数据库备份,从而减少人为错误和提高数据恢复的效率。本文将详细介绍如何在Linux下实现MySQL数据库的自动定时备份。
379 3

推荐镜像

更多