linux中MySQL数据库备份恢复的四种方法(更新中)

**mysqldump+binlog实现完全+**增量备份

注意:首先确保 binlog 是开启的,默认是开启(可通过查看 /var/lib/mysql 下是否有 binlog.000001
文件)。

复制代码
mysql> show variables like "%log_bin%"
    -> ;
+---------------------------------+-----------------------------+
| Variable_name                   | Value                       |
+---------------------------------+-----------------------------+
| log_bin                         | ON                          |
| log_bin_basename                | /var/lib/mysql/binlog       |
| log_bin_index                   | /var/lib/mysql/binlog.index |
| log_bin_trust_function_creators | OFF                         |
| sql_log_bin                     | ON                          |
+---------------------------------+-----------------------------+
5 rows in set (0.00 sec)

完整命令

备份命令

复制代码
# 备份整个数据库
mysqldump -u用户名 -p密码 -h主机地址 --single-transaction --skip-add-locks -R --alldatabases > 备份路径/备份文件名
# 备份单个数据库
mysqldump -u用户名 -p密码 -h主机地址 --single-transaction --skip-add-locks -R -B 数据
库名 > 备份路径/备份文件名

还原命令

复制代码
# 还原整个数据库
mysql -u用户名 -p密码 -h主机地址 -P端口号 < 备份文件
# 还原单个数据库
CREATE DATABASE 需要还原的库名 DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_unicode_ci;
mysql -u用户名 -p密码 -h主机地址 -P端口号 需要还原的库名 < 备份文件
# 注意:还原的库名必须存在,可以是原来备份的库名,也可以是新建的另一个库名

数据准备

准备数据库相关数据

复制代码
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| db3                |
| information_schema |
| mysql              |
| performance_schema |
| school             |
| student_management |
| sys                |
+--------------------+
7 rows in set (0.00 sec)

mysql> use student_management;
Database changed
mysql> show tables;
+------------------------------+
| Tables_in_student_management |
+------------------------------+
| classes                      |
| courses                      |
| scores                       |
| students                     |
| teachers                     |
+------------------------------+
5 rows in set (0.00 sec)

完全备份

复制代码
[root@test1 ~]# mkdir /mysqlbak
[root@test1 ~]# cd /mysqlbak/


[root@test1 mysqlbak]# mysqldump --opt -B student_management -u root -p >student_management.sql
Enter password: 
Warning: A partial dump from a server that has GTIDs will by default include the GTIDs of all transactions, even those that changed suppressed parts of the database. If you don't want to restore GTIDs, pass --set-gtid-purged=OFF. To make a complete dump, pass --all-databases --triggers --routines --events. 
Warning: A dump from a server that has GTIDs enabled will by default include the GTIDs of all transactions, even those that were executed during its extraction and might not be represented in the dumped data. This might result in an inconsistent data dump. 
In order to ensure a consistent backup of the database, pass --single-transaction or --lock-all-tables or --source-data. 
[root@test1 mysqlbak]# ls
student_management.sql

出现的警告意思是:

  1. GTID 相关警告

MySQL 开了 GTID 事务,备份默认会带上 GTID 信息,恢复时可能出问题。

  1. 数据一致性警告

没有加参数保证备份时数据一致,可能导致备份出来的库损坏、无法恢复。

  1. 提示你必须加

--single-transaction--lock-all-tables

复制代码
[root@test1 mysqlbak]# mysqldump --opt -B student_management --single-transaction --set-gtid-purged=OFF -uroot -p >student_management.sql
Enter password: 
[root@test1 mysqlbak]# ls
student_management.sql

增量备份

添加信息:

复制代码
mysql> insert into teachers values(5009,'代教师','M','daiyonghao@qq.com','computer college','2010-06-01',1477777);
Query OK, 1 row affected (0.01 sec)

mysql> select * from teachers;
+------------+--------------+--------+----------------------+--------------------+------------+------------+
| teacher_id | name         | gender | email                | department         | hire_date  | salary     |
+------------+--------------+--------+----------------------+--------------------+------------+------------+
|       5001 | 张教授       | M      | zhang@university.edu | 计算机学院         | 2010-08-15 |   15000.00 |
|       5002 | 李副教授     | F      | li@university.edu    | 计算机学院         | 2012-05-20 |   12000.00 |
|       5003 | 王教授       | M      | wang@university.edu  | 电子工程学院       | 2009-03-10 |   16000.00 |
|       5004 | 赵副教授     | F      | zhao@university.edu  | 电子工程学院       | 2013-07-15 |   12500.00 |
|       5005 | 钱教授       | M      | qian@university.edu  | 经济学院           | 2011-09-01 |   15500.00 |
|       5006 | 孙讲师       | F      | sun@university.edu   | 经济学院           | 2015-02-18 |   10000.00 |
|       5007 | 周教授       | M      | zhou@university.edu  | 计算机学院         | 2008-11-22 |   17000.00 |
|       5008 | 吴副教授     | F      | wu@university.edu    | 电子工程学院       | 2014-06-30 |   11800.00 |
|       5009 | 代教师       | M      | daiyonghao@qq.com    | computer college   | 2010-06-01 | 1477777.00 |
+------------+--------------+--------+----------------------+--------------------+------------+------------+
9 rows in set (0.00 sec)

