如何使用docker在恢复模式下启动innodb



重新启动服务器后,我的数据库将不会启动。它抛出以下错误;

〔错误〕InnoDB:Page〔Page id:space=1106,Page number=4119〕日志序列号29970252505在未来!当前系统日志序列号29967893604。[错误]InnoDB:您的数据库可能已损坏,或者您可能复制了InnoDB表空间,但没有复制InnoDB日志文件。请参阅https://mariadb.com/kb/en/library/innodb-recovery-modes/有关强制恢复的信息。

所以我的问题是如何使用docker在恢复模式下启动innodb?

要在恢复模式下启动innodb,需要在my.cnf文件中添加以下行:

[mysqld]
innodb_force_recovery = 0 

0是正常使用。您可以在此处阅读有关不同级别的更多信息:https://mariadb.com/kb/en/innodb-recovery-modes/

通常,建议从尽可能低的值开始(例如,尝试1(,如果不起作用,则向上递增。使用的级别越高,可能会发生数据损坏。

如果您的主机和容器之间已经有my.cnf文件映射,那么只需在主机上进行修改并启动Docker服务。

如果您没有my.cnf文件,那么您可能已经定义了默认变量。最简单的选择之一是:

  1. 使用相同的映像启动一个新容器,同时将容器的/tmp文件夹映射到本地计算机/path-on-host/tmp
  2. 进入容器(例如docker exec -it container_name bash(,将my.cnf文件复制到tmp文件夹(cp /etc/my.cnf /tmp(并关闭容器。my.cnf文件的位置要么在/etc中,要么在某些版本中可以在/etc/mysql
  3. 通过设置innodb_force_recovery = x修改主机上的my.cnf文件
  4. my.cnf添加到原始容器上的正确位置,例如使用Docker Compose:
volumes:
- '/path-on-host/tmp/my.cnf:/etc/my.cnf'

或使用docker run

--mount type=bind,src=/path-on-host/tmp/my.cnf,dst=/etc/my.cnf 

Yo可以像任何其他初始化参数一样,在"命令"行中添加它(临时!(

services:
mariadb:
image: "mariadb:10.6.4"
container_name: mariadb
restart: 'always'
volumes:
- /data/mysql:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: **
MYSQL_DATABASE: **
MYSQL_USER: **
MYSQL_PASSWORD: **
command: -–innodb_force_recovery=4 --lower_case_table_names=1 --character-set-server=utf8mb4 --collation-server=utf8mb4_bin --innodb-flush-log-at-trx-commit=0 

https://mariadb.com/kb/en/innodb-recovery-modes/#recovery-模式

最新更新