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:
2:
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
备份后修改前:
修改后:
四、开始模拟数据库被异常删除了(实验环境这样,实际生产中千万不要用这种命令)
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]> source /data/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表恢复成功了
注释: 通过 select * from students;可以查看到之前修改过的数据库文件都恢复成功了。
至此恢复完成