第十章 数据库的增量备份和恢复
一:数据备份的重要性
在生产环境中,数据的安全性是至关重要的任何数据的丢失都可能产生严重的后果
1.1:造成数据丢失的原因
程序错误、人为操作错误(目前绝大部分的原因都是人为)、运算错误、磁盘故障、灾难(如火灾、地震)和盗窃

1.2:数据库备份的分类
物理备份:对数据库操作系统的物理文件(如数据文件、日志文件等)的备份
数据库在物理层面分成了三类文件,每一个文件的名字以表的名字开始,扩展名指出文件类型
表结构文件:.frm文件存储表定义
表数据文件的扩展名为.MYD(MYData)
表索引文件的扩展名是.MYI( MYIndex)
物理备份又可以分为脱机备份(冷备份)和联机备份(热备份)
冷备份:是在关闭数据库的时候进行的
热备份:数据库处于运行状态,这种备份方法依赖于数据库的日志文件
逻辑备份:对数据库逻辑组件(如表等数据库对象)的备份

1.3:从数据库的备份策略角度,备份可分为哪几种?
完全备份:每次对数据进行完整的备份
差异备份:备份那些自从上次完全备份之后被修改过的文件
增量备份:只有那些在上次完全备份或者增量备份后被修改的文件才会被备份

1.4:常见的备份方法
物理冷备:备份时数据库处于关闭状态,直接打包数据库文件;备份速度快,回复时也是最简单的
专用备份工具mydump或mysqlhotcopy:mysqldump常用的逻辑备份工具;mysqlhotcopy仅拥有备份mylsam和ARCHIV表
启用二进制日志进行增量备份:进行增量备份,需要刷新二进制日志
第三方工具备份:免费的MySQL热备份软件Percona XtaBackup

二:MySQL的完全备份
2.1:完全备份概念
完全备份是对整个数据库的备份、数据库结构和文件结构的备份;完全备份保存的是备份完成时刻的数据库;完全备份是增量备份的基础
2.2:完全备份的优缺点
优点:安全性高;备份与恢复操作简单方便
缺点:数据存在大量的重复;占用大量的备份空间,空间利用率低;备份与恢复时间长
2.3:mysqldump备份库
2.3.1: 实现备份MySQL数据库的方法
直接打包数据库文件夹,如/usr/local/mysql/data
如:tar jcvf /opt/mysql-$(date +%F).tar.gz /usr/local/mysql/data
使用专用备份工具 mysqldump
2.3.2:mysqldump概念
mysqldump命令是MySQLI自带的备份工具,相当方便对MySQL进行备份;通过该命令工具可以将指定的库、表或全部的库导出为SQL脚本,在需要恢复时可进行数据恢复

2.3.3:使用mysqldump命令备份库?
备份单个库;语法:mysqldump -u 用户名 -p [密码] [选项] [库名] > /备份路径/备份文件名
例如:mysqldump -u root -p info > /backup/info.sql

备份多个库
语法:mysqldump -u 用户名 -p [密码] [选项] --databases 库名1 [库名2] ... > /备份路径/备份文件名
例如:mysqldump -u root -p --databases info base > /backup/info-base.sql

对所有库完全备份
语法:mysqldump -u 用户名 -p [密码] [选项] --all-databases > /备份路径/备份文件名
例如:mysqldump -u root -p --opt --all-databases > /backup/ku.sql

2.3.4:使用mysqldump命令备份表
在实际生产环境中,存在对某个特定表的维护操作,此时mysqldump同样发挥重大作用;使用mysqldump备份表的操作
语法:mysqldump -u 用户名 -p [密码] [选项] 数据库名 表名 > /备份路径/备份文件名
例如:mysqldump -u root -p school info > /backup/school-info.sql

使用 mysqldump备份表的结构
mysqldump -u 用户名 -p [密码] [选项] -d 数据库名 表名 > /备份路径/备份文件名
例如mysqldump -u root -p -d school info > /backup/schoolo-info.sql

三:恢复数据库和表
3.1:数据恢复的两种方法
使用 mysqldump命令导出的SQL备份脚本,在进行数据恢复时可使用以下方法导入source命令,mysql命令
3.2:使用source命令恢复数据库的步骤
使用source恢复数据库的步骤
登录到MySQL数据库(作用在linux的环境下)执行source备份sql脚本的路径(引用的是绝对路径)
恢复示例:
mysql > source /backup/all-data.sql
'source命令在mysql库中使用’

