完整的 mysqldump 备份与恢复示例
最后更新于:2022-04-02 03:56:24
[TOC]
> [参考网站](https://juejin.cn/post/6844903511201677325#heading-9)
## 概述
如果是maridb 则 为 maria_bin.xxx
## 实例
### 备份数据库
```
> ./mysqldump -uroot -ppassword -l -F t2 > t2.dmp
参数说明:
-l 参数表示给所有表加读锁
-F 表示生成一个新的日志文件
```
为了便于测试,执行 reset master 删除所有 binlog
```
MySQL [(none)]> reset master;
Query OK, 0 rows affected (0.00 sec)
# 此时只有一个 binlog 日志文件 mysql-bin.000001
MySQL [t2]> select * from test;
+------+------+
| id | name |
+------+------+
| 1 | a |
| 2 | b |
+------+------+
```
### 备份完毕后,插入新的数据
因为上一步执行是加入了 -F 选项, 所以接下来的操作会被记录到新的二进制文件,即名为 mysql-bin.000002 的文件
```
MySQL [t2]> insert into test values (3,'c');
MySQL [t2]> insert into test values (4,'d');
```
### 模拟故障-删库
```
// 这里为了便于测试,不把删库操作记入日志,当前 session 设置 sql_log_bin 为 off。
// 删库后,执行 flush logs,让后续的 binlog 到新的文件中,即名为 mysql-bin.000003中
MySQL [t2]> set sql_log_bin = 0;
MySQL [t2]> show variables like "%sql_log_bin%";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| sql_log_bin | OFF |
+---------------+-------+
1 row in set (0.00 sec)
MySQL [t2]> drop database t2;
MySQL [(none)]> flush logs;
MySQL [t2]> drop database t2;
```
### 恢复备份
```
> ./mysql -e "create database t2"
> ./mysql t2 < t2.dmp
-----
MySQL [t2]> select * from test;
+------+------+
| id | name |
+------+------+
| 1 | a |
| 2 | b |
+------+------+
```
### 恢复 binglog
- 使用 mysqlbinlog 还原 binlog日志
- 备份的时间点到删库的时间点之间的操作被记录到了 mysql-bin.000002 文件中
```
> ./mysqlbinlog --no-defaults /data/mysql/mysql-bin.000002 | ./mysql t2
*******************************************************
MySQL [t2]> select * from test;
+------+------+
| id | name |
+------+------+
| 1 | a |
| 2 | b |
| 3 | c |
| 4 | d |
+------+------+
```
数据恢复成功
';