模拟数据库损坏

复制代码
mysql> drop database student_management;
Query OK, 5 rows affected (0.03 sec)

mysql> flush logs;
Query OK, 0 rows affected (0.00 sec)

mysql> show binary logs;
+---------------+-----------+-----------+
| Log_name      | File_size | Encrypted |
+---------------+-----------+-----------+
| binlog.000001 |      2867 | No        |
| binlog.000002 |      2709 | No        |
| binlog.000003 |      1471 | No        |
| binlog.000004 |      9505 | No        |
| binlog.000005 |       967 | No        |
| binlog.000006 |      1447 | No        |
| binlog.000007 |       703 | No        |
| binlog.000008 |       402 | No        |
| binlog.000009 |       198 | No        |
| binlog.000010 |       221 | No        |
| binlog.000011 |       625 | No        |
| binlog.000012 |       850 | No        |
| binlog.000013 |       198 | No        |
+---------------+-----------+-----------+
13 rows in set (0.00 sec)

备份binlog日志,一般在刚删除后,flush log后删除命令一般在倒数第二个文件中

你也可以去查看

复制代码
[root@test1 mysqlbak]# mysqlbinlog /var/lib/mysql/binlog.000012 | grep -i "drop database"
drop database student_management

备份binlog日志

复制代码
[root@test1 mysqlbak]# cp /var/lib/mysql/binlog.000012 /mysqlbak

-- 注意:如果要查看二进制日志内容,需要使用 mysqlbinlog(能够解析binlog文件,可以用于恢复在备
份点之后的实时数据)
-- 解析binlog文件:mysqlbinlog --start-position=起始位点 --stop-position=结束位点
binlog文件>解析的文件名.sql
-- 注:结束位点不指定的话,即从起始位点到整个binlog文件导入
-- 实时数据:mysql -h 数据库主机 -u 用户名 -P端口 < 解析的文件名.sql
[root@localhost ~]# cd /mysqlbak
[root@localhost mysqlbak]# mysqlbinlog binlog.000012
-- 注意:5.7版本,insert语句已经加密,默认看不到,查看时加上选项 --base64-output=DECODEROWS -vv
[root@localhost mysqlbak]# mysqlbinlog binlog.000012 --base64-output=DECODE-ROWS -vv

[root@test1 mysqlbak]# mysqlbinlog binlog.000012 --base64-output=DECODE-ROWS -vv
# The proper term is pseudo_replica_mode, but we use this compatibility alias
# to make the statement usable on server versions 8.0.24 and older.
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#260408 16:44:57 server id 1  end_log_pos 127 CRC32 0xe0ec02c5 	Start: binlog v 4, server v 8.4.8 created 260408 16:44:57 at startup
ROLLBACK/*!*/;
# at 127
#260408 16:44:57 server id 1  end_log_pos 198 CRC32 0x4e5d8360 	Previous-GTIDs
# 4a5ad43a-22a3-11f1-94e6-000c291ec60d:1-32
# at 198
#260408 18:12:32 server id 1  end_log_pos 277 CRC32 0xbe67c724 	GTID	last_committed=0	sequence_number=1	rbr_only=yes	original_committed_timestamp=1775643152840085	immediate_commit_timestamp=1775643152840085	transaction_length=385
/*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*//*!*/;
# original_commit_timestamp=1775643152840085 (2026-04-08 18:12:32.840085 CST)
# immediate_commit_timestamp=1775643152840085 (2026-04-08 18:12:32.840085 CST)
/*!80001 SET @@session.original_commit_timestamp=1775643152840085*//*!*/;
/*!80014 SET @@session.original_server_version=80408*//*!*/;
/*!80014 SET @@session.immediate_server_version=80408*//*!*/;
SET @@SESSION.GTID_NEXT= '4a5ad43a-22a3-11f1-94e6-000c291ec60d:33'/*!*/;
# at 277
#260408 18:12:32 server id 1  end_log_pos 368 CRC32 0x4765413f 	Query	thread_id=8	exec_time=0	error_code=0
SET TIMESTAMP=1775643152/*!*/;
SET @@session.pseudo_thread_id=8/*!*/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
SET @@session.sql_mode=1168113696/*!*/;
SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
/*!\C utf8mb4 *//*!*/;
SET @@session.character_set_client=255,@@session.collation_connection=255,@@session.collation_server=255/*!*/;
SET @@session.lc_time_names=0/*!*/;
SET @@session.collation_database=DEFAULT/*!*/;
/*!80011 SET @@session.default_collation_for_utf8mb4=255*//*!*/;
BEGIN
/*!*/;
# at 368
#260408 18:12:32 server id 1  end_log_pos 457 CRC32 0x998f083a 	Table_map: `student_management`.`teachers` mapped to number 95
# has_generated_invisible_primary_key=0
# at 457
#260408 18:12:32 server id 1  end_log_pos 552 CRC32 0xd1793117 	Write_rows: table id 95 flags: STMT_END_F
### INSERT INTO `student_management`.`teachers`
### SET
###   @1=5009 /* INT meta=0 nullable=0 is_null=0 */
###   @2='代教师' /* VARSTRING(80) meta=80 nullable=0 is_null=0 */
###   @3='M' /* STRING(4) meta=65028 nullable=0 is_null=0 */
###   @4='daiyonghao@qq.com' /* VARSTRING(200) meta=200 nullable=1 is_null=0 */
###   @5='computer college' /* VARSTRING(200) meta=200 nullable=0 is_null=0 */
###   @6='2010:06:01' /* DATE meta=0 nullable=0 is_null=0 */
###   @7=1477777.00 /* DECIMAL(10,2) meta=2562 nullable=0 is_null=0 */
# at 552
#260408 18:12:32 server id 1  end_log_pos 583 CRC32 0x9c3e7502 	Xid = 241
COMMIT/*!*/;
# at 583
#260408 18:14:47 server id 1  end_log_pos 660 CRC32 0xab336853 	GTID	last_committed=1	sequence_number=2	rbr_only=no	original_committed_timestamp=1775643287190038	immediate_commit_timestamp=1775643287190038	transaction_length=223
# original_commit_timestamp=1775643287190038 (2026-04-08 18:14:47.190038 CST)
# immediate_commit_timestamp=1775643287190038 (2026-04-08 18:14:47.190038 CST)
/*!80001 SET @@session.original_commit_timestamp=1775643287190038*//*!*/;
/*!80014 SET @@session.original_server_version=80408*//*!*/;
/*!80014 SET @@session.immediate_server_version=80408*//*!*/;
SET @@SESSION.GTID_NEXT= '4a5ad43a-22a3-11f1-94e6-000c291ec60d:34'/*!*/;
# at 660
#260408 18:14:47 server id 1  end_log_pos 806 CRC32 0x941cc685 	Query	thread_id=8	exec_time=0	error_code=0	Xid = 243
SET TIMESTAMP=1775643287/*!*/;
drop database student_management
/*!*/;
# at 806
#260408 18:15:07 server id 1  end_log_pos 850 CRC32 0xf0deb638 	Rotate to binlog.000013  pos: 4
SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/;
DELIMITER ;
# End of log file
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;

