目录
Docker挂载数据库问题汇总
觉得有帮助的同学可以点个赞!传递给更多人!
Docker挂载的mysql/mariadb等数据库,远程连接时间长
本地链接秒连但是远程连接慢
解决方案1
在配置文件my.cnf中加入
skip-name-resolve
然后重启容器
docker restart 你的容器id
解决方案2
在原来的启动的命令中加上
–skip-name-resolve
例如
docker run -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=输入你的密码 --name mariadb_ubuntu --skip-name-resolve 0a2fe61c51d1
Docker挂载的mysql/mariadb等数据库,IO性能下降严重/性能损失/备份还原慢
实测数据
测试环境为同环境同服务,同备份数据库文件.这个服务器累积的数据库文件目前已经有280G+
未处理前-3m22s
处理后-1m27s
解决方法
linux中输入
lsblk -f
获取你的数据库所在的存储位置的信息 确认你是ext4的文件系统
然后使用
vi /etc/fstab
在你对应的存储位置增加
barrier=0
示例
UUID=a90a3f4d-d95f-4e25-94cb-a608e5ce943d /home/diska ext4 defaults,barrier=0 0 0
UUID=7086b60d-2524-4cda-994a-254c8ade9bdb /home/diskb ext4 defaults,barrier=0 0 0
然后重启linux服务器,即可完成修复.
barrier的解释
此处参考:https://blog.csdn.net/lidan3959/article/details/12617639
Linux日志和barrier功能
要理解barrier,你首先需要理解文件系统日志功能。常用的文件系统使用日志功能来保证文件系统的完整性。该功能背后的思路很简单:在写入新的 数据块到磁盘之前,会先将元数据写入日志。预先将元数据写入日志可以保证在写入真实数据前后一旦发生错误,日志功能能很容易地回滚到更改之前的状态。这个方法确保了不会发生文件系统崩溃的情况。 单独使用日志功能不能保证没有任何差错。现在的磁盘大都有大容量的缓存,数据不会立即写入到磁盘中,而是先写入到磁盘缓存中。到这一步,磁盘控制器就能更加高效地将其复制到磁盘中。这对性能来说是有好处的,但是对日志功能来说则相反。为了保证日志百分之百可靠,它必须绝对保证元数据在真实数据写入之前被预先写入。这就是我们要介绍文件系统barrier的原因。我们很容易理解使用barrier的根本原因:barrier本身禁止在barrier之后写入数据,真实的数据块将在barrier被写入之前完全写入磁盘。使用barrier可以确保文件系统的完整性,因为barrier功能在EXT4文件系统中是默认启用的(除非你的操作系统更改了这个默认设>置)。
Docker启动mysql/mariadb并挂载目录和解决数据库时间不正确
# 这里我使用了配置文件my.cnf;3307:3306 3307是外部端口。并且利用目录挂载实现将数据库的存储位置挂载到其他磁盘。
docker run -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=输入你的密码 -v /home/disk_sql/mariadb_data/data:/var/lib/mysql -v /home/disk_sql/mariadb_data/conf/my.cnf:/etc/mysql/my.cnf --name mariadb_ubuntu 0a2fe61c51d1
# 解决数据库时间不正确(因为需要更改时区) docker cp 时区文件 容器id:容器内时区路径
docker cp /usr/share/zoneinfo/Asia/Shanghai f552c2171ecf:/etc/localtime