MySQL数据库备份还原

1、 备份类型

 热备份、温备份、冷备份 (根据服务器状态)
     热备份:读、写不受影响;
     温备份:仅可以执行读操作;
     冷备份:离线备份;读、写操作均中止;
 ​
 物理备份与逻辑备份 (从对象来分)
     物理备份:复制数据文件;
     逻辑备份:将数据导出至文本文件中;
 ​
 完全备份、增量备份、差异备份 (从数据收集来分)
     完全备份:备份全部数据;
     增量备份:仅备份上次完全备份或增量备份以后变化的数据;
     差异备份:仅备份上次完全备份以来变化的数据;

2、备份案例

2.1 mysqldump(完全)+binlog(增量)实现完全+增量备份

 mysql> create database school;
 Query OK, 1 row affected (0.01 sec)
 ​
 mysql> use school
 Database changed
 mysql> CREATE TABLE `Student` (
     ->   `Sno` int(10) NOT NULL COMMENT '学号',  `Sname` varchar(16) NOT NULL COMMENT '姓名',
     ->   `Ssex` char(2) NOT NULL COMMENT '性别',  `Sage` tinyint(2) NOT NULL DEFAULT '0' COMMENT '学生年龄',
     ->   `Sdept` varchar(16) DEFAULT 'NULL' COMMENT '学生所在系别',  PRIMARY KEY (`Sno`)
     -> ) ;
 Query OK, 0 rows affected, 2 warnings (0.09 sec)
 ​
 mysql> INSERT INTO `Student` VALUES (1, '陆亚', '男', 24, '计算机网络'),(2, 'tom', '男', 26, '英语'),(3, '张阳', '男', 21, '物流管理'), (4, 'alex', '女', 22, '电子商务');
 Query OK, 4 rows affected (0.02 sec)
 Records: 4  Duplicates: 0  Warnings: 0
 ​
 #完全备份:
 [root@localhost mysqlbak]# mysqldump --opt -B school > school.sql
 -B:恢复时不用创建数据库和删表
 ​
 #插入数据:
 INSERT INTO Student values(0005,'xumubin','男',29,'中文专业'),(0006,'wangzhao','男',21,'导弹专业');
 ​
 #模拟数据损坏:
 mysql> drop database school;
 Query OK, 1 row affected (0.04 sec)
 ​
 #刷新日志并保存
 mysql> flush logs;
 Query OK, 0 rows affected (0.03 sec)
 ​
 mysql> show binary logs;
 +---------------+-----------+-----------+
 | Log_name      | File_size | Encrypted |
 +---------------+-----------+-----------+
 | binlog.000001 |      1822 | No        |
 | binlog.000002 |       157 | No        |
 +---------------+-----------+-----------+
 2 rows in set (0.00 sec)
 ​
 #将二进制日志进行备份保存,避免二次破坏
 mysql> system cp /var/lib/mysql/binlog.000001 /mysqlbak
 ​
 # 查看二进制日志
 使用mysqlbinlog
 注意5.7版本,insert语句已经加密,默认看不到,查看时加上选项 --base64-output=DECODE-ROWS -vv
     
 #1、基于时间点增量恢复
 注意:在BEGIN之后的时间点,cCOMMIT之后
 [root@localhost mysqlbak]# mysqlbinlog binlog.000001 --start-datetime="2024-02-19 11:34:53" --stop-datetime="2024-02-19 11:36:35" -r time1.sql
 -r,----result-file=name:此选项指示mysqlbinlog将文本输出写入到的文件
 ​
 #还原完全备份
 mysql> source /mysqlbak/school.sql
 mysql> select * from school.Student;
 +-----+--------+------+------+-----------------+
 | Sno | Sname  | Ssex | Sage | Sdept           |
 +-----+--------+------+------+-----------------+
 |   1 | 陆亚   | 男   |   24 | 计算机网络      |
 |   2 | tom    | 男   |   26 | 英语            |
 |   3 | 张阳   | 男   |   21 | 物流管理        |
 |   4 | alex   | 女   |   22 | 电子商务        |
 +-----+--------+------+------+-----------------+
 4 rows in set (0.01 sec)
 ​
 #还原增量备份
 mysql> source /mysqlbak/time1.sql
 mysql> select * from school.Student;
 +-----+----------+------+------+-----------------+
 | Sno | Sname    | Ssex | Sage | Sdept           |
 +-----+----------+------+------+-----------------+
 |   1 | 陆亚     | 男   |   24 | 计算机网络      |
 |   2 | tom      | 男   |   26 | 英语            |
 |   3 | 张阳     | 男   |   21 | 物流管理        |
 |   4 | alex     | 女   |   22 | 电子商务        |
 |   5 | xumubin  | 男   |   29 | 中文专业        |
 |   6 | wangzhao | 男   |   21 | 导弹专业        |
 +-----+----------+------+------+-----------------+
 6 rows in set (0.00 sec)
 ​
 #2、基于位置点恢复
 [root@localhost mysqlbak]# mysqlbinlog binlog.000001 --start-position=1392 --stop-position=1591 -r pos1.sql

