紧急 抢救mysql 数据库 恢复到指定时间点

情景介绍 :

**

前提 是开启了binlog日志 当时数据没备份 只有一份基础表 数据结构还不全

**

因为错误执行了其他项目的sql文件 因为有重名的数据表 导致原项目的数据表和数据都不存在了。
或者 错误执行sql语句 或者误删除了表 都可以用

(原基础表 不全也没事)

1. 先知道自己执行了什么sql语句 先以我自己的为例 : 找到执行语句的开头

紧急 抢救mysql 数据库 恢复到指定时间点_第1张图片

可以看出 这里先执行了 DROP TABLE IF EXISTS admin_config

  1. 找到 从binlog 文件 进行查找
  mysqlbinlog -d aibuy mysql-bin.000001 |grep -i -n 'DROP TABLE IF EXISTS `admin_config`'

在这里插入图片描述

然后根据行数 继续查询

尽量 往前多看几行 这里从 3928555 开始

mysqlbinlog -d aibuy mysql-bin.000001 |awk 'NR>3928555'|more

紧急 抢救mysql 数据库 恢复到指定时间点_第2张图片

可以看到 我们开始执行 是在 116803631 ,所以 116803630 是我们之前的数据

再次确认 --start-datetime 开始时间 因为我的表示从这个时间开始创建的

–stop-position=116803640 结束位置 往后几行 多观察下

mysqlbinlog -d aibuy --start-datetime='2022-05-05 16:36:46' --stop-position=116803640 mysql-bin.000001 |tail -100

紧急 抢救mysql 数据库 恢复到指定时间点_第3张图片

** –start-datetime 开始时间
如果数据全部都没了 就从最开始的时间 可根据自己实际情况 修改开始时间

–stop-position 结束位置 跟自己情况修改

mysqlbinlog -d aibuy --start-datetime='2022-05-05 16:36:46' --stop-position=116803630 mysql-bin.000001 > /usr/local/src/01.sql

查看文件生成了没?

ls -lh /usr/local/src/

在这里插入图片描述

先把现在数据备份一次

mysqldump -uroot -p aibuy > /usr/local/src/aibuy_old.sql 
  1. 停止 mysql 服务 配置不要密码验证
service mariadb  stop

为了省会不要密码验证 修改配置文件 (在启动mysql时不启动授权表功能,可以直接免密码登录)

vi /etc/my.cnf

添加下面的内容

   skip-grant-tables

启动mysql

service mariadb  start
  1. 原先的基础表导入一次  (基础表没涉及太多的话   这一步可省略)
    
mysql -uroot -p aibuy  < aibuy.sql
  1. 导入数据
mysql -uroot -p -f aibuy  < 01.sql 

查看mysql进程

ps -ef|grep mysql

查看文件大小

wc -l 01.sql

查看mysql 执行

show datbases;

use 数据库名;

source /usr/local/src/aibuy.sql   (可省略 这是导入最早的基础表)

show processlist;

select a.time/3600/24,a.* from  information_schema.processlist a;

你可能感兴趣的:(mysql,数据库,mariadb)