发现问题

据说mariadb和mysql 90% 相似度,本地使用docker 起了个容器 挂载数据到本地的时候居然报错了

[ERROR] InnoDB: The Auto-extending innodb_system data file './ibdata1' is of a different size 0 pages than specified in the .cnf file: initial 768 pages, max 0 (relevant if non-zero) pages!

查询问题

和 mysql 一样的配置为什么会报错的,一脸懵逼??? ./ibdata1
查询了各大资源后发现可能是 Docker for windows 的共享文件系统或MariaDB本身中的bug!!!

解决问题

最后经过苦苦测试 终于找到了一个可行的解决方案
下面解释一下关键配置

  • ibdata1是InnoDB的共有表空间,默认情况下会把表空间存放在一个文件ibdata1中
  • innodb_flush_method 则确定日志及数据文件如何write、flush
  • innodb_flush_method可以取如下值:fdatasync, O_DSYNC, O_DIRECT 实验选项littlesync和nosync
  • innodb_use_native_aio 该选项仅适用于Linux系统,默认情况下处于启用状态。在其他类Unix系统上,InnoDB仅使用同步I/O. - 从历史上看,InnoDB仅在Windows系统上使用异步I/O. 在Linux上使用异步I/O子系统需要libaio库
  • Binary Log 简称 Binlog 即 二进制日志文件,这个文件记录了mysql所有的 DML 操作。
  • 通过 Binlog 日志我们可以做数据恢复,做主主复制和主从复制等等。

下面是的我的 docker-compose.yml 和 配置

dockerFile
FROM mariadb:latest

LABEL maintainer="Mahmoud Zalt <mahmoud@zalt.me>"

COPY my.cnf /etc/mysql/conf.d/my.cnf



CMD ["mysqld"]

EXPOSE 3306
docker-compose.yml
    mariadb:
      build: ./mariadb
      volumes:
        - ./mariadb/data:/var/lib/mysql
 
      ports:
        - "3306:3306"
      environment:
        - MYSQL_DATABASE=default
        - MYSQL_USER=default
        - MYSQL_PASSWORD=default
        - MYSQL_ROOT_PASSWORD=root
      networks:
        - backend
      command:
        mysqld --innodb-flush-method=littlesync --innodb-use-native-aio=OFF --log_bin=ON
mariadb 配置
[mysqld]
innodb_flush_method=littlesync
innodb_use_native_aio=OFF
log_bin=ON

标签: none

添加新评论