Симптоматическое лечение Open Harvester System (PKP OHS).

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.

<h1>DB Error: Data too long for column 'contents' at row 1</h1>harvester2: DB Error: Data too long for column 'contents' at row 1

Это не гипотетическая проблема. Запись объёмом более 64КБ — не редкость. Например вот, так же можно получить 64КБ+ текста и в reference и в aknowledgements, особенно это актуально для OJS.

Решение:

Смена типа данных у «проблемных полей».

ALTER TABLE records MODIFY contents MEDIUMTEXT;
ALTER TABLE records MODIFY parsed_contents MEDIUMTEXT;



Вторая проблема — всё стало как-то медленно-медленно.

Наш сервис на столько стар что в базе использует MyISAM, и разгон полей до MEDIUMTEXT (а кто-то ведь и LONGTEXT бахнул!) тут без потерь не пройдёт.

Решение:

Перевод таблицы records на современный движок InnoDB — это должно спасти от жестких блокировок.

USE `ohs`;
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 — имя базы, переключаем только одну таблицу.




Третья проблема — четырехбайтовый юникод.

<h1>DB Error: Incorrect string value: '\xF3\xA0\x84\xB7\xCE\xB2...' for column `ohs`.`records`.`contents` at row 1</h1>harvester2: DB Error: Incorrect string value: '\xF3\xA0\x84\xB7\xCE\xB2...' for column `ohs`.`records`.`contents` at row 1
<h1>DB Error: Illegal mix of collations (utf8_general_ci,IMPLICIT) and (utf8mb4_general_ci,COERCIBLE) for operation '='</h1>harvester2: DB Error: Illegal mix of collations (utf8_general_ci,IMPLICIT) and (utf8mb4_general_ci,COERCIBLE) for operation '='

На самом деле тут две проблемы — собственно четырехбайтовый юникод и нелюбовь системы к utf8mb4_unicode_ci

Решение:

Изменение кодировки базы данных

ALTER DATABASE `ohs` CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci;

Массовая конвертация всех таблиц в utf8mb4_general_ci

ALTER TABLE `search_keyword_list` CONVERT TO CHARACTER SET utf8mb4 COLLATE 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;

Обновление статистики для планировщика запросов

ANALYZE TABLE `search_keyword_list`, `rt_searches`, `auth_sources`, `search_form_element_settings`, `controlled_vocabs`, `processes`, `roles`, `raw_fields`, `crosswalk_fields`, `site_settings`, `search_form_elements`, `archive_settings`, `site`, `records`, `controlled_vocab_entries`, `email_templates_default_data`, `sort_order_numbers`, `schema_aliases`, `users`, `email_templates`, `notification_settings`, `search_object_keywords`, `plugin_settings`, `sort_order_strings`, `controlled_vocab_entry_settings`, `sort_orders`, `sort_order_settings`, `archives`, `email_templates_default`, `sort_order_dates`, `sessions`, `schema_plugins`, `search_form_element_fields`, `access_keys`, `oai_resumption_tokens`, `notifications`, `crosswalks`, `search_objects`, `rt_contexts`, `search_form_element_options`, `email_templates_data`, `captchas`, `sort_order_fields`, `rt_versions`, `versions`, `user_settings`;

Изменения в my.cnf (или my.ini)

[client]
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_buffer_pool_size = 768M
innodb_log_file_size = 192M
innodb_buffer_pool_instances = 1

Изменения в config.inc.php

[database]
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 инструменты, как то:

php /var/www/html/tools/harvest.php all from=last verbose

чтобы понимать где случается ошибка.

Так же, после всех этих изменений наверняка потребуется дать команду

php /var/www/html/tools/rebuildSearchIndex.php

и возможно предварительно очистить таблицу с поисковым индексом.




Подобные изменения позволят OHS еще некоторое время харвестить сайты с объёмыми записями и спецсимволами.

Запись опубликована в рубрике Библиотека с метками , , , . Добавьте в закладки постоянную ссылку.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *