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;

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

| 姓名 | 地址 |

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

| 小明 | 美国 |

| 华为 | 日本 |

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

相关推荐
一休哥助手7 分钟前
Redis 五种数据类型及底层数据结构详解
数据结构·数据库·redis
翔云12345615 分钟前
MVCC(多版本并发控制)
数据库·mysql
代码敲上天.31 分钟前
数据库语句优化
android·数据库·adb
盒马盒马1 小时前
Redis:zset类型
数据库·redis
静听山水1 小时前
mysql语句执行过程
数据库·mysql
虽千万人 吾往矣1 小时前
golang gorm
开发语言·数据库·后端·tcp/ip·golang
Q_w77422 小时前
一个真实可用的登录界面!
javascript·mysql·php·html5·网站登录
mariokkm2 小时前
Django一分钟:在Django中怎么存储树形结构的数据,DRF校验递归嵌套模型的替代方案
数据库·django·sqlite
Wang's Blog3 小时前
Redis: 集群环境搭建,集群状态检查,分析主从日志,查看集群信息
数据库·redis
容器( ु⁎ᴗ_ᴗ⁎)ु.。oO3 小时前
MySQL事务
数据库·mysql