Prisma连接到现有MySQL的坑
按官网教程执行完docker-compose up -d
,发现 http://localhost:4466/ 起不来
执行 docker logs --since 30m CONTAINER_ID
查看容器日志
发现以下报错:
Unable to load Prisma config: com.prisma.config.InvalidConfiguration: Only Postgres connectors specify a schema. If they do they also need to specify a database. Other connectors only specify a database.
官方默认生成的docker-compose.yml配置的是schema,由于MySql没有schema,把schema改成database
version: '3'
services:
prisma:
image: prismagraphql/prisma:1.34
restart: always
ports:
- "4466:4466"
environment:
PRISMA_CONFIG: |
port: 4466
# uncomment the next line and provide the env var PRISMA_MANAGEMENT_API_SECRET=my-secret to activate cluster security
# managementApiSecret: my-secret
databases:
default:
connector: mysql
host: host.docker.internal
database: 'myDB'
user: root
password: root
rawAccess: true
port: '3306'
migrations: false
ok,干掉重来
docker-compose kill
docker-compose down
docker-compose up -d
结果还是不行,查看容器日志继续抛出错误
[INFO] {} - Starting...
[INFO] {} - Start completed.
[INFO] {} - Starting...
[INFO] {} - Start completed.
Exception in thread "main" java.sql.SQLTransientConnectionException: database - Connection is not available, request timed out after 5006ms.
at com.zaxxer.hikari.pool.HikariPool.createTimeoutException(HikariPool.java:676)
at com.zaxxer.hikari.pool.HikariPool.getConnection(HikariPool.java:190)
at com.zaxxer.hikari.pool.HikariPool.getConnection(HikariPool.java:155)
at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:100)
at slick.jdbc.hikaricp.HikariCPJdbcDataSource.createConnection(HikariCPJdbcDataSource.scala:14)
at slick.jdbc.JdbcBackend$BaseSession.<init>(JdbcBackend.scala:494)
at slick.jdbc.JdbcBackend$DatabaseDef.createSession(JdbcBackend.scala:46)
at slick.jdbc.JdbcBackend$DatabaseDef.createSession(JdbcBackend.scala:37)
at slick.basic.BasicBackend$DatabaseDef.acquireSession(BasicBackend.scala:250)
at slick.basic.BasicBackend$DatabaseDef.acquireSession$(BasicBackend.scala:249)
at slick.jdbc.JdbcBackend$DatabaseDef.acquireSession(JdbcBackend.scala:37)
at slick.basic.BasicBackend$DatabaseDef$$anon$3.run(BasicBackend.scala:275)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.sql.SQLNonTransientConnectionException: Could not connect to address=(host=localhost)(port=3306)(type=master) : Connection refused (Connection refused)
at org.mariadb.jdbc.internal.util.exceptions.ExceptionMapper.get(ExceptionMapper.java:161)
at org.mariadb.jdbc.internal.util.exceptions.ExceptionMapper.connException(ExceptionMapper.java:79)
at org.mariadb.jdbc.internal.protocol.AbstractConnectProtocol.connectWithoutProxy(AbstractConnectProtocol.java:1040)
at org.mariadb.jdbc.internal.util.Utils.retrieveProxy(Utils.java:490)
at org.mariadb.jdbc.MariaDbConnection.newConnection(MariaDbConnection.java:144)
at org.mariadb.jdbc.Driver.connect(Driver.java:90)
at slick.jdbc.DriverDataSource.getConnection(DriverDataSource.scala:101)
at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:369)
at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:198)
at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:467)
at com.zaxxer.hikari.pool.HikariPool.access$100(HikariPool.java:71)
at com.zaxxer.hikari.pool.HikariPool$PoolEntryCreator.call(HikariPool.java:706)
at com.zaxxer.hikari.pool.HikariPool$PoolEntryCreator.call(HikariPool.java:692)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
... 3 more
Caused by: java.net.ConnectException: Connection refused (Connection refused)
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:589)
at java.net.Socket.connect(Socket.java:538)
at org.mariadb.jdbc.internal.protocol.AbstractConnectProtocol.connect(AbstractConnectProtocol.java:398)
at org.mariadb.jdbc.internal.protocol.AbstractConnectProtocol.connectWithoutProxy(AbstractConnectProtocol.java:1032)
... 14 more
No log level set, defaulting to INFO.
发现是MySql连接不上,立马把docker-compose.yml里的host值尝试改成localhost、127.0.0.1,NND还是不行。。。
各种折腾后发现这里犯了一个傻,在docker容器里连接到宿主机的MySql数据库,怎么能用localhost、127.0.0.1这种本地回送地址呢?等于连接回容器里鸭(My youth...)
把host改成宿主机内网地址
connector: mysql
host: 192.168.199.151
database: 'myDB'
user: root
password: root
rawAccess: true
port: '3306'
migrations: false
干掉重来还是跑不起来,继续查看容器日志,发现连接上了,报的数据库错误
Unknown storage engine 'InnoDB'
我这MySql默认MyISAM存储引擎,my.ini配置文件修改成
default-storage-engine=INNODB
重启MySql起不来了,查看MySql日志报错信息:
2019-11-04 16:11:07 0 [Note] InnoDB: Mutexes and rw_locks use Windows interlocked functions
2019-11-04 16:11:07 0 [Note] InnoDB: Uses event mutexes
2019-11-04 16:11:07 0 [Note] InnoDB: Compressed tables use zlib 1.2.11
2019-11-04 16:11:07 0 [Note] InnoDB: Number of pools: 1
2019-11-04 16:11:07 0 [Note] InnoDB: Using SSE2 crc32 instructions
2019-11-04 16:11:07 0 [Note] InnoDB: Initializing buffer pool, total size = 64M, instances = 1, chunk size = 64M
2019-11-04 16:11:07 0 [Note] InnoDB: Completed initialization of buffer pool
2019-11-04 16:11:07 0 [ERROR] InnoDB: The Auto-extending innodb_system data file '.\ibdata1' is of a different size 640 pages than specified in the .cnf file: initial 768 pages, max 0 (relevant if non-zero) pages!
2019-11-04 16:11:07 0 [ERROR] InnoDB: Plugin initialization aborted with error Generic error
2019-11-04 16:11:07 0 [Note] InnoDB: Starting shutdown...
2019-11-04 16:11:07 0 [ERROR] Plugin 'InnoDB' init function returned error.
2019-11-04 16:11:07 0 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
2019-11-04 16:11:07 0 [Note] Plugin 'FEEDBACK' is disabled.
2019-11-04 16:11:07 0 [ERROR] Unknown/unsupported storage engine: INNODB
2019-11-04 16:11:07 0 [ERROR] Aborting
提示什么鬼ibdata1实际大小和配置文件中指定的大小不一致,google一下找到解决方法
我这里日志的报错信息...different size 640 pages...
,算出其实际大小:640*16/1024=10M
在my.ini里新增一项innodb_data_file_path=ibdata1:10M:autoextend
重启MySql终于起来了,docker也跑起来,浏览器输入 http://localhost:4466/
enjoy life
参考:
https://github.com/prisma/prisma/issues/4434
https://www.jianshu.com/p/6ef34ffd5e0c
https://www.cnblogs.com/ivictor/p/5340822.html