2.2 binlog新特性--gtid

binlog日志的GTID新特性

1、 GTID 介绍

1> 什么是GTID

GTID(Global Transaction ID),全局事务标识符。是对于一个已提交事务的编号,并且是一个全局唯一的编号。 它是MySQL 5.6加入的一个强大特性,目的在于能够实现主从自动定位和切换,而不像以前需要指定文件和位置。

2> GTID的格式与存储

1) 单个GTID GTID与主库上提交的每个事务相关联。此标识符不仅对发起事务的库是唯一的,而且在给定复制拓扑中的所有库中都是唯一的。GTID用冒号分隔的一对坐标表示,例如:

 8eed0f5b-6f9b-11e9-94a9-005056a57a4e:23
 前一部分是主库的server_uuid,后面一部分是主库上按提交事务的顺序确定的序列号,提交的事务序号从1开始。
 GTID = server_uuid :transaction_id

2)GTID集 GTID集是包括一个或多个单个GTID或GTID范围的集合。源自同一服务器的一系列GTID可以折叠为单个表达式,例如:

8eed0f5b-6f9b-11e9-94a9-005056a57a4e:1-321 上面的示例表示源自server_uuid为8eed0f5b-6f9b-11e9-94a9-005056a57a4e服务器的第1到第321个事务。源自同一服务器的多个单GTID或GTID范围可以同时包含在由冒号分隔的单个表达式中,例如:

8eed0f5b-6f9b-11e9-94a9-005056a57a4e:1-3:11:47-49

3)mysql.gtid_executed表 mysql.gtid_executed表结构如下:

 mysql> desc mysql.gtid_executed;
 +----------------+------------+------+-----+---------+-------+
 | Field          | Type       | Null | Key | Default | Extra |
 +----------------+------------+------+-----+---------+-------+
 | source_uuid    | char(36)   | NO   | PRI | NULL    |       |
 | interval_start | bigint(20) | NO   | PRI | NULL    |       |
 | interval_end   | bigint(20) | NO   |     | NULL    |       |
 +----------------+------------+------+-----+---------+-------+

mysql.gtid_executed表记录的是服务器上已经执行事务的GTID。三个字段分别表示发起事务的服务器UUID、UUID集的起始和结束事务ID。对于单个GTID,后两个字段的值相同。

3> 版本支持

5.6 版本新加的特性,5.7中做了加强 5.6 中不开启,没有这个功能. 5.7 中的GTID,即使不开也会有自动生成 SET @@SESSION.GTID_NEXT= 'ANONYMOUS'

 mysql> show variables like '%gtid%';
 +----------------------------------+-----------+
 | Variable_name                    | Value     |
 +----------------------------------+-----------+
 | binlog_gtid_simple_recovery      | ON        |
 | enforce_gtid_consistency         | OFF       |
 | gtid_executed                    |           |
 | gtid_executed_compression_period | 0         |
 | gtid_mode                        | OFF       | #8.0默认关闭
 | gtid_next                        | AUTOMATIC |
 | gtid_owned                       |           |
 | gtid_purged                      |           |
 | session_track_gtids              | OFF       |
 +----------------------------------+-----------+
 9 rows in set (0.06 sec)
4>开启gtid
 vim /etc/my.cnf
 [mysqld]
 gtid-mode=on
 enforce-gtid-consistency=true

