数据库备份与恢复(2)

备份方法

备份方法一Mysqldump

sql 复制代码
# 导出
mysqldump [options] > dump.sql
# 导⼊
mysql [options] < backup-file.sql

简单示例

原始数据

sql 复制代码
-- 选择数据库
use testdb
-- 查看所有表
Database changed
show tables;
+------------------+
| Tables_in_testdb |
+------------------+
| t1 |
+------------------+
1 row in set (0.00 sec)
-- 写⼊数据
INSERT INTO `t1` VALUES (109,'bit109'),(110,'bit110'),(111,'bit111');
-- 查看表中的数据
select * from t1;
+-----+--------+
| id | name |
+-----+--------+
| 101 | bit101 |
| 102 | bit102 |
| 103 | bit103 |
| 109 | bit109 |
| 110 | bit110 |
| 111 | bit111 |
+-----+--------+
6 rows in set (0.01 sec)
sql 复制代码
# 导出本地testdb数据库中的所有数据到磁盘
mysqldump -uroot -p -h127.0.0.1 -P3306 -B testdb > /backup/mysql/dump.sql
# 备份⽂件按当前时间命名
mysqldump -uroot -p -h127.0.0.1 -P3306 -B testdb > /backup/mysql/`date
+%Y%m%d`.sql

常用选项

恢复数据

sql 复制代码
# ⽅式⼀:在命令⾏通过mysql客⼾⼯具直接恢复
mysql -uroot -p < /backup/mysql/dump.sql
# ⽅式⼆:登录mysql客⼾端导⼊SQL⽂件
msyql -uroot -p
password:
mysql> source /backup/mysql/dump.sql

备份执行流程

存在问题

1.其他操作处于等待过程,影响其他操作的执行

2.会导致数据不一致的情况

解决一致性问题

收集信息

这几个库是系统自带的,需要排除

查看数据库和表信息
存储过程、触发器和调度事件
sql 复制代码
-- 查看是否存在存储过程
SELECT count(*) FROM information_schema.routines;
+----------+
| count(*) |
+----------+
| 48 |
+----------+
1 row in set (0.01 sec)
-- 查看是否存在触发器、调度事件
SELECT count(*) FROM information_schema.TRIGGERS;
+----------+
| count(*) |
+----------+
| 2 |
+----------+
1 row in set (0.00 sec)
-- 查看是否存在调度事件
SELECT count(*) FROM information_schema.EVENTS;
+----------+
| count(*) |
+----------+
| 0 |
+----------+
1 row in set (0.00 sec)
查看字符集
sql 复制代码
-- 查看字符集
show variables like 'character%';
查看限制信息

创建备份用户

生产环境单库备份

单表多表备份

按条件备份

导出表结构

只备份数据

数据导入

1.通过mysql客户工具直接恢复

2.使用source命令导入

3.流式导入

流程

监控恢复进度

复制代码
# 安装PV⼯具
# Debian/Ubuntu 系统
sudo apt-get install pv
# Red Hat/CentOS 系统
sudo yum install pv
# 导⼊并查看进度
pv -L1000 /backup/mysql/dump6.sql | mysql -uroot -p123456 -h192.168.100.237 -
P3306
pv -L1000 /backup/mysql/dump6.sql | mysql -uroot -p123456 -h127.0.0.1 -P3306

备份方法二SQL语句导入导出

特点

语法

mysqlimport

示例

导出

导入

导出导入时字段顺序

使用mysqlimport进行导入

可以看到,如果文件名字和表名字不同,则会导致导入失败,所以我们前面建议导出文件名字和表名字相同

备份方法三物理备份工具-Xtrabackup

介绍

下载

复制代码
# 安装软件源
dpkg -i percona-xtrabackup-80_8.0.35-31-1.jammy_amd64.deb
# 更新源
apt update
# 安装xtrabackup
apt install percona-xtrabackup-80
# 如果提⽰缺少依赖运⾏以下命令安装
apt-get install -f
# 如果之前修改过MySQL的配置⽂件会有以下提⽰,保留当前的配置选择N
Configuration file '/etc/mysql/mysql.cnf'
==> Modified (by you or by a script) since installation.
==> Package distributor has shipped an updated version.
What would you like to do about it ? Your options are:
Y or I : install the package maintainer ''s version
N or O : keep your currently-installed version
D : show the differences between the versions
Z : start a shell to examine the situation
The default action is to keep your current version.
** mysql.cnf (Y/I/N/O/D/Z) [default=N] ? N
# 更新源
apt update
# 重新安装xtrabackup
apt install percona-xtrabackup-80
# 验证是否成功
xtrabackup --version
2024-11-27T18:32:13.374176+08:00 0 [Note] [MY-011825] [Xtrabackup] recognized
server arguments: --datadir=/var/lib/mysql --log_bin=/var/lib/mysql/binlog
xtrabackup version 8.0.35-31 based on MySQL server 8.0.35 Linux (x86_64)
(revision id: 55ec21d7)

全备份

恢复

物理全量备份常用指令

复制代码
# 停⽌MySQL服务
systemctl stop mysql
# 查看MySQL服务是否停⽌
systemctl status mysql
# 移动或删除原来的数据⽬录
mv /var/lib/mysql /var/lib/mysql-old
# 创建数据⽬录同名的空⽬录
mkdir -p /var/lib/mysql
# 准备
xtrabackup --prepare --target-dir=/backup/mysql/full
# 恢复数据
xtrabackup --defaults-file=/etc/mysql/my.cnf \
--copy-back --parallel=2 --target-dir=/backup/mysql/full
# 为恢复⽬录授权
chown -R mysql:mysql /var/lib/mysql
# 启动MySQL服务
systemctl start mysql
# 查看MySQL服务
systemctl status mysql

增量备份

复制代码
# 全备
xtrabackup --defaults-file=/etc/mysql/my.cnf \
--host=localhost --port=3306 --user=backup_user --password=123456 \
--use-memory=1G --parallel=2 \
--backup --target-dir=/backup/mysql/full
# 查看检查点信息
cat /backup/mysql/full/xtrabackup_checkpoints
# 为当前增量备份指定保存备份的⽬录,以及全量备份的⽬录
xtrabackup --host=localhost --port=3306 --user=backup_user --password=123456
\
--backup \
--target-dir=/backup/mysql/inc1 \
--incremental-basedir=/backup/mysql/full
# 查看检查点信息
cat /backup/mysql/xtrabackup-inc1/xtrabackup_checkpoints
# 为当前增量备份指定保存备份的⽬录,以及上⼀次增备的⽬录
xtrabackup --host=localhost --port=3306 --user=backup_user --password=123456 \
--backup \
--target-dir=/backup/mysql/inc2 \
--incremental-basedir=/backup/mysql/inc1
# 查看检查点信息
cat /backup/mysql/xtrabackup-inc2/xtrabackup_checkpoints
复制代码
# 恢复数据
xtrabackup --copy-back --parallel=2 --target-dir=/backup/mysql/full
# 为恢复⽬录授权
chown -R mysql:mysql /var/lib/mysql
# 启动MySQL服务
systemctl start mysql
# 查看MySQL服务
systemctl status mysql
相关推荐
麦聪聊数据几秒前
拒绝循环写库:MySQL 批量插入、Upsert 与跨表更新的高效写法
数据库·sql·mysql
技术净胜1 分钟前
mysqldump 命令备份单库、多库、全库实操指南
数据库·mysql·adb
1.14(java)1 分钟前
数据库范式详解与设计实践
数据库·mysql
麦聪聊数据2 分钟前
由SQL空值 (NULL)引发的逻辑黑洞:从NOT IN失效谈起
数据库·sql·mysql
陈天伟教授4 分钟前
关系数据库-06. 触发器
数据库·oracle·达梦数据库·国产数据库
2501_944521004 分钟前
rn_for_openharmony商城项目app实战-账号安全实现
javascript·数据库·安全·react native·react.js·ecmascript
dishugj6 分钟前
【Oracle】 闪回技术(Flashback)的底层原理
数据库·oracle·flashback
想摆烂的不会研究的研究生10 分钟前
每日八股——Redis(4)
数据库·经验分享·redis·后端·缓存
杨了个杨898211 分钟前
Redis主从复制部署
数据库·redis·缓存
DBA小马哥14 分钟前
金仓数据库替代MongoDB:如何高效存储复杂数据类型并实现平滑迁移
数据库·mongodb·dba