3.3:使用mysql命令恢复数据库
语法:mysql -u 用户名 -p [密码] < 库备份脚本的路径'此处用了导入<符号,而不是导出>符号‘
例如:mysql -u root -p < /backup/all-data.sql

3.4:恢复表
恢复表时同样可以使用source或者mysql命令进行;source恢复表的操作与恢复库的操作相同;当备份文件中只包含表的备份,而不包括创建库的语句时,必须指定库名,且目标库必须存在
语法:mysql -u 用户名 -p [密码] < 表备份脚本的路径
例如:mysql -u root -p mysql < /backup/school-info.sql

在生产环境中,可以使用shell脚本自动实现定期备份

3.5:MySQL备份思路总结
定期实施备份,制定备份计划或者策略,并严格遵守;除了进行完全备份,开启MySQL服务器的日志功能是很重要的;完全备份加上日志,可以对MySQL进行最大化还原;使用统一的和易理解的备份文件名称;不要使用backup1、backup2等这样没有意义的名字;推荐使用库名或者表名加上时间的命名规则

四:实现MySQL增量备份
4.1:MySQL增量备份概念
只有那些在上次完全备份或者增量备份后被修改的文件才会被备份;增量备份就是备份自上一次备份之后增加或变化的文件或者内容

4.2:使用mysqldump命令进行完全备份存在的问题
备份数据中有重复数据;备份时间与恢复时间长

4.3:增量备份有什么优缺点?
优点:没有重复数据,效率高,空间利用率最大化;备份量不大,时间短
缺点:恢复麻烦:需要上次完全备份及完全备份之后所有的增量备份才能恢复,而且要对所有增量备份进行逐个反推恢复;安全性较低

4.4:实现MySQL增量备份
MySQL没有提供直接的增量备份方法;可以通过MySQL提供的二进制日志(binary logs)间接实现增量备份
'MySQL的配置文件的[mysqld]项中加入log-bin=filepath项(filepath是二进制文件的路径),如log-bin=mysql-bin,然后重启mysqld服务'二进制日志文件的默认路径为/usr/local/mysql/data
[root@localhost ~]# vim /etc/my.cnf
'在[mysqld]项中加入配置 log-bin=mysql-bin'
...省略内容
[mysqld]
user = mysql
basedir = /usr/local/mysql
datadir=/usr/local/mysql/data
port = 3306
character_set_server=utf8
pid-file = /usr/local/mysql/mysqld.pid
socket = /usr/local/mysql/mysql.sock
server-id = 1
log-bin=mysql-bin '添加此句'
...省略内容
[root@localhost ~]# systemctl restart mysqld '重启服务'
[root@localhost ~]# ls /usr/local/mysql/data/
mysql-bin.000001 '发现已经生成了二进制文件,设置成功'
...省略内容
MySQL二进制日志对备份的意义
二进制日志保存了所有更新或者可能更新数据库的操作;二进制日志在启动 MySQL服务器后开始记录,并在文件达到max_binlog_size所设置的大小或者接收到flush-logs命令后重新创建新的日志文件。
语法:mysqladmin -u 用户名 -p [密码] flush-logs '增量备份,生成新的日志'
只需定时执行flush-logs方法重新创建新的日志,生成二进制文件序列,并及时把这些旧的日志保存到安全的地方就完成了一个时间段的增量备份

五:MySQL数据库增量恢复
5.1:增量恢复的方式
5.1.1:查看到日志文件中的操作语句
mysqlbinlog --no-defaults --base64-output=decode-rows -v 日志文件名称 /opt/bk.txt '使用64位解码器逐行输出日志文件放到/opt/bk.txt中',cat /opt/bk.txt '查看日志文件的详细信息’

5.1.2:一般恢复
语法:mysqlbinlog [--no-defaults] 增量备份文件 | mysql -u 用户名 -p

5.1.3:断点恢复
基于位置恢复;就是将某个起始时间的二进制日志导入数据库中,从而跳过某个发生错误的时间点实现数据的恢复
'恢复数据到指定位置'
mysqlbinlog --stop-position=‘操作id’ 二进制日志 |mysql -u 用户名 -p 密码 '从指定的位置开始恢复数据'
mysqlbinlog --start-position=‘操作id’ 二进制日志 |mysql -u 用户名 -p 密码 基于时间点恢复
使用基于时间点的恢复,可能会出现在一个时间点里既同时存在正确的操作又存在错误的操作,所以我们需要一种更为精确的恢复方式。

'从日志开头截止到某个时间点的恢复'
mysqlbinlog [--no-defaults] --stop-datetime='年-月-日 小时:分钟:秒' 二进制日志 |mysql -u 用户名 -p 密码

'从某个时间点到日志结尾的恢复'
mysqlbinlog [--no-defaults] --start-datetime='年-月-日 小时:分钟:秒' 二进制日志 |mysql -u 用户名 -p 密码

'从某个时间点到某个时间点的恢复'
mysqlbinlog [--no-defaults] --start-datetime='年-月-日 小时:分钟:秒' --stop-datetime='年-月-日 小时:分钟:秒' 二进制日志 |mysql -u 用户名 -p 密码

六:增量备份实操
6.1:物理冷备份,开启服务
[root@localhost ~]# tar Jcvf /opt/mysql-$(date +%F).tar.xz /usr/local/mysql/data
[root@localhost ~]# ls /opt/
mysql mysql-2020-08-22.tar.xz mysql-5.7.20 mysql-.tar.xz rh
[root@localhost ~]# systemctl start mysqld

6.2:开启二进制日志文件
[root@localhost ~]# vim /etc/my.cnf
'在[mysqld]项中加入配置 log-bin=mysql-bin'
...省略内容
[mysqld]
user = mysql
basedir = /usr/local/mysql
datadir=/usr/local/mysql/data
port = 3306
character_set_server=utf8
pid-file = /usr/local/mysql/mysqld.pid
socket = /usr/local/mysql/mysql.sock
server-id = 1
log-bin=mysql-bin '添加此句'
...省略内容
[root@localhost ~]# systemctl restart mysqld '重启服务'
[root@localhost ~]# ls /usr/local/mysql/data/
mysql-bin.000001 '发现已经生成了二进制文件,设置成功'
...省略内容

6.3:创建库和表,进行完全备份和增量备份
[root@localhost ~]# mysql -uroot -pab123
mysql> create database school; '创建库'
Query OK, 1 row affected (0.00 sec)
mysql> use school; '使用库'
Database changed
mysql> create table info (id int(3) not null primary key auto_increment,name char(10) not null); '创建表结构'
Query OK, 0 rows affected (0.01 sec)
mysql> insert into info values (1,'zhangsan'),(2,'lisi'); '插入记录'
Query OK, 2 rows affected (0.01 sec)
Records: 2 Duplicates: 0 Warnings: 0

mysql> select * from info; '查看表数据'
+----+----------+
| id | name |
+----+----------+
| 1 | zhangsan |
| 2 | lisi |
+----+----------+
2 rows in set (0.00 sec)
mysql>exit
[root@localhost ~]# cd /usr/local/mysql/data
[root@localhost data]# mysqladmin -uroot -p flush-logs
Enter password:
[root@localhost data]# ls
mysql-bin.000001 mysql-bin.000002 ...省略内容 '发现已经有了增量备份文件,刚刚备份的操作记录都存放在 mysql-bin.000001中, mysql-bin.000002是准备存放后续操作的'

6.4:进行正常操作和误操作,进行增量备份
mysql> insert into info values (3,'wangwu'); '正常操作'
Query OK, 1 row affected (0.00 sec)
mysql> delete from info where name='lisi'; '误操作'
Query OK, 1 row affected (0.01 sec)
mysql> insert into info values (4,'zhouliu'); '正常操作'
Query OK, 1 row affected (0.00 sec)
mysql> select * from info;
+----+----------+
| id | name |
+----+----------+
| 1 | zhangsan |
| 3 | wangwu |
| 4 | zhouliu |
+----+----------+
3 rows in set (0.00 sec)
mysql> exit Bye
[root@localhost data]# mysqladmin -uroot -p flush-logs; '再次增量备份'
Enter password: [root@localhost data]# ls '发现再次生成新的增量备份文件ysql-bin.000003' mysql-bin.000001 mysql-bin.000002 mysql-bin.000003 '注意的是:刚刚的正常操作和误操作都存放到了mysql-bin.000002中,而不是000003中'

6.5:查看增量备份文件
[root@localhost data]# mysqlbinlog --no-defaults --base64-output=decode-rows -v mysql-bin.000002 > /opt/bak.txt '发现能够查看到刚刚的操作语句'
[root@localhost data]# vim /opt/bak.txt
...省略内容
at 345 '正常操作'
INSERT INTO school.info
SET
@1=3
@2='wangwu'
...省略内容
at 614 '误操作,614为误操作语句的开始位置id,2020-08-22 10:26:31为误操作语句的开始位置时间,也是上一语句的结束时间'
200822 10:26:31 server id 1 end_log_pos 659 CRC32 0xee949524 Delete_rows: table id 220 flags: STMT_END_F
DELETE FROM school.info
WHERE
@1=2
@2='lisi'
...省略内容
at 881 '正常操作语句段,881为正常操作语句的开始位置id,2020-08022 10:26:59为正常操作语句的开始位置时间,也是上一语句的结束时间'
200822 10:26:59 server id 1 end_log_pos 929 CRC32 0xf1b72d71 Write_rows: table id 220 flags: STMT_END_F
INSERT INTO school.info
SET
@1=4
@2='zhouliu'
...省略内容

6.6:模拟故障,删除表并进行恢复
[root@localhost data]# mysql -uroot -p
Enter password:
mysql> drop table info '删除原有的表'
Query OK, 0 rows affected (0.01 sec)
mysql> show tables;
Empty set (0.00 sec)
mysql> source /opt/info.sql; '//恢复库'
mysql> show tables; '//恢复成功'
+----------------+
| Tables_in_school |
+----------------+
| info |
+----------------+
1 row in set (0.00 sec)
mysql> select * from info; '恢复成功'
+----+----------+
| id | name |
+----+----------+
| 1 | zhangsan |
| 2 | lisi |
+----+----------+
2 rows in set (0.00 sec)

6.7:使用基于时间点的断点恢复
[root@localhost data]# mysqlbinlog --no-defaults --stop-datetime='2020-08-22 10:26:31' /usr/local/mysql/data/mysql-bin.000002 | mysql -u root -p '第一个正常操作的结尾时间是2020-08-22 10:26:31,所以此处用此时间,表示恢复到此时间的操作'
'时间在之前查看增量备份文件中有写'
Enter password:
[root@localhost data]# mysql -u root -p
Enter password:
mysql> use school;
mysql> select * from info; '查看表,发现恢复成功了'
+----+----------+
| id | name |
+----+----------+
| 1 | zhangsan |
| 2 | lisi |
| 3 | wangwu |
+----+----------+
3 rows in set (0.00 sec)
[root@localhost data]# mysqlbinlog --no-defaults --start-datetime='2020-08-22 10:26:31' /usr/local/mysql/data/mysql-bin.000002 | mysql -u root -p '第二个是误操作,我们要跳过。第三个正常操作的结尾时间是2020-08-22 10:26:59,所以此处用此时间,表示从此时间恢复到结尾的操作'
'时间在之前查看增量备份文件中有写'
Enter password:
[root@localhost data]# mysql -u root -p
Enter password:
mysql> use school;
mysql> select * from info; '查看表,发现恢复成功了'
+----+----------+
| id | name |
+----+----------+
| 1 | zhangsan |
| 2 | lisi |
| 3 | wangwu |
| 4 | zhaoliu |
+----+----------+
4 rows in set (0.00 sec)

6.8:使用基于位置的断点恢复
'先删除刚刚恢复的两个表记录'
mysql> delete from info where id=3;
Query OK, 1 row affected (0.01 sec)

mysql> delete from info where id=4;
Query OK, 1 row affected (0.00 sec)

mysql> select * from info;
+----+----------+
| id | name |
+----+----------+
| 1 | zhangsan |
| 2 | lisi |
+----+----------+
2 rows in set (0.00 sec)
mysql> exit
[root@localhost data]# mysqlbinlog --no-defaults --stop-position='345' /usr/local/mysql/data/mysql-bin.000002 | mysql -u root -p '错误操作真正开始的位置是614,所以要恢复到345位置结束'
'位置在之前查看增量备份文件中有写'
Enter password:
[root@localhost data]# mysql -u root -p
Enter password:
mysql> use school;
mysql> select * from info; '查看表,发现恢复成功了'
+----+----------+
| id | name |
+----+----------+
| 1 | zhangsan |
| 2 | lisi |
| 3 | wangwu |
+----+----------+
3 rows in set (0.00 sec)
[root@localhost data]# mysqlbinlog --no-defaults --start-position='881' /usr/local/mysql/data/mysql-bin.000002 | mysql -u root -p '正常操作真正开始的位置是881'
'位置在之前查看增量备份文件中有写'
Enter password:
[root@localhost data]# mysql -u root -p
Enter password:
mysql> use school;
mysql> select * from info; '查看表,发现恢复成功了'
+----+----------+
| id | name |
+----+----------+
| 1 | zhangsan |
| 2 | lisi |
| 3 | wangwu |
| 4 | zhaoliu |
+----+----------+
4 rows in set (0.00 sec)

数据库增量备份与恢复-----全量备份+恢复
1.安装mariadb-backup工具(此工具已默认随mariadb安装,如果没有安装就安装一下)
[root@localhost ~]# dnf -y install  mariadb-backup
Updating Subscription Management repositories.
Unable to read consumer identity
This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.
上次元数据过期检查:1:36:07 前,执行于 2021年01月18日 星期一 20时18分18秒。
依赖关系解决。
=============================================================
 软件包        架构       版本               仓库           大小
=============================================================
安装:
 mariadb-backup     x86_64     3:10.3.17-1.module+el8.1.0+3974+90eded84        AppStream     6.0 M
事务概要
=============================================================
安装  1 软件包
总计:6.0 M
安装大小:28 M
下载软件包:
运行事务检查
事务检查成功。
运行事务测试
事务测试成功。
运行事务
  准备中  :                                                     1/1 
  安装    : mariadb-backup-3:10.3.17-1.module+el8.1.0+3974+90eded84.x86_64                     1/1 
  运行脚本: mariadb-backup-3:10.3.17-1.module+el8.1.0+3974+90eded84.x86_64                     1/1 
  验证    : mariadb-backup-3:10.3.17-1.module+el8.1.0+3974+90eded84.x86_64 1/1 
Installed products updated.
已安装:
  mariadb-backup-3:10.3.17-1.module+el8.1.0+3974+90eded84.x86_64                                   
完毕!
[root@localhost ~]#
2.对数据库进行全量备份
[root@localhost ~]# mariabackup --backup --target-dir=/root/fullbackup --user=root --password=123456
[00] 2021-01-18 22:08:24 Connecting to MySQL server host: localhost, user: root, password: set, port: not set, socket: not set
[00] 2021-01-18 22:08:24 Using server version 10.3.17-MariaDB
mariabackup based on MariaDB server 10.3.17-MariaDB Linux (x86_64)
[00] 2021-01-18 22:08:24 uses posix_fadvise().
[00] 2021-01-18 22:08:24 cd to /var/lib/mysql/
。。。。。。。。。。。。。。。。省略
[00] 2021-01-18 22:08:26         ...done
[00] 2021-01-18 22:08:26 Redo log (from LSN 1784551 to 1784560) was copied.
[00] 2021-01-18 22:08:26 completed OK!
[root@localhost ~]#
3.准备全备数据
[root@localhost ~]# mariabackup --prepare --target-dir=/root/fullbackup/ --user=root --password=123456
mariabackup based on MariaDB server 10.3.17-MariaDB Linux (x86_64)
[00] 2021-01-18 22:11:02 cd to /root/fullbackup/
[00] 2021-01-18 22:11:02 This target seems to be not prepared yet.
[00] 2021-01-18 22:11:02 mariabackup: using the following InnoDB configuration for recovery:
[00] 2021-01-18 22:11:02 innodb_data_home_dir = .
。。。。。。。。。。。。。。省略
2021-01-18 22:11:02 0 [Note] InnoDB: Completed initialization of buffer pool
2021-01-18 22:11:02 0 [Note] InnoDB: page_cleaner coordinator priority: -20
2021-01-18 22:11:02 0 [Note] InnoDB: Starting crash recovery from checkpoint LSN=1784551
[00] 2021-01-18 22:11:02 Last binlog file , position 0
[00] 2021-01-18 22:11:03 completed OK!
[root@localhost ~]#
4.还原数据(请确保数据目录下是空的)并修改属组和属主,随后重启服务,并进行登录查看
[root@localhost ~]# ls
公共  模板  视频  图片  文档  下载  音乐  桌面  anaconda-ks.cfg  fullbackup  initial-setup-ks.cfg
[root@localhost ~]# cd /var/lib/mysql/
[root@localhost mysql]# ls
aria_log.00000001  ibdata1    ibtmp1    mysql.sock     runtime    test
aria_log_control  ib_logfile0  multi-master.info  mysql_upgrade_info  runtimeedu
ib_buffer_pool  ib_logfile1  mysql    performance_schema  tc.log
[root@localhost mysql]# rm -rf *
[root@localhost mysql]# ls
[root@localhost mysql]# cd 
[root@localhost ~]#
[root@localhost mysql]# mariabackup  --copy-back  --target-dir=/root/fullbackup/  --user=root  --password=123456
mariabackup based on MariaDB server 10.3.17-MariaDB Linux (x86_64)
[01] 2021-03-09 21:40:37 Copying ibdata1 to /var/lib/mysql/ibdata1
[01] 2021-03-09 21:40:37 …done
[01] 2021-03-09 21:40:37 Copying ./mysql/innodb_table_stats.ibd to /var/lib/mysql/mysql/innodb_table_stats.ibd
[01] 2021-03-09 21:40:37 …done
。。。。。。。。。。。。。。。。。。。。。。省略
[01] 2021-01-18 22:13:02 Copying ./aria_log_control to /var/lib/mysql/aria_log_control
[01] 2021-01-18 22:13:02         ...done
[01] 2021-01-18 22:13:02 Copying ./ib_buffer_pool to /var/lib/mysql/ib_buffer_pool
[01] 2021-01-18 22:13:02         ...done
[01] 2021-01-18 22:13:02 Copying ./xtrabackup_info to /var/lib/mysql/xtrabackup_info
[01] 2021-01-18 22:13:02         ...done
[00] 2021-01-18 22:13:02 completed OK!
[root@localhost ~]# ls /var/lib/mysql/
aria_log.00000001  ib_buffer_pool  mysql      runtime     test
aria_log_control   ibdata1   performance_schema  runtimeedu  xtrabackup_info
[root@localhost ~]# chown  -R mysql.mysql /var/lib/mysql/
[root@localhost ~]# systemctl  restart  mariadb.service
[root@localhost ~]# mysql -uroot -p
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 8
Server version: 10.3.17-MariaDB MariaDB Server
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| runtime            |
| runtimeedu         |
| test               |
+--------------------+
6 rows in set (0.001 sec)
MariaDB [(none)]>
数据库增量备份与恢复-----全备+增量+恢复
1.对数据库进行全量备份
MariaDB [(none)]> exit
Bye
[root@localhost ~]# rm -rf fullbackup/
[root@localhost ~]# ls
公共  模板  视频  图片  文档  下载  音乐  桌面  anaconda-ks.cfg  initial-setup-ks.cfg
[root@localhost ~]# mariabackup --backup --target-dir=/root/fullbackup --user=root --password=123456
[00] 2021-01-18 22:22:55 Connecting to MySQL server host: localhost, user: root, password: set, port: not set, socket: not set
[00] 2021-01-18 22:22:55 Using server version 10.3.17-MariaDB
mariabackup based on MariaDB server 10.3.17-MariaDB Linux (x86_64)
[00] 2021-01-18 22:22:55 uses posix_fadvise().
[00] 2021-01-18 22:22:55 cd to /var/lib/mysql/
[00] 2021-01-18 22:22:55 open files limit requested 0, set to 1024
。。。。。。。。。。。。。。。。。。。。。。。省略
[00] 2021-01-18 22:22:58         ...done
[00] 2021-01-18 22:22:58 Backup created in directory '/root/fullbackup/'
[00] 2021-01-18 22:22:58 Writing backup-my.cnf
[00] 2021-01-18 22:22:58         ...done
[00] 2021-01-18 22:22:58 Writing xtrabackup_info
[00] 2021-01-18 22:22:58         ...done
[00] 2021-01-18 22:22:58 Redo log (from LSN 1784844 to 1784853) was copied.
[00] 2021-01-18 22:22:58 completed OK!
[root@localhost ~]#
2.对数据库进行增量备份
[root@localhost ~]# mariabackup --backup --target-dir=/root/inc1 --incremental-basedir=/root/fullbackup/ --user=root --password=123456
[00] 2021-01-18 22:24:44 Connecting to MySQL server host: localhost, user: root, password: set, port: not set, socket: not set
[00] 2021-01-18 22:24:44 Using server version 10.3.17-MariaDB
mariabackup based on MariaDB server 10.3.17-MariaDB Linux (x86_64)
[00] 2021-01-18 22:24:44 incremental backup from 1784844 is enabled.
[00] 2021-01-18 22:24:44 uses posix_fadvise().
[00] 2021-01-18 22:24:44 cd to /var/lib/mysql/
[00] 2021-01-18 22:24:44 open files limit requested 0, set to 1024
[00] 2021-01-18 22:24:44 mariabackup: using the following InnoDB configuration:
[00] 2021-01-18 22:24:44 innodb_data_home_dir = 
[00] 2021-01-18 22:24:44 innodb_data_file_path = ibdata1:12M:autoextend
[00] 2021-01-18 22:24:44 innodb_log_group_home_dir = ./
。。。。。。。。。。。。。。。。。。。。。。。。。。省略
[00] 2021-01-18 22:24:46         ...done
[00] 2021-01-18 22:24:46 Backup created in directory '/root/inc1/'
[00] 2021-01-18 22:24:46 Writing backup-my.cnf
[00] 2021-01-18 22:24:46         ...done
[00] 2021-01-18 22:24:46 Writing xtrabackup_info
[00] 2021-01-18 22:24:46         ...done
[00] 2021-01-18 22:24:46 Redo log (from LSN 1784844 to 1784853) was copied.
[00] 2021-01-18 22:24:46 completed OK!
[root@localhost ~]#
3.对数据库进行全备数据
[root@localhost ~]# mariabackup --prepare --target-dir=/root/fullbackup/ --user=root --password=123456
mariabackup based on MariaDB server 10.3.17-MariaDB Linux (x86_64)
[00] 2021-01-18 22:25:48 cd to /root/fullbackup/
[00] 2021-01-18 22:25:48 This target seems to be not prepared yet.
[00] 2021-01-18 22:25:48 mariabackup: using the following InnoDB configuration for recovery:
[00] 2021-01-18 22:25:48 innodb_data_home_dir = .
[00] 2021-01-18 22:25:48 innodb_data_file_path = ibdata1:12M:autoextend
[00] 2021-01-18 22:25:48 innodb_log_group_home_dir = .
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。省略
2021-01-18 22:25:48 0 [Note] InnoDB: Initializing buffer pool, total size = 100M, instances = 1, chunk size = 100M
2021-01-18 22:25:48 0 [Note] InnoDB: Completed initialization of buffer pool
2021-01-18 22:25:48 0 [Note] InnoDB: page_cleaner coordinator priority: -20
2021-01-18 22:25:48 0 [Note] InnoDB: The log sequence number 1784560 in the system tablespace does not match the log sequence number 1784844 in the ib_logfiles!
[00] 2021-01-18 22:25:48 Last binlog file , position 0
[00] 2021-01-18 22:25:48 completed OK!
[root@localhost ~]#
4.对数据库增量和全备数据合并
[root@localhost ~]# mariabackup --prepare --target-dir=/root/fullbackup/ --user=root --password=123456 --incremental-dir=/root/inc1/ --apply-log-only
mariabackup based on MariaDB server 10.3.17-MariaDB Linux (x86_64)
[00] 2021-01-18 22:26:42 incremental backup from 1784844 is enabled.
[00] 2021-01-18 22:26:42 cd to /root/fullbackup/
[00] 2021-01-18 22:26:42 This target seems to be already prepared.
[00] 2021-01-18 22:26:42 mariabackup: using the following InnoDB configuration for recovery:
[00] 2021-01-18 22:26:42 innodb_data_home_dir = .
。。。。。。。。。。。。。。省略
[01] 2021-01-18 22:26:42         ...done
[01] 2021-01-18 22:26:42 Copying /root/inc1/test/passwd.MYD to ./test/passwd.MYD
[01] 2021-01-18 22:26:42         ...done
[01] 2021-01-18 22:26:42 Copying /root/inc1/performance_schema/db.opt to ./performance_schema/db.opt
[01] 2021-01-18 22:26:42         ...done
[00] 2021-01-18 22:26:42 Copying /root/inc1//xtrabackup_info to ./xtrabackup_info
[00] 2021-01-18 22:26:42         ...done
[00] 2021-01-18 22:26:42 completed OK!
[root@localhost ~]#
5.恢复数据(请确保数据目录下是空的) 并修改属组和属主
[root@localhost ~]# ls /var/lib/mysql/
aria_log.00000001  ibdata1  ibtmp1  mysql.sock  runtimeedu  xtrabackup_info
aria_log_control   ib_logfile0  multi-master.info  performance_schema  tc.log
ib_buffer_pool     ib_logfile1  mysql          runtime             test
[root@localhost ~]# cd /var/lib/mysql/
[root@localhost mysql]# rm -rf *
[root@localhost mysql]# ls
[root@localhost mysql]# cd 
[root@localhost ~]# mariabackup --copy-back --target-dir=/root/fullbackup/ --user=root --password=123456
mariabackup based on MariaDB server 10.3.17-MariaDB Linux (x86_64)
[01] 2021-01-18 22:30:17 Copying ibdata1 to /var/lib/mysql/ibdata1
[01] 2021-01-18 22:30:17         ...done
[01] 2021-01-18 22:30:17 Copying ./mysql/innodb_table_stats.ibd to /var/lib/mysql/mysql/innodb_table_stats.ibd
[01] 2021-01-18 22:30:17         ...done
[01] 2021-01-18 22:30:17 Copying ./mysql/innodb_index_stats.ibd to /var/lib/mysql/mysql/innodb_index_stats.ibd
[01] 2021-01-18 22:30:17         ...done
。。。。。。。。。。。。。。。。。。省略
[01] 2021-01-18 22:30:17         ...done
[01] 2021-01-18 22:30:17 Copying ./aria_log.00000001 to /var/lib/mysql/aria_log.00000001
[01] 2021-01-18 22:30:17         ...done
[01] 2021-01-18 22:30:17 Copying ./aria_log_control to /var/lib/mysql/aria_log_control
[01] 2021-01-18 22:30:17         ...done
[01] 2021-01-18 22:30:17 Copying ./ib_buffer_pool to /var/lib/mysql/ib_buffer_pool
[01] 2021-01-18 22:30:17         ...done
[01] 2021-01-18 22:30:17 Copying ./xtrabackup_info to /var/lib/mysql/xtrabackup_info
[01] 2021-01-18 22:30:17         ...done
[00] 2021-01-18 22:30:17 completed OK!
[root@localhost ~]# chown -R mysql.mysql /var/lib/mysql
[root@localhost ~]# ll /var/lib/mysql/
总用量 12324
-rw-r-----. 1 mysql mysql    16384 1月  18 22:30 aria_log.00000001
-rw-r-----. 1 mysql mysql       52 1月  18 22:30 aria_log_control
-rw-r-----. 1 mysql mysql     1627 1月  18 22:30 ib_buffer_pool
-rw-r-----. 1 mysql mysql 12582912 1月  18 22:30 ibdata1
drwx------. 2 mysql mysql     4096 1月  18 22:30 mysql
drwx------. 2 mysql mysql       20 1月  18 22:30 performance_schema
drwx------. 2 mysql mysql      134 1月  18 22:30 runtime
drwx------. 2 mysql mysql     4096 1月  18 22:30 runtimeedu
drwx------. 2 mysql mysql      106 1月  18 22:30 test
-rw-r-----. 1 mysql mysql      489 1月  18 22:30 xtrabackup_info
[root@localhost ~]# systemctl restart mariadb.service 
[root@localhost ~]# ll /var/lib/mysql/
总用量 122940
-rw-r-----. 1 mysql mysql    16384 1月  18 22:30 aria_log.00000001
-rw-r-----. 1 mysql mysql       52 1月  18 22:30 aria_log_control
-rw-rw----. 1 mysql mysql     1627 1月  18 22:30 ib_buffer_pool
-rw-r-----. 1 mysql mysql 12582912 1月  18 22:30 ibdata1
-rw-rw----. 1 mysql mysql 50331648 1月  18 22:31 ib_logfile0
-rw-rw----. 1 mysql mysql 50331648 1月  18 22:31 ib_logfile1
-rw-rw----. 1 mysql mysql 12582912 1月  18 22:31 ibtmp1
-rw-rw----. 1 mysql mysql        0 1月  18 22:31 multi-master.info
drwx------. 2 mysql mysql     4096 1月  18 22:30 mysql
srwxrwxrwx. 1 mysql mysql        0 1月  18 22:31 mysql.sock
drwx------. 2 mysql mysql       20 1月  18 22:30 performance_schema
drwx------. 2 mysql mysql      134 1月  18 22:30 runtime
drwx------. 2 mysql mysql     4096 1月  18 22:30 runtimeedu
-rw-rw----. 1 mysql mysql    24576 1月  18 22:31 tc.log
drwx------. 2 mysql mysql      106 1月  18 22:30 test
-rw-r-----. 1 mysql mysql      489 1月  18 22:30 xtrabackup_info
[root@localhost ~]# mysql -uroot -p
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 8
Server version: 10.3.17-MariaDB MariaDB Server
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| runtime            |
| runtimeedu         |
| test               |
+--------------------+
6 rows in set (0.000 sec)
MariaDB [(none)]> exit
Bye
[root@localhost ~]#
上一篇 下一篇