Open Harvester System (OHS) это довольно интересный, но однозначно устаревший и идейно и технологически продукт. Немного об OHS можно прочитать здесь, но нам важно то, что PHP 5.x (Will not run on versions greater than 5.x) и статус Retired. При этом OHS довольно бодро стартует в среде Apache 2.4, MariaDB 10.5, PHP 5.6. То есть в любом современном дистрибутиве Linux, куда можно затащить PHP 5.6. Но то, что сервис бодро стартует, не означает что он бодро работает.
Речь пойдёт о проблемах и путях их решения….
Здесь и далее мы исходим из того, что OHS уже зачем-то есть, т.е. установлен, более или менее работает и выводиться из работы не будет. Вопросы актуализации кода, установки и настройки PHP 5.6 оставим за скобками. Имя базы — ohs, wwwroot по адресу /var/www/html/.
Первая проблема — запись слишком большая для того чтобы уместиться в поле типа TEXT.
Это не гипотетическая проблема. Запись объёмом более 64КБ — не редкость. Например вот, так же можно получить 64КБ+ текста и в reference и в aknowledgements, особенно это актуально для OJS.
Решение:
Смена типа данных у «проблемных полей».
ALTER TABLE records MODIFY parsed_contents MEDIUMTEXT;
Вторая проблема — всё стало как-то медленно-медленно.
Наш сервис на столько стар что в базе использует MyISAM, и разгон полей до MEDIUMTEXT (а кто-то ведь и LONGTEXT бахнул!) тут без потерь не пройдёт.
Решение:
Перевод таблицы records на современный движок InnoDB — это должно спасти от жестких блокировок.
ALTER TABLE `ohs`.`records` ENGINE=InnoDB;
ALTER TABLE `ohs`.`records` DROP INDEX `record_identifier`;
ALTER TABLE `ohs`.`records` ADD UNIQUE KEY `record_identifier` (`identifier`);
ohs — имя базы, переключаем только одну таблицу.
Третья проблема — четырехбайтовый юникод.
На самом деле тут две проблемы — собственно четырехбайтовый юникод и нелюбовь системы к utf8mb4_unicode_ci
Решение:
Изменение кодировки базы данных
Массовая конвертация всех таблиц в utf8mb4_general_ci
ALTER TABLE `rt_searches` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE `auth_sources` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE `search_form_element_settings` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE `controlled_vocabs` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE `processes` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE `roles` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE `raw_fields` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE `crosswalk_fields` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE `site_settings` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE `search_form_elements` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE `archive_settings` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE `site` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE `records` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE `controlled_vocab_entries` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE `email_templates_default_data` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE `sort_order_numbers` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE `schema_aliases` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE `users` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE `email_templates` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE `notification_settings` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE `search_object_keywords` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE `plugin_settings` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE `sort_order_strings` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE `controlled_vocab_entry_settings` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE `sort_orders` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE `sort_order_settings` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE `archives` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE `email_templates_default` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE `sort_order_dates` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE `sessions` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE `schema_plugins` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE `search_form_element_fields` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE `access_keys` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE `oai_resumption_tokens` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE `notifications` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE `crosswalks` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE `search_objects` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE `rt_contexts` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE `search_form_element_options` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE `email_templates_data` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE `captchas` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE `sort_order_fields` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE `rt_versions` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE `versions` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE `user_settings` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
Обновление статистики для планировщика запросов
Изменения в my.cnf (или my.ini)
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
character_set_filesystem = utf8mb4
init_connect = 'SET NAMES utf8mb4 COLLATE utf8mb4_general_ci; SET collation_connection = utf8mb4_general_ci; SET collation_database = utf8mb4_general_ci;'
Настройки для обеспечения высокой скорости нового движка InnoDB (тут уже по месту, эти настройки тоже в [mysqld])
innodb_log_file_size = 192M
innodb_buffer_pool_instances = 1
Изменения в config.inc.php
driver = mysqli
connection_charset = utf8mb4
database_charset = utf8mb4
collation = utf8mb4_general_ci
[i18n]
client_charset = utf-8
connection_charset = utf8mb4
database_charset = utf8mb4
charset_normalization = Off
Для отладки всё же удобно использовать CLI инструменты, как то:
чтобы понимать где случается ошибка.
Так же, после всех этих изменений наверняка потребуется дать команду
и возможно предварительно очистить таблицу с поисковым индексом.
Подобные изменения позволят OHS еще некоторое время харвестить сайты с объёмыми записями и спецсимволами.
