MySQL的备份与恢复

使用mysqldump+binlog备份

备份素材:

create database school;
use school

CREATE TABLE stu (
Sno INT PRIMARY KEY,
Sname VARCHAR(50),
Ssex ENUM('Male', 'Female'),
Sage INT,
Sdept VARCHAR(50)
);

INSERT INTO stu (Sno, Sname, Ssex, Sage, Sdept)
VALUES (1, 'Alice', 'Female', 20, 'Mathematics'),
(2, 'Bob', 'Male', 22, 'Computer Science'),
(3, 'Charlie', 'Male', 21, 'Engineering'),
(4, 'David', 'Female', 19, 'Literature');

完全备份:

[root@node1 ~]# mysqldump -B school > /tmp/fullbackup.sql
[root@node1 ~]# cat /tmp/fullbackup.sql 
-- MySQL dump 10.13  Distrib 8.0.36, for Linux (x86_64)
--
-- Host: localhost    Database: school
-- ------------------------------------------------------
-- Server version    8.0.36

/*!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 */;
/*!50503 SET NAMES utf8mb4 */;
/*!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 */;

--
-- Current Database: `school`
--

CREATE DATABASE /*!32312 IF NOT EXISTS*/ `school` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */ /*!80016 DEFAULT ENCRYPTION='N' */;

USE `school`;

--
-- Table structure for table `stu`
--

