关于 docker for windows 挂载mariadb 数据目录报错
发现问题
据说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