前情提要
在学习开源框架时,觉得非常不错,准备部署在本地进行调试一下,发现此项目使用的是MySQL数据,但本地没有安装数据库,那怎么办?装呗!准备直接下载个安装包直接装在本地,但发现本地安装占用资源是在是太多了,那就通过docker装一个吧,说干就干!
准备镜像
直接通过docker search 命令检索一下MySQL镜像
docker search mysql
得到比较多的image,一般我们默认选择第一个star数最多的,也就是官方的image,其他image都是一些公司或者个人打包的镜像,在安全的情况下,建议还是使用官方镜像较为稳妥。
此处我选择就是,第一个官方镜像,直接通过docker pull mysql命令拉取镜像,默认拉取最新版本lasted,如需安装指定版本,添加版本号即可。
docker pull mysql 或 docker pull mysql:5.7.39(指定版本号)
拉取完毕后,通过docker images命令查看镜像列表,我这里指定了镜像名称,可以看到我这里有两个版本的MySQL 镜像,其中tag:5.7.39就是我刚才拉取的
docker images mysql
启动容器
哈哈哈,一切准备就绪,那么直接一条命令启动容器吧!(这里启动的8版本)(我记错了容器内的端口了。。。)
docker run -v "/Users/XXXX/tools/docker/mysql/data":/var/lib/mysql --name my-mysql -e MYSQL_ROOT_PASSWORD=123456 -p 3306:33060 -d mysql
完美,打完收工!用Navicat连接一下吧!
嗯?什么情况怎么连不上?搞什么飞机?仔细有检查了一遍,镜像没问题,启动也正常,但就是无法连接,进到容器里面看看,发现服务也正常,那么只能是一个可能性了,端口映射有问题,先查一下,容器内部的mysql服务的端口,果然是我搞错端口了。。。
删掉容器,重新启动
docker rm -f my-mysql
docker run -v "/Users/XXXX/tools/docker/mysql/data":/var/lib/mysql --name my-mysql -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 -d mysql
再次使用Navicat连接试一下,连接成功,完美收工!
导入数据库,启动项目,嗯?什么情况?
Caused by: org.quartz.impl.jdbcjobstore.LockException: Failure obtaining db row lock: Table 'mt.QRTZ_LOCKS' doesn't exist
at org.quartz.impl.jdbcjobstore.StdRowLockSemaphore.executeSQL(StdRowLockSemaphore.java:157)
at org.quartz.impl.jdbcjobstore.DBSemaphore.obtainLock(DBSemaphore.java:113)
at org.quartz.impl.jdbcjobstore.JobStoreCMT.executeInLock(JobStoreCMT.java:238)
at org.quartz.impl.jdbcjobstore.JobStoreSupport.clearAllSchedulingData(JobStoreSupport.java:2002)
at org.quartz.core.QuartzScheduler.clear(QuartzScheduler.java:1541)
at org.quartz.impl.StdScheduler.clear(StdScheduler.java:239)
表不存在,马上去Navicat里搜索了一下,发现有啊,怎么会不存在呢?
于是乎,写一个查询语句查一下吧,还真找不着!
是不是大小写敏感的问题呢?换成了小写,再查一次,果然正常了!实锤了,就是大小写的问题!
怎么解决呢?查询官方文档(https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_lower_case_table_names),原来默认将表名大小写敏感开启了,那么我们的目标就明确了,就是禁止它开启,大小写就均可查询!
只需要在启动命令中增加 --lower-case-table-names=1 命令即可,然后重新初始化数据库,已经初始化过的数据库无法生效!重新创建容器!
注意:以上操作均是因为当前数据库为新库,没什么需要备份的数据,所以反复删除均无所谓,实际应用时,建议先进行数据备份,然后再删除容器!
docker run -v "/Users/XXXX/tools/docker/mysql/data":/var/lib/mysql -v /Users/yangdongming/tools/docker/mysql/my.cnf:/etc/mysql/my.cnf --name my-mysql -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 -d mysql --lower-case-table-names=1
再次通过Navicat验证,表名大小写问题已解决!!重新启动项目,完美运行!