DROP TABLE IF EXISTS `stu`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `stu` (
  `Sno` int NOT NULL,
  `Sname` varchar(50) DEFAULT NULL,
  `Ssex` enum('Male','Female') DEFAULT NULL,
  `Sage` int DEFAULT NULL,
  `Sdept` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`Sno`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `stu`
--

LOCK TABLES `stu` WRITE;
/*!40000 ALTER TABLE `stu` DISABLE KEYS */;
INSERT INTO `stu` VALUES (1,'Alice','Female',20,'Mathematics'),(2,'Bob','Male',22,'Computer Science'),(3,'Charlie','Male',21,'Engineering'),(4,'David','Female',19,'Literature');
/*!40000 ALTER TABLE `stu` 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 2024-02-21 14:49:43

全量备份恢复:

[root@node1 ~]# mysql -e 'drop database school'  #删库模拟数据丢失
[root@node1 ~]# mysql -e 'show databases'
+-----------------------------+
| Database                    |
+-----------------------------+
| information_schema   |
| mysql                          |
| performance_schema |
| sys                               |
+------------------------------+
[root@node1 ~]# mysql < /tmp/fullbackup.sql   #恢复
[root@node1 ~]# mysql -e 'show databases'
+-------------------------------+
| Database                      |
+-------------------------------+
| information_schema     |
| mysql                            |
| performance_schema   |
| school                           |
| sys                                |
+-------------------------------+
[root@node1 ~]# mysql -e 'select * from school.stu'
+-----+---------+--------+------+------------------+
| Sno | Sname   | Ssex   | Sage | Sdept            |
+-----+---------+--------+------+------------------+
|   1 | Alice   | Female |   20 | Mathematics      |
|   2 | Bob     | Male   |   22 | Computer Science |
|   3 | Charlie | Male   |   21 | Engineering      |
|   4 | David   | Female |   19 | Literature       |
+-----+---------+--------+------+------------------+

#也可以使用source恢复
[root@node1 ~]# mysql -e 'drop database school'
[root@node1 ~]# mysql -e 'show databases'
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
[root@node1 ~]# mysql -e 'source /tmp/fullbackup.sql'
[root@node1 ~]# mysql -e 'show databases'
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| school             |
| sys                |
+--------------------+
[root@node1 ~]# mysql -e 'select * from school.stu'
+-----+---------+--------+------+------------------+
| Sno | Sname   | Ssex   | Sage | Sdept            |
+-----+---------+--------+------+------------------+
|   1 | Alice   | Female |   20 | Mathematics      |
|   2 | Bob     | Male   |   22 | Computer Science |
|   3 | Charlie | Male   |   21 | Engineering      |
|   4 | David   | Female |   19 | Literature       |
+-----+---------+--------+------+------------------+

增量备份:

MySQL 8.0 默认开启binglog日志
素材准备

#第一次增量备份
INSERT INTO stu (Sno, Sname, Ssex, Sage, Sdept) VALUES (5, 'Emma', 'Female', 20, 'Mathematics'),(6, 'Tom', 'Male', 22, 'Computer Science');

mysql> select sleep(10);
+-----------+
| sleep(10) |
+-----------+
|         0 |
+-----------+
1 row in set (10.01 sec)

#第二次增量备份
INSERT INTO stu (Sno, Sname, Ssex, Sage, Sdept) VALUES (7, 'Lily', 'Female', 21, 'Engineering'),(8, 'Jack', 'Male', 19, 'Literature');

mysql> select sleep(30);
+-----------+
| sleep(30) |
+-----------+
|         0 |
+-----------+
1 row in set (30.00 sec)

mysql> select * from stu;
+-----+---------+--------+------+------------------+
| Sno | Sname   | Ssex   | Sage | Sdept            |
+-----+---------+--------+------+------------------+
|   1 | Alice   | Female |   20 | Mathematics      |
|   2 | Bob     | Male   |   22 | Computer Science |
|   3 | Charlie | Male   |   21 | Engineering      |
|   4 | David   | Female |   19 | Literature       |
|   5 | Emma    | Female |   20 | Mathematics      |
|   6 | Tom     | Male   |   22 | Computer Science |
|   7 | Lily    | Female |   21 | Engineering      |
|   8 | Jack    | Male   |   19 | Literature       |
+-----+---------+--------+------+------------------+
8 rows in set (0.00 sec)

mysql> drop database school;

#再增量备份前一定有一次完全备份
mysql> source /tmp/fullbackup.sql  #先恢复增量备份
mysql> select * from school.stu;
+-----+---------+--------+------+------------------+
| Sno | Sname   | Ssex   | Sage | Sdept            |
+-----+---------+--------+------+------------------+
|   1 | Alice   | Female |   20 | Mathematics      |
|   2 | Bob     | Male   |   22 | Computer Science |
|   3 | Charlie | Male   |   21 | Engineering      |
|   4 | David   | Female |   19 | Literature       |
+-----+---------+--------+------+------------------+
4 rows in set (0.00 sec)

增量备份恢复:

1、检查全备后的所有binlog
[root@node1 ~]# ll /var/lib/mysql/bin*
-rw-r-----. 1 mysql mysql  157 Feb 21 15:31 /var/lib/mysql/binlog.000006
-rw-r-----. 1 mysql mysql 3717 Feb 21 15:40 /var/lib/mysql/binlog.000007
-rw-r-----. 1 mysql mysql   32 Feb 21 15:31 /var/lib/mysql/binlog.index

2.保护现场立即刷新日志
[root@node1 ~]# mysqladmin flush-logs 
[root@node1 ~]# ll /var/lib/mysql/bin*
-rw-r-----. 1 mysql mysql  157 Feb 21 15:31 /var/lib/mysql/binlog.000006
-rw-r-----. 1 mysql mysql 3761 Feb 21 15:41 /var/lib/mysql/binlog.000007
-rw-r-----. 1 mysql mysql  157 Feb 21 15:41 /var/lib/mysql/binlog.000008
-rw-r-----. 1 mysql mysql   48 Feb 21 15:41 /var/lib/mysql/binlog.index
[root@node1 ~]# mysql -e 'show binary logs;'
+---------------+-----------+-----------+
| Log_name      | File_size | Encrypted |
+---------------+-----------+-----------+
| binlog.000006 |       157 | No        |
| binlog.000007 |      3761 | No        |
| binlog.000008 |       157 | No        |
+---------------+-----------+-----------+
#现在不会再往binlog.000007里记录数据了
[root@node1 ~]# cp /var/lib/mysql/binlog.000007 /mysqlbak  #做个冷备

3、查看刷新的binlog日志,
#注意5.7版本,insert语句已经加密,默认看不到,查看时加上选项 --base64-output=DECODE-ROWS -vv

[root@node1 ~]# mysqlbinlog --base64-output=decode-rows -vv  /var/lib/mysql/binlog.000007                                                  
#找到后来的insert语句的部分

BEGIN
/*!*/;
# at 1196
#240221 15:35:27 server id 1  end_log_pos 1262 CRC32 0xc14ac894         Table_map: `school`.`stu` mapped to number 90
# has_generated_invisible_primary_key=0
# at 1262
#240221 15:35:27 server id 1  end_log_pos 1355 CRC32 0x21da1ca0         Write_rows: table id 90 flags: STMT_END_F
### INSERT INTO `school`.`stu`
### SET
###   @1=5 /* INT meta=0 nullable=0 is_null=0 */
###   @2='Emma' /* VARSTRING(200) meta=200 nullable=1 is_null=0 */
###   @3=2 /* ENUM(1 byte) meta=63233 nullable=1 is_null=0 */
###   @4=20 /* INT meta=0 nullable=1 is_null=0 */
###   @5='Mathematics' /* VARSTRING(200) meta=200 nullable=1 is_null=0 */
### INSERT INTO `school`.`stu`
### SET
###   @1=6 /* INT meta=0 nullable=0 is_null=0 */
###   @2='Tom' /* VARSTRING(200) meta=200 nullable=1 is_null=0 */
###   @3=1 /* ENUM(1 byte) meta=63233 nullable=1 is_null=0 */
###   @4=22 /* INT meta=0 nullable=1 is_null=0 */
###   @5='Computer Science' /* VARSTRING(200) meta=200 nullable=1 is_null=0 */
# at 1355
#240221 15:35:27 server id 1  end_log_pos 1386 CRC32 0x5bd46bfd         Xid = 48
COMMIT/*!*/;
# at 1386
#240221 15:36:47 server id 1  end_log_pos 1465 CRC32 0x93fd67b9         Anonymous_GTID  last_committed=4        sequence_number=5        rbr_only=yes    original_committed_timestamp=1708501007176819   immediate_commit_timestamp=1708501007176819      transaction_length=341
/*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*//*!*/;
# original_commit_timestamp=1708501007176819 (2024-02-21 15:36:47.176819 CST)
# immediate_commit_timestamp=1708501007176819 (2024-02-21 15:36:47.176819 CST)
/*!80001 SET @@session.original_commit_timestamp=1708501007176819*//*!*/;
/*!80014 SET @@session.original_server_version=80036*//*!*/;
/*!80014 SET @@session.immediate_server_version=80036*//*!*/;
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 1465
#240221 15:36:47 server id 1  end_log_pos 1542 CRC32 0x756150f3         Query   thread_id=10    exec_time=0     error_code=0
SET TIMESTAMP=1708501007/*!*/;
BEGIN
/*!*/;
# at 1542
#240221 15:36:47 server id 1  end_log_pos 1608 CRC32 0xefda7f38         Table_map: `school`.`stu` mapped to number 90
# has_generated_invisible_primary_key=0
# at 1608
#240221 15:36:47 server id 1  end_log_pos 1696 CRC32 0x972dfd69         Write_rows: table id 90 flags: STMT_END_F
### INSERT INTO `school`.`stu`
### SET
###   @1=7 /* INT meta=0 nullable=0 is_null=0 */
###   @2='Lily' /* VARSTRING(200) meta=200 nullable=1 is_null=0 */
###   @3=2 /* ENUM(1 byte) meta=63233 nullable=1 is_null=0 */
###   @4=21 /* INT meta=0 nullable=1 is_null=0 */
###   @5='Engineering' /* VARSTRING(200) meta=200 nullable=1 is_null=0 */
### INSERT INTO `school`.`stu`
### SET
###   @1=8 /* INT meta=0 nullable=0 is_null=0 */
###   @2='Jack' /* VARSTRING(200) meta=200 nullable=1 is_null=0 */
###   @3=1 /* ENUM(1 byte) meta=63233 nullable=1 is_null=0 */
###   @4=19 /* INT meta=0 nullable=1 is_null=0 */
###   @5='Literature' /* VARSTRING(200) meta=200 nullable=1 is_null=0 */
# at 1696
#240221 15:36:47 server id 1  end_log_pos 1727 CRC32 0x75a1b152         Xid = 50
COMMIT/*!*/;
# at 1727
#240221 15:39:01 server id 1  end_log_pos 1804 CRC32 0x1fc4c31d         Anonymous_GTID  last_committed=5        sequence_number=6        rbr_only=no     original_committed_timestamp=1708501141321225   immediate_commit_timestamp=1708501141321225      transaction_length=187

4、基于时间恢复
#开始时间为begin后的第一个,结束时间为COMMIT后的第一个
[root@node1 ~]# mysqlbinlog /var/lib/mysql/binlog.000007 --start-datetime='2024-02-21 15:35:27' --stop-datetime='2024-02-21 15:36:47' > /tmp/incrementbackup1.sql
[root@node1 ~]# mysql < /tmp/incrementbackup1.sql 
[root@node1 ~]# mysql -e 'select * from school.stu;'   
+-----+---------+--------+------+------------------+
| Sno | Sname   | Ssex   | Sage | Sdept            |
+-----+---------+--------+------+------------------+
|   1 | Alice   | Female |   20 | Mathematics      |
|   2 | Bob     | Male   |   22 | Computer Science |
|   3 | Charlie | Male   |   21 | Engineering      |
|   4 | David   | Female |   19 | Literature       |
|   5 | Emma    | Female |   20 | Mathematics      |
|   6 | Tom     | Male   |   22 | Computer Science |
+-----+---------+--------+------+------------------+

4、基于位置恢复
#起始位置为begin后的第一个,终止位置为COMMIT后的第一个
[root@node1 ~]# mysqlbinlog --start-position=1542 --stop-position=1727 /var/lib/mysql/binlog.000007 > /tmp/incrementbackup2.sql
[root@node1 ~]# mysql -e 'source /tmp/incrementbackup2.sql'  #恢复
[root@node1 ~]# mysql -e 'select * from school.stu;'
+-----+---------+--------+------+------------------+
| Sno | Sname   | Ssex   | Sage | Sdept            |
+-----+---------+--------+------+------------------+
|   1 | Alice   | Female |   20 | Mathematics      |
|   2 | Bob     | Male   |   22 | Computer Science |
|   3 | Charlie | Male   |   21 | Engineering      |
|   4 | David   | Female |   19 | Literature       |
|   5 | Emma    | Female |   20 | Mathematics      |
|   6 | Tom     | Male   |   22 | Computer Science |
|   7 | Lily    | Female |   21 | Engineering      |
|   8 | Jack    | Male   |   19 | Literature       |
+-----+---------+--------+------+------------------+

binglog日志的gtid的新特性

开启gtid

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       |
| gtid_next                        | AUTOMATIC |
| gtid_owned                       |           |
| gtid_purged                      |           |
| session_track_gtids              | OFF       |
+----------------------------------+-----------+
#开启gtid
mysql> system vim /etc/my.cnf
gtid-mode=on
enforce-gtid-consistency=true

mysql> system systemctl restart mysqld 
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.00 sec)

使用binlog的GTID特性进行增量备份

