当前位置: 首页 > news >正文

MySQL的备份及还原

备份类型

热备份、温备份、冷备份 (根据服务器状态)
    热备份:读、写不受影响;
    温备份:仅可以执行读操作;
    冷备份:离线备份;读、写操作均中止;

物理备份与逻辑备份 (从对象来分)
    物理备份:复制数据文件;
    逻辑备份:将数据导出至文本文件中;

完全备份、增量备份、差异备份 (从数据收集来分)
    完全备份:备份全部数据;
    增量备份:仅备份上次完全备份或增量备份以后变化的数据;
    差异备份:仅备份上次完全备份以来变化的数据;;

备份案例

1、mysqldump+binlog实现完全+增量备份

提前准备一个表

完全备份

 mysqldump  -u root -pabc123   school > /root/mysql_bak/school.sql

模拟数据故障:  mysql>  drop database school;

 刷新日志并保存 :  mysql> flush logs;

立马备份binlog.0000

[root@localhost mysqlbak]# cp /var/lib/mysql/binlog.000001 /mysqlbak

# 查看二进制日志
使用mysqlbinlog,insert语句已经加密,默认看不到。查看时加上选项 --base64-output=DECODE-ROWS -vv

#250117 11:34:22 server id 1 end log_pos 2862 CRC32 0x5102374d
### INSERT INTO )school'.'Student
生## SET
@1=5 /* INT meta=0 nullable=o is null=0 */
### 02='xumubin' /* VARSTRING(64) meta=64 nullable=o is null=0 */
(3='男’/* STRING(8) meta=65032 nullable=0 is nul1=0 */
4=29 /* TINYINT meta=o nullable=e is null=o /
05='中文专业’/* VARSTRING(64) meta=64 nullable=1 is null=0 */
INSERT INTO ‘school’.'Student
#排# SET
Q1=6 /* INT mFta=0 nullable=o is null=0 */
a2='wangzhao""/* VARSTRING(64) meta=64 nutlable=o is null=0 */
a3='男/* STRING(8) meta=65032 nullable=e is null=0 */
04=21 /* TINYINT meta=0 nullable=e is null=0 天/
##井 @5='导弹专业’/* VARSTRING(64) meta=64 nullable=i is null=e */
# at 2862
*250117 11:34:22 server id 1 end log_pos 2893 CRC32 0x07cf07af COMIT/*!*/;
at 2893
#250117 11:34:57 server id 1 end log_pos 2972 CRC32 Ox9eb12b07

1、基于时间点增量恢复
[root@localhost mysqlbak]# mysqlbinlog binlog.000005 --start-datetime="2024-02-19 11:34:53" --stop-datetime="2024-02-19 11:34:57" -r time1.sql

#还原完全备份
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 | 电子商务        |
+-----+--------+------+------+-----------------+

#还原增量备份
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 | 导弹专业        |
+-----+----------+------+------+-----------------+

2、mydumper备份数据库

--host-h连接的MySQL数据库服务器
--user-u连接数据库的用户
--password-p连接数据库用户的密码
--ask-password-a提示输入用户的密码
--port-PMySQL数据库端口
--compress-protocol-C对 MySQL 连接使用压缩
--database-B需要备份的数据库
--no-schemas-m不备份表结构,(数据和触发器)
--all-tablespaces-Y备份所有表空间
--no-data-d不备份表的数据
--triggers-G备份触发器,默认情况下不备份
--events-E备份事件,默认情况下不备份
--routines-R备份存储过程和函数,默认情况下不备份
--partition-regex按分区名称过滤的正则表达式
--ignore-engines-i要忽略的存储引擎的列表 ,逗号分隔
备份例子

1、备份全库

mydumper -u root -p 123456 -o /backup

2、备份指定数据库

mydumper -u root -p 123456 -G -R -E -B school -o /backup

 3、导出指定表

mydumper -u root -p 123456  -T school -o /backup

 4、只导出表结构,不导出表数据

mydumper -u root -p 123456 -B zs -d -o /backup

主要原理:

  1.  主线程 FLUSH TABLES WITH READ LOCK ,将脏页刷新到磁盘并施加全局只读锁,以阻止 DML 语句写入,保证数据的一致性;
  2. 读取当前时间点的二进制日志文件名和日志写入的位置并记录在 metadata 文件中,以供即时点恢复使用;
  3.  START TRANSACTION WITH CONSISTENT SNAPSHOT 并获取一致性快照
  4. 创建子进程被分配任务,导出表
  5. 主线程 UNLOCK TABLES ,释放全局只读锁;
恢复例子 

myloader -u root -p 123456 -o -d /backup

3、 xtrabackup备份

准备

mysql> CREATE USER 'lee'@'%' IDENTIFIED with mysql_native_password  BY '123';
mysql> GRANT BACKUP_ADMIN, PROCESS, RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'lee'@'%';
mysql> GRANT SELECT ON performance_schema.log_status TO 'lee'@'%';
mysql> GRANT SELECT ON performance_schema.keyring_component_status TO lee@'%';
mysql> GRANT SELECT ON performance_schema.replication_group_members TO lee@'%';

mysql> FLUSH PRIVILEGES;

完全备份:

[root@localhost ~]# xtrabackup --backup --target-dir=/data/backups/ -u lee -p'123' -H172.16.100.21 -S /var/lib/mysql/mysql.sock

增量备份:


[root@localhost ~]#  usr/bin/xtrabackup --backup --target-dir=/data/incr1/ -u lee -p'123'  --incremental-basedir=/data/backups/  -S  /var/lib/mysql/mysql.sock

 还原例子

[root@localhost ~]#  xtrabackup --prepare --apply-log-only --target-dir=/data/backups/ 

[root@localhost ~]#  xtrabackup --prepare --apply-log-only --target-dir=/data/backups/ --incremental-dir=/data/incr1/

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

 

4、mysqlbackup 备份还原

1、备份image

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 \
--with-timestamp \
backup-to-image

注释解释

  • –backup-image:生成的备份image名称

  • –backup-dir:生成的备份image所在目录

  • –show-progress:显示备份进度[可选项]

  • –compress:对备份image进行压缩节省空间[可选项]

  • –with-timestamp:在backup-dir目录下生成’年-月-日-时-分-秒’的目录存储备份image以及其它相关文件

  • backup-to-image:声明这是备份为image的备份

可以通过list-image查看备份image中的文件内容  

[root@localhost ~]# mysqlbackup --backup-image=/data/back/2025-03-28_18-45-32/my_full_bak.mbi list-image

2、还原image

还原数据库备份之前必须做完成以下前提:

  • 关闭mysqld服务

  • 清空mysql的datadir目录

 [root@localhost 2025-03-28_18-45-32]#  mysqlbackup --datadir=/var/lib/mysql  --backup-image=/data/back/2025-03-28_18-45-32/my_full_bak.mbi --backup-dir=/data/back/2025-03-28_18-45-32/tmp --uncompress copy-back-and-apply-log 

解释:

  • –datadir : mysql server的数据库datadir,数据将还原至此

  • –backup-image:image备份的路径与名称

  • –backup-dir: image临时工作目录用于释放image都此目录,必须为空

  • –uncompress[可选项]  解压

  • copy-back-and-apply-log:应用redolog并且copy datafile至datadir

权限有问题,修改权限

chown  -R mysql.mysql /var/lib/mysql

 3、datafile备份

mysqlbackup --user=mysqlbackup --password=MySQL@123

--socket=/var/lib/mysql/mysql.sock

--backup-dir=/data/backup

--show-progress

--compress

--with-timestamp

backup 

5、还原datafile

分步还原

分布还原

1、apply-log

mysqlbackup --backup-dir=/data/backup/2022-04-13_17-32-49 --uncompress  apply-log 

2、copy-back

mysqlbackup --datadir=/data/mysql/data --backup-dir=/data/backup/2022-04-13_17-32-49  copy-back

合并还原

mysqlbackup --datadir=/var/lib/mysql/ --backup-dir=/data/backup/2022-04-13_17-32-49 --uncompress --show-progess --show-progess 

相关文章:

  • C++多线程的性能优化
  • 怎样配置windows云主机不关闭显示器
  • 小程序中跨页面组件共享数据的实现方法与对比
  • platform总线驱动简单示例
  • 探索新一代大模型代理(LLM agent)及其架构
  • AI Agent创新10大前沿方向与落地实践分析
  • 如何使用CUDA Graphs,如何更新Graphs中kernel函数参数
  • 利用 Chrome devTools Source Override 实现JS逆向破解案例
  • 矿山边坡监测预警系统设计
  • Qt | 电脑音频采集曲线Charts
  • 限制 某个容器服务的内存使用
  • Keepalived+LVS+nginx高可用架构
  • 后端开发 SpringBoot 工程模板
  • 【蓝桥杯】第十五届C++B组省赛
  • 【3. 软件工程】3.1 软件过程模型
  • 数字货币交易所开发中的常见问题与解决方案
  • python实现代码雨
  • springboot 对接马来西亚数据源API等多个国家的数据源
  • 向量库(Vector Database)概述
  • 基于PyQt5的自动化任务管理软件:高效、智能的任务调度与执行管理
  • 洋山特殊综合保税区累计进出口货值超1万亿元
  • 特朗普宣布打造“金穹”导弹防御系统,计划3年内运转
  • 欧盟宣布解除对叙利亚的经济制裁
  • 广西隆林发生一起山洪灾害,致4人遇难
  • 河北省纪委原副书记、省监委原副主任陈玉祥一审获刑十二年
  • 外交部:国际调解院着眼以调解定分止争,更好维护国际公平正义