重启服务后查看:

 mysql> show variables like "%gtid%";
 +----------------------------------+-----------+
 | Variable_name                    | Value     |
 +----------------------------------+-----------+
 | binlog_gtid_simple_recovery      | ON        |
 | enforce_gtid_consistency         | ON        |
 | gtid_executed                    |           |
 | gtid_executed_compression_period | 0         |
 | gtid_mode                        | ON        | #已开启
 | gtid_next                        | AUTOMATIC |
 | gtid_owned                       |           |
 | gtid_purged                      |           |
 | session_track_gtids              | OFF       |
 +----------------------------------+-----------+
 9 rows in set (0.01 sec)
5>DDL和DML语句查看gtid

DDL一个语句产生一个gtid

 mysql> create database db3;
 Query OK, 1 row affected (0.00 sec)
 ​
 mysql> show master status; #此语句提供有关源服务器二进制日志文件的状态信息,通过该命令可以了解当前主数据库的状态,以及正在写入的二进制日志文件名和位置,方便进行备份和恢复操作。
 +------------------+----------+--------------+------------------+----------------------------------------+
 | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                      |
 +------------------+----------+--------------+------------------+----------------------------------------+
 | mysql-bin.000013 |      310 |              |                  | 6181523d-bc2e-11ea-a78b-000c29221146:1 |
 +------------------+----------+--------------+------------------+----------------------------------------+
 1 row in set (0.00 sec)
 mysql> use db3
 #1.File:当前正在写入的二进制日志文件名。
 #2.Position:当前正在写入的二进制日志文件的位置。
 #3.Binlog Do DB:指定需要写入二进制日志的数据库名。
 #4. Binlog lgnore DB:指定不需要写入二进制日志的数据库名。
 ​
 Database changed
 mysql> create table t1 (id int);
 Query OK, 0 rows affected (0.01 sec)
 ​
 mysql> show master status;
 +------------------+----------+--------------+------------------+------------------------------------------+
 | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                        |
 +------------------+----------+--------------+------------------+------------------------------------------+
 | mysql-bin.000013 |      471 |              |                  | 6181523d-bc2e-11ea-a78b-000c29221146:1-2 |
 +------------------+----------+--------------+------------------+------------------------------------------+
 1 row in set (0.00 sec)
 ​
 mysql> create table t2 (id int);
 Query OK, 0 rows affected (0.01 sec)
 ​
 mysql> show master status;
 +------------------+----------+--------------+------------------+------------------------------------------+
 | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                        |
 +------------------+----------+--------------+------------------+------------------------------------------+
 | mysql-bin.000013 |      632 |              |                  | 6181523d-bc2e-11ea-a78b-000c29221146:1-3 |
 +------------------+----------+--------------+------------------+------------------------------------------+
 1 row in set (0.00 sec)
 ​
 mysql> create table t3 (id int);
 Query OK, 0 rows affected (0.01 sec)
 ​
 mysql> show master status;
 +------------------+----------+--------------+------------------+------------------------------------------+
 | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                        |
 +------------------+----------+--------------+------------------+------------------------------------------+
 | mysql-bin.000013 |      793 |              |                  | 6181523d-bc2e-11ea-a78b-000c29221146:1-4 |
 +------------------+----------+--------------+------------------+------------------------------------------+
 1 row in set (0.00 sec)

DML一个事务产生一个gtid

 DML一个事务产生一个gtid
 mysql> begin;
 Query OK, 0 rows affected (0.00 sec)
 ​
 mysql> insert into t1 values(1);
 Query OK, 1 row affected (0.02 sec)
 ​
 mysql> insert into t1 values(2);
 Query OK, 1 row affected (0.00 sec)
 ​
 mysql> commit;
 Query OK, 0 rows affected (0.00 sec)
 ​
 mysql> show master status;
 +------------------+----------+--------------+------------------+------------------------------------------+
 | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                        |
 +------------------+----------+--------------+------------------+------------------------------------------+
 | mysql-bin.000013 |     1128 |              |                  | 6181523d-bc2e-11ea-a78b-000c29221146:1-5 |
 +------------------+----------+--------------+------------------+------------------------------------------+
 1 row in set (0.00 sec)
 ​
 mysql> begin;
 Query OK, 0 rows affected (0.00 sec)
 ​
 mysql> insert into t2 values(1);
 Query OK, 1 row affected (0.00 sec)
 ​
 mysql> commit;
 Query OK, 0 rows affected (0.00 sec)
 ​
 mysql> show master status;
 +------------------+----------+--------------+------------------+------------------------------------------+
 | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                        |
 +------------------+----------+--------------+------------------+------------------------------------------+
 | mysql-bin.000013 |     1379 |              |                  | 6181523d-bc2e-11ea-a78b-000c29221146:1-6 |
 +------------------+----------+--------------+------------------+------------------------------------------+
 1 row in set (0.00 sec)s