在一个干净的环境将刚才的素材导入这里省略
mysql> drop database school;
Query OK, 1 row affected (0.02 sec)

mysql> show master status\G   #一个DDL或者一个事务产生一个GTID
*************************** 1. row ***************************
             File: binlog.000008
         Position: 1914
     Binlog_Do_DB: 
 Binlog_Ignore_DB: 
Executed_Gtid_Set: 10fdd06f-b851-11ee-8253-000c29ae0c7f:1-6

mysql> flush logs;  #保护现场
mysql> show master status\G
*************************** 1. row ***************************
             File: binlog.000009
         Position: 197
     Binlog_Do_DB: 
 Binlog_Ignore_DB: 
Executed_Gtid_Set: 10fdd06f-b851-11ee-8253-000c29ae0c7f:1-6
1 row in set (0.00 sec)

binlog的GTID特性进行恢复

mysql> source /tmp/fullbackup.sql   #恢复全量备份
mysql> select * from stu;
+-----+---------+--------+------+------------------+
| Sno | Sname   | Ssex   | Sage | Sdept            |
+-----+---------+--------+------+------------------+
|   1 | Alice   | Female |   20 | Mathematics      |
|   2 | Bob     | Male   |   22 | Computer Science |
|   3 | Charlie | Male   |   21 | Engineering      |
|   4 | David   | Female |   19 | Literature       |
+-----+---------+--------+------+------------------+
4 rows in set (0.00 sec)

mysql> show binlog events in 'binlog.000008'\G  #查看
*************************** 1. row ***************************
   Log_name: binlog.000008
        Pos: 4
 Event_type: Format_desc
  Server_id: 1
End_log_pos: 126
       Info: Server ver: 8.0.36, Binlog ver: 4
*************************** 2. row ***************************
   Log_name: binlog.000008
        Pos: 126
 Event_type: Previous_gtids
  Server_id: 1
End_log_pos: 157
       Info: 
*************************** 3. row ***************************
   Log_name: binlog.000008
        Pos: 157
 Event_type: Gtid
  Server_id: 1
End_log_pos: 234
       Info: SET @@SESSION.GTID_NEXT= '10fdd06f-b851-11ee-8253-000c29ae0c7f:1'
*************************** 4. row ***************************
   Log_name: binlog.000008
        Pos: 234
 Event_type: Query
  Server_id: 1
End_log_pos: 348
       Info: create database school /* xid=3 */
*************************** 5. row ***************************
   Log_name: binlog.000008
        Pos: 348
 Event_type: Gtid
  Server_id: 1
End_log_pos: 427
       Info: SET @@SESSION.GTID_NEXT= '10fdd06f-b851-11ee-8253-000c29ae0c7f:2'
*************************** 6. row ***************************
   Log_name: binlog.000008
        Pos: 427
 Event_type: Query
  Server_id: 1
End_log_pos: 636
       Info: use `school`; CREATE TABLE stu (
Sno INT PRIMARY KEY,
Sname VARCHAR(50),
Ssex ENUM('Male', 'Female'),
Sage INT,
Sdept VARCHAR(50)

) /* xid=8 */
*************************** 7. row ***************************
   Log_name: binlog.000008
        Pos: 636
 Event_type: Gtid
  Server_id: 1
End_log_pos: 715
       Info: SET @@SESSION.GTID_NEXT= '10fdd06f-b851-11ee-8253-000c29ae0c7f:3'
*************************** 8. row ***************************
   Log_name: binlog.000008
        Pos: 715
 Event_type: Query
  Server_id: 1
End_log_pos: 792
       Info: BEGIN
*************************** 9. row ***************************
   Log_name: binlog.000008
        Pos: 792
 Event_type: Table_map
  Server_id: 1
End_log_pos: 858
       Info: table_id: 90 (school.stu)
*************************** 10. row ***************************
   Log_name: binlog.000008
        Pos: 858
 Event_type: Write_rows
  Server_id: 1
End_log_pos: 1009
       Info: table_id: 90 flags: STMT_END_F
*************************** 11. row ***************************
   Log_name: binlog.000008
        Pos: 1009
 Event_type: Xid
  Server_id: 1
End_log_pos: 1040
       Info: COMMIT /* xid=9 */
*************************** 12. row ***************************
   Log_name: binlog.000008
        Pos: 1040
 Event_type: Gtid
  Server_id: 1
End_log_pos: 1119
       Info: SET @@SESSION.GTID_NEXT= '10fdd06f-b851-11ee-8253-000c29ae0c7f:4'
*************************** 13. row ***************************
   Log_name: binlog.000008
        Pos: 1119
 Event_type: Query
  Server_id: 1
End_log_pos: 1196
       Info: BEGIN
*************************** 14. row ***************************
   Log_name: binlog.000008
        Pos: 1196
 Event_type: Table_map
  Server_id: 1
End_log_pos: 1262
       Info: table_id: 90 (school.stu)
*************************** 15. row ***************************
   Log_name: binlog.000008
        Pos: 1262
 Event_type: Write_rows
  Server_id: 1
End_log_pos: 1355
       Info: table_id: 90 flags: STMT_END_F
*************************** 16. row ***************************
   Log_name: binlog.000008
        Pos: 1355
 Event_type: Xid
  Server_id: 1
End_log_pos: 1386
       Info: COMMIT /* xid=49 */
*************************** 17. row ***************************
   Log_name: binlog.000008
        Pos: 1386
 Event_type: Gtid
  Server_id: 1
End_log_pos: 1465
       Info: SET @@SESSION.GTID_NEXT= '10fdd06f-b851-11ee-8253-000c29ae0c7f:5'
*************************** 18. row ***************************
   Log_name: binlog.000008
        Pos: 1465
 Event_type: Query
  Server_id: 1
End_log_pos: 1542
       Info: BEGIN
*************************** 19. row ***************************
   Log_name: binlog.000008
        Pos: 1542
 Event_type: Table_map
  Server_id: 1
End_log_pos: 1608
       Info: table_id: 90 (school.stu)
*************************** 20. row ***************************
   Log_name: binlog.000008
        Pos: 1608
 Event_type: Write_rows
  Server_id: 1
End_log_pos: 1696
       Info: table_id: 90 flags: STMT_END_F
*************************** 21. row ***************************
   Log_name: binlog.000008
        Pos: 1696
 Event_type: Xid
  Server_id: 1
End_log_pos: 1727
       Info: COMMIT /* xid=50 */
*************************** 22. row ***************************
   Log_name: binlog.000008
        Pos: 1727
 Event_type: Gtid
  Server_id: 1
End_log_pos: 1804
       Info: SET @@SESSION.GTID_NEXT= '10fdd06f-b851-11ee-8253-000c29ae0c7f:6'
*************************** 23. row ***************************
   Log_name: binlog.000008
        Pos: 1804
 Event_type: Query
  Server_id: 1
End_log_pos: 1914
       Info: drop database school /* xid=51 */
*************************** 24. row ***************************
   Log_name: binlog.000008
        Pos: 1914
 Event_type: Rotate
  Server_id: 1
End_log_pos: 1958
       Info: binlog.000009;pos=4
24 rows in set (0.00 sec)

确定起始范围:1-5,注意不要把drop写进去就行

这里注意
GTID的幂等性 
    • 开启GTID后,MySQL恢复Binlog时,重复GTID的事务不会再执行了 
    • 就想恢复?怎么办? 
    • --skip-gtids  #跳过gtid
