备份介绍
为了防止数据丢失、方便数据迁移,建议定期备份数据中的数据。
方式:
逻辑备份:将数据库中库和表转换为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物理备份(热备份)
Xtrabackup:percona免费开源的数据热备工具,用来替代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;
原创
MySQL备份
本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
评论交流
欢迎留下你的想法