6>基于GTID进行查看binlog
 mysql> SHOW BINLOG EVENTS IN 'mysql-bin.000013';
 +------------------+------+----------------+-----------+-------------+-------------------------------------------------------------------+
 | Log_name         | Pos  | Event_type     | Server_id | End_log_pos | Info                                                              |
 +------------------+------+----------------+-----------+-------------+-------------------------------------------------------------------+
 | mysql-bin.000013 |    4 | Format_desc    |       123 |         123 | Server ver: 5.7.14-log, Binlog ver: 4                             |
 | mysql-bin.000013 |  123 | Previous_gtids |       123 |         154 |                                                                   |
 | mysql-bin.000013 |  154 | Gtid           |       123 |         219 | SET @@SESSION.GTID_NEXT= '6181523d-bc2e-11ea-a78b-000c29221146:1' |
 | mysql-bin.000013 |  219 | Query          |       123 |         310 | create database db3                                               |
 | mysql-bin.000013 |  310 | Gtid           |       123 |         375 | SET @@SESSION.GTID_NEXT= '6181523d-bc2e-11ea-a78b-000c29221146:2' |
 | mysql-bin.000013 |  375 | Query          |       123 |         471 | use `db3`; create table t1 (id int)                               |
 | mysql-bin.000013 |  471 | Gtid           |       123 |         536 | SET @@SESSION.GTID_NEXT= '6181523d-bc2e-11ea-a78b-000c29221146:3' |
 | mysql-bin.000013 |  536 | Query          |       123 |         632 | use `db3`; create table t2 (id int)                               |
 | mysql-bin.000013 |  632 | Gtid           |       123 |         697 | SET @@SESSION.GTID_NEXT= '6181523d-bc2e-11ea-a78b-000c29221146:4' |
 | mysql-bin.000013 |  697 | Query          |       123 |         793 | use `db3`; create table t3 (id int)                               |
 | mysql-bin.000013 |  793 | Gtid           |       123 |         858 | SET @@SESSION.GTID_NEXT= '6181523d-bc2e-11ea-a78b-000c29221146:5' |
 | mysql-bin.000013 |  858 | Query          |       123 |         929 | BEGIN                                                             |
 | mysql-bin.000013 |  929 | Table_map      |       123 |         973 | table_id: 108 (db3.t1)                                            |
 | mysql-bin.000013 |  973 | Write_rows     |       123 |        1013 | table_id: 108 flags: STMT_END_F                                   |
 | mysql-bin.000013 | 1013 | Table_map      |       123 |        1057 | table_id: 108 (db3.t1)                                            |
 | mysql-bin.000013 | 1057 | Write_rows     |       123 |        1097 | table_id: 108 flags: STMT_END_F                                   |
 | mysql-bin.000013 | 1097 | Xid            |       123 |        1128 | COMMIT /* xid=21 */                                               |
 | mysql-bin.000013 | 1128 | Gtid           |       123 |        1193 | SET @@SESSION.GTID_NEXT= '6181523d-bc2e-11ea-a78b-000c29221146:6' |
 | mysql-bin.000013 | 1193 | Query          |       123 |        1264 | BEGIN                                                             |
 | mysql-bin.000013 | 1264 | Table_map      |       123 |        1308 | table_id: 109 (db3.t2)                                            |
 | mysql-bin.000013 | 1308 | Write_rows     |       123 |        1348 | table_id: 109 flags: STMT_END_F                                   |
 | mysql-bin.000013 | 1348 | Xid            |       123 |        1379 | COMMIT /* xid=26 */                                               |
 +------------------+------+----------------+-----------+-------------+-------------------------------------------------------------------+
 22 rows in set (0.00 sec)

具备GTID后,截取查看某些事务日志: --include-gtids 包含哪些gtid --exclude-gtids 排除哪些gtid