还原完全备份

复制代码
[root@test1 mysqlbak]# mysql < student_management.sql 
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| db3                |
| information_schema |
| mysql              |
| performance_schema |
| school             |
| student_management |
| sys                |
+--------------------+
7 rows in set (0.01 sec)
也可以
source /mysqlbak/school.sql

还原增量备份

复制代码
mysql> select * from teachers;
+------------+--------------+--------+----------------------+--------------------+------------+----------+
| teacher_id | name         | gender | email                | department         | hire_date  | salary   |
+------------+--------------+--------+----------------------+--------------------+------------+----------+
|       5001 | 张教授       | M      | zhang@university.edu | 计算机学院         | 2010-08-15 | 15000.00 |
|       5002 | 李副教授     | F      | li@university.edu    | 计算机学院         | 2012-05-20 | 12000.00 |
|       5003 | 王教授       | M      | wang@university.edu  | 电子工程学院       | 2009-03-10 | 16000.00 |
|       5004 | 赵副教授     | F      | zhao@university.edu  | 电子工程学院       | 2013-07-15 | 12500.00 |
|       5005 | 钱教授       | M      | qian@university.edu  | 经济学院           | 2011-09-01 | 15500.00 |
|       5006 | 孙讲师       | F      | sun@university.edu   | 经济学院           | 2015-02-18 | 10000.00 |
|       5007 | 周教授       | M      | zhou@university.edu  | 计算机学院         | 2008-11-22 | 17000.00 |
|       5008 | 吴副教授     | F      | wu@university.edu    | 电子工程学院       | 2014-06-30 | 11800.00 |
+------------+--------------+--------+----------------------+--------------------+------------+----------+
8 rows in set (0.00 sec)

基于时间点增量恢复,从 binlog 日志文件中获取到时间

复制代码
mysqlbinlog binlog.000012 --start-datetime="2026-04-08 18:12:30" --stop-datetime="2026-04-08 18:14:40" | mysql -uroot -p
或
mysqlbinlog binlog.000012 --stop-position=583 | mysql -uroot -p

如果发现开gtid,需要跳过gtid
[root@test1 mysqlbak]# mysqlbinlog binlog.000012 --stop-position=583 --skip-gtids | mysql -uroot -p

mysql> select * from teachers;
+------------+--------------+--------+----------------------+--------------------+------------+------------+
| teacher_id | name         | gender | email                | department         | hire_date  | salary     |
+------------+--------------+--------+----------------------+--------------------+------------+------------+
|       5001 | 张教授       | M      | zhang@university.edu | 计算机学院         | 2010-08-15 |   15000.00 |
|       5002 | 李副教授     | F      | li@university.edu    | 计算机学院         | 2012-05-20 |   12000.00 |
|       5003 | 王教授       | M      | wang@university.edu  | 电子工程学院       | 2009-03-10 |   16000.00 |
|       5004 | 赵副教授     | F      | zhao@university.edu  | 电子工程学院       | 2013-07-15 |   12500.00 |
|       5005 | 钱教授       | M      | qian@university.edu  | 经济学院           | 2011-09-01 |   15500.00 |
|       5006 | 孙讲师       | F      | sun@university.edu   | 经济学院           | 2015-02-18 |   10000.00 |
|       5007 | 周教授       | M      | zhou@university.edu  | 计算机学院         | 2008-11-22 |   17000.00 |
|       5008 | 吴副教授     | F      | wu@university.edu    | 电子工程学院       | 2014-06-30 |   11800.00 |
|       5009 | 代教师       | M      | daiyonghao@qq.com    | computer college   | 2010-06-01 | 1477777.00 |
+------------+--------------+--------+----------------------+--------------------+------------+------------+
9 rows in set (0.00 sec)

