MySQL数据库的备份还原至最新状态

模拟数据库在某次备份后但未达到下次备份时间中,被意外删除的数据

此处恢复hello数据库和里面的students表

使用工具:均为mariadb-server自带

1 mysqldump 
2 mysqlbinlog

前提条件:

  二进制日志文件必须开启

MariaDB [(none)]> show master logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |      7674 |
| mysql-bin.000002 |       264 |
| mysql-bin.000003 |  15864234 |
| mysql-bin.000004 |     30379 |
| mysql-bin.000005 |   1038814 |
| mysql-bin.000006 |       264 |
| mysql-bin.000007 |       245 |
+------------------+-----------+

但因为我服务器上有过二进制日志文件,清除掉这些二进制日志

1 MariaDB [hello]> reset master;
MariaDB [hello]> show master logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |       245 |
+------------------+-----------+
现在就是个干净的日志文件
1 cat /etc/my.cnf
2 [mysqld] 3 log_bin=/data/logbin/mysql-bin
这里指定了二进制日志文件的位置,实际生产中,建议二进制日志文件放在其他盘上,实在没有,最好也在其他分区上

sql_log_bin=ON|OFF:是否记录二进制日志,默认ON
log_bin=/PATH/BIN_LOG_FILE:指定文件位置;默认OFF,表示不启用二进制日志功能,上述两项都开启才可
注释:MariaDB [hello]>这个表示在数据库中执行的,没有这个就表示在shell命令中执行的
一、开始全局备份重定向到 /data/下,备份文件后的文件名为all.sql
mysqldump -A --master-data=2 > /data/all.sql

# 注释:此处-A表示全局备份,--master-data=后面有两个选项,分别是1和2,1可以用来配合主从复制,此处我没有配置主从服务器就选择2就可以

1和2区别1是命令,而2只是个注释

1:

MySQL数据库的备份还原至最新状态

 2:

MySQL数据库的备份还原至最新状态

mysql -e 'show master logs'
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |       245 |
+------------------+-----------+

# 注释:此处为了看的清除,我清除了之前的二进制日志文件,现在的位置是245(初始的二进制日志文件就是245)

 二、切换到hello表,查看表中的数据,以做后续参考

MariaDB [mysql]> use hello
MariaDB [hello]> select * from students;
+-------+---------------+-----+--------+---------+-----------+
| StuID | Name          | Age | Gender | ClassID | TeacherID |
+-------+---------------+-----+--------+---------+-----------+
|     1 | Shi Zhongyu   |  22 | M      |       2 |         3 |
|     2 | Shi Potian    |  22 | M      |       1 |         7 |
|     3 | Xie Yanke     |  53 | M      |       2 |        16 |
|     4 | Ding Dian     |  32 | M      |       4 |         4 |
|     5 | Yu Yutong     |  26 | M      |       3 |         1 |
|     6 | Shi Qing      |  46 | M      |       5 |      NULL |
|     7 | Xi Ren        |  19 | F      |       3 |      NULL |
|     8 | Lin Daiyu     |  17 | F      |       7 |      NULL |
|     9 | Ren Yingying  |  20 | F      |       6 |      NULL |
|    10 | Yue Lingshan  |  19 | F      |       3 |      NULL |
|    11 | Yuan Chengzhi |  23 | M      |       6 |      NULL |
|    12 | Wen Qingqing  |  19 | F      |       1 |      NULL |
|    13 | Tian Boguang  |  33 | M      |       2 |      NULL |
|    14 | Lu Wushuang   |  17 | F      |       3 |      NULL |
|    15 | Duan Yu       |  19 | M      |       4 |      NULL |
|    16 | Xu Zhu        |  21 | M      |       1 |      NULL |
|    17 | Lin Chong     |  25 | M      |       4 |      NULL |
|    18 | Hua Rong      |  23 | M      |       7 |      NULL |
|    19 | Xue Baochai   |  18 | F      |       6 |      NULL |
|    20 | Diao Chan     |  19 | F      |       7 |      NULL |
|    21 | Huang Yueying |  22 | F      |       6 |      NULL |
|    22 | Xiao Qiao     |  20 | F      |       1 |      NULL |
|    23 | Ma Chao       |  23 | M      |       4 |      NULL |
|    24 | Xu Xian       |  27 | M      |    NULL |      NULL |
|    25 | Sun Dasheng   | 100 | M      |    NULL |      NULL |
|    26 | a             |  20 | F      |    NULL |      NULL |
|    27 | b             |  20 | F      |    NULL |      NULL |
+-------+---------------+-----+--------+---------+-----------+

三、对数据进行修改

MariaDB [hello]> insert students (name,age)values('测试1',100);
MariaDB [hello]> insert students (name,age)values('测试2',101);
MariaDB [hello]> insert students (name,age)values('测试3',102);
MariaDB [hello]> update students set classid=111 where stuid=27

备份后修改前:

MySQL数据库的备份还原至最新状态

 修改后:

MySQL数据库的备份还原至最新状态

 四、开始模拟数据库被异常删除了(实验环境这样,实际生产中千万不要用这种命令)

rm -rf /var/lib/mysql/*

五、先禁止用户通过网络访问,只能使用本地的套接字来连接

vim /etc/my.cnf
skip-networking

六、开始重启服务

systemctl restart mariadb

注释:重新启动数据库,会生成崭新的数据库文件,但里面是没有数据的

七、临时关闭二进制日志文件

MariaDB [(none)]> set sql_log_bin=off;

注释:还原数据的生成二进制日志文件没有什么用,其他用户此时也不能访问,此处暂时不用记录二进制日志文件

八、查看之前的二进制日志文件更新到哪里了

MariaDB [(none)]> show master logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |      1175 |
| mysql-bin.000002 |     30379 |
| mysql-bin.000003 |   1038814 |
| mysql-bin.000004 |       245 |
+------------------+-----------+

注释:此处1,2,3是上次备份之后生成的,需要导出的,而这个4是刚刚启动时生成的(每次重启服务之后会重新生成二进制日志)没有用,可以不用导出

九、其他窗口打开,导出二进制日志文件

mysqlbinlog mysql-bin.000001 > /data/inc.sql
mysqlbinlog mysql-bin.000002 >> /data/inc.sql
mysqlbinlog mysql-bin.000003 >> /data/inc.sql

注释:此处特地分开写,后面两个是追加,mysqlbinlog是导出二进制日志文件的命令

十、回到之前的窗口

把之前备份的文件导入进数据库,还有之前生成的二进制日志文件,也导入进数据库

MariaDB [test]> source /data/all.sql;
MariaDB [test]> /inc.sql

十一、此时查看上次备份后,新增和修改的数据是否恢复成功了。

MariaDB [hello]>  show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| hello              |
| mysql              |
| performance_schema |
| test               |
+--------------------+

注释:此时hello数据库已经恢复成功了

MariaDB [hello]> show tables;
+-----------------+
| Tables_in_hello |
+-----------------+
| classes         |
| coc             |
| courses         |
| scores          |
| students        |
| teachers        |
| testlog         |
| toc             |
+-----------------+

注释:此时可以查看到之前的students表恢复成功了

MySQL数据库的备份还原至最新状态

 注释: 通过 select * from students;可以查看到之前修改过的数据库文件都恢复成功了。

至此恢复完成