Сбой подключения SchemaSpy к Microsoft SQL Server в Linux для Docker Engine с ошибкой подключения - PullRequest
0 голосов
/ 16 мая 2019

Я использую свою базу данных локально в Microsoft SQL Server в Linux для Docker Engine Я могу успешно подключиться к ней с помощью mssql-cli -U username -P password -d dbname, но я пытаюсь подключиться к ней с помощью SchemaSpy, например.

$ java -jar schemaspy-6.0.0.jar -t mssql -u username -p password -o . -host localhost -port 1433 -db dbname
INFO  - Started Main in 1.183 seconds (JVM running for 1.556)
INFO  - Configuration file not found
INFO  - Starting schema analysis
INFO  - Failed to validate png renderer ':cairo'.  Reverting to default renderer for png.
WARN  - Connection Failure

Есть идеи, что я могу сделать, чтобы исправить ошибку подключения?

1 Ответ

1 голос
/ 16 мая 2019

Я запустил SQL-сервер с этим:

docker run --name sqlserver -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=BadPassword1' -p 1433:1433 -d mcr.microsoft.com/mssql/server:2017-latest-ubuntu

Я бы проверил, достаточно ли у вас вашего Docker Desktop. Когда я впервые запустил SQL Server с Docker, настроенным для оперативной памяти <2 ГБ, контейнер запустился, но я не смог подключиться, когда посмотрел в журналах: </p>

docker logs sqlserver

(sqlserver - имя вышедшего контейнера Docker)

Я видел:

sqlservr: This program requires a machine with at least 2000 megabytes of memory.
/opt/mssql/bin/sqlservr: This program requires a machine with at least 2000 megabytes of memory.

Как только я обновил свой Docker Desktop, чтобы снова иметь 2 ГБ ОЗУ (некоторое время назад я сбросил его до 1 ГБ), все прошло нормально.

Тот, который был запущен, я мог бы использовать nmap localhost -p 1433, чтобы проверить, что порт был открыт.

Затем я проверил, что SQL Server запущен, запустив интерактивную оболочку в работающем контейнере:

docker exec -it --rm sqlserver /bin/bash

Внутри интерактивной оболочки я мог бы использовать /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P BadPassword1 для доступа к оболочке сервера SQL. В оболочке mssql вам нужно набрать то, что вы хотите, затем ввести GO в отдельной строке, чтобы выполнить все, что вы ввели.

Итак, чтобы перечислить dbs:

SELECT name FROM master.sys.databases;
GO

Для перечисления таблиц:

SELECT DISTINCT TABLE_NAME FROM information_schema.TABLES;
GO

Затем я создал БД и таблицу для запуска SchemaSpy для:

CREATE DATABASE SchemaSpyTest;
GO;
USE SchemaSpyTest;
GO;
CREATE TABLE TableTest1(id int);
GO

Затем я запустил параметры, которые вы перечислили в SchemaSpy, и у меня это тоже не сработало.

Как только я использовал флаг -debug, я увидел, что настройки mssql недостаточно:

org.schemaspy.model.ConnectionFailure: Failed to connect to database URL [jdbc:microsoft:sqlserver://localhost:1433;databaseName=dbname] Failed to create any of 'com.microsoft.sqlserver.jdbc.SQLServerDriver, com.microsoft.jdbc.sqlserver.SQLServerDriver' driver from driverPath 'C:/Program Files/Microsoft SQL Server 2000 Driver for JDBC/lib/msbase.jar;C:/Program Files/Microsoft SQL Server 2000 Driver for JDBC/lib/mssqlserver.jar;C:/Program Files/Microsoft SQL Server 2000 Driver for JDBC/lib/msutil.jar' with sibling jars no.
Resulting in classpath: empty
There were missing paths in driverPath:
        C
        /Program Files/Microsoft SQL Server 2000 Driver for JDBC/lib/msbase.jar;C
        /Program Files/Microsoft SQL Server 2000 Driver for JDBC/lib/mssqlserver.jar;C
        /Program Files/Microsoft SQL Server 2000 Driver for JDBC/lib/msutil.jar
Use commandline option '-dp' to specify driver location.
If you need to load sibling jars used '-loadjars'
        at org.schemaspy.DbDriverLoader.getConnection(DbDriverLoader.java:101)
        at org.schemaspy.DbDriverLoader.getConnection(DbDriverLoader.java:75)
        at org.schemaspy.service.SqlService.connect(SqlService.java:68)
        at org.schemaspy.SchemaAnalyzer.analyze(SchemaAnalyzer.java:186)
        at org.schemaspy.SchemaAnalyzer.analyze(SchemaAnalyzer.java:107)
        at org.schemaspy.cli.SchemaSpyRunner.runAnalyzer(SchemaSpyRunner.java:97)
        at org.schemaspy.cli.SchemaSpyRunner.run(SchemaSpyRunner.java:86)
        at org.schemaspy.Main.main(Main.java:48)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:497)
        at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48)
        at org.springframework.boot.loader.Launcher.launch(Launcher.java:87)
        at org.springframework.boot.loader.Launcher.launch(Launcher.java:50)
        at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:51)

Итак, я скачал драйвер JDBC из https://www.microsoft.com/en-us/download/details.aspx?id=57782 и разархивировал его в той же папке, что и другие мои скрипты.

Затем я смог определить правильную комбинацию параметров на основе документов:

java -jar schemaspy-6.0.0.jar -t mssql05 -u sa -p BadPassword1 -o . -host localhost -port 1433 -db SchemaSpyTest -debug -dp ./sqljdbc_7.2/enu/mssql-jdbc-7.2.2.jre8.jar

Флаг dp ссылается на файл JAR в драйвере JDBC Microsoft SQL Server.

После этого все заработало отлично.

...