mydumper****备份数据库+myloader还原数据库

官网地址 : https://launchpad.net/mydumper(老官网,应该已经不再更新了)
GitHub 地 t 址 : https://github.com/maxbube/mydumper
下载页: https://github.com/mydumper/mydumper/releaseshttps://github.com/mydumper/mydumper/releases
mydumper 主要有以下几点特性:
支持多线程导出数据,速度更快 ;
支持一致性备份 ;
支持将导出文件压缩,节约空间 ;
支持多线程恢复 ;
支持以守护进程模式工作,定时快照和连续二进制日志 ;
支持按照指定大小将备份文件切割 ;
数据与建表语句分离。

备份过程主要步骤概括:

  1. 主线程 FLUSH TABLES WITH READLOCK ,施加全局只读锁,以阻止 DML 语句写入,保证数据的一 致性;
  2. 读取当前时间点的二进制日志文件名和日志写入的位置并记录在 metadata 文件中,以供即时点恢复 使用;
  3. N 个(线程数可以指定,默认是 4 个) dump 线程 START TRANSACTION WITH CONSISTENT
    SNAPSHOT ;
  4. 开启读一致的事物;
  5. dump non-InnoDB tables ,首先导出非事物引擎的表;
  6. 主线程 UNLOCKTABLES 非事物引擎备份完后,释放全局只读锁;
  7. dump InnoDB tables ,基于事物导出 InnoDB 表;
  8. 事物结束。

下载

复制代码
rhel-10版本
https://github.com/mydumper/mydumper/releases/download/v0.21.3-1/mydumper-0.21.3-
1.el10.x86_64.rpm
rhel-9版本
https://github.com/mydumper/mydumper/releases/download/v0.21.3-1/mydumper-0.21.3-
1.el9.x86_64.rpm

国内访问githup很容易断开

Github文件加速https://github.chenc.dev/GitHub 代理下载服务合集 | 文件加速器https://ghproxylist.com/以上两个网址将githup下载链接转化,可代理下载

复制代码
[root@test1 ~]# ll
total 94192
-rw-------. 1 root root      989 Jan 19 21:27 anaconda-ks.cfg
-rw-r--r--. 1 root root      458 Mar 29 19:37 bak_mysql.sh
-rwxr-xr-x. 1 root root     3334 Jan 19 21:31 inin_vm.sh
-rw-r--r--. 1 root root  3429450 Feb  4 06:45 mydumper-0.21.3-1.el9.x86_64.rpm

参数介绍

参数 说明 使用示例
-u, --user 备份所使用的用户名 -u root
-p, --password 连接所用的用户密码 -p 'your_password'
-h, --host 数据库主机地址 (默认 localhost) -h 192.168.1.100
-P, --port 数据库端口 (默认 3306) -P 3306
-B, --database 要备份的数据库名,不指定则备份所有数据库 -B my_database
-T, --tables-list 需要备份的表,名字用逗号隔开 -T t1,t2,...
-o, --outputdir 备份文件输出目录 -o /backup/mysql/
-t, --threads 开启的备份线程数 (默认 4) -t 8
-s, --statement-size 生成的 insert 语句的字节数,默认 1000000,与 --rows 冲突 -s 500000
-r, --rows 将表按行分割,指定这个选项会关闭 --chunk-filesize -r
-F, --chunk-filesize 将表按大小分割时,指定分割大小,单位是 MB -F 10
-c, --compress 启用 gzip 压缩备份文件 -c
-x, --regex 使用正则表达式匹配要备份的表 -x '^(db1.tb1|db2\.)'
-i, --ignore-engines 忽略存储引擎 -i
-m, --no-schemas 不备份表结构 -m
-d, --no-data 不备份表数据 -d
-G, --triggers 备份触发器 -G
-E, --events 备份事件 -E
-R, --routines 备份存储过程和函数 -R
-w, --no-views 不备份视图 -w
-k, --no-locks 不使用临时共享只读锁,使用这个选项会造成数据不一致 -k
-D, --daemon 启用守护进程模式,守护进程模式以某个时间间隔不间断对数据库进行备份 -D
--where 只导出选择的数据
--clear 备份前清除目录

备份数据库示例:

1.备份全部数据库:
复制代码
[root@test1 ~]# mydumper -u root -p 123456 -r 10000 -o /backup/all/

** (mydumper:1868): WARNING **: 16:46:18.549: Using --trx-tables options, binlog coordinates will not be accurate if you are writing to non transactional tables.

-r按行切割
每 N 行数据,生成一个独立的 .sql 备份文件

