Mysql数据备份 — mysqldump

一 备份类型

- 逻辑备份(mysqldump)

  • 优点:

  • 恢复简单,可以使用管道将他们输入到mysql。

  • 与存储引擎无关,因为是从MySQL服务器中提取数据而生成的,所以消除了底层数据存储的不同。

  • 有助于避免数据损坏。若磁盘驱动器有故障而要复制原始文件时,此时将得到一个损坏的备份。

  • 缺点:

  • 必须有数据库服务器完成逻辑工作,需要更多地cpu周期。

  • 逻辑备份还原速度慢:需要MySQL加载和解释语句、转化存储格式、重建引擎。
    - 物理备份(xtrabackup):

  • 优点:

  • 基于文件的物理备份。

  • 容易跨平台、跨操作系统和MySQL版本。

  • 恢复起来会更快(不需要执行任何的mysql语句,不需要构建索引,innoDB表无需完全缓存到内存)。

  • 缺点:

  • 文件大。

  • 不总是可以跨平台、操作系统和MySQL版本。
    - 其他备份方法:

  • cp:直接复制数据库文件,备份速度快,恢复速度快,但功能较弱,适用于少量数据备份。

  • lvm2快照:基于文件系统管理工具进行备份,备份速度快,恢复速度快,支持几乎热备,适用于中小型数据量的备份。

每种备份方法都有其适用的场景,选择哪种备份方法取决于你的具体需求和环境。

二 逻辑备份 - mysqldump

mysqldump命令及其参数:

  • 基本语法:mysqldump -u username -p dbname table1 table2 ... > BackupName.sql

  • username:MySQL用户名

  • dbname:数据库名称

  • table1、table2:表名称,如果没有这些参数,将备份整个数据库

  • BackupName.sql:备份文件的名称,文件名前面可以加上一个绝对路径

  • 恢复数据:mysql -u username -p dbname < /path/to/backup.sql

  • username:MySQL用户名

  • dbname:数据库名称

  • /path/to/backup.sql:备份文件的路径

2.1 插入数据

sql 复制代码
-- 创建数据库
CREATE DATABASE db_default;

-- 使用数据库
USE db_default;

-- 创建表
CREATE TABLE db_one (
  姓名 VARCHAR(255),
  地址 VARCHAR(255)
);

-- 插入数据
INSERT INTO db_one (姓名, 地址) VALUES ('小明', '美国'), ('小美', '中国');

2.2 备份数据表

bash 复制代码
 mysqldump -u root -p db_default db_one > /tmp/db_one_backup.sql

2.3 表级别恢复

bash 复制代码
mysql -u root -p db_default < /tmp/db_one_backup.sql

或则 进入数据库

sql 复制代码
use  db_default;
source /tmp/db_one_backup.sql;

2.4 库级别备份和还原

sql 复制代码
mysqldump -u root  --databases db_default > /tmp/db_one_backup.sql -p

MariaDB [db_default]> DROP DATABASE db_default;

Query OK, 1 row affected (0.00 sec)

sql 复制代码
mysql < ./db_one_backup.sql  -p
##在shell 还原 数据库

MariaDB [(none)]> select * from db_default.db_one

-> ;

+--------+--------+

| 姓名 | 地址 |

+--------+--------+

| 小明 | 美国 |

| 小美 | 中国 |

2.5 全库备份

在MySQL中,如果想使用mysqldump使用全库级别备份,必须开启二进制日志!

常用选项:

  1. -h, --host=主机: 指定连接到的MySQL服务器的主机名。

  2. --databases 数据库1 [数据库2 ...]: 指定要备份的一个或多个数据库。

  3. --all-databases: 备份MySQL服务器中的所有数据库。

  4. --single-transaction: 在事务处理中运行mysqldump,以确保备份的数据是一致的。

  5. --lock-tables, -l: 在备份每个表之前对其进行锁定。在大型数据库上可能导致服务中断,推荐使用--single-transaction

  6. --result-file=文件路径: 将输出重定向到指定的文件,而不是默认输出到标准输出。

高级用法:

  1. --ignore-table=数据库.表: 指定要忽略备份的表,可以指定特定数据库中的特定表。

  2. --skip-lock-tables: 不对所有表进行锁定,即不使用--lock-tables选项。

  3. --compress: 在传输数据时使用压缩。

  4. --routines: 一起备份存储过程和函数。

  5. --triggers: 一起备份触发器。

  6. --events: 一起备份事件。

  7. --add-drop-database: 在每个数据库创建语句之前添加DROP DATABASE IF EXISTS语句。

  8. --add-drop-table: 在每个表创建语句之前添加DROP TABLE IF EXISTS语句。

sql 复制代码
mysqldump -u 用户名 -p 密码 --all-databases > /路径/到/备份文件.sql

2.6 总结

  1. mysqldump工具备份的是sql语句,备份不需要暂停服务

  2. 使用备份文件恢复时需要保持数据库处于运行状态

  3. 只能实现,全库,指定库,表级别的某时刻的备份,本身不能增量备份

  4. 适合中小数据库

三 mysqldump + binlog 实现增量备份

sql 复制代码
 mysqldump -u root -p --databases db_default --flush-logs --master-data > /tmp/all.sql
##全库备份
sql 复制代码
[root@master binlog]# ls
mysql-bin.000001  mysql-bin.000002  mysql-bin.000003  mysql-bin.index
[root@master binlog]# ls
mysql-bin.000001  mysql-bin.000002  mysql-bin.000003  mysql-bin.000004  mysql-bin.index
#此时已经刷新了一个新的binlog文件

3.1 对数据进行增删改操作

sql 复制代码
DELETE FROM db_default.db_one WHERE 姓名 = '小美';
INSERT INTO db_default.db_one (姓名, 地址) VALUES ('华为', '日本');

MariaDB [(none)]> select * from db_default.db_one

-> ;

+--------+--------+

| 姓名 | 地址 |

+--------+--------+

| 小明 | 美国 |

| 华为 | 日本 |

+--------+--------+

2 rows in set (0.00 sec)

3.2 模拟数据库故障后恢复

sql 复制代码
 drop database db_default;

##备份最新或全部二进制文件

sql 复制代码
[root@master binlog]# ll
总用量 20
-rw-rw---- 1 mysql mysql  264 11月  9 13:06 mysql-bin.000001
-rw-rw---- 1 mysql mysql 3924 11月 10 10:25 mysql-bin.000002
-rw-rw---- 1 mysql mysql  288 11月 10 10:26 mysql-bin.000003
-rw-rw---- 1 mysql mysql  790 11月 10 10:30 mysql-bin.000004
-rw-rw---- 1 mysql mysql  176 11月 10 10:26 mysql-bin.index
[root@master binlog]# cp mysql-bin.000004 /tmp

库恢复 (只是恢复了备份时候的数据 并没有恢复全部)

sql 复制代码
MariaDB [(none)]> source /tmp/all.sql

MariaDB [db_default]> select * from db_default.db_one
    -> ;
+--------+--------+
| 姓名   | 地址   |
+--------+--------+
| 小明   | 美国   |
| 小美   | 中国   |
+--------+--------+
2 rows in set (0.00 sec)

读取二进制文件

bash 复制代码
mysqlbinlog --no-defaults --base64-output=never ./mysql-bin.000004

##查找事故临界点位置 如drop databases db_default

#231110 09:34:30 server id 1 end_log_pos 692 Xid = 207

at 314

SET TIMESTAMP=1699583370/*!*/;

DELETE FROM db_default.db_one WHERE 姓名 = '小美'

/*!*/;

at 527

#231110 10:29:30 server id 1 end_log_pos 692 Xid = 207

SET TIMESTAMP=1699583370/*!*/;

INSERT INTO db_default.db_one (姓名, 地址) VALUES ('华为', '日本')

at 692

SET TIMESTAMP=1699583448/*!*/;

drop database db_default

恢复数据(这边是时间 也可以填写 at后面的数字)

bash 复制代码
mysqlbinlog --no-defaults --base64-output=never  --start-datetime="2023-11-10 10:00:00" --stop-datetime="2023-11-10 10:30:00" mysql-bin.000004 | mysql -u root -p

MariaDB [db_default]> select * from db_default.db_one;

+--------+--------+

| 姓名 | 地址 |

+--------+--------+

| 小明 | 美国 |

| 华为 | 日本 |

+--------+--------+

相关推荐
广州智造4 小时前
OptiStruct实例:3D实体转子分析
数据库·人工智能·算法·机器学习·数学建模·3d·性能优化
技术宝哥7 小时前
Redis(2):Redis + Lua为什么可以实现原子性
数据库·redis·lua
学地理的小胖砸8 小时前
【Python 操作 MySQL 数据库】
数据库·python·mysql
dddaidai1239 小时前
Redis解析
数据库·redis·缓存
数据库幼崽9 小时前
MySQL 8.0 OCP 1Z0-908 121-130题
数据库·mysql·ocp
Amctwd9 小时前
【SQL】如何在 SQL 中统计结构化字符串的特征频率
数据库·sql
betazhou10 小时前
基于Linux环境实现Oracle goldengate远程抽取MySQL同步数据到MySQL
linux·数据库·mysql·oracle·ogg
lyrhhhhhhhh10 小时前
Spring 框架 JDBC 模板技术详解
java·数据库·spring
喝醉的小喵11 小时前
【mysql】并发 Insert 的死锁问题 第二弹
数据库·后端·mysql·死锁
付出不多12 小时前
Linux——mysql主从复制与读写分离
数据库·mysql