备份介绍

  • 为了防止数据丢失、方便数据迁移,建议定期备份数据中的数据。

  • 方式:

    • 逻辑备份:将数据库中库和表转换为SQL语句,生成.sql文件。还原数据时只需要运行该SQL语句。适合中小型规模的数据,30GB以内数据。数据量过大时,转换效率慢。

      • mysqldump:MySQL自带的数据库备份工具;使用逻辑备份

    • 物理备份:将数据库的data目录,直接复制备份。

      • InnoDB 存储引擎,数据库最核心的组件;

      • /usr/local/mysql/data/yun20(创建的库)对应表的后缀时idb; CSV;

      • 冷备份:关闭MySQL-Server后进行的备份。

      • 热备份:使用专业的数据备份工具,在服务运行中备份。

      • 全量备份:每次备份都备份所有的数据。

      • 增量备份(差异备份):只备份新增的数据或不一样的数据。

使用mysqldump工具进行备份

 # 本地备份(库)
 mysqldump -uroot -p密码  库名 > 库名.sql
 ​
 # 在其他主机远程备份
 mysqldump -uroot -p密码 -hIP地址 库名 > 库名.sql
 ​
 # 还原
 mysql -uroot -p密码 库名 < 库名.sql
 ​
 # 或者登录数据库后,在库中执行:
 use 库名
 source /路径/库名.sql;
 ​
 # 本地备份(表)
 mysqldump -uroot -p密码 库名 表名 > 表名.sql
 示例:
 mysqldump -uroot -proot123 test user_info > user_info.sql
 ​
 # 本地备份(多表)
 mysqldump -uroot -p密码 库名 表1 表2 表3 > 多表备份.sql
 ​
 #还原(单表/多表)
 mysql -uroot -p密码 库名 < 表名.sql
 ​
 # 也可以使用第三方工具操作
 ​

物理备份(冷备份)

 # 备份
 ## 冷备份,先停止mysql服务,在备份
 systemctl stop mysqld
 ​
 # 创建备份路径
 mkdir -p /备份路径
 实例:
 mkdir -p /bak/2026/6/6/
 ​
 # 使用cp命令备份
 cp -r /usr/local/mysql/数据库文件   /备份路径
 实例:
 cp -r /usr/local/mysql/data   /bak/2026/6/6/
 ​
 # 启动服务器
 systemctl start mysqld
 ​
 # 还原
 ## 先停止mysql服务,在还原
 systemctl stop mysqld
 ​
 # 删除原本数据库文件(注意不要删除错了)
 rm -rf /usr/local/mysql/data
 ​
 # 复制备份数据库文件恢复数据
 cp -r  /bak/2026/6/6/data  /usr/local/mysql/
 ​
 # 恢复文件属主、属组权限(不然会启动不了服务)
 chown mysql.mysql -R /usr/local/mysql/data
 ​
 # 启动服务器
 systemctl start  mysqld

物理备份(热备份)

  • Xtrabackuppercona免费开源的数据热备工具,用来替代Hotbackup。

  • Hotbackup:收费版数据热备工具。

安装软件及依赖

 # 安装依赖
 yum install -y libev perl-DBD-mysql perl-Digest-MD5 epel-release
 ​
 # 下载地址
 wget https://downloads.percona.com/downloads/Percona-XtraBackup-8.0/Percona-XtraBackup-8.0.12/binary/redhat/7/x86_64/percona-xtrabackup-80-8.0.12-1.el7.x86_64.rpm
 ​
 # 安装软件
 rpm -ivh percona-xtrabackup-80-8.0.12-1.el7.x86_64.rpm
 ​
 # 安装成功后测试版本
 xtrabackup -v