[root@test1 backup]# ll
total 20
drwxr-x---. 2 root root 16384 Apr  9 16:46 all
2.备份全部数据库,包含触发器、事件、存储过程及函数
复制代码
[root@test1 backup]# mydumper -u root -p 123456 -G -E -R -r 100000 -o /backup/all2

** (mydumper:1894): WARNING **: 16:51:18.079: Using --trx-tables options, binlog coordinates will not be accurate if you are writing to non transactional tables.
[root@test1 backup]# ll
total 40
drwxr-x---. 2 root root 16384 Apr  9 16:46 all
drwxr-x---. 2 root root 16384 Apr  9 16:51 all2
3.备份指定数据库
复制代码
[root@test1 backup]# mydumper -u root -p 123456 -r 10000 -B student_management -o /backup/student_management

** (mydumper:1907): WARNING **: 16:56:22.424: Using --trx-tables options, binlog coordinates will not be accurate if you are writing to non transactional tables.
[root@test1 backup]# ll
total 44
drwxr-x---. 2 root root 16384 Apr  9 16:46 all
drwxr-x---. 2 root root 16384 Apr  9 16:51 all2
drwxr-x---. 2 root root  4096 Apr  9 16:56 student_management
4.使用正则排除系统数据库
复制代码
[root@test1 backup]# mydumper -u root -p 123456 -r 10000 -x '^(?!(mysql|sys))' -o /backup/non_mysqlsys

** (mydumper:1966): WARNING **: 17:04:58.945: Using --trx-tables options, binlog coordinates will not be accurate if you are writing to non transactional tables.
[root@test1 backup]# ll
total 48
drwxr-x---. 2 root root 16384 Apr  9 16:46 all
drwxr-x---. 2 root root 16384 Apr  9 16:51 all2
drwxr-x---. 2 root root  4096 Apr  9 17:04 non_mysqlsys
drwxr-x---. 2 root root  4096 Apr  9 16:56 student_management
5.备份指定表
复制代码
[root@test1 backup]# mydumper -u root -p 123456 -B student_management -T student_management.teachers -r 10000 -o /backup/student_tb

** (mydumper:2011): WARNING **: 17:14:04.216: Using --trx-tables options, binlog coordinates will not be accurate if you are writing to non transactional tables.
[root@test1 backup]# ll
total 48
drwxr-x---. 2 root root 16384 Apr  9 16:46 all
drwxr-x---. 2 root root 16384 Apr  9 16:51 all2
drwxr-x---. 2 root root  4096 Apr  9 17:04 non_mysqlsys
drwxr-x---. 2 root root  4096 Apr  9 16:56 student_management
drwxr-x---. 2 root root   157 Apr  9 17:14 student_tb
6.压缩备份某个表
复制代码
[root@test1 backup]# mydumper -u root -p 123456 -B student_management -T student_management.teachers -r 10000 -c -o /backup/student_tb2

** (mydumper:2143): WARNING **: 17:21:03.036: Using --trx-tables options, binlog coordinates will not be accurate if you are writing to non transactional tables.
[root@test1 backup]# ll
total 48
drwxr-x---. 2 root root 16384 Apr  9 16:46 all
drwxr-x---. 2 root root 16384 Apr  9 16:51 all2
drwxr-x---. 2 root root  4096 Apr  9 17:04 non_mysqlsys
drwxr-x---. 2 root root  4096 Apr  9 16:56 student_management
drwxr-x---. 2 root root   157 Apr  9 17:14 student_tb
drwxr-x---. 2 root root   169 Apr  9 17:21 student_tb2
[root@test1 backup]# cd student_tb2
[root@test1 student_tb2]# ll
total 16
-rw-r--r--. 1 root root 717 Apr  9 17:21 metadata
-rw-r-----. 1 root root 313 Apr  9 17:21 student_management-schema-create.sql.zst
-rw-r-----. 1 root root 608 Apr  9 17:21 student_management.teachers.00000.sql.zst
-rw-r-----. 1 root root 534 Apr  9 17:21 student_management.teachers-schema.sql.zst

注意(oom)

备份时建议配置 -r 参数来按行分割,避免恢复时一次 insert 数据太多导致触发系统 OOMKill 。
不加 -r 会怎样?

一张 1000 万行的表,mydumper 会生成:

复制代码
INSERT INTO t VALUES (....), (....), (....) ... 一共 1000 万行!
  • myloader 恢复时
  • MySQL 要一次性加载这一整句
  • 内存瞬间暴涨
  • 系统发现内存不够用 → 直接把 MySQL 进程杀掉

这就叫:OOM Kill(Out of Memory 内存溢出杀死)

结果就是:恢复失败、数据库挂掉、服务崩了。

myloader还原

参数名 缩写 含义
--user -u 备份所使用的用户名(原表笔误 "用不用的用户名" 已修正)
--password -p 连接所用的用户密码
--host -h MySQL 服务端地址
--port -P MySQL 端口号
--threads -t 开启的线程数,默认是 4
--directory -d 指定待恢复的备份目录
--queries-per-transaction -q 每次事务执行的查询数量,默认是 1000
--overwrite-tables -o 如果要恢复的表存在,则先 drop 掉该表
--database -B 需要还原到哪个数据库(目标数据库)
--source-db -s 选择被还原的数据库(源数据库)
--enable-binlog -e 在恢复时开启 binlog

