最近在调试一个自动化部署脚本时,遇到mariadb数据库的一个问题:授权会消失。
过程是这样的。在用mariadb:10.6.2这个官方镜像运行容器之后,尝试判断show databases指令是否可执行,如果可以就认为容器已经起来了、可以使用了。没毛病吧。而且看日志显示了这样的信息:
mysqld: ready for connections.
更加确信数据库容器正常了。
随后创建数据库和赋予用户权限:
create database abc;
grant all on abc.* to abc@'%' identified by 'abc';
问题来了:不论是分成两个语句用mysql -e执行,还是放在一个sql文件里执行,还是放在容器的初始化目录/docker-entrypoint-initdb.d里执行,都有一定概率出现grant失效的现象。不是完全失效,有时候是成功的。直接的表现是,后续应用程序访问数据库,有时候成功,有时候报密码错误。一查用户表,发现没有添加用户。
后来怀疑是grant指令没有执行成功,于是在grant指令执行之后增加了一个show grants指令来检测,发现show grants是有数据的。用select * from mysq.user也能看到这个用户。但是后来应用程序访问的时候,授权莫名其妙消失了。
查了半天,头大了一圈。后来按照同事推荐的方法规避了,就是:预先创建好数据库,把数据目录保留下来。部署的时候直接映射到数据库容器里,就不需要重新创建和授权了。