7>示例:演示跨binlog文件截取日志
1、素材准备

第一次操作:

 mysql> show master status;
 +------------------+----------+--------------+------------------+------------------------------------------+
 | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                        |
 +------------------+----------+--------------+------------------+------------------------------------------+
 | mysql-bin.000013 |     1379 |              |                  | 6181523d-bc2e-11ea-a78b-000c29221146:1-6 |
 +------------------+----------+--------------+------------------+------------------------------------------+
 1 row in set (0.00 sec)
 ​
 mysql> create database gtid;
 Query OK, 1 row affected (0.01 sec)
 ​
 mysql> use gtid
 Database changed
 mysql> create table t1(id int);
 Query OK, 0 rows affected (0.00 sec)
 ​
 mysql> begin;
 Query OK, 0 rows affected (0.00 sec)
 ​
 mysql> insert into t1 values(1);
 Query OK, 1 row affected (0.00 sec)
 ​
 mysql> commit;
 Query OK, 0 rows affected (0.00 sec)
 ​
 mysql> flush logs;
 Query OK, 0 rows affected (0.00 sec)

第二次操作:

 mysql> create table t2(id int);
 Query OK, 0 rows affected (0.00 sec)
 ​
 mysql> begin;
 Query OK, 0 rows affected (0.00 sec)
 ​
 mysql> insert into t2 values(1);
 Query OK, 1 row affected (0.00 sec)
 ​
 mysql> commit;
 Query OK, 0 rows affected (0.00 sec)
 ​
 mysql> flush logs;
 Query OK, 0 rows affected (0.01 sec)

第三次操作:

 mysql> create table t3(id int);
 Query OK, 0 rows affected (0.00 sec)
 ​
 mysql> begin;
 Query OK, 0 rows affected (0.00 sec)
 ​
 mysql> insert into t3 values(1);
 Query OK, 1 row affected (0.00 sec)
 ​
 mysql> commit;
 Query OK, 0 rows affected (0.01 sec)
 ​
 #数据库误删
 mysql> drop database gtid;
 Query OK, 3 rows affected (0.01 sec)
2、使用binlog日志恢复误删除的gtid数据库

(1)首先要确定gtid的起始和结束

 mysql> show binlog events in 'mysql-bin.000013';
 ...
 | mysql-bin.000013 | 1379 | Gtid           |       123 |        1444 | SET @@SESSION.GTID_NEXT= '6181523d-bc2e-11ea-a78b-000c29221146:7' |
 | mysql-bin.000013 | 1444 | Query          |       123 |        1538 | create database gtid    
 ...
 ​
 开始:
 文件:mysql-bin.000013
 gtid:'6181523d-bc2e-11ea-a78b-000c2921146:7' 
 mysql> show master status;
 +------------------+----------+--------------+------------------+-------------------------------------------+
 | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                         |
 +------------------+----------+--------------+------------------+-------------------------------------------+
 | mysql-bin.000015 |      766 |              |                  | 6181523d-bc2e-11ea-a78b-000c29221146:1-14 |
 +------------------+----------+--------------+------------------+-------------------------------------------+
 1 row in set (0.00 sec)
 ​
 mysql> show binlog events in 'mysql-bin.000015';
 +------------------+-----+----------------+-----------+-------------+--------------------------------------------------------------------+
 | Log_name         | Pos | Event_type     | Server_id | End_log_pos | Info                                                               |
 +------------------+-----+----------------+-----------+-------------+--------------------------------------------------------------------+
 | mysql-bin.000015 |   4 | Format_desc    |       123 |         123 | Server ver: 5.7.14-log, Binlog ver: 4                              |
 | mysql-bin.000015 | 123 | Previous_gtids |       123 |         194 | 6181523d-bc2e-11ea-a78b-000c29221146:1-11                          |
 | mysql-bin.000015 | 194 | Gtid           |       123 |         259 | SET @@SESSION.GTID_NEXT= '6181523d-bc2e-11ea-a78b-000c29221146:12' |
 | mysql-bin.000015 | 259 | Query          |       123 |         356 | use `gtid`; create table t3(id int)                                |
 | mysql-bin.000015 | 356 | Gtid           |       123 |         421 | SET @@SESSION.GTID_NEXT= '6181523d-bc2e-11ea-a78b-000c29221146:13' |
 | mysql-bin.000015 | 421 | Query          |       123 |         493 | BEGIN                                                              |
 | mysql-bin.000015 | 493 | Table_map      |       123 |         538 | table_id: 112 (gtid.t3)                                            |
 | mysql-bin.000015 | 538 | Write_rows     |       123 |         578 | table_id: 112 flags: STMT_END_F                                    |
 | mysql-bin.000015 | 578 | Xid            |       123 |         609 | COMMIT /* xid=50 */                                                |
 | mysql-bin.000015 | 609 | Gtid           |       123 |         674 | SET @@SESSION.GTID_NEXT= '6181523d-bc2e-11ea-a78b-000c29221146:14' |
 | mysql-bin.000015 | 674 | Query          |       123 |         766 | drop database gtid                                                 |
 +------------------+-----+----------------+-----------+-------------+--------------------------------------------------------------------+
 11 rows in set (0.00 sec)
 ​
 ​
 确定结束:
 文件:mysql-bin.000015 
 gtid:'6181523d-bc2e-11ea-a78b-000c29221146:14'