myloader使用示例

1.删除一个数据库然后恢复
复制代码
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| db3                |
| information_schema |
| mysql              |
| performance_schema |
| school             |
| student_management |
| sys                |
+--------------------+
7 rows in set (0.01 sec)

mysql> drop database student_management;
Query OK, 5 rows affected (0.03 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| db3                |
| information_schema |
| mysql              |
| performance_schema |
| school             |
| sys                |
+--------------------+
6 rows in set (0.00 sec)

[root@test1 backup]# myloader -u root -p 123456 -o -d student_management/

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| db3                |
| information_schema |
| mysql              |
| performance_schema |
| school             |
| student_management |
| sys                |
+--------------------+
7 rows in set (0.01 sec)


[root@test1 backup]# myloader -u root -p 123456 -s student_management -o -d all
从全备份中恢复指定数据库
2.恢复时开启binlog(有备库的时候需要开启)
复制代码
[root@localhost ~]# myloader -u root -p 123456 -e -o -d /backup/school
3.无法直接还原单表,只能找到单表的 sql 文件,进入命令行 source 执行
复制代码
mysql> source school.Student-schema.sql -- 还原表结构
mysql> source school.Student.sql -- 还原表数据
-- 或者
[root@localhost ~]# mysql school < Student-schema.sql
[root@localhost ~]# mysql school < Student.sql

lvm****快照备份

介绍
复制代码
LVM快照的工作原理基于写时复制(Copy-on-Write,简称CoW)机制。当创建一个快照时,LVM不会
立即复制原始数据的所有内容,而是只复制元数据和一些指针。这些指针指向原始数据块的位置。当原
始数据块发生变化时,LVM会将这些变化的数据块复制到快照中,而不是修改原始数据块。这样,快照
就包含了原始数据的一个时间点副本,并且这个会随着副本原始数据的变化而更新。
LVM快照在多种场景中都非常有用。例如,在开发或测试环境中,管理员可以创建一个快照,然后在新
环境中进行各种尝试,而不用担心会损坏原始数据。一旦出现问题,可以轻松地回滚到快照状态。在生
产环境中,LVM快照也可以作为备份策略的一部分,定期创建快照并将它们存储在其他地方,以便在数
据丢失或损坏时进行恢复。

一旦创建了快照,就可以像使用其他逻辑卷一样使用它。例如,可以将快照挂载到一个目录,然后复制 其中的数据到备份设备或远程存储。如果需要恢复数据,只需将备份的数据复制回快照或原始逻辑卷, 然后卸载快照即可。
需要注意的是, LVM 快照虽然提供了强大的数据备份和恢复功能,但也有其限制。首先,快照的大小是 固定的,一旦快照创建完成,就不能改变其大小。其次,由于快照是基于写时复制机制,当原始数据发 生大量变化时,快照可能会占用大量的磁盘空间。因此,在使用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 )卸载
8 )移除快照

操作示例:
创建卷组:

首先要创建卷组,这里可以添加一块磁盘,也可以从原有空闲磁盘划一块出来

先说划

复制代码
vgs
lvs

# 新建 LV 给 MySQL
lvcreate -L 10G -n mysql rhel
mkfs.xfs /dev/rhel/mysql
mkdir /mysql
mount /dev/rhel/mysql /mysql

rhel是其中的一块磁盘,mkfs.xfs /dev/rhel/mysql是初始化

[root@test1 ~]# vgs
  Devices file sys_wwid eui.f264dc238d1b75d4000c2960cac2228d PVID FOYARoJPNtqf1Q5FmegRl1gbG7kuBgie last seen on /dev/nvme0n1p3 not found.
  VG   #PV #LV #SN Attr   VSize  VFree
  rhel   1   2   0 wz--n- 18.41g    0 

我的vfree是0,这个方法行不通

添加磁盘

复制代码
[root@test1 ~]# lsblk
NAME          MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sda             8:0    0   20G  0 disk 
sr0            11:0    1  9.8G  0 rom  /mnt
sr1            11:1    1  9.8G  0 rom  
nvme0n1       259:0    0   20G  0 disk 
├─nvme0n1p1   259:1    0  600M  0 part /boot/efi
├─nvme0n1p2   259:2    0    1G  0 part /boot
└─nvme0n1p3   259:3    0 18.4G  0 part 
  ├─rhel-root 253:0    0 16.4G  0 lvm  /
  └─rhel-swap 253:1    0    2G  0 lvm  

[root@test1 ~]# vgcreate mysql /dev/sda
  Physical volume "/dev/sda" successfully created.
  Volume group "mysql" successfully created
[root@test1 ~]# vgdisplay mysql
  Devices file sys_wwid eui.f264dc238d1b75d4000c2960cac2228d PVID FOYARoJPNtqf1Q5FmegRl1gbG7kuBgie last seen on /dev/nvme0n1p3 not found.
  --- Volume group ---
  VG Name               mysql
  System ID             
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  1
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                0
  Open LV               0
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               <20.00 GiB
  PE Size               4.00 MiB
  Total PE              5119
  Alloc PE / Size       0 / 0   
  Free  PE / Size       5119 / <20.00 GiB
  VG UUID               jaPWs0-vkac-nyVR-Rmp2-N89V-3xm9-wZxVUE
   