接着上面,截取日志时添加--skip-gtids。
[root@node1 ~]# mysqlbinlog --skip-gtids --include-gtids='10fdd06f-b851-11ee-8253-000c29ae0c7f:4-5' /var/lib/mysql/binlog.000008 > /tmp/gtid.sql
[root@node1 ~]# mysql < /tmp/gtid.sql
[root@node1 ~]# mysql -e 'select * from school.stu'
+-----+---------+--------+------+------------------+
| Sno | Sname   | Ssex   | Sage | Sdept            |
+-----+---------+--------+------+------------------+
|   1 | Alice   | Female |   20 | Mathematics      |
|   2 | Bob     | Male   |   22 | Computer Science |
|   3 | Charlie | Male   |   21 | Engineering      |
|   4 | David   | Female |   19 | Literature       |
|   5 | Emma    | Female |   20 | Mathematics      |
|   6 | Tom     | Male   |   22 | Computer Science |
|   7 | Lily    | Female |   21 | Engineering      |
|   8 | Jack    | Male   |   19 | Literature       |
+-----+---------+--------+------+------------------+

LVM快照备份:

创建逻辑卷

[root@node1 ~]# lsblk   #添加一块硬盘
NAME                     MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sda                        8:0    0   20G  0 disk 
├─sda1                     8:1    0    1G  0 part /boot
└─sda2                     8:2    0   19G  0 part 
  ├─openeuler_node1-root 253:0    0   17G  0 lvm  /
  └─openeuler_node1-swap 253:1    0    2G  0 lvm  [SWAP]
sdb                        8:16   0   20G  0 disk 
sr0                       11:0    1 17.1G  0 rom  
[root@node1 ~]# vgcreate vg01 /dev/sdb 
  Physical volume "/dev/sdb" successfully created.
  Volume group "vg01" successfully created
[root@node1 ~]# lvcreate -n lv_mysql -L 4G vg01
  Logical volume "lv_mysql" created.
[root@node1 ~]# vgcreate vg01 /dev/sdb
  Physical volume "/dev/sdb" successfully created.
  Volume group "vg01" successfully created
[root@node1 ~]# lvcreate -n lv_mysql -L 4G vg01
  Logical volume "lv_mysql" created.
[root@node1 ~]# mkfs.ext4 /dev/vg01/lv_mysql   #格式化
mke2fs 1.46.4 (18-Aug-2021)
Creating filesystem with 1048576 4k blocks and 262144 inodes
Filesystem UUID: 0db7faf1-88a8-4669-bc3e-ccdb4f9e9090
Superblock backups stored on blocks: 
        32768, 98304, 163840, 229376, 294912, 819200, 884736

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done 
 

环境创建:

[root@node1 ~]# systemctl stop mysqld.service   #先停止服务
[root@node1 ~]# cd /var/lib/mysql
[root@node1 mysql]# tar czf /tmp/mysqlall.tar.gz *
[root@node1 mysql]# cd
[root@node1 ~]# mount /dev/vg01/lv_mysql /var/lib/mysql
[root@node1 ~]# ll /var/lib/mysql  #该文件会被清空,等于把数据都清空了
total 0
[root@node1 ~]# tar xf /tmp/mysqlall.tar.gz -C /var/lib/mysql #将mysql的文件内容解压到逻辑卷中

[root@node1 ~]# ll -d  /var/lib/mysql   ##用户组为root此时mysql无法启动
drwxr-xr-x. 3 root root 17 Feb 21 20:24 /var/lib/mysql
[root@node1 ~]# chown -R mysql.mysql /var/lib/mysql
[root@node1 ~]# ll -d  /var/lib/mysql 
drwxr-xr-x. 3 mysql mysql 17 Feb 21 20:24 /var/lib/mysql
[root@node1 ~]# systemctl start mysqld.service   #直接起服务

[root@node1 ~]# mysql -e 'select * from school.stu'  #数据都在
+-----+---------+--------+------+------------------+
| Sno | Sname   | Ssex   | Sage | Sdept            |
+-----+---------+--------+------+------------------+
|   1 | Alice   | Female |   20 | Mathematics      |
|   2 | Bob     | Male   |   22 | Computer Science |
|   3 | Charlie | Male   |   21 | Engineering      |
|   4 | David   | Female |   19 | Literature       |
+-----+---------+--------+------+------------------+

使用LVM快照备份数据库

1、创建快照
#给数据库加读锁 
[root@node1 ~]# mysql -e 'flush table with read lock'  
#给mysql的数据库所在的逻辑卷创建快照

[root@node1 ~]# lvcreate -n lv_mysql_s -L 500M -s /dev/vg01/lv_mysql 
    Logical volume "lv_mysql_s" created.
#解锁数据库 
[root@node1 ~]# mysql -e 'unlock tables'
以上1-3需要在一个会话完成 

将快照挂载到临时目录里 
[root@node1 ~]# mkdir /mnt/mysql && mount /dev/vg01/lv_mysql_s /mnt/mysql/ 

2、备份数据 
[root@node1 ~]# yum install rsync -y  #下载备份工具
[root@node2 ~]# mkdir /backup && rsync -av /mnt/mysql/ /backup 
卸载快照并删除 
[root@node1 ~]# umount /mnt/mysql/ && lvremove /dev/vg01/lv_mysql_s 

方法二:
这里建议直接写一个shell脚本(事先下号rsync备份工具),因为写脚本可以直接指定contab计划任务
[root@node2 ~]# vim mysql.sh 
#!/bin/bash                                                                               
back_dir=/backup/`date +%F` #创建一个备份目录                                               
[ -d ${back_dir} ]|| mkdir -p ${back_dir}  #如果没有就创建  

echo "flush tables with read lock; system lvcreate -n lv_mysql_s -L 500M -s /dev/vg01/lv_mysql; unlock tables;" | mysql -uroot -p1234 &>/dev/null #锁表只读,创建快照,做完后解锁         

[ -d /mnt/mysql/ ] || mkdir -p /mnt/mysql   #判断挂载点书否存在                             
mount /dev/vg01/lv_mysql_s /mnt/mysql  #挂载逻辑卷快照 

rsync -a /mnt/mysql/ ${back_dir}  #备份                                                     
if [ $? -eq 0 ];then                                                                     
        umount /mnt/mysql/ && lvremove -f /dev/vg01/lv_mysql_s &>/dev/null  #卸载,移除       
fi

