李承武

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/

prisma启动成功

enjoy life

参考:
https://github.com/prisma/prisma/issues/4434
https://www.jianshu.com/p/6ef34ffd5e0c
https://www.cnblogs.com/ivictor/p/5340822.html

评论