查看卷组
[root@test1 ~]# vgs
  Devices file sys_wwid eui.f264dc238d1b75d4000c2960cac2228d PVID FOYARoJPNtqf1Q5FmegRl1gbG7kuBgie last seen on /dev/nvme0n1p3 not found.
  VG    #PV #LV #SN Attr   VSize   VFree  
  mysql   1   0   0 wz--n- <20.00g <20.00g
  rhel    1   2   0 wz--n-  18.41g      0 

查看逻辑卷
[root@test1 ~]# lvs
  Devices file sys_wwid eui.f264dc238d1b75d4000c2960cac2228d PVID FOYARoJPNtqf1Q5FmegRl1gbG7kuBgie last seen on /dev/nvme0n1p3 not found.
  LV   VG   Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  root rhel -wi-ao---- 16.41g                                                    
  swap rhel -wi-a-----  2.00g      

查看物理卷                                              
[root@test1 ~]# pvs
  Devices file sys_wwid eui.f264dc238d1b75d4000c2960cac2228d PVID FOYARoJPNtqf1Q5FmegRl1gbG7kuBgie last seen on /dev/nvme0n1p3 not found.
  PV             VG    Fmt  Attr PSize   PFree  
  /dev/nvme0n1p3 rhel  lvm2 a--   18.41g      0 
  /dev/sda       mysql lvm2 a--  <20.00g <20.00g
创建逻辑卷并格式化
复制代码
root@test1 ~]# lvcreate -n lv_mysql -L 6G mysql
  Logical volume "lv_mysql" created.
[root@test1 ~]# lvs
  Devices file sys_wwid eui.f264dc238d1b75d4000c2960cac2228d PVID FOYARoJPNtqf1Q5FmegRl1gbG7kuBgie last seen on /dev/nvme0n1p3 not found.
  LV       VG    Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  lv_mysql mysql -wi-a-----  6.00g                                                    
  root     rhel  -wi-ao---- 16.41g                                                    
  swap     rhel  -wi-a-----  2.00g                                                    
[root@test1 ~]# mkfs.ext4 /dev/mysql/lv_mysql 
mke2fs 1.46.5 (30-Dec-2021)
Creating filesystem with 1572864 4k blocks and 393216 inodes
Filesystem UUID: a8a6c1e6-8154-48cc-bd1b-ff2caff23bf6
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@test1 ~]# systemctl stop mysqld.service 

备份所有数据文件到指定地方

复制代码
[root@test1 ~]# tar -czf /tmp/mysql.tar.gz /var/lib/mysql/*
tar: Removing leading `/' from member names
tar: Removing leading `/' from hard link targets
[root@test1 ~]# cd /tmp/
[root@test1 tmp]# ll
total 2892
-rw-r--r--. 1 root root 2958175 Apr  9 18:37 mysql.tar.gz

挂载逻辑卷到当前MySQL的数据目录中

复制代码
[root@test1 tmp]# mount /dev/mysql/lv_mysql /var/lib/mysql
[root@test1 tmp]#tar xf /tmp/mysql.tar.gz --strip-components=3 -C /var/lib/mysql
--strip-components=3的意思是解压时,自动删掉前面 3 层目录!不然解压出来的就是/var目录本身

启动数据库

复制代码
[root@test1 lib]# systemctl start mysqld

可能会遇到权限问题:
chown -R mysql:mysql /var/lib/mysql

备份数据

结合计划任务实现备份

复制代码
[root@test1 ~]# dnf install rsync -y

cat > /root/bak_mysql.sh <<'EOF'
#!/bin/bash
bak_dir=/bak/$(date +%F)

# 1. 创建备份目录
mkdir -p ${bak_dir}

# 2. 强制清理旧快照
lvremove -f /dev/mysql/lv_snapshot &>/dev/null

# 3. 锁表 + 创建快照
echo "flush tables with read lock; system lvcreate -s -n lv_snapshot -L 2G /dev/mysql/lv_mysql; unlock tables;" | mysql -uroot -p'123456'

# 4. 挂载点
mkdir -p /media/mysql

# 5. ext4 正确挂载(去掉 -o nouuid!,这个参数是xfs独有,不允许两个相同 UUID 的设备同时挂载,加了就不会检测uuid)
mount -t ext4 /dev/mysql/lv_snapshot /media/mysql

# 6. 备份
rsync -az /media/mysql/ ${bak_dir}/

# 7. 清理
umount /media/mysql
lvremove -f /dev/mysql/lv_snapshot &>/dev/null

echo "✅ MySQL LVM 备份成功!路径:$bak_dir"
EOF