(2)其次,binlog使用gtid截取日志

确认范围:7-13

文件:mysql-bin.000013 mysql-bin.000014 mysql-bin.000015

 [root@mysql ~]# cd /var/lib/mysql
 [root@mysql mysql]# mysqlbinlog --include-gtids='6181523d-bc2e-11ea-a78b-000c29221146:7-13' mysql-bin.000013 mysql-bin.000014 mysql-bin.000015 -r /tmp/gtid1.sql
 -r,----result-file=name:此选项指示mysqlbinlog将文本输出写入到的文件

(3)最后使用binlog日志恢复

 mysql> set sql_log_bin=0;  #设为0后,在Master数据库上执行的语句都不记录binlog
 Query OK, 0 rows affected (0.00 sec)
 ​
 mysql> source /tmp/gtid1.sql
 mysql> set sql_log_bin=1;
 Query OK, 0 rows affected (0.00 sec)
 mysql> show databases like 'gtid';
 Empty set (0.00 sec)

发现并没有恢复成功,为什么?

原因是GTID幂等性。

3、GTID幂等性

开启GTID后,MySQL恢复Binlog时,重复GTID的事务不会再执行了 就想恢复?怎么办? --skip-gtids

接着上面,截取日志时添加--skip-gtids

 [root@mysql mysql]# mysqlbinlog --skip-gtids --include-gtids='6181523d-bc2e-11ea-a78b-000c29221146:7-13' mysql-bin.000013 mysql-bin.000014 mysql-bin.000015 -r /tmp/gtid2.sql

恢复成功:

 mysql> set sql_log_bin=0;
 Query OK, 0 rows affected (0.00 sec)
 ​
 mysql> source /tmp/gtid2.sql
 ​
 mysql> set sql_log_bin=1;
 Query OK, 0 rows affected (0.00 sec)
 ​
 mysql> show databases like 'gtid';
 +-----------------+
 | Database (gtid) |
 +-----------------+
 | gtid            |
 +-----------------+
 1 row in set (0.00 sec)
 ​
 mysql> select * from gtid.t1;
 +------+
 | id   |
 +------+
 |    1 |
 +------+
 1 row in set (0.00 sec)

2.3 第三方工具mydumper备份数据库

 [root@localhost mysqlbak]# wget -c https://github.com/mydumper/mydumper/releases/download/v0.15.1-3/mydumper-0.15.1-3.el8.x86_64.rpm
 ​
 安装:
 [root@localhost mysqlbak]# dnf install mydumper-0.15.1-3.el8.x86_64.rpm
 ​
 [root@localhost mysqlbak]# mydumper --help
 Usage:
   mydumper [OPTION…] multi-threaded MySQL dumping
 ​
 备份:
 [root@localhost mysqlbak]# mydumper -B it -o /bak
 [root@localhost mysqlbak]# ll /bak/
 total 16K
 -rw-r--r-- 1 root root 151 Feb 19 14:23 it-schema-create.sql
 -rw-r--r-- 1 root root   0 Feb 19 14:23 it-schema-triggers.sql
 -rw-r--r-- 1 root root 354 Feb 19 14:23 it.Student.00000.sql
 -rw-r--r-- 1 root root 478 Feb 19 14:23 it.Student-schema.sql
 -rw-r--r-- 1 root root 308 Feb 19 14:23 metadata
 ​
 还原:
 [root@localhost mysqlbak]# myloader -d /bak/ -o
 ​

