From 8d071c8d30491c6854f2eafa3023e1bb6256c559 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Mon, 5 Aug 2019 13:03:38 +0200 Subject: [PATCH 1/2] DB IDO: Fix upgrade script for 2.11.0 (drop index only if existing) fixes #7393 --- lib/db_ido_mysql/schema/upgrade/2.11.0.sql | 103 +++++++++++++++------ 1 file changed, 76 insertions(+), 27 deletions(-) diff --git a/lib/db_ido_mysql/schema/upgrade/2.11.0.sql b/lib/db_ido_mysql/schema/upgrade/2.11.0.sql index b461a66d7..bafa93f7a 100644 --- a/lib/db_ido_mysql/schema/upgrade/2.11.0.sql +++ b/lib/db_ido_mysql/schema/upgrade/2.11.0.sql @@ -2,37 +2,86 @@ -- upgrade path for Icinga 2.11.0 -- -- ----------------------------------------- --- Copyright (c) 2018 Icinga Development Team (https://icinga.com/) +-- Copyright (c) 2019 Icinga Development Team (https://icinga.com/) -- -- Please check https://docs.icinga.com for upgrading information! -- ----------------------------------------- -ALTER TABLE `icinga_commands` DROP INDEX `commands_i_id_idx`; -ALTER TABLE `icinga_comments` DROP INDEX `idx_comments_object_id`; -ALTER TABLE `icinga_comments` DROP INDEX `comments_i_id_idx`; -ALTER TABLE `icinga_configfiles` DROP INDEX `configfiles_i_id_idx`; -ALTER TABLE `icinga_contactgroups` DROP INDEX `contactgroups_i_id_idx`; -ALTER TABLE `icinga_contacts` DROP INDEX `contacts_i_id_idx`; -ALTER TABLE `icinga_customvariables` DROP INDEX `idx_customvariables_object_id`; -ALTER TABLE `icinga_eventhandlers` DROP INDEX `eventhandlers_i_id_idx`; -ALTER TABLE `icinga_hostdependencies` DROP INDEX `hostdependencies_i_id_idx`; -ALTER TABLE `icinga_hostescalations` DROP INDEX `hostesc_i_id_idx`; -ALTER TABLE `icinga_hostescalation_contacts` DROP INDEX `hostesc_contacts_i_id_idx`; -ALTER TABLE `icinga_hostgroups` DROP INDEX `hostgroups_i_id_idx`; -ALTER TABLE `icinga_hosts` DROP INDEX `host_object_id`; -ALTER TABLE `icinga_hosts` DROP INDEX `hosts_i_id_idx`; -ALTER TABLE `icinga_objects` DROP INDEX `objects_objtype_id_idx`; -ALTER TABLE `icinga_programstatus` DROP INDEX `programstatus_i_id_idx`; -ALTER TABLE `icinga_runtimevariables` DROP INDEX `runtimevariables_i_id_idx`; -ALTER TABLE `icinga_scheduleddowntime` DROP INDEX `scheduleddowntime_i_id_idx`; -ALTER TABLE `icinga_scheduleddowntime` DROP INDEX `idx_scheduleddowntime_object_id`; -ALTER TABLE `icinga_serviceescalations` DROP INDEX `serviceesc_i_id_idx`; -ALTER TABLE `icinga_serviceescalation_contacts` DROP INDEX `serviceesc_contacts_i_id_idx`; -ALTER TABLE `icinga_servicegroups` DROP INDEX `servicegroups_i_id_idx`; -ALTER TABLE `icinga_services` DROP INDEX `services_i_id_idx`; -ALTER TABLE `icinga_services` DROP INDEX `service_object_id`; -ALTER TABLE `icinga_systemcommands` DROP INDEX `systemcommands_i_id_idx`; -ALTER TABLE `icinga_timeperiods` DROP INDEX `timeperiods_i_id_idx`; +SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"; + +-- -------------------------------------------------------- +-- Helper functions and procedures for DROP INDEX IF EXISTS +-- -------------------------------------------------------- + +DELIMITER // +DROP FUNCTION IF EXISTS ido_index_exists // +CREATE FUNCTION ido_index_exists( + f_table_name varchar(64), + f_index_name varchar(64) +) + RETURNS BOOL + DETERMINISTIC + READS SQL DATA + BEGIN + DECLARE index_exists BOOL DEFAULT FALSE; + SELECT EXISTS ( + SELECT 1 + FROM information_schema.statistics + WHERE table_schema = SCHEMA() + AND table_name = f_table_name + AND index_name = f_index_name + ) INTO index_exists; + RETURN index_exists; + END // + +DROP PROCEDURE IF EXISTS ido_drop_index_if_exists // +CREATE PROCEDURE ido_drop_index_if_exists ( + IN p_table_name varchar(64), + IN p_index_name varchar(64) +) + DETERMINISTIC + MODIFIES SQL DATA + BEGIN + IF ido_index_exists(p_table_name, p_index_name) + THEN + SET @ido_drop_index_sql = CONCAT('ALTER TABLE `', SCHEMA(), '`.`', p_table_name, '` DROP INDEX `', p_index_name, '`'); + PREPARE stmt FROM @ido_drop_index_sql; + EXECUTE stmt; + DEALLOCATE PREPARE stmt; + SET @ido_drop_index_sql = NULL; + END IF; + END // +DELIMITER ; + +CALL ido_drop_index_if_exists('icinga_commands', 'commands_i_id_idx'); +CALL ido_drop_index_if_exists('icinga_comments', 'idx_comments_object_id'); +CALL ido_drop_index_if_exists('icinga_comments', 'comments_i_id_idx'); +CALL ido_drop_index_if_exists('icinga_configfiles', 'configfiles_i_id_idx'); +CALL ido_drop_index_if_exists('icinga_contactgroups', 'contactgroups_i_id_idx'); +CALL ido_drop_index_if_exists('icinga_contacts', 'contacts_i_id_idx'); +CALL ido_drop_index_if_exists('icinga_customvariables', 'idx_customvariables_object_id'); +CALL ido_drop_index_if_exists('icinga_eventhandlers', 'eventhandlers_i_id_idx'); +CALL ido_drop_index_if_exists('icinga_hostdependencies', 'hostdependencies_i_id_idx'); +CALL ido_drop_index_if_exists('icinga_hostescalations', 'hostesc_i_id_idx'); +CALL ido_drop_index_if_exists('icinga_hostescalation_contacts', 'hostesc_contacts_i_id_idx'); +CALL ido_drop_index_if_exists('icinga_hostgroups', 'hostgroups_i_id_idx'); +CALL ido_drop_index_if_exists('icinga_hosts', 'host_object_id'); +CALL ido_drop_index_if_exists('icinga_hosts', 'hosts_i_id_idx'); +CALL ido_drop_index_if_exists('icinga_objects', 'objects_objtype_id_idx'); +CALL ido_drop_index_if_exists('icinga_programstatus', 'programstatus_i_id_idx'); +CALL ido_drop_index_if_exists('icinga_runtimevariables', 'runtimevariables_i_id_idx'); +CALL ido_drop_index_if_exists('icinga_scheduleddowntime', 'scheduleddowntime_i_id_idx'); +CALL ido_drop_index_if_exists('icinga_scheduleddowntime', 'idx_scheduleddowntime_object_id'); +CALL ido_drop_index_if_exists('icinga_serviceescalations', 'serviceesc_i_id_idx'); +CALL ido_drop_index_if_exists('icinga_serviceescalation_contacts', 'serviceesc_contacts_i_id_idx'); +CALL ido_drop_index_if_exists('icinga_servicegroups', 'servicegroups_i_id_idx'); +CALL ido_drop_index_if_exists('icinga_services', 'services_i_id_idx'); +CALL ido_drop_index_if_exists('icinga_services', 'service_object_id'); +CALL ido_drop_index_if_exists('icinga_systemcommands', 'systemcommands_i_id_idx'); +CALL ido_drop_index_if_exists('icinga_timeperiods', 'timeperiods_i_id_idx'); + +DROP FUNCTION ido_index_exists; +DROP PROCEDURE ido_drop_index_if_exists; -- ----------------------------------------- -- set dbversion (same as 2.11.0) From f0f5fbb9ce47ad4f8be9caa31e56fb5e4adbe79c Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Mon, 5 Aug 2019 13:06:50 +0200 Subject: [PATCH 2/2] DB IDO: Add upgrading note --- doc/16-upgrading-icinga-2.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/doc/16-upgrading-icinga-2.md b/doc/16-upgrading-icinga-2.md index 08e66aed4..6eaec877d 100644 --- a/doc/16-upgrading-icinga-2.md +++ b/doc/16-upgrading-icinga-2.md @@ -289,6 +289,12 @@ It will also attempt to fix them, the following log entry is perfectly fine. If you still encounter problems, please follow [this troubleshooting entry](15-troubleshooting.md#troubleshooting-api-missing-runtime-objects). +### DB IDO MySQL Schema + +The schema for MySQL contains an optional update which +drops unneeded indexes. You don't necessarily need to apply +this update. + ### Documentation * `Custom attributes` have been renamed to `Custom variables` following the name `vars` and their usage in backends and web interfaces.