疑难解释:
1.
flush tables with read lock;
给 MySQL 加全局只读锁,防止备份时数据写入(极短时间)
system lvcreate -s -n lv_snapshot -L 500M /dev/mysql/lv_mysql;
创建 LVM 快照
-s:snapshot 快照
-n lv_snapshot:快照名字叫 lv_snapshot
-L 500M:快照大小 500M
/dev/mysql/lv_mysql:对哪个逻辑卷做快照
unlock tables;
解锁 MySQL,恢复正常写入(锁只持续零点几秒)
2.
mount -t ext4 -o nouuid /dev/mysql/lv_snapshot /media/mysql
-t ext4:文件系统是 ext4
把快照 /dev/mysql/lv_snapshot 挂载到 /media/mysql
3.
rsync -az /media/mysql ${bak_dir}
rsync:远程同步 / 拷贝工具
-a:归档模式(保留权限、属性、目录结构)
-z:传输时压缩
把快照里的所有 MySQL 数据 拷贝到 /bak/日期 目录
4.
umount /media/mysql && lvremove -f /dev/mysql/lv_snapshot &>/dev/null
$? -eq 0:上一条命令成功(rsync 成功)
umount:卸载快照
lvremove -f:删除快照(释放空间)
&>/dev/null:不输出任何信息

sh -n bak_mysql.sh用来查看该脚本是否有语法错误
执行脚本,看备份目录是否有文件
复制代码
[root@test1 ~]# ./bak_mysql.sh 
mysql: [Warning] Using a password on the command line interface can be insecure.
File descriptor 3 (socket:[32802]) leaked on lvcreate invocation. Parent PID 2205: mysql
  Logical volume "lv_snapshot" created.
✅ MySQL LVM 备份成功!路径:/bak/2026-04-09

[root@test1 ~]# cd /bak/
[root@test1 bak]# ll
total 4
drwxr-xr-x.  3 root  root    19 Mar 29 19:37 2026-03-29
drwxr-xr-x. 10 mysql mysql 4096 Apr  9 18:58 2026-04-09
[root@test1 bak]# cd 2026-04-09/
[root@test1 2026-04-09]# ll
total 90260
还原数据

1.修改配置文件

除了mysqld中的datadir要改外,mysqld和client中的socket也要改

一句话:socket = MySQL 的本地连接 "通道文件"

你可以把它理解成:

本地程序(mysql 命令)和 MySQL 服务器 之间的 "本地电话线"

服务端生成电话线 → /bak/mysql.sock

客户端去拿电话线 → /bak/mysql.sock

复制代码
[client]
user=root
password=123456
socket=/bak/mysql.sock
[mysqld]
#
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove the leading "# " to disable binary logging
# Binary logging captures changes between backups and is enabled by
# default. It's default setting is log_bin=binlog
# disable_log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M

datadir=/bak/2026-04-09
socket=/bak/mysql.sock

log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
gtid-mode=on
enforce-gtid-consistency=true

2.重启数据库mysqld

复制代码
这里会出现重启失败,原因是因为selinux
可以直接关闭验证
这是因为selinux拦截mysqld去访问/bak目录
[root@test1 2026-04-09]# semanage fcontext -a -t mysqld_db_t "/bak(/.*)?"
[root@test1 2026-04-09]# restorecon -R /bak

默认 MySQL 只能访问带 mysqld_db_t 标签的目录
/var/lib/mysql 自带这个标签
/bak 没有,所以被拦截

restorecon -R /bak
让刚才的永久规则立刻生效!
restorecon = 恢复 SELinux 标签
-R = 递归(所有子目录、文件)

chcon -R -t mysqld_db_t /bak不行
chcon 只能改文件标签,不能解决 MySQL 对自定义目录的 "写权限",而且这是临时的,重启消失
部分 意思
semanage fcontext 管理 SELinux 永久文件标签
-a add,添加一条规则
-t mysqld_db_t 给目录打上 MySQL 数据目录标签
"/bak(/.*)?" 匹配 /bak 目录 + 里面所有文件 / 子目录

/bak

匹配 /bak 目录

( )

分组(只是包起来)

/.

匹配 / + 任意字符

*

匹配零个或多个

?

表示:前面这一组 可有可无

3.修改权限

复制代码
chown -R mysql: /bak/2026-04-09/
验证还原:
复制代码
[root@test1 2026-04-09]# mysql -uroot -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 11
Server version: 8.4.8 MySQL Community Server - GPL

Copyright (c) 2000, 2026, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| db3                |
| information_schema |
| mysql              |
| performance_schema |
| school             |
| student_management |
| sys                |
+--------------------+
7 rows in set (0.00 sec)
相关推荐
云边有个稻草人2 小时前
时序数据库选型技术剖析:从写入、存储到查询的五个关键维度
数据库
疯狂成瘾者2 小时前
Chroma向量数据库
开发语言·数据库·c#
coppher2 小时前
Ubuntu 22.04 amd64 离线安装 Docker 完整教程
linux·docker
ayt0072 小时前
Netty AbstractNioChannel源码深度剖析:NIO Channel的抽象实现
java·数据库·网络协议·安全·nio
荒川之神2 小时前
Oracle 数据仓库星座模型(Galaxy Model)设计原则
数据库·数据仓库·oracle
xyz5992 小时前
如何在 WSL 中删除指定版本的 Ubuntu 以及安装
linux·运维·ubuntu
杰克尼2 小时前
redis(day03-商户查询缓存)
数据库·redis·缓存
枕布响丸辣2 小时前
Python 操作 MySQL 数据库从入门到精通
数据库·python·mysql
zxrhhm3 小时前
SQLServer限制特定数据库的CPU使用率,确保关键业务系统有足够的资源
数据库·sqlserver