mysql数据库删除binlog无法启动

原因

今天发现mysql数据库磁盘满了, 看到很多的binlog文件很大, 而且修改时间又是在很久, 之前于是就备份了一下binlog日志, 然后把binlog日志删除了。最终导致在进行了一个个mysql的写操作之后mysql挂了, 而且无法重启.

通过ps -ef|grep mysql 命令来查看mysql进程, 发现进程在, 但是想kill
进程的时候发现, 进程又不存在了, 然后再次打开查看mysql进程发现进程id又不一样了, 此时感觉到这个mysql应该是不断在重启, 而又不断的重启失败。

此时想查看mysql的启动报错日志, 但是又不知道路径, 于是通过以下命令来查看mysql的日志路径:

vim /etc/my.cnf

发现mysqld模块下面如下的配置

datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock

default_authentication_plugin=mysql_native_password
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

然后通过命令 vim /var/log/mysqld.log来查看mysql的报错日志
具体的报错如下:
space name jxtms/CostManage, which is outside the tablespace bounds. B
yte offset 0, len 16384, i/o type read. If you get this error at mysqld startup, please check that your my.cnf matches the ibdata files that you have in the MySQL server.

通过那个报错以为是my.cnf中没有匹配ibdata files的路径, 于是在my.cnf加了一下配置, 但是发现还是没有用, 还是在不断

innodb_data_file_path = ibdata1:76M;ibdata2:12M:autoextend:max:500M

然后就试了试mysql日志中推荐的强制恢复mysql的操作, 官方地址如下:
https://dev.mysql.com/doc/refman/8.0/en/forcing-innodb-recovery.html
主要就是在mysqld中加一下如下的配置, 其中后面的值从1-6, 从1到6风险主键增加, 官方文档也说必须先备份一下你的数据, 这里我都无法启动了不知道如何备份, 幸运的是我同事在前两天备份过数据库, 而且我们是开发库, 问题不是很大.
在这里插入图片描述

[mysqld]
innodb_force_recovery = 1

但是我设置了该配置从1一直到6都无济于事, 一直还是处于不断重启中, 然后就放弃了这个办法。最终同事用这个方法成功了, 原因居然是我没有把这个配置innodb_force_recovery = 1放在配置文件my.cnf下面的[mysqld]模块的第一行,而是最后一行, 导致这个配置没有生效。
像下面这样就可以了.
然后重启数据库就能启动了, 但是重启以后,还是无法访问有问题的表空间对应的数据库, 其他数据库是能访问的.此时只能新建一个同名字的数据库, 然后把数据重新到导入里面。然后把innodb_force_recovery给蛛丝注释掉, 再次重启mysql即可.在这里插入图片描述
附加知识

binlog二进制日志是mysql-server层的,主要是做主从复制,时间点恢复使用。redo log重做日志是InnoDB存储引擎层的,用来保证事务安全。undo log回滚日志保存了事务发生之前的数据的一个版本,可以用于回滚,同时可以提供多版本并发控制下的读(MVCC),也即非锁定读。redo log。redo log在事务没有提交前,每一个修改操作都会记录变更后的数据,保存的是物理日志->数据。

binlog是一个二进制格式的文件,用于记录用户对数据库更新的SQL语句信息,但对库表等内容的查询不会记录由于是二进制文件,需使用mysqlbinlog解析查看主要作用:用于数据库的主从复制及数据的增量恢复ROW (行模式) :

记录哪条数据修改了记录的是修改的那条记录的全部数据,即使只更新了-个字段, binlog里也会记录所有字段的数据Statement (语句模式) :每一条会修改数据的sq都会记录在binlog中作用:用于复制,在主从复制中,从库利用主库上的binlog进行重播,实现主从同步。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
MySQL binlogMySQL数据库的日志文件,用于记录数据库中所有的操作。使用binlog可以实现MySQL数据的备份、恢复和数据同步等功能。 在Spring Boot中,可以通过使用JDBC连接MySQL数据库并订阅binlog文件,实现对MySQL数据库的数据同步。具体实现步骤如下: 1. 添加MySQL的JDBC依赖,例如: ``` <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.26</version> </dependency> ``` 2. 在application.properties文件中配置MySQL数据库连接信息,例如: ``` spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=Asia/Shanghai spring.datasource.username=root spring.datasource.password=123456 ``` 3. 使用Java代码连接MySQL数据库,并订阅binlog文件,例如: ``` @Configuration public class BinlogConfig { @Autowired private DataSource dataSource; @Bean public BinaryLogClient binaryLogClient() { BinaryLogClient client = new BinaryLogClient("localhost", 3306, "root", "123456"); client.registerEventListener(event -> { EventData data = event.getData(); if (data instanceof WriteRowsEventData) { // 处理插入事件 } else if (data instanceof UpdateRowsEventData) { // 处理更新事件 } else if (data instanceof DeleteRowsEventData) { // 处理删除事件 } }); client.setBinlogFilename("mysql-bin.000001"); client.setBinlogPosition(4); return client; } @Bean public DataSource dataSource() { return DataSourceBuilder.create() .driverClassName("com.mysql.cj.jdbc.Driver") .username("root") .password("123456") .url("jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=Asia/Shanghai") .build(); } } ``` 4. 在Spring Boot启动类中启动binlog客户端,例如: ``` @SpringBootApplication public class Application { public static void main(String[] args) throws IOException { ApplicationContext context = SpringApplication.run(Application.class, args); BinaryLogClient client = context.getBean(BinaryLogClient.class); client.connect(); } } ``` 通过以上步骤,就可以在Spring Boot中使用MySQL binlog实现数据同步。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值