2.4 lvm快照备份

 前提:
     数据文件要在逻辑卷上;
     此逻辑卷所在卷组必须有足够空间使用快照卷;
     数据文件和事务日志要在同一个逻辑卷上;
     
 前提:MySQL数据lv和将要创建的快照要在同一vg,vg要有足够的空间存储
 优点:
     几乎是热备(创建快照前把表上锁,创建完毕后立即释放)
     支持所有的存储引擎
     备份速度快
     无需使用昂贵的商业软件(操作系统级别的)
 缺点:
     可能需要部门协调(使用操作系统级别的命令,DBA一般没有权限)
     无法预计服务停止时间
     数据如果分布在多个卷上比较麻烦
 操作流程
 1)锁表 flush table with read lock
 2)查看position号并记录,便于后期恢复 show master status
 3)创建snapshot(快照) create snapshop
 4)解表 unlock tables
 5)挂载snapshot 
 6)拷贝snapshot数据,进行备份。备份整个数据库之前,要关闭mysql服务(保护ibdata1文件)
 7)卸载

演示:

 一、数据迁移到逻辑卷上
  环境:数据文件不在逻辑卷上,那么需要将数据文件迁移到逻辑卷上
 1、创建一个逻辑卷
 [root@Admin ~]# pvcreate /dev/sdb
 [root@Admin ~]# vgcreate mysql /dev/sdb1
 [root@Admin ~]# lvcreate -n lv_mysql -L 4G mysql
 [root@Admin ~]# mkfs.ext4 /dev/mysql/lv_mysql 
 ​
 2、将当前的mysql数据库迁移到逻辑卷上
  1>先停止应用
  2>停止mysql服务    
     [root@Admin ~]# systemctl stop mysqld
  3>备份所有的数据文件到指定的地方
     [root@localhost ~]# tar czf /tmp/mysql.tar.gz /var/lib/mysql/*
  4>挂载逻辑卷到当前mysql的数据目录里
     [root@localhost ~]# mount /dev/mysql/lv_mysql /var/lib/mysql
  5>将刚刚备份的数据解压到数据目录里
     [root@localhost ~]# tar xf /tmp/mysql.tar.gz -C /var/lib/mysql
  6>启动数据库
     权限变成了root,更改权限重新启动
     [root@Admin ~]# chown mysql. -R /var/lib/mysql/ && service mysqld start
     
 二、快照备份数据库
 1、给数据库加锁,只读
 mysql>flush table with read lock;
 2、给mysql的数据文件所在的的逻辑卷创建快照
 [root@Admin ~]# lvcreate -n lv_mysql_s -L 50M -s /dev/vg01/lv_mysql
 3、解锁数据库
 mysql>unlock tables;
 以上1-3需要在一个会话完成
 4、将快照挂载到临时目录中
 [root@Admin ~]# mkdir /mnt/mysql
 [root@Admin ~]# mount /dev/vg01/lv_mysql_s /mnt/mysql
 5、备份数据
 [root@Admin ~]# midir /backup 
 [root@Admin ~]# rsync -av /mnt/mysql /backup
 6、卸载快照并删除
 [root@Admin ~]# umount /dev/vg01/lv_mysql_s
 [root@Admin ~]# lvremove /dev/vg01/lv_mysql_s

脚本:

 [root@localhost ~]# more bak_mysql.sh 
 #!/bin/bash
 ​
 bak_dir=/bak/$(date +%F)
 [ -d ${bak_dir} ] || mkdir -p ${bak_dir}
 ​
 echo "flush tables with read lock; system lvcreate -n lv_mysql_s -L 500M -s /dev/mysql/lv_mysql; unlock tables;"
  | mysql -uroot -p123456
 ​
 [ -d /mnt/mysql/ ] || mkdir /mnt/mysql
 mount /dev/mysql/lv_mysql_s /mnt/mysql
 ​
 rsync -az /mnt/mysql/ ${bak_dir}
 if [ $? -eq 0 ]
 then
   umount /mnt/mysql/ && lvremove -f /dev/mysql/lv_mysql_s &>/dev/null
 fi

