Статьи

Реализация SchemaSpy в вашей среде MySQL

Этот пост принадлежит  Майклу Кобурну из MySQL Performance Blog.

SchemaSpyВ последнее время я работаю с группой клиентов на долгосрочной основе, что дало мне время для изучения новых инструментов с использованием их сред. Один инструмент, который я считаю очень полезным, называется SchemaSpy .

SchemaSpy — это инструмент на основе Java (требуется  Java 5 или выше ), который анализирует метаданные схемы в базе данных и генерирует ее визуальное представление в формате, отображаемом браузером. Он позволяет пролистывать иерархию таблиц базы данных через связи дочерних и родительских таблиц, представленные как ссылками HTML, так и диаграммами отношений сущностей. Он также предназначен для устранения тупых ошибок, которые база данных иногда выдает, связанных со сбоями из-за ограничений.

В инструментах ERD мне нравится то, что я могу быстро сгенерировать графическое представление базы данных, чтобы увидеть, на какие таблицы чаще всего ссылаются, а какие являются кандидатами на удаление (зачем сохранять старые данные, если вам это не нужно? ). Я гораздо быстрее набираю скорость и могу более эффективно участвовать в процессе разработки, когда знаю взаимосвязи между таблицами и только наблюдение за запросами. Дополнительным преимуществом является то, что SchemaSpy управляется из командной строки и создает html после каждого запуска, поэтому я считаю удобным настроить его на crontab, чтобы изменения схемы автоматически регистрировались. Хорошо, а?

Использование этого инструмента очень простое и делает большую работу за вас. По сути, если в вашей базе данных есть Foreign Keys, вы смеетесь, если не отчаиваетесь, у вас впереди еще немного работы. В большинстве случаев SchemaSpy «делает правильные вещи», но иногда вам нужно немного помочь в виде файлов метаданных.

Установка SchemaSpy и зависимостей

  • Загрузите последнюю копию  jar-файла SchemaSpy (5.0.0 на момент написания)
  • Убедитесь, что у вас установлена ​​последняя версия Java JRE для вашей платформы
  • Вам понадобится драйвер Java для вашей базы данных — я использую MySQL Connector / J
  • Установите пакет graphiz

Создание файла mysql.properties

Хотя это и не требуется явно, я предпочитаю создавать это один раз, чтобы командная строка была короче и аккуратнее. В моем случае вот файл свойств, используемый для моей песочницы Percona Server 5.6.10:

description=MySQL
driver=com.mysql.jdbc.Driver
connectionSpec=jdbc:mysql://127.0.0.1:5610/schemaspy
driverPath=/usr/share/java/mysql-connector-java.jar

Пример схемы

CREATE TABLE `parent` (
 `parent_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
 PRIMARY KEY (`parent_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
CREATE TABLE `child_A` (
 `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
 `parent_id` int(10) unsigned DEFAULT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
CREATE TABLE `child_B` (
 `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
 `parent_id` int(10) unsigned DEFAULT NULL,
 PRIMARY KEY (`id`),
 KEY `parent_id` (`parent_id`),
 CONSTRAINT `child_B_ibfk_1` FOREIGN KEY (`parent_id`) REFERENCES `parent` (`parent_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1

Обратите внимание, что в случае child_A существует неявное отношение FK к родительскому элементу через parent_id, однако в child_B оно является явным. Это влияет на то, как SchemaSpy идентифицирует отношения, и нужно ли вам давать подсказку или нет.

Запуск SchemaSpy (с внешними ключами)

Когда вы запустите schemaSpy без файла метаданных, вы увидите, что отношения между parent и child_B отображаются правильно:

FK_only

Таблицу child_A можно отобразить, если вы отметите поле Подразумеваемые отношения, но это обычно работает только в том случае, если вы использовали точно такое же имя (в данном случае parent_id) в дочерней и родительской таблицах. Ваша среда может походить на множество магазинов, которые мы видим, где родительская таблица называется id, а в дочерних таблицах они ссылаются на нее как parent_id — это может иметь смысл для разработчиков, но это совсем не помогает SchemaSpy. Это где файлы метаданных приходят для воспроизведения

подразумеваемые

Создание файла метаданных

Формат файла метаданных основан на XML. Я включил файл метаданных, который использовал, чтобы правильно связать child_A с родительской таблицей:

<?xml version="1.0" encoding="UTF-8"?>
<schemaMeta xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://schemaspy.sourceforge.net/xmlschema/2011/02/05/schemaspy.meta.xsd">
<comments>
Main Production Database. Percona, Michael Coburn
</comments>
<tables>
<table name="parent" comments="Parent table">
<column name="parent_id" primaryKey="true">
</column>
</table>
<table name="child_A" comments="Non-FK relationship, implicit relationship to parent">
<column name="id" primaryKey="true">
</column>
<column name="parent_id">
<foreignKey table="parent" column="parent_id"/>
</column>
</table>
</tables>
</schemaMeta>

Если вы ищете другие примеры, вы можете найти более полный пример здесь .

Запуск SchemaSpy

Приведенный ниже синтаксис специфичен для MySQL, но обратите внимание, что SchemaSpy работает практически для всех популярных СУБД.

java -jar schemaSpy_5.0.0.jar -t mysql -u msandbox_ro -p msandbox -meta schemaspy.meta.xml -o /var/www/schemaspy/

Директива -o указывает SchemaSpy, куда записывать выходные данные, убедитесь, что это каталог, к которому затем может обращаться веб-сервер. Также обратите внимание, что, поскольку я создал файл mysql.properties в том же каталоге, что и файл jar, мне не нужно передавать какую-либо информацию host: port или имя схемы.

Просмотр выходных данных SchemaSpy

Завершенное представление взаимосвязей этих трех таблиц должно выглядеть следующим образом:

after_metadata_application

Последние мысли

Хотя я считаю вкладку «Отношения» наиболее полезным компонентом SchemaSpy, я не хочу оставлять у вас впечатление, что это единственный компонент инструмента. Есть дополнительные вкладки:

  • Таблицы — имена, количество детей, родителей, количество столбцов, количество строк и комментариев — отличный способ для общего обзора размеров таблиц и простой способ использовать функцию поиска вашего браузера, чтобы сосредоточиться на конкретном стол
  • Ограничения — перечисляет явные ограничения внешнего ключа в базе данных (это не включает ограничения, идентифицированные с помощью файлов метаданных!)
  • Аномалии — Определяет возможные отношения между столбцами / таблицами на основе имен, таблиц без индексов, столбцов, помеченных как ‘обнуляемые’ и ‘должны быть уникальными’ (woops!), Таблиц с одним столбцом, увеличивающихся имен столбцов в таблицах и таблиц со строкой NULL вместо фактического значения SQL NULL. Это в основном быстрая проверка работоспособности вашей схемы на наличие значительных ошибок или элементов, требующих проверки.
  • Столбцы — список всех столбцов в схеме, которые очень удобно отсортировать по имени, чтобы увидеть, есть ли у вас какие-то неявные ограничения, которые вы могли пропустить, и затем можете записать их в файл метаданных.
  • Пожертвовать — это бесплатное программное обеспечение, и Джон Керриер просит пожертвований, чтобы он мог оправдать время, потраченное на поддержание SchemaSpy своей жене:)

Наконец, не забудьте автоматизировать SchemaSpy через crontab, как только вы закончите.

Какие инструменты ERD вы используете и как они сравниваются со SchemaSpy? Не стесняйтесь отвечать через комментарии. Спасибо за чтение!