diff --git a/doc/16-upgrading-icinga-2.md b/doc/16-upgrading-icinga-2.md index 187ffcb90..258a0e3d4 100644 --- a/doc/16-upgrading-icinga-2.md +++ b/doc/16-upgrading-icinga-2.md @@ -5,6 +5,12 @@ are scheme updates for the IDO database. ## Upgrading to v2.8 +### DB IDO Schema Update to 2.8.0 + +There are additional indexes and schema fixes which require an update. + +Please proceed here for [MySQL](16-upgrading-icinga-2.md#upgrading-mysql-db) for [PostgreSQL](16-upgrading-icinga-2.md#upgrading-postgresql-db). + ### Changed Certificate Paths The default certificate path was changed from `/etc/icinga2/pki` to @@ -149,8 +155,8 @@ systemctl restart icinga2 ## Upgrading the MySQL database -If you're upgrading an existing Icinga 2 instance, you should check the -`/usr/share/icinga2-ido-mysql/schema/upgrade` directory for an incremental schema upgrade file. +If you want to upgrade an existing Icinga 2 instance, check the +`/usr/share/icinga2-ido-mysql/schema/upgrade` directory for incremental schema upgrade file(s). > **Note** > @@ -158,25 +164,35 @@ If you're upgrading an existing Icinga 2 instance, you should check the Apply all database schema upgrade files incrementally. - # mysql -u root -p icinga < /usr/share/icinga2-ido-mysql/schema/upgrade/.sql +``` +# mysql -u root -p icinga < /usr/share/icinga2-ido-mysql/schema/upgrade/.sql +``` -The Icinga 2 DB IDO module will check for the required database schema version on startup -and generate an error message if not satisfied. +The Icinga 2 DB IDO feature checks the required database schema version on startup +and generates an log message if not satisfied. -**Example:** You are upgrading Icinga 2 from version `2.0.2` to `2.3.0`. Look into -the *upgrade* directory: +**Example:** You are upgrading Icinga 2 from version `2.4.0` to `2.8.0`. Look into +the `upgrade` directory: - $ ls /usr/share/icinga2-ido-mysql/schema/upgrade/ - 2.0.2.sql 2.1.0.sql 2.2.0.sql 2.3.0.sql +``` +$ ls /usr/share/icinga2-ido-mysql/schema/upgrade/ +2.0.2.sql 2.1.0.sql 2.2.0.sql 2.3.0.sql 2.4.0.sql 2.5.0.sql 2.6.0.sql 2.8.0.sql +``` -There are two new upgrade files called `2.1.0.sql`, `2.2.0.sql` and `2.3.0.sql` +There are two new upgrade files called `2.5.0.sql`, `2.6.0.sql` and `2.8.0.sql` which must be applied incrementally to your IDO database. +``` +# mysql -u root -p icinga < /usr/share/icinga2-ido-mysql/schema/upgrade/2.5.0.sql +# mysql -u root -p icinga < /usr/share/icinga2-ido-mysql/schema/upgrade/2.6.0.sql +# mysql -u root -p icinga < /usr/share/icinga2-ido-mysql/schema/upgrade/2.8.0.sql +``` + ## Upgrading the PostgreSQL database -If you're updating an existing Icinga 2 instance, you should check the -`/usr/share/icinga2-ido-pgsql/schema/upgrade` directory for an incremental schema upgrade file. +If you want to upgrade an existing Icinga 2 instance, check the +`/usr/share/icinga2-ido-mysql/schema/upgrade` directory for incremental schema upgrade file(s). > **Note** > @@ -184,17 +200,28 @@ If you're updating an existing Icinga 2 instance, you should check the Apply all database schema upgrade files incrementally. - # export PGPASSWORD=icinga - # psql -U icinga -d icinga < /usr/share/icinga2-ido-pgsql/schema/upgrade/.sql +``` +# export PGPASSWORD=icinga +# psql -U icinga -d icinga < /usr/share/icinga2-ido-pgsql/schema/upgrade/.sql +``` -The Icinga 2 DB IDO module will check for the required database schema version on startup -and generate an error message if not satisfied. +The Icinga 2 DB IDO feature checks the required database schema version on startup +and generates an log message if not satisfied. -**Example:** You are upgrading Icinga 2 from version `2.0.2` to `2.3.0`. Look into -the *upgrade* directory: +**Example:** You are upgrading Icinga 2 from version `2.4.0` to `2.8.0`. Look into +the `upgrade` directory: - $ ls /usr/share/icinga2-ido-pgsql/schema/upgrade/ - 2.0.2.sql 2.1.0.sql 2.2.0.sql 2.3.0.sql +``` +$ ls /usr/share/icinga2-ido-pgsql/schema/upgrade/ +2.0.2.sql 2.1.0.sql 2.2.0.sql 2.3.0.sql 2.4.0.sql 2.5.0.sql 2.6.0.sql 2.8.0.sql +``` -There are two new upgrade files called `2.1.0.sql`, `2.2.0.sql` and `2.3.0.sql` +There are two new upgrade files called `2.5.0.sql`, `2.6.0.sql` and `2.8.0.sql` which must be applied incrementally to your IDO database. + +``` +# export PGPASSWORD=icinga +# psql -U icinga -d icinga < /usr/share/icinga2-ido-pgsql/schema/upgrade/2.5.0.sql +# psql -U icinga -d icinga < /usr/share/icinga2-ido-pgsql/schema/upgrade/2.6.0.sql +# psql -U icinga -d icinga < /usr/share/icinga2-ido-pgsql/schema/upgrade/2.8.0.sql +``` diff --git a/lib/db_ido/dbconnection.hpp b/lib/db_ido/dbconnection.hpp index dc677d075..2b1d77d6e 100644 --- a/lib/db_ido/dbconnection.hpp +++ b/lib/db_ido/dbconnection.hpp @@ -29,8 +29,8 @@ #include #include -#define IDO_CURRENT_SCHEMA_VERSION "1.14.2" -#define IDO_COMPAT_SCHEMA_VERSION "1.14.2" +#define IDO_CURRENT_SCHEMA_VERSION "1.14.3" +#define IDO_COMPAT_SCHEMA_VERSION "1.14.3" namespace icinga { diff --git a/lib/db_ido/dbevents.cpp b/lib/db_ido/dbevents.cpp index 706e3ddd3..2d6653579 100644 --- a/lib/db_ido/dbevents.cpp +++ b/lib/db_ido/dbevents.cpp @@ -375,10 +375,8 @@ void DbEvents::AddCommentInternal(std::vector& queries, const Comment:: query1.WhereCriteria = new Dictionary(); query1.WhereCriteria->Set("object_id", checkable); - query1.WhereCriteria->Set("comment_time", DbValue::FromTimestamp(entry_time)); - query1.WhereCriteria->Set("instance_id", 0); /* DbConnection class fills in real ID */ - /* Match the unique constraint. */ - query1.WhereCriteria->Set("internal_comment_id", comment->GetLegacyId()); + query1.WhereCriteria->Set("name", comment->GetName()); + query1.WhereCriteria->Set("entry_time", DbValue::FromTimestamp(entry_time)); } else { query1.Table = "commenthistory"; query1.Type = DbQueryInsert; @@ -409,8 +407,7 @@ void DbEvents::RemoveCommentInternal(std::vector& queries, const Commen query1.Category = DbCatComment; query1.WhereCriteria = new Dictionary(); query1.WhereCriteria->Set("object_id", checkable); - query1.WhereCriteria->Set("comment_time", DbValue::FromTimestamp(entry_time)); - query1.WhereCriteria->Set("instance_id", 0); /* DbConnection class fills in real ID */ + query1.WhereCriteria->Set("entry_time", DbValue::FromTimestamp(entry_time)); query1.WhereCriteria->Set("name", comment->GetName()); queries.push_back(query1); @@ -430,8 +427,7 @@ void DbEvents::RemoveCommentInternal(std::vector& queries, const Commen query2.WhereCriteria = new Dictionary(); query2.WhereCriteria->Set("object_id", checkable); - query2.WhereCriteria->Set("comment_time", DbValue::FromTimestamp(entry_time)); - query2.WhereCriteria->Set("instance_id", 0); /* DbConnection class fills in real ID */ + query2.WhereCriteria->Set("entry_time", DbValue::FromTimestamp(entry_time)); query2.WhereCriteria->Set("name", comment->GetName()); queries.push_back(query2); } @@ -521,10 +517,8 @@ void DbEvents::AddDowntimeInternal(std::vector& queries, const Downtime query1.WhereCriteria = new Dictionary(); query1.WhereCriteria->Set("object_id", checkable); + query1.WhereCriteria->Set("name", downtime->GetName()); query1.WhereCriteria->Set("entry_time", DbValue::FromTimestamp(downtime->GetEntryTime())); - query1.WhereCriteria->Set("instance_id", 0); /* DbConnection class fills in real ID */ - /* Match the unique constraint. */ - query1.WhereCriteria->Set("internal_downtime_id", downtime->GetLegacyId()); } else { query1.Table = "downtimehistory"; query1.Type = DbQueryInsert; @@ -586,6 +580,7 @@ void DbEvents::RemoveDowntimeInternal(std::vector& queries, const Downt query1.Type = DbQueryDelete; query1.Category = DbCatDowntime; query1.WhereCriteria = new Dictionary(); + query1.WhereCriteria->Set("object_id", checkable); query1.WhereCriteria->Set("entry_time", DbValue::FromTimestamp(downtime->GetEntryTime())); query1.WhereCriteria->Set("instance_id", 0); /* DbConnection class fills in real ID */ diff --git a/lib/db_ido_mysql/schema/mysql.sql b/lib/db_ido_mysql/schema/mysql.sql index 77f022b05..2acff559a 100644 --- a/lib/db_ido_mysql/schema/mysql.sql +++ b/lib/db_ido_mysql/schema/mysql.sql @@ -2,7 +2,7 @@ -- mysql.sql -- DB definition for IDO MySQL -- --- Copyright (c) 2009-2016 Icinga Development Team (https://www.icinga.com/) +-- Copyright (c) 2009-2017 Icinga Development Team (https://www.icinga.com/) -- -- -- -------------------------------------------------------- @@ -1681,10 +1681,18 @@ CREATE INDEX idx_hostdependencies_dependent_host_object_id on icinga_hostdepende CREATE INDEX idx_service_contacts_service_id on icinga_service_contacts(service_id); CREATE INDEX idx_host_contacts_host_id on icinga_host_contacts(host_id); +-- #5458 +create index idx_downtimehistory_remove on icinga_downtimehistory (object_id, entry_time, scheduled_start_time, scheduled_end_time); +create index idx_scheduleddowntime_remove on icinga_scheduleddowntime (object_id, entry_time, scheduled_start_time, scheduled_end_time); + +-- #5492 +CREATE INDEX idx_commenthistory_remove ON icinga_commenthistory (object_id, entry_time); +CREATE INDEX idx_comments_remove ON icinga_comments (object_id, entry_time); + -- ----------------------------------------- -- set dbversion -- ----------------------------------------- -INSERT INTO icinga_dbversion (name, version, create_time, modify_time) VALUES ('idoutils', '1.14.2', NOW(), NOW()) -ON DUPLICATE KEY UPDATE version='1.14.2', modify_time=NOW(); +INSERT INTO icinga_dbversion (name, version, create_time, modify_time) VALUES ('idoutils', '1.14.3', NOW(), NOW()) +ON DUPLICATE KEY UPDATE version='1.14.3', modify_time=NOW(); diff --git a/lib/db_ido_mysql/schema/upgrade/2.8.0.sql b/lib/db_ido_mysql/schema/upgrade/2.8.0.sql new file mode 100644 index 000000000..db546d007 --- /dev/null +++ b/lib/db_ido_mysql/schema/upgrade/2.8.0.sql @@ -0,0 +1,81 @@ +-- ----------------------------------------- +-- upgrade path for Icinga 2.8.0 +-- +-- ----------------------------------------- +-- Copyright (c) 2017 Icinga Development Team (https://www.icinga.com) +-- +-- Please check https://docs.icinga.com for upgrading information! +-- ----------------------------------------- + +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_downtimehistory', 'instance_id'); +CALL ido_drop_index_if_exists('icinga_scheduleddowntime', 'instance_id'); +CALL ido_drop_index_if_exists('icinga_commenthistory', 'instance_id'); +CALL ido_drop_index_if_exists('icinga_comments', 'instance_id'); + +DROP FUNCTION ido_index_exists; +DROP PROCEDURE ido_drop_index_if_exists; + +-- ----------------------------------------- +-- #5458 IDO: Improve downtime removal/cancel +-- ----------------------------------------- + +CREATE INDEX idx_downtimehistory_remove ON icinga_downtimehistory (object_id, entry_time, scheduled_start_time, scheduled_end_time); +CREATE INDEX idx_scheduleddowntime_remove ON icinga_scheduleddowntime (object_id, entry_time, scheduled_start_time, scheduled_end_time); + +-- ----------------------------------------- +-- #5492 IDO: Improve comment removal +-- ----------------------------------------- + +CREATE INDEX idx_commenthistory_remove ON icinga_commenthistory (object_id, entry_time); +CREATE INDEX idx_comments_remove ON icinga_comments (object_id, entry_time); + +-- ----------------------------------------- +-- set dbversion +-- ----------------------------------------- +INSERT INTO icinga_dbversion (name, version, create_time, modify_time) VALUES ('idoutils', '1.14.3', NOW(), NOW()) ON DUPLICATE KEY UPDATE version='1.14.3', modify_time=NOW(); diff --git a/lib/db_ido_pgsql/schema/pgsql.sql b/lib/db_ido_pgsql/schema/pgsql.sql index fda5ea591..fb033d2b7 100644 --- a/lib/db_ido_pgsql/schema/pgsql.sql +++ b/lib/db_ido_pgsql/schema/pgsql.sql @@ -2,7 +2,7 @@ -- pgsql.sql -- DB definition for IDO Postgresql -- --- Copyright (c) 2009-2016 Icinga Development Team (https://www.icinga.com/) +-- Copyright (c) 2009-2017 Icinga Development Team (https://www.icinga.com/) -- -- -------------------------------------------------------- @@ -1721,9 +1721,17 @@ CREATE INDEX idx_hostdependencies_dependent_host_object_id on icinga_hostdepende CREATE INDEX idx_service_contacts_service_id on icinga_service_contacts(service_id); CREATE INDEX idx_host_contacts_host_id on icinga_host_contacts(host_id); +-- #5458 +CREATE INDEX idx_downtimehistory_remove ON icinga_downtimehistory (object_id, entry_time, scheduled_start_time, scheduled_end_time); +CREATE INDEX idx_scheduleddowntime_remove ON icinga_scheduleddowntime (object_id, entry_time, scheduled_start_time, scheduled_end_time); + +-- #5492 +CREATE INDEX idx_commenthistory_remove ON icinga_commenthistory (object_id, entry_time); +CREATE INDEX idx_comments_remove ON icinga_comments (object_id, entry_time); + -- ----------------------------------------- -- set dbversion -- ----------------------------------------- -SELECT updatedbversion('1.14.2'); +SELECT updatedbversion('1.14.3'); diff --git a/lib/db_ido_pgsql/schema/upgrade/2.8.0.sql b/lib/db_ido_pgsql/schema/upgrade/2.8.0.sql new file mode 100644 index 000000000..cae9b6699 --- /dev/null +++ b/lib/db_ido_pgsql/schema/upgrade/2.8.0.sql @@ -0,0 +1,32 @@ +-- ----------------------------------------- +-- upgrade path for Icinga 2.8.0 +-- +-- ----------------------------------------- +-- Copyright (c) 2017 Icinga Development Team (https://www.icinga.com) +-- +-- Please check https://docs.icinga.com for upgrading information! +-- ----------------------------------------- + +ALTER TABLE icinga_downtimehistory DROP CONSTRAINT IF EXISTS UQ_downtimehistory; +ALTER TABLE icinga_scheduleddowntime DROP CONSTRAINT IF EXISTS UQ_scheduleddowntime; +ALTER TABLE icinga_commenthistory DROP CONSTRAINT IF EXISTS UQ_commenthistory; +ALTER TABLE icinga_comments DROP CONSTRAINT IF EXISTS UQ_comments; + +-- ----------------------------------------- +-- #5458 IDO: Improve downtime removal/cancel +-- ----------------------------------------- + +CREATE INDEX idx_downtimehistory_remove ON icinga_downtimehistory (object_id, entry_time, scheduled_start_time, scheduled_end_time); +CREATE INDEX idx_scheduleddowntime_remove ON icinga_scheduleddowntime (object_id, entry_time, scheduled_start_time, scheduled_end_time); + +-- ----------------------------------------- +-- #5492 +-- ----------------------------------------- + +CREATE INDEX idx_commenthistory_remove ON icinga_commenthistory (object_id, entry_time); +CREATE INDEX idx_comments_remove ON icinga_comments (object_id, entry_time); +-- ----------------------------------------- +-- set dbversion +-- ----------------------------------------- + +SELECT updatedbversion('1.14.3');