[root@node1 ~]# chmod +x mysql.sh 
[root@node1 ~]# ./mysql.sh
[root@node1 ~]# ll /backup/2024-02-22/   #这里就备份好了
total 94680
-rw-r-----. 1 mysql mysql       56 Jan 21 19:42  auto.cnf
-rw-r-----. 1 mysql mysql      180 Feb 22 20:04  binlog.000004
-rw-r-----. 1 mysql mysql     1063 Feb 22 20:22  binlog.000005
-rw-r-----. 1 mysql mysql      157 Feb 22 20:23  binlog.000006
-rw-r-----. 1 mysql mysql       48 Feb 22 20:23  binlog.index
-rw-------. 1 mysql mysql     1676 Jan 21 19:42  ca-key.pem
-rw-r--r--. 1 mysql mysql     1112 Jan 21 19:42  ca.pem
-rw-r--r--. 1 mysql mysql     1112 Jan 21 19:42  client-cert.pem
-rw-------. 1 mysql mysql     1676 Jan 21 19:42  client-key.pem
-rw-r-----. 1 mysql mysql   196608 Feb 22 20:25 '#ib_16384_0.dblwr'
-rw-r-----. 1 mysql mysql  8585216 Jan 21 19:42 '#ib_16384_1.dblwr'
-rw-r-----. 1 mysql mysql     3428 Feb 22 20:22  ib_buffer_pool
-rw-r-----. 1 mysql mysql 12582912 Feb 22 20:23  ibdata1
-rw-r-----. 1 mysql mysql 12582912 Feb 22 20:23  ibtmp1
drwxr-x---. 2 mysql mysql     4096 Feb 22 20:23 '#innodb_redo'
drwxr-x---. 2 mysql mysql     4096 Feb 22 20:23 '#innodb_temp'
drwx------. 2 mysql mysql     4096 Feb 22 20:21  lost+found
drwxr-x---. 2 mysql mysql     4096 Jan 21 19:42  mysql
-rw-r-----. 1 mysql mysql 29360128 Feb 22 20:23  mysql.ibd
srwxrwxrwx. 1 mysql mysql        0 Feb 22 20:23  mysql.sock
-rw-------. 1 mysql mysql        5 Feb 22 20:23  mysql.sock.lock
drwxr-x---. 2 mysql mysql     4096 Jan 21 19:42  performance_schema
-rw-------. 1 mysql mysql     1676 Jan 21 19:42  private_key.pem
-rw-r--r--. 1 mysql mysql      452 Jan 21 19:42  public_key.pem
drwxr-x---. 2 mysql mysql     4096 Feb 22 20:21  school
-rw-r--r--. 1 mysql mysql     1112 Jan 21 19:42  server-cert.pem
-rw-------. 1 mysql mysql     1676 Jan 21 19:42  server-key.pem
drwxr-x---. 2 mysql mysql     4096 Jan 21 19:42  sys
-rw-r-----. 1 mysql mysql 16777216 Feb 22 20:25  undo_001
-rw-r-----. 1 mysql mysql 16777216 Feb 22 20:25  undo_002

[root@node1 ~]# vim /etc/my.cnf   ##将datadir文件暂时指向备份的文件,最后记得改回来
#datadir=/var/lib/mysql
datadir=/backup/2024-02-22/
[root@node2 ~]# systemctl start mysqld
[root@node1 ~]# mysql -e 'select * from school.stu'  ##该备份文件可用 
+-----+---------+--------+------+------------------+
| Sno | Sname   | Ssex   | Sage | Sdept            |
+-----+---------+--------+------+------------------+
|   1 | Alice   | Female |   20 | Mathematics      |
|   2 | Bob     | Male   |   22 | Computer Science |
|   3 | Charlie | Male   |   21 | Engineering      |
|   4 | David   | Female |   19 | Literature       |
+-----+---------+--------+------+------------------+

mydumper备份数据库:

安装部署:

[root@node1 ~]# wget -c https://github.com/mydumper/mydumper/releases/download/v0.15.1-3/mydumper-0.15.1-3.el8.x86_64.rpm
[root@node1 ~]# yum install mydumper-0.15.1-3.el8.x86_64.rpm -y

备份:

[root@node1 ~]# mydumper -B school -o /bak
[root@node1 ~]# ll /bak
total 16
-rw-r--r--. 1 root root 262 Feb 22 20:49 metadata
-rw-r--r--. 1 root root 155 Feb 22 20:49 school-schema-create.sql
-rw-r--r--. 1 root root   0 Feb 22 20:49 school-schema-triggers.sql
-rw-r--r--. 1 root root 283 Feb 22 20:49 school.stu.00000.sql
-rw-r--r--. 1 root root 379 Feb 22 20:49 school.stu-schema.sql

恢复:

[root@node1 ~]# mysql -e 'drop database school'
[root@node1 ~]# mysql -e 'show databases'
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
[root@node1 ~]# myloader -d /bak/ -o  #恢复
[root@node1 ~]# mysql -e 'select * from school.stu'
+-----+---------+--------+------+------------------+
| Sno | Sname   | Ssex   | Sage | Sdept            |
+-----+---------+--------+------+------------------+
|   1 | Alice   | Female |   20 | Mathematics      |
|   2 | Bob     | Male   |   22 | Computer Science |
|   3 | Charlie | Male   |   21 | Engineering      |
|   4 | David   | Female |   19 | Literature       |
+-----+---------+--------+------+------------------+

mydumper常用参数:

    · -B, --database:指定要备份的数据库。
    · -T, --tables-list:指定要备份的表的以逗号分隔的列表。
    · -o, --outputdir:指定备份文件的输出目录。
    · -s, --statement-size:尝试将INSERT语句的大小限制为指定的字节数,默认为1000000字节。
    · -r, --rows:将表拆分为指定行数的分块。此选项会关闭--chunk-filesize选项。
    · -F, --chunk-filesize:将表拆分为指定输出文件大小的分块。该值以MB为单位。
    · -c, --compress:压缩输出文件。
    · -e, --build-empty-files:即使表中没有数据,也构建备份文件。
    · -x, --regex:用于匹配’数据库.表’的正则表达式。
    · -i, --ignore-engines:指定要忽略的存储引擎的逗号分隔列表。
    · -m, --no-schemas:不备份表结构,只备份数据。
    · -d, --no-data:不备份表数据,只备份表结构。
    · -G, --triggers:备份触发器。
    · -h, --host:要连接的主机名。
    · -u, --user:用于运行备份的具有特权的用户名。
    · -p, --password:用户密码。
    · -P, --port:要连接的TCP/IP端口。
    · -S, --socket:要使用的UNIX域套接字文件进行连接。
    · -t, --threads:要使用的线程数,默认为4。
    · -C, --compress-protocol:在MySQL连接上使用压缩协议。
    · -V, --version:显示程序版本并退出。
    ·-v --verbose:输出的详细程度,0 = 静默,1 = 错误,2 = 警告,3 = 信息,默认为2。

Xtrabackup 备份数据库

安装部署和环境准备:

openEuler和xtrabackup不兼容,所以只能用通用二进制安装、而且最高只支持到 MySQL 8.0.35

[root@node1 ~]# 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@node1 ~]# tar xf percona-xtrabackup-8.0.35-30-Linux-x86_64.glibc2.17.tar.gz
[root@node1 ~]# ln -sv /root/percona-xtrabackup-8.0.35-30-Linux-x86_64.glibc2.17/bin/xtrabackup /usr/bin/xtrabackup
'/usr/bin/xtrabackup' -> '/root/percona-xtrabackup-8.0.35-30-Linux-x86_64.glibc2.17/bin/xtrabackup'

创建用户并授权
CREATE USER 'bkpuser'@'%'IDENTIFIED with mysql_native_password  BY 'Bak@123.com';

GRANT BACKUP_ADMIN, PROCESS, RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO 

GRANT SELECT ON performance_schema.log_status TO 'bkpuser'@'%';

GRANT SELECT ON performance_schema.keyring_component_status TO bkpuser@'%';

GRANT SELECT ON performance_schema.replication_group_members TO bkpuser@'%';

GRANT SELECT ON performance_schema.replication_group_members TO bkpuser@'%';

增量备份:

[root@node1 ~]# mkdir /data
[root@node1 ~]# xtrabackup --backup --backup --target-dir=/data/backups/ -u bkpuser -p'Bak@123.com' -H192.168.110.142  #完全备份

第一次增量备份
INSERT INTO stu (Sno, Sname, Ssex, Sage, Sdept) VALUES (5, 'Emma', 'Female', 20, 'Mathematics'),(6, 'Tom', 'Male', 22, 'Computer Science');

[root@node1 ~]# xtrabackup --backup --target-dir=/data/incr1/ -u bkpuser -p'Bak@123.com' -H192.168.110.142 --incremental-basedir=/data/backups/  #第一次增量备份
    --backup:指定进行备份操作。
    --target-dir=/data/backups/:指定备份文件的目标目录。
    -u bkpuser:指定用于连接 MySQL 服务器的用户名。
    -p'Bak@123.com':指定用户的密码。
    -H192.168.110.142:指定要连接的 MySQL 服务器的主机名或 IP 地址。
    --incremental-basedir=/data/backups/:增量备份的基础目录