2.5 xtrabackup备份(第三方工具)

下载地址:Software Downloads - Percona

参考文档:Percona XtraBackup

1、安装:

 [root@Admin ~]# wget -c https://downloads.percona.com/downloads/Percona-XtraBackup-8.0/Percona-XtraBackup-8.0.35-30/binary/tarball/percona-xtrabackup-8.0.35-30-Linux-x86_64.glibc2.17.tar.gz
 [root@Admin ~]# tar xf percona-xtrabackup-8.0.35-30-Linux-x86_64.glibc2.17.tar.gz -C /opt
 [root@Admin ~]# ln -sv /opt/percona-xtrabackup-8.0.35-30-Linux-x86_64.glibc2.17/bin/xtrabackup /usr/bin/xtrabackup

2、准备工作

官方不推荐使用root用户

 #创建数据用户,并设置相关权限
 mysql> CREATE USER 'bkpuser'@'%'IDENTIFIED with mysql_native_password  BY 'Bak@123.com';
 mysql> GRANT BACKUP_ADMIN, PROCESS, RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'bkpuser'@'%';
 mysql> GRANT SELECT ON performance_schema.log_status TO 'bkpuser'@'%';
 mysql> GRANT SELECT ON performance_schema.keyring_component_status TO bkpuser@'%';
 mysql> GRANT SELECT ON performance_schema.replication_group_members TO bkpuser@'%';
 mysql> FLUSH PRIVILEGES;

3、备份

 完全备份
 [root@localhost ~]# mkdir /data
 [root@localhost ~]# xtrabackup --backup --target-dir=/data/backups/ -u'bkpuser' -p'Bak@123.com' -H127.0.0.1
 ​
 增量备份
 插入数据
 mysql> insert into it.Student values(7,'john','男',22,'电子商务');
 [root@localhost ~]# xtrabackup --backup --target-dir=/data/incr1/ -u'bkpuser' -p'Bak@123.com' -H127.0.0.1 --incremental-basedir=/data/backups/
 --incremental-basedir=/data/backups/ 基于/data/backups做增量备份
 ​
 ​
 再次插入数据
 mysql> insert into it.Student values(8,'bob','女',21,'英语'),(9,'smith','男',20,'计算机网络');
 第二次增量备份
 [root@localhost ~]# xtrabackup --backup --target-dir=/data/incr2/ -u'bkpuser' -p'Bak@123.com' -H127.0.0.1 --incremental-basedir=/data/incr1/

4、还原

使用 XtraBackup 产生的备份数据无法直接使用 在数据备份(--backup)后,由于数据文件复制的时间点不同,因此数据不一致而无法使用。另外 InnoDB 会将这些数据文件视为损坏,将拒绝启动。

如何才能使备份数据正常使用,以用于数据库恢复 需要对数据进行“预备”(prepare)操作,使数据文件完全一致,然后才能用于数据恢复及在 InnoDB 中运行。

 模拟破坏数据
 mysql> drop database it;
 ​
 --apply-log-only    //这个选项使在准备备份(prepare)时,只执行重做(redo)阶段,这对于增量备份非常重要。
 准备完全备份
 [root@node1 ~]# xtrabackup --prepare --apply-log-only --target-dir=/data/backups/ 
             
 应用第一次增量备份到完全备份
 [root@node1 ~]# xtrabackup --prepare --apply-log-only --target-dir=/data/backups/ --incremental-dir=/data/incr1/
 ​
 应用第二次增量备份到完全备份
 [root@node1 ~]# xtrabackup --prepare --apply-log-only --target-dir=/data/backups/ --incremental-dir=/data/incr2/
 ​
 ​
 最后执行:
 [root@node1 ~]# xtrabackup --prepare --target-dir=/data/backups/
 [root@node1 ~]# systemctl stop mysqld
 [root@node1 ~]# rm -rf /var/lib/mysql/*
 [root@node1 ~]# xtrabackup --copy-back --target-dir=/data/backups/
 ​
 [root@node1 ~]# chown -R mysql:mysql /var/lib/mysql
 [root@node1 ~]# systemctl start mysqld
  • 19
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值