全量备份

 # 在备份服务器上创建一个目录,用于存储备份文件
 mkdir -P /bak/full(文件名自己创建)
 ​
 # 全量备份,如果远程备份需要添加参数--host=IP,删除--socket参数
 # 这将备份MySQL数据目录(/usr/local/mysql/data)到指定的目录(/bak/full )中
 xtrabackup  --defaults-file=/etc/my.cnf  \
             --user=root  \
             --password=123456 \
             --port=3306  \
             --socket=/tmp/mysql.sock \
             --datadir=/usr/local/mysql/data \
             --backup \
             --target-dir=/bak/full
             
 拆解翻译:
         xtrabackup                          # 命令本身
         --defaults-file=/etc/my.cnf         # 指定配置文件
         --user=root                         # 数据库用户名
         --password=123456                   # 数据库密码
         --port=3306                         # 端口号
         --socket=/tmp/mysql.sock            # Socket 文件路径
         --datadir=/usr/local/mysql/data     # 数据恢复目录
         --backup                            # 执行备份
         --target-dir=/bak/full              # 备份目录
 ​
 # 成功提示 
 ## 这说明你的 MySQL 全量备份已经顺利完成!
 260623 17:27:12 completed OK!
 ​
 # 可操作/可不操作
 # 验证备份文件
 ## 1. 查看备份目录内容
 ls -lh /bak/full/
 ​
 ## 2. 查看备份摘要信息
 cat /bak/full/xtrabackup_info
 ​
 ## 3. 查看备份大小
 du -sh /bak/full/
 ​
 # 还原
 # 首先停止MySQL服务
 systemctl stop mysqld
 ​
 #并确保MySQL数据目录为空(data存放数据目录)
 rm -rf /usr/local/mysql/data/*
 ​
 # 进行恢复:
 ## 1.合并数据文件和日志文件,确保数据完整性(准备阶段)
 xtrabackup --prepare \
            --datadir=/usr/local/mysql/data \
            --target-dir=/bak/full
            
 ## 准备(prepare)完成,现在可以用于恢复了
 260623 17:48:16 completed OK!
            
 拆解翻译:
         xtrabackup                          # 命令本身
         --prepare                           # 准备模式
         --datadir=/usr/local/mysql/data     # 数据恢复目录
         --target-dir=/bak/full              # 备份目录
 ​
 ## 2.全备的恢复(恢复阶段)
 xtrabackup  --copy-back \
             --datadir=/usr/local/mysql/data \
             --target-dir=/bak/full
             
 ## 完整复制到 MySQL 数据目录 /usr/local/mysql/data
 260623 17:49:19 completed OK!
             
 拆解翻译:
         xtrabackup                          # 命令本身
         --copy-back                         # 恢复模式
         --datadir=/usr/local/mysql/data     # 目标数据目录
         --target-dir=/bak/full              # 备份目录
         
 ## 3.修复所有者和权限
 chown -R mysql:mysql /usr/local/mysql/data
 ​
 ## 4.启动MySQL
 systemctl start mysqld
 ​
 # 5.登录测试
 mysql -uroot -p
 show databases;

增量备份

增量备份其实只针对的是InnoDB,对于MyISAM来说,还是完整备份。 增量备份前需要有一次全量备份

 # 增量备份 创建增量文件夹(inc1,inc2)
 mkdir /bak/{inc1,inc2}
 ​
 # 第一次增量备份
 xtrabackup  --defaults-file=/etc/my.cnf  \
             --user=root  \
             --password=root123 \
             --port=3306  \
             --socket=/tmp/mysql.sock \
             --datadir=/usr/local/mysql/data \
             --backup \
             --target-dir=/bak/inc1 \
             --incremental-basedir=/bak/full
               
 # 第二次增量备份
 xtrabackup  --defaults-file=/etc/my.cnf  \
             --user=root \
             --password=root123 \
             --port=3306  \
             --socket=/tmp/mysql.sock \
             --datadir=/usr/local/mysql/data \
             --backup \
             --target-dir=/bak/inc2 \
             --incremental-basedir=/bak/inc1
             
 拆解翻译:
         xtrabackup                              # 命令本身
         --defaults-file=/etc/my.cnf             # 指定配置文件    
         --user=root                             # 数据库用户名
         --password=123456                       # 数据库密码
         --port=3306                             # 端口号
         --socket=/tmp/mysql.sock                # Socket 文件
         --datadir=/usr/local/mysql/data         # 数据目录
         --backup                                # 执行备份
         --target-dir=/bak/inc1                  # 目标目录(每天存放路径文件都需要修改)
         --incremental-basedir=/bak/full         # 增量基准目录(可根据全量比较或者上次比较)
     
 # 增量备份总结
 参数                      一句话解释           自动化建议
 --target-dir             今天的增量放哪?      用 $(date +%Y%m%d) 自动生成,每天不同
 --incremental-basedir    和谁比?             生产环境建议永远指向全量 /bak/full,恢复最方便!
 ​
 注:上次比较需要增量数据全部添加到全备中,全备比较只用最后一次增量数据就行
 ​
 # 自动生成写法推荐
 写法一:
 常用格式(推荐)目录会自动变成 /bak/inc_20260624(今天的日期)
 --target-dir=/bak/inc_$(date +%Y%m%d)
 ​
 写法二:
 带时分秒(防止一天多次备份)目录会自动变成 /bak/inc_20260624_143025(年月日_时分秒)
 --target-dir=/bak/inc_$(date +%Y%m%d_%H%M%S)
     
 # 增量还原
 ## 1.首先停止MySQL服务
 systemctl stop mysqld
 ​
 ## 并确保MySQL数据目录为空。
 rm -rf /usr/local/mysql/data/*
 ​
 # 进行恢复
 ## 1.准备全备(增量备份的恢复,需要恢复增量备份到完全备份)
 ## 预处理,此选项--apply--log-only 阻止回滚未完成的事务
 xtrabackup --prepare --apply-log-only --target-dir=/bak/full
 ​
 ## 2.将第一次增备添加到全备中
 xtrabackup --prepare --apply-log-only --target-dir=/bak/full --incremental-dir=/bak/inc1
 ​
 ## 3.将第二次增备添加到全备中
 xtrabackup --prepare --apply-log-only --target-dir=/bak/full --incremental-dir=/bak/inc2
 ​
 注:如果增量备份较多的情况可以用脚本批量合并增量备份(每次增量必须全部加到全备中)
 ​
 ## 4.将合并后的完备再一次准备复制到数据库目录,注意数据库目录必须为空,MySQL服务不能启动
 ### A.合并数据文件和日志文件,确保数据完整性。
 xtrabackup --prepare \
            --datadir=/usr/local/mysql/data \
            --target-dir=/bak/full
 ### B.全备的恢复
 xtrabackup  --copy-back \
             --datadir=/usr/local/mysql/data \
             --target-dir=/bak/full
 ​
 # 这将从备份中复制数据文件到MySQL数据目录,并将权限设置正确。
 # 5.修复所有者和权限
 chown -R mysql:mysql /usr/local/mysql/data
 ​
 # 6.启动MySQL
 systemctl start mysqld
 ​
 # 7.登录测试
 mysql -uroot -proot123
 show databases;