[root@node1 ~]# ll /data/incr1/
total 324
-rw-r-----. 1 root root   447 Feb 22 22:02 backup-my.cnf  #备份配置文件
-rw-r-----. 1 root root   157 Feb 22 22:02 binlog.000008  #二进制日志文件
-rw-r-----. 1 root root    16 Feb 22 22:02 binlog.index   #二进制日志索引文件
-rw-r-----. 1 root root  3427 Feb 22 22:02 ib_buffer_pool #InnoDB 缓冲池文件
-rw-r-----. 1 root root 32768 Feb 22 22:02 ibdata1.delta  #InnoDB 系统表空间的增量和元数据文件
-rw-r-----. 1 root root    64 Feb 22 22:02 ibdata1.meta   #InnoDB 表相关的增量和元数据文件
drwxr-x---. 2 root root  4096 Feb 22 22:02 mysql          #MySQL 数据库的相关文件
-rw-r-----. 1 root root 49152 Feb 22 22:02 mysql.ibd.delta #与InnoDB表相关的增量和元数据文件
-rw-r-----. 1 root root    73 Feb 22 22:02 mysql.ibd.meta  
drwxr-x---. 2 root root  4096 Feb 22 22:02 performance_schema
drwxr-x---. 2 root root  4096 Feb 22 22:02 school         ##school数据库的相关文件
drwxr-x---. 2 root root  4096 Feb 22 22:02 sys
-rw-r-----. 1 root root 98304 Feb 22 22:02 undo_001.delta
-rw-r-----. 1 root root    69 Feb 22 22:02 undo_001.meta
-rw-r-----. 1 root root 81920 Feb 22 22:02 undo_002.delta
-rw-r-----. 1 root root    69 Feb 22 22:02 undo_002.meta
-rw-r-----. 1 root root    18 Feb 22 22:02 xtrabackup_binlog_info 
-rw-r-----. 1 root root   139 Feb 22 22:02 xtrabackup_checkpoints
-rw-r-----. 1 root root   531 Feb 22 22:02 xtrabackup_info
-rw-r-----. 1 root root  2560 Feb 22 22:02 xtrabackup_logfile
-rw-r-----. 1 root root    39 Feb 22 22:02 xtrabackup_tablespaces

第二次增量备份
INSERT INTO stu (Sno, Sname, Ssex, Sage, Sdept) VALUES (7, 'Lily', 'Female', 21, 'Engineering'),(8, 'Jack', 'Male', 19, 'Literature');
[root@node1 ~]# xtrabackup --backup --target-dir=/data/incr2/ -u bkpuser -p'Bak@123.com' -H192.168.110.142 --incremental-basedir=/data/incr1/
#每一次增量备份都在上一次增量都都要指定上一次备份的基础目录

恢复:

[root@node1 ~]# mysql -e 'drop database school'  #删库
[root@node1 ~]# mysql -e 'show databases'
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+

1、准备完全备份
[root@node1 ~]# xtrabackup --prepare --apply-log-only --target-dir=/data/backups

2、应用第一次增量备份到完全备份
[root@node1 ~]# xtrabackup --prepare --apply-log-only --target-dir=/data/backups/ --incremental-dir=/data/incr1

3、应用第二次增量备份到完全备份
[root@node1 ~]# xtrabackup --prepare --apply-log-only --target-dir=/data/backups/ --incremental-dir=/data/incr2

4、最后执行
[root@node1 ~]# xtrabackup --prepare --target-dir=/data/backups/  #用于准备 xtrabackup 备份
--prepare 选项指示 xtrabackup 进行备份的准备工作。这通常包括将备份数据转换为可用于恢复的格式,并确保备份的一致性和完整性。
--target-dir=/data/backups/ 指定了准备后生成的文件将被放置的目标目录。
通过执行这个命令,xtrabackup 将在指定的目标目录中进行准备操作,以便后续可以使用这些备份进行数据库的恢复。

5、验证
[root@node1 ~]# systemctl stop mysqld.service 
[root@node1 ~]# rm -rf /var/lib/mysql/*  #要保证这个文件为空
[root@node1 ~]# xtrabackup --copy-back --target-dir=/data/backups/  #将备份文件copy到该目录
[root@node1 ~]# chown -R mysql:mysql /var/lib/mysql  #更改目录下所有文件的权限
[root@node1 ~]# systemctl restart mysqld.service 
[root@node1 ~]# mysql -e 'select * from school.stu;'
+-----+---------+--------+------+------------------+
| Sno | Sname   | Ssex   | Sage | Sdept            |
+-----+---------+--------+------+------------------+
|   1 | Alice   | Female |   20 | Mathematics      |
|   2 | Bob     | Male   |   22 | Computer Science |
|   3 | Charlie | Male   |   21 | Engineering      |
|   4 | David   | Female |   19 | Literature       |
|   5 | Emma    | Female |   20 | Mathematics      |
|   6 | Tom     | Male   |   22 | Computer Science |
|   7 | Lily    | Female |   21 | Engineering      |
|   8 | Jack    | Male   |   19 | Literature       |
+-----+---------+--------+------+------------------+

MySQLBackup备份数据库

安装部署:

[root@node5 ~]# wget -c https://edelivery.oracle.com/osdc/softwareDownload?fileName=V1040085-01.zip
[root@node5 ~]# ll
total 22776
-rw-------. 1 root root     1066 Jan 21 14:59 anaconda-ks.cfg
-r--r--r--. 1 root root 23316009 Feb 24 18:50 V1040085-01.zip
[root@node5 ~]# unzip V1040085-01.zip
[root@node5 ~]# yum install mysql-commercial-backup-8.0.36-1.1.el8.x86_64.rpm -y

配置备份管理员:

mysql> create user 'mysqlbackup'@'localhost' identified by 'MySQL@123';
Query OK, 0 rows affected (0.09 sec)
mysql> grant all on *.* to 'mysqlbackup'@'localhost';
Query OK, 0 rows affected (0.03 sec)

backup-to-image方式备份数据库:

全量备份:

[root@node5 ~]# mkdir /data  #创建备份目录
[root@node5 ~]# mysqlbackup --user=mysqlbackup --password=MySQL@123 --socket=/var/lib/mysql/mysql.sock \
 --backup-image=my_full_bak.mbi  \
 --backup-dir=/data/backup \
 --show-progress \
 --compress \
 backup-to-image
参数解释:
 –backup-image:生成的备份image名称
 –backup-dir:生成的备份image所在目录
 –show-progress:显示备份进度[可选项]
 –compress:对备份image进行压缩节省空间[可选项]
 –with-timestamp:在backup-dir目录下生成’年-月-日-时-分-秒’的目录存储备份image以及其它相关文件,写脚本就不要加
 backup-to-image:声明这是备份为image的备份

[root@node5 ~]# ll /data/backup/  #查看备份后的文件
total 4408
-rw-r--r--. 1 root root     255 Feb 24 19:59 backup-my.cnf
drwxr-x---. 2 root root    4096 Feb 24 19:59 datadir
drwxr-x---. 2 root root    4096 Feb 24 19:59 meta
-rw-r-----. 1 root root 4475730 Feb 24 19:59 my_full_bak.mbi
-rw-r-----. 1 root root   19936 Feb 24 19:59 server-all.cnf
-rw-r-----. 1 root root     632 Feb 24 19:59 server-my.cnf

 全量备份还原:

[root@node5 ~]# mysqlbackup --backup-image=/data/backup/my_full_bak.mbi list-image
#通过list-image查看备份image中的文件内容
[root@node5 ~]# mysqlbackup --backup-image=/data/backup/my_full_bak.mbi validate
#通过validate验证备份image的有效性

[root@node5 ~]# mysql -e 'drop database school'  #删库
[root@node5 ~]# mysql -e 'show databases'
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+

还原image:

#这两步必做
[root@node5 ~]# systemctl stop mysqld.service  #关闭mysqld服务
[root@node5 ~]# rm -rf /var/lib/mysql/*   #清空mysql的datadir目录
[root@node5 ~]# mysqlbackup --datadir=/var/lib/mysql --backup-image=/data/backup/my_full_bak.mbi \
 --backup-dir=/data/backup/tmp \
 --uncompress \
 copy-back-and-apply-log

参数解释:
--datadir=/var/lib/mysql:指定MySQL服务器的数据目录
--backup-image=/data/backup/my_full_bak.mbi:指定备份镜像的文件名和路径。
--backup-dir=/data/backup/tmp:指定备份过程中临时文件的存储目录。这些临时文件在备份过程中被创建,用于存储备份数据的副本。
--uncompress:在恢复时不压缩备份镜像。默认情况下,mysqlbackup会尝试压缩备份镜像以节省空间。
copy-back-and-apply-log:这是mysqlbackup的一个操作模式。它指示mysqlbackup在恢复过程中首先将备份镜像复制回原始数据目录,然后应用任何未应用的binlog事件。

[root@node5 ~]# chown -R mysql.mysql /var/lib/mysql/*  #更改权限
[root@node5 ~]# systemctl start mysqld.service 
[root@node5 ~]# mysql -e 'select * from school.stu'  #确认恢复
+-----+---------+--------+------+------------------+
| Sno | Sname   | Ssex   | Sage | Sdept            |
+-----+---------+--------+------+------------------+
|   1 | Alice   | Female |   20 | Mathematics      |
|   2 | Bob     | Male   |   22 | Computer Science |
|   3 | Charlie | Male   |   21 | Engineering      |
|   4 | David   | Female |   19 | Literature       |
+-----+---------+--------+------+------------------+

增量备份:

1、第一次增量备份
mysql> INSERT INTO stu (Sno, Sname, Ssex, Sage, Sdept) VALUES (5, 'Emma', 'Female', 20, 'Mathematics'),(6, 'Tom', 'Male', 22, 'Computer Science');

[root@node5 ~]# mysqlbackup --user=mysqlbackup --password=MySQL@123 --socket=/var/lib/mysql/mysql.sock \
 --compress \
 --incremental \
 --incremental-base=dir:/data/backup \
 --backup-dir=/data/backup/incr1 \
 --backup-image=my_inc1_bak.mbi \
 backup-to-image

参数解释:
--user=mysqlbackup:指定用于连接到MySQL服务器的用户名。
--password=MySQL@123:指定用于连接到MySQL服务器的密码。
--socket=/var/lib/mysql/mysql.sock:指定MySQL服务器的Unix套接字文件路径。
--compress:指示mysqlbackup在创建备份镜像时进行压缩,以节省磁盘空间。
--incremental:指示mysqlbackup进行增量备份,只备份自上次备份以来的更改。
--incremental-base=dir:/data/backup:指定增量备份的基础备份目录。这个目录应该包含了上次的完整备份。
--backup-dir=/data/backup/incr1:指定备份过程中临时文件的存储目录。
--backup-image=my_inc1_bak.mbi:指定备份镜像的文件名和路径。
backup-to-image:这是mysqlbackup的一个操作模式。它指示mysqlbackup创建一个备份镜像,包含了自上次备份以来的所有更改。

[root@node5 ~]# ll /data/backup/incr1/
total 1792
-rw-r--r--. 1 root root     255 Feb 24 20:22 backup-my.cnf
drwxr-x---. 2 root root    4096 Feb 24 20:22 datadir
drwxr-x---. 2 root root    4096 Feb 24 20:22 meta
-rw-r-----. 1 root root 1796619 Feb 24 20:22 my_inc1_bak.mbi
-rw-r-----. 1 root root   19936 Feb 24 20:22 server-all.cnf
-rw-r-----. 1 root root     505 Feb 24 20:22 server-my.cnf

2、第二次增量备份
mysql> INSERT INTO stu (Sno, Sname, Ssex, Sage, Sdept) VALUES (7, 'Lily', 'Female', 21, 'Engineering'),(8, 'Jack', 'Male', 19, 'Literature');

[root@node5 ~]# mysqlbackup  --user=mysqlbackup --password=MySQL@123 --socket=/var/lib/mysql/mysql.sock \
 --compress \
 --incremental \
 --incremental-base=history:last_backup \
 --backup-dir=/data/backup/incr2 \
 --backup-image=my_inc_bak.mbi \
 backup-to-image

#--incremental-base 可以写成history:last_backup不用写上次备份的dir,两个方法都可以

[root@node5 ~]# ll /data/backup/incr2/
total 1700
-rw-r--r--. 1 root root     255 Feb 24 20:28 backup-my.cnf
drwxr-x---. 2 root root    4096 Feb 24 20:28 datadir
drwxr-x---. 2 root root    4096 Feb 24 20:28 meta
-rw-r-----. 1 root root 1696167 Feb 24 20:28 my_inc_bak.mbi
-rw-r-----. 1 root root   19936 Feb 24 20:28 server-all.cnf
-rw-r-----. 1 root root     632 Feb 24 20:28 server-my.cnf

增量备份还原:

[root@node5 ~]# mysql -e 'drop database school'  #删库
[root@node5 ~]# mysql -e 'show databases'
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
[root@node5 ~]# systemctl stop mysqld.service  #关闭mysqld服务
[root@node5 ~]# rm -rf /var/lib/mysql/*   #清空mysql的datadir目录

1、先还原完全备份
[root@node5 ~]# mysqlbackup --datadir=/var/lib/mysql --backup-image=/data/backup/my_full_bak.mbi \
 --backup-dir=/data/backup/tmp1 \
 --uncompress \
 copy-back-and-apply-log

#注意backup-dir刚才是/data/backup/tmp,这里得换一个

2、第一次增量备份还原
[root@node5 ~]# mysqlbackup --backup-image=/data/backup/incr1/my_inc1_bak.mbi \
 --backup-dir=/data/backup/incr1/tmp2 \
 --datadir=/var/lib/mysql/ \
 --incremental \
 copy-back-and-apply-log

3、第二次增量备份还原
[root@node5 ~]# mysqlbackup --backup-image=/data/backup/incr2/my_inc_bak.mbi \
 --backup-dir=/data/backup/incr2/tmp3 \
 --datadir=/var/lib/mysql/ \
 --incremental \
 copy-back-and-apply-log

[root@node5 ~]# chown -R mysql.mysql /var/lib/mysql/*
[root@node5 ~]# systemctl start mysqld.service
[root@node5 ~]# mysql -e 'select * from school.stu'
+-----+---------+--------+------+------------------+
| Sno | Sname   | Ssex   | Sage | Sdept            |
+-----+---------+--------+------+------------------+
|   1 | Alice   | Female |   20 | Mathematics      |
|   2 | Bob     | Male   |   22 | Computer Science |
|   3 | Charlie | Male   |   21 | Engineering      |
|   4 | David   | Female |   19 | Literature       |
|   5 | Emma    | Female |   20 | Mathematics      |
|   6 | Tom     | Male   |   22 | Computer Science |
|   7 | Lily    | Female |   21 | Engineering      |
|   8 | Jack    | Male   |   19 | Literature       |
+-----+---------+--------+------+------------------+

datafile方式备份数据库:

**环境:最好恢复初始环境,或只把上次备份的目录删了**

完全备份:

[root@node5 ~]# mysqlbackup --user=mysqlbackup --password=MySQL@123 --socket=/var/lib/mysql/mysql.sock \
 --backup-dir=/data/backup \
 --show-progress \
 --compress \
 backup 

[root@node5 ~]# ll /data/backup/
total 36
-rw-r--r--. 1 root root   255 Feb 24 20:53 backup-my.cnf
drwxr-x---. 6 root root  4096 Feb 24 20:53 datadir
drwxr-x---. 2 root root  4096 Feb 24 20:53 meta
-rw-r-----. 1 root root 19936 Feb 24 20:53 server-all.cnf
-rw-r-----. 1 root root   632 Feb 24 20:53 server-my.cnf

完全备份恢复:

[root@node5 ~]# mysql -e 'drop database school'
[root@node5 ~]# mysql -e 'show databases'
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
[root@node5 ~]# systemctl restart mysqld.service 
[root@node5 ~]# systemctl stop mysqld.service 
[root@node5 ~]# rm -rf /var/lib/mysql/*

[root@node5 ~]# mysqlbackup --backup-dir=/data/backup \   #备份过程中产生的日志文件
 apply-log

[root@node5 ~]# mysqlbackup --datadir=/var/lib/mysql/ --backup-dir=/data/backup \  #将备份的文件拷贝到datadir下
 copy-back-and-apply-log

[root@node5 ~]# chown -R mysql.mysql /var/lib/mysql/*
[root@node5 ~]# systemctl start mysqld.service 
[root@node5 ~]# mysql -e 'select * from school.stu'
+-----+---------+--------+------+------------------+
| Sno | Sname   | Ssex   | Sage | Sdept            |
+-----+---------+--------+------+------------------+
|   1 | Alice   | Female |   20 | Mathematics      |
|   2 | Bob     | Male   |   22 | Computer Science |
|   3 | Charlie | Male   |   21 | Engineering      |
|   4 | David   | Female |   19 | Literature       |
+-----+---------+--------+------+------------------+

增量备份:

1、第一次增量备份
mysql> INSERT INTO stu (Sno, Sname, Ssex, Sage, Sdept) VALUES (5, 'Emma', 'Female', 20, 'Mathematics'),(6, 'Tom', 'Male', 22, 'Computer Science');

[root@node5 ~]# mysqlbackup --user=mysqlbackup --password=MySQL@123 --socket=/var/lib/mysql/mysql.sock \
 --compress \

 --incremental \
 --incremental-base=dir:/data/backup \
 --incremental-backup-dir=/data/backup/incr1 \
 backup

[root@node5 ~]# ll /data/backup/incr1/
total 36
-rw-r--r--. 1 root root   255 Feb 24 21:55 backup-my.cnf
drwxr-x---. 6 root root  4096 Feb 24 21:55 datadir
drwxr-x---. 2 root root  4096 Feb 24 21:55 meta
-rw-r-----. 1 root root 19936 Feb 24 21:55 server-all.cnf
-rw-r-----. 1 root root   632 Feb 24 21:55 server-my.cnf

2、第二次增量备份
mysql> INSERT INTO stu (Sno, Sname, Ssex, Sage, Sdept) VALUES (7, 'Lily', 'Female', 21, 'Engineering'),(8, 'Jack', 'Male', 19, 'Literature');

[root@node5 ~]# mysqlbackup --user=mysqlbackup --password=MySQL@123 --socket=/var/lib/mysql/mysql.sock \
 --compress \

 --incremental \
 --incremental-base=history:last_backup \
 --incremental-backup-dir=/data/backup/incr2 \
 backup

[root@node5 ~]# ll /data/backup/incr2/
total 36
-rw-r--r--. 1 root root   255 Feb 24 21:56 backup-my.cnf
drwxr-x---. 6 root root  4096 Feb 24 21:56 datadir
drwxr-x---. 2 root root  4096 Feb 24 21:56 meta
-rw-r-----. 1 root root 19936 Feb 24 21:56 server-all.cnf
-rw-r-----. 1 root root   632 Feb 24 21:56 server-my.cnf

增量备份还原:

[root@node5 ~]# mysql -e 'drop database school'  #删库
[root@node5 ~]# mysql -e 'show databases'
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
[root@node5 ~]# systemctl stop mysqld.service  #关闭mysqld服务
[root@node5 ~]# rm -rf /var/lib/mysql/*   #清空mysql的datadir目录

[root@node5 ~]# mysqlbackup --backup-dir=/data/backup \  
 apply-log
 ##备份过程中产生的日志文件

#增备apply-incremental-backup
[root@node5 ~]# mysqlbackup --incremental-backup-dir=/data/backup/incr1  \
 --backup-dir=/data/backup/ \
 apply-incremental-backup

[root@node5 ~]# mysqlbackup --incremental-backup-dir=/data/backup/incr2  \
 --backup-dir=/data/backup/ \
 apply-incremental-backup

[root@node5 ~]# mysqlbackup --datadir=/var/lib/mysql --backup-dir=/data/backup/ \ 
 copy-back-and-apply-log
 #将几次备份搞得文件拷到datadir

[root@node5 ~]# chown -R mysql.mysql /var/lib/mysql/*
[root@node5 ~]# systemctl start mysqld.service 
[root@node5 ~]# mysql -e 'select * from school.stu'
+-----+---------+--------+------+------------------+
| Sno | Sname   | Ssex   | Sage | Sdept            |
+-----+---------+--------+------+------------------+
|   1 | Alice   | Female |   20 | Mathematics      |
|   2 | Bob     | Male   |   22 | Computer Science |
|   3 | Charlie | Male   |   21 | Engineering      |
|   4 | David   | Female |   19 | Literature       |
|   5 | Emma    | Female |   20 | Mathematics      |
|   6 | Tom     | Male   |   22 | Computer Science |
|   7 | Lily    | Female |   21 | Engineering      |
|   8 | Jack    | Male   |   19 | Literature       |
+-----+---------+--------+------+------------------+

相关推荐

  1. MySQL恢复备份

    2024-04-30 00:42:03       25 阅读
  2. MySQL备份恢复

    2024-04-30 00:42:03       28 阅读
  3. MySQL备份恢复

    2024-04-30 00:42:03       11 阅读
  4. Mysql-备份恢复

    2024-04-30 00:42:03       36 阅读
  5. MYSQL-备份恢复

    2024-04-30 00:42:03       22 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-30 00:42:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-30 00:42:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-30 00:42:03       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-30 00:42:03       20 阅读

热门阅读

  1. sqlserver创建login、user并授予相应数据库的权限

    2024-04-30 00:42:03       10 阅读
  2. 使用python写一个识别车牌原理

    2024-04-30 00:42:03       11 阅读
  3. ssh登录主机时会读取哪些PAM文件进行认证

    2024-04-30 00:42:03       12 阅读
  4. 【QA】Git常用命令

    2024-04-30 00:42:03       11 阅读
  5. Zookeeper集群部署和单机部署

    2024-04-30 00:42:03       14 阅读
  6. c# 字典与内存碎片化

    2024-04-30 00:42:03       12 阅读
  7. 第三部分 Vue讲解(22-25)(代码版)

    2024-04-30 00:42:03       11 阅读
  8. 启动前端项目

    2024-04-30 00:42:03       10 阅读
  9. 深度探索DreamFusion:AI和3D建模的革命

    2024-04-30 00:42:03       10 阅读
  10. SpringCloud Ribbon介绍

    2024-04-30 00:42:03       10 阅读