-- выполнить в базе dwh для создания внешних таблиц схемы vmreports -- перед выполнением забекапить схему vmreports для восстановления в БД billing CREATE EXTENSION IF NOT EXISTS postgres_fdw; GRANT USAGE ON FOREIGN DATA WRAPPER postgres_fdw TO dbo; SET ROLE dbo; --DROP SCHEMA IF EXISTS vmreports CASCADE; CREATE SCHEMA IF NOT EXISTS vmreports AUTHORIZATION dbo; GRANT USAGE ON SCHEMA vmreports TO nifi,analytics,analyst; ALTER DEFAULT PRIVILEGES FOR ROLE dbo IN SCHEMA vmreports GRANT SELECT ON TABLES TO nifi,analytics,analyst; -- это работает и для внешних таблиц --ALTER DEFAULT PRIVILEGES FOR ROLE dbo IN SCHEMA vmreports GRANT USAGE ON SEQUENCES TO nifi,analytics,analyst; /* конструкция осложняется тем, что нужен один пользователь-владелец и второй читатель Это вызывает множество телодвижений при создании. Необходимость указывать пароль при локальном коннекте не очень радует (ведь пользователь локальный, прописан на этом же сервере) А при смене его пароля все сломается, и поиск ошибки будет неочевиден */ DO $$ DECLARE rec RECORD; BEGIN FOR rec IN SELECT tablename FROM pg_tables WHERE schemaname = 'vmreports' LOOP EXECUTE format('ALTER TABLE vmreports.%I RENAME TO %I', rec.tablename, 'del_' || rec.tablename); END LOOP; END $$; DROP SERVER IF EXISTS billing CASCADE; CREATE SERVER billing FOREIGN DATA WRAPPER postgres_fdw OPTIONS (host 'localhost', port '5432', dbname 'billing', updatable 'false'); DROP USER MAPPING IF EXISTS FOR PUBLIC SERVER billing; CREATE USER MAPPING FOR PUBLIC SERVER billing OPTIONS (user 'nifi', password '***'); IMPORT FOREIGN SCHEMA vmreports FROM SERVER billing INTO vmreports; --select * from vmreports.host; /* план миграции - черновик Забекапить схему vmreports Восстановить схему vmreports из бэкапа в базу биллинг Поменять целевую базу импорта НиФи (для прода - втащить новый обмен из репозитория) Выполнить скрипт в базе DWH - он удалит (переименует) физические таблицы и создаст внешние таблицы на базу billing */ /* Исходно данные host, compute, storage, (gpu) загружались в dwh.vmreports, для анализа capacity В текущей конфигурации, чтобы избежать дублирования таблиц, данных и обменов NiFi Направляем загрузку данных из VROPS в схему billing.vmreports и в базе dwh (схема vmreports) создаем Foreign Tables на billing.vmreports. ----------------------------------------------- Миграция на проде: убедиться, что новый обмен VROPS->billing.vmreports (billing/vmReports) загружен в NiFi Registry найти пароль nifi (под ним коннект к localhost) остановить загрузку из VROPS на nifi-01 (billing/vmReports), сделать бэкап схемы dwh.vmreports (займет минут 10 ... заняло 215 сек), Восстановить схему vmreports в БД billing - запустить восстановление (Clean Before Restore) (РИСК: восстановление может занять много времени и завершиться с ошибками, обычно так бывает) select count (*) from vmreports.storage Выполнить этот скрипт (заменив пароль nifi на актуальный перед выполнением) переименовать таблицы из схемы vmreports для удаления (есть в скрипте выше) создать Foreign Tables (коннект проверится при импорте схемы) Проверить, что права назначились коррректно Обновить обмен billing/vmReports на продуктиве, запустить ----------------------------------------------------------------- Данные из billing.vmreports также реплицируются (процессорами группы LK) в буферную базу rpt */ /* 17:04:49 MSKERROR0dff1f93-153d-3a90-ed64-55d23960b88c EvaluateJsonPath[id=0dff1f93-153d-3a90-ed64-55d23960b88c] FlowFile FlowFile[filename=06c68bec-d824-4114-913b-bda34cb4fb1d] did not have valid JSON content. -- со второй попытки отработало 17:05:15 MSKERROR239db407-76f2-3660-7fad-c4bedff6a4f8 InvokeHTTP[id=239db407-76f2-3660-7fad-c4bedff6a4f8] Request Processing failed: FlowFile[filename=3474c340-f360-4a1e-a27e-283be41fc264]: java.net.SocketTimeoutException: timeout - Caused by: java.net.SocketException: Socket closed https://payg.adl.nubes.ru/payg.cfm с первого раза таймаут, со второго посчиталось */ /* теперь ищу в нифи примеры с кроном 17:25:05 MSKERROR16efa0f6-f1e7-3755-04fc-5be0383244ec PutDatabaseRecord[id=16efa0f6-f1e7-3755-04fc-5be0383244ec] Failed to put Records to database for FlowFile[filename=11f8176f-2a98-4199-932e-22e2fc2073b1]. Routing to failure.: org.apache.nifi.serialization.MalformedRecordException: Record does not have a value for the UpdateKey column 'obj_uuid' 17:25:05 MSKERROR16efa0f6-f1e7-3755-04fc-5be0383244ec PutDatabaseRecord[id=16efa0f6-f1e7-3755-04fc-5be0383244ec] Record does not have a value for the UpdateKey column 'obj_uuid' 17:25:05 MSKERROR16efa0f6-f1e7-3755-04fc-5be0383244ec PutDatabaseRecord[id=16efa0f6-f1e7-3755-04fc-5be0383244ec] Failed to put Records to database for FlowFile[filename=5039a3b6-2244-4451-81fc-deb8074f3cc7]. Routing to failure.: org.apache.nifi.serialization.MalformedRecordException: Record does not have a value for the UpdateKey column 'obj_uuid' 17:25:05 MSKERROR16efa0f6-f1e7-3755-04fc-5be0383244ec PutDatabaseRecord[id=16efa0f6-f1e7-3755-04fc-5be0383244ec] Record does not have a value for the UpdateKey column 'obj_uuid' 17:25:05 MSKERROR16efa0f6-f1e7-3755-04fc-5be0383244ec PutDatabaseRecord[id=16efa0f6-f1e7-3755-04fc-5be0383244ec] Failed to put Records to database for FlowFile[filename=8c6e9efb-198d-4303-897a-53fcfdf4d0f6]. Routing to failure.: org.apache.nifi.serialization.MalformedRecordException: Record does not have a value for the UpdateKey column 'obj_uuid' */