{"id":488053,"date":"2026-07-21T13:24:45","date_gmt":"2026-07-21T13:24:45","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=488053"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=488053","title":{"rendered":"\u041c\u0438\u0433\u0440\u0430\u0446\u0438\u044f MariaDB \u2192 PostgreSQL \u0431\u0435\u0437 \u0434\u0430\u0443\u043d\u0442\u0430\u0439\u043c\u0430: \u043f\u043e\u0447\u0435\u043c\u0443 \u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u0443\u0442\u0438\u043b\u0438\u0442\u044b \u043d\u0435 \u043f\u043e\u0434\u043e\u0448\u043b\u0438 \u0438 \u043a\u0430\u043a \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u044d\u0442\u043e \u0447\u0435\u0440\u0435\u0437 Debezium CDC"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/9e7\/78e\/ddf\/9e778eddf58caf3b5316e0170ecc0cbd.webp\" width=\"1000\" height=\"421\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/9e7\/78e\/ddf\/9e778eddf58caf3b5316e0170ecc0cbd.webp 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/9e7\/78e\/ddf\/9e778eddf58caf3b5316e0170ecc0cbd.webp 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u041f\u0435\u0440\u0435\u0434 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439, \u0432\u044b\u0440\u043e\u0441\u0448\u0435\u0439 \u043d\u0430 MySQL\/MariaDB, \u0432\u0441\u0442\u0430\u0451\u0442 \u0432\u043e\u043f\u0440\u043e\u0441 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u043d\u0430 PostgreSQL: \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438, \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439, \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0443\u0435\u043c\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043f\u0440\u0438 \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u044b\u0445 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0430\u0445 &#8212; \u043f\u0440\u0438\u0447\u0438\u043d \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e. \u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432 \u0434\u0440\u0443\u0433\u043e\u043c: \u043a\u0430\u043a \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u0431\u043e\u0435\u0432\u0443\u044e \u0431\u0430\u0437\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0435 \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0438 \u043d\u0430 \u043c\u0438\u043d\u0443\u0442\u0443, \u0431\u0435\u0437 \u0447\u0430\u0441\u043e\u0432 \u043f\u0440\u043e\u0441\u0442\u043e\u044f \u0438 \u0431\u0435\u0437 \u0440\u0438\u0441\u043a\u0430 \u043f\u043e\u0442\u0435\u0440\u044f\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435, \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0430.<\/p>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 &#8212; \u043a\u0430\u043a \u043c\u044b \u0440\u0435\u0448\u0430\u043b\u0438 \u044d\u0442\u0443 \u0437\u0430\u0434\u0430\u0447\u0443 \u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u043c\u0430\u0433\u0430\u0437\u0438\u043d\u0430 \u043d\u0430 MariaDB, \u043f\u043e\u0447\u0435\u043c\u0443 \u0433\u043e\u0442\u043e\u0432\u044b\u0435 \u043a\u043e\u043d\u0441\u043e\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0435\u0440\u044b \u043d\u0435 \u0433\u043e\u0434\u044f\u0442\u0441\u044f \u0434\u043b\u044f \u00ab\u0436\u0438\u0432\u043e\u0439\u00bb \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438, \u0438 \u043a\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0440\u0430\u0431\u043e\u0447\u0430\u044f \u0441\u0445\u0435\u043c\u0430 \u043d\u0430 Debezium + Kafka Connect, \u0432\u043a\u043b\u044e\u0447\u0430\u044f Ansible-\u0440\u043e\u043b\u044c \u0434\u043b\u044f \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u043c\u043e\u0433\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430.<\/p>\n<blockquote>\n<p>\u0412\u0441\u0435 \u0438\u043c\u0435\u043d\u0430 \u0445\u043e\u0441\u0442\u043e\u0432, \u0431\u0430\u0437, \u0442\u043e\u043f\u0438\u043a\u043e\u0432 \u0438 \u0443\u0447\u0451\u0442\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445 &#8212; \u0432\u044b\u043c\u044b\u0448\u043b\u0435\u043d\u043d\u044b\u0435.<\/p>\n<\/blockquote>\n<h3>\u041f\u043e\u0447\u0435\u043c\u0443 \u043d\u0435 \u043f\u043e\u0434\u043e\u0448\u043b\u0438 \u0433\u043e\u0442\u043e\u0432\u044b\u0435 \u0443\u0442\u0438\u043b\u0438\u0442\u044b<\/h3>\n<p>\u041f\u0435\u0440\u0432\u0430\u044f \u043c\u044b\u0441\u043b\u044c \u043f\u0440\u0438 \u0441\u043b\u043e\u0432\u0435 \u00ab\u043c\u0438\u0433\u0440\u0430\u0446\u0438\u044f MySQL \u2192 PostgreSQL\u00bb &#8212; \u0432\u0437\u044f\u0442\u044c \u043e\u0434\u0438\u043d \u0438\u0437 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0445 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0435\u0440\u043e\u0432 \u0438 \u043f\u0440\u043e\u0433\u043d\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u043d\u0435\u0433\u043e \u0434\u0430\u043c\u043f. \u041c\u044b \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432, \u0438 \u0443 \u0432\u0441\u0435\u0445 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u043b\u0441\u044f \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0439 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u043a: \u044d\u0442\u043e <strong>\u0443\u0442\u0438\u043b\u0438\u0442\u044b \u043e\u0434\u043d\u043e\u0440\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0430<\/strong>, \u0430 \u043d\u0435 \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0438. \u041e\u043d\u0438 \u0441\u043d\u0438\u043c\u0430\u044e\u0442 \u0441\u043d\u0435\u043f\u0448\u043e\u0442 \u043d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0438 \u043d\u0435 \u0443\u043c\u0435\u044e\u0442 \u0434\u043e\u043d\u0430\u043a\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f, \u0441\u043b\u0443\u0447\u0438\u0432\u0448\u0438\u0435\u0441\u044f \u0432 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0435 \u043f\u043e\u0441\u043b\u0435 \u043d\u0430\u0447\u0430\u043b\u0430 \u0440\u0430\u0431\u043e\u0442\u044b. \u0414\u043b\u044f \u0431\u0430\u0437\u044b, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0435 \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f, \u044d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0434\u0430\u0443\u043d\u0442\u0430\u0439\u043c\u0430 \u043d\u0430 \u0432\u0440\u0435\u043c\u044f \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0430 &#8212; \u0434\u043b\u044f \u043d\u0430\u0441 \u043d\u0435\u043f\u0440\u0438\u0435\u043c\u043b\u0435\u043c\u043e\u0435.<\/p>\n<p>\u041f\u043b\u044e\u0441 \u043a \u044d\u0442\u043e\u043c\u0443 \u0443 \u043a\u0430\u0436\u0434\u043e\u0439 \u0443\u0442\u0438\u043b\u0438\u0442\u044b \u043d\u0430\u0448\u043b\u0438\u0441\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0431\u043e\u043b\u044f\u0447\u043a\u0438:<\/p>\n<ul>\n<li>\n<p><strong>pgloader<\/strong> &#8212; \u0441\u0430\u043c\u044b\u0439 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442, \u043d\u043e \u0432 \u0435\u0433\u043e issue-\u0442\u0440\u0435\u043a\u0435\u0440\u0435 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0442 \u043f\u0430\u0434\u0435\u043d\u0438\u044f \u043f\u043e \u043f\u0430\u043c\u044f\u0442\u0438 (heap exhaustion) \u043d\u0430 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u0445, \u043e\u0448\u0438\u0431\u043a\u0438 \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 (<code>ESRAP-PARSE-ERROR<\/code>), \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441 \u00ab\u043d\u0443\u043b\u0435\u0432\u044b\u043c\u0438\u00bb \u0434\u0430\u0442\u0430\u043c\u0438 MySQL, \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u044b \u0438\u043c\u0451\u043d \u043f\u0440\u0438 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0438\u0438 \u043b\u0438\u043c\u0438\u0442\u0430 PostgreSQL \u0432 63 \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u0438 \u0434\u0443\u0431\u043b\u0438\u0440\u0443\u044e\u0449\u0438\u043c\u0438\u0441\u044f \u0438\u043c\u0435\u043d\u0430\u043c\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 MySQL \u0434\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u043d\u0435\u044f\u0432\u043d\u043e, \u0430 PostgreSQL &#8212; \u043d\u0435\u0442 (<a href=\"https:\/\/github.com\/dimitri\/pgloader\/issues\/1336\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u0438\u043c\u0435\u0440<\/a>, <a href=\"https:\/\/github.com\/dimitri\/pgloader\/issues\/1679\" rel=\"noopener noreferrer nofollow\">\u0435\u0449\u0451 \u043e\u0434\u0438\u043d<\/a>, <a href=\"https:\/\/github.com\/dimitri\/pgloader\/issues\/1680\" rel=\"noopener noreferrer nofollow\">\u0438 \u0435\u0449\u0451<\/a>). \u041d\u0430 \u0447\u0430\u0441\u0442\u0438 \u043d\u0430\u0448\u0438\u0445 \u0442\u0430\u0431\u043b\u0438\u0446 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u0432\u0438\u0441\u0430\u043b\u0430 \u043d\u0430 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0435.<\/p>\n<\/li>\n<li>\n<p><strong>pg_chameleon<\/strong> &#8212; \u0431\u043b\u0438\u0436\u0435 \u043a \u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043d\u0430\u043c \u0431\u044b\u043b\u043e \u043d\u0443\u0436\u043d\u043e (\u0440\u0435\u0430\u043b\u044c\u043d\u0430\u044f \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u044f \u0447\u0435\u0440\u0435\u0437 \u0447\u0442\u0435\u043d\u0438\u0435 \u0431\u0438\u043d\u043b\u043e\u0433\u043e\u0432), \u043d\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442 <code>binlog_format=ROW<\/code>, \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e primary key \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u0435, \u0430 \u043f\u0440\u0438 \u043e\u0448\u0438\u0431\u043a\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u0440\u043e\u0441\u0442\u043e <strong>\u0432\u044b\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442 \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u043d\u0443\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0438\u0437 \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0438<\/strong> &#8212; \u0442\u043e \u0435\u0441\u0442\u044c \u0447\u0430\u0441\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u043e\u043b\u0447\u0430 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u0451\u0442 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f, \u0438 \u044d\u0442\u043e \u043b\u0435\u0433\u043a\u043e \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u00abPostgreSQL \u2192 MySQL\u00bb \u0443 \u043d\u0435\u0433\u043e \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u0438 \u0441\u0438\u043b\u044c\u043d\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u0435 &#8212; \u0436\u0438\u0437\u043d\u0435\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u044f \u0432 \u043e\u0434\u043d\u0443 \u0441\u0442\u043e\u0440\u043e\u043d\u0443.<\/p>\n<\/li>\n<li>\n<p><strong>py-mysql2pgsql<\/strong> &#8212; \u043f\u043e \u0441\u0443\u0442\u0438, \u0437\u0430\u0431\u0440\u043e\u0448\u0435\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442: \u0440\u0435\u043b\u0438\u0437\u043e\u0432 \u043d\u0435\u0442 \u0443\u0436\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043b\u0435\u0442, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u043d\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u0430, \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0447\u0435\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043d\u0435 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u043b\u0438.<\/p>\n<\/li>\n<\/ul>\n<p>\u041d\u0438 \u043e\u0434\u0438\u043d \u0438\u0437 \u044d\u0442\u0438\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043d\u0435 \u0434\u0430\u0451\u0442 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0431\u044b\u043b\u043e \u043d\u0443\u0436\u043d\u043e: \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0439 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u0438 \u043f\u0440\u0438\u0451\u043c\u043d\u0438\u043a\u0430, \u0447\u0442\u043e\u0431\u044b \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043c\u0438\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0437\u0430\u0440\u0430\u043d\u0435\u0435, \u0434\u0430\u0442\u044c \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u043c \u00ab\u0434\u043e\u0440\u0435\u043f\u043b\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f\u00bb \u0438 \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043e\u0442 MariaDB \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0435\u0433\u043e \u043d\u0430 PostgreSQL \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e \u0441 \u0440\u0430\u0437\u043d\u0438\u0446\u0435\u0439 \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u044b.<\/p>\n<h3>\u0420\u0435\u0448\u0435\u043d\u0438\u0435: Debezium \u043a\u0430\u043a CDC-\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430<\/h3>\n<p><a href=\"https:\/\/debezium.io\/\" rel=\"noopener noreferrer nofollow\">Debezium<\/a> &#8212; \u044d\u0442\u043e \u043d\u0430\u0431\u043e\u0440 \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440\u043e\u0432 \u0434\u043b\u044f Kafka Connect, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0438\u0445 Change Data Capture (CDC). \u0412 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u0440\u0430\u0437\u043e\u0432\u044b\u0445 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0435\u0440\u043e\u0432, Debezium:<\/p>\n<ol>\n<li>\n<p>\u0441\u043d\u0438\u043c\u0430\u0435\u0442 \u043a\u043e\u043d\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u043d\u044b\u0439 \u0441\u043d\u0435\u043f\u0448\u043e\u0442 \u0442\u0435\u043a\u0443\u0449\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 (<code>snapshot.mode: initial<\/code>);<\/p>\n<\/li>\n<li>\n<p>\u0434\u0430\u043b\u044c\u0448\u0435 \u0447\u0438\u0442\u0430\u0435\u0442 \u0431\u0438\u043d\u043b\u043e\u0433\u0438 MariaDB \u043f\u043e\u0441\u0442\u0440\u043e\u0447\u043d\u043e \u0438 \u0441\u0442\u0440\u0438\u043c\u0438\u0442 \u043a\u0430\u0436\u0434\u043e\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 (insert\/update\/delete) \u0432 Kafka;<\/p>\n<\/li>\n<li>\n<p>\u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u043c \u043a\u043e\u043d\u0446\u0435 sink-\u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u0442 \u043f\u043e\u0442\u043e\u043a \u0438\u0437 Kafka \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 PostgreSQL \u0447\u0435\u0440\u0435\u0437 upsert.<\/p>\n<\/li>\n<\/ol>\n<p>\u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 PostgreSQL-\u0440\u0435\u043f\u043b\u0438\u043a\u0430 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e \u00ab\u0434\u043e\u0433\u043e\u043d\u044f\u0435\u0442\u00bb \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a, \u0438 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u043d\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0432 \u043b\u044e\u0431\u043e\u0439 \u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442, \u043a\u043e\u0433\u0434\u0430 \u043b\u0430\u0433 \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u0431\u043b\u0438\u0437\u043e\u043a \u043a \u043d\u0443\u043b\u044e &#8212; \u0431\u0435\u0437 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 MariaDB \u043d\u0430 \u0432\u0440\u0435\u043c\u044f \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0430.<\/p>\n<p>\u041f\u043b\u0430\u0442\u0430 \u0437\u0430 \u044d\u0442\u043e &#8212; \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u043d\u0443\u0436\u0435\u043d Kafka \u0441 ZooKeeper, Kafka Connect, \u0434\u0438\u0441\u043a \u043f\u043e\u0434 \u043e\u0447\u0435\u0440\u0435\u0434\u044c) \u0438 \u0442\u043e, \u0447\u0442\u043e \u0432\u0441\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0443\u044e\u0442\u0441\u044f \u0432 Kafka \u0432 \u0432\u0438\u0434\u0435 JSON &#8212; \u0432 \u043d\u0430\u0448\u0435\u043c \u0442\u0435\u0441\u0442\u0435 \u043f\u0435\u0440\u0435\u043d\u043e\u0441 \u0434\u0430\u043d\u043d\u044b\u0445 \u0437\u0430\u043d\u044f\u043b \u043e\u043a\u043e\u043b\u043e <strong>50 \u0413\u0411<\/strong> \u0434\u0438\u0441\u043a\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u0438\u0437-\u0437\u0430 \u044d\u0442\u043e\u0433\u043e \u0444\u043e\u0440\u043c\u0430\u0442\u0430. \u0420\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c \u0441\u0442\u0435\u043a \u043b\u0443\u0447\u0448\u0435 \u043d\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435, \u0430 \u043d\u0435 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u0441 \u0431\u043e\u0435\u0432\u043e\u0439 \u0431\u0430\u0437\u043e\u0439.<\/p>\n<h3>\u0412\u0435\u0440\u0441\u0438\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432<\/h3>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0412\u0435\u0440\u0441\u0438\u044f<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">MariaDB<\/p>\n<\/td>\n<td>\n<p align=\"left\">v11.7.2<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">PostgreSQL<\/p>\n<\/td>\n<td>\n<p align=\"left\">v15.12 (Debian 15.12-0+deb12u2)<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Debezium ZooKeeper<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>quay.io\/debezium\/zookeeper:3.1.1.Final<\/code><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Debezium Kafka<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>quay.io\/debezium\/kafka:3.1.1.Final<\/code><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Debezium Connect<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>quay.io\/debezium\/connect:3.1.1.Final<\/code><\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u041d\u0438\u0436\u0435 &#8212; \u043f\u0440\u0438\u043c\u0435\u0440 \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0430 <code>db-source-01<\/code> (MariaDB) \u2192 <code>db-target-01<\/code> (PostgreSQL).<\/p>\n<h3>\u0428\u0430\u0433 1. \u0418\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430: ZooKeeper, Kafka, Kafka Connect<\/h3>\n<pre><code class=\"bash\">docker network create debezium-netdocker run -d --name zookeeper \\  --network debezium-net \\  -p 2181:2181 -p 2888:2888 -p 3888:3888 \\  quay.io\/debezium\/zookeeper:3.1.1.Finaldocker run -d --name kafka \\  --network debezium-net \\  -p 9092:9092 \\  -e KAFKA_LISTENERS=PLAINTEXT:\/\/0.0.0.0:9092 \\  -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT:\/\/kafka:9092 \\  -e ZOOKEEPER_CONNECT=zookeeper:2181 \\  -e KAFKA_AUTO_CREATE_TOPICS_ENABLE=true \\  quay.io\/debezium\/kafka:3.1.1.Finaldocker run -d --name connect \\  --network debezium-net \\  -p 8083:8083 \\  -e BOOTSTRAP_SERVERS=kafka:9092 \\  -e GROUP_ID=1 \\  -e CONFIG_STORAGE_TOPIC=my_connect_configs \\  -e OFFSET_STORAGE_TOPIC=my_connect_offsets \\  -e STATUS_STORAGE_TOPIC=my_connect_statuses \\  quay.io\/debezium\/connect:3.1.1.Finaldocker exec -it kafka \/kafka\/bin\/kafka-topics.sh \\  --bootstrap-server kafka:9092 --create \\  --topic schemachanges-example \\  --partitions 1 --replication-factor 1<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:87px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0442\u043e\u043f\u0438\u043a <code>schemachanges-example<\/code> \u043d\u0443\u0436\u0435\u043d Debezium \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0441\u0445\u0435\u043c\u044b \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 &#8212; \u0431\u0435\u0437 \u043d\u0435\u0433\u043e source-\u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440 \u043d\u0435 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0441\u044f.<\/p>\n<h3>\u0428\u0430\u0433 2. Source-\u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440 (MariaDB)<\/h3>\n<pre><code class=\"bash\">curl -i -X POST -H \"Content-Type:application\/json\" http:\/\/localhost:8083\/connectors\/ -d '{  \"name\": \"mariadb-connector\",  \"config\": {    \"connector.class\": \"io.debezium.connector.mariadb.MariaDbConnector\",    \"database.hostname\": \"db-source-01.example.int\",    \"database.port\": \"3306\",    \"database.user\": \"debezium\",    \"database.password\": \"&lt;MARIADB_PASSWORD&gt;\",    \"database.server.id\": \"1\",    \"database.include.list\": \"example_shop\",    \"database.connectionTimeZone\": \"Europe\/Moscow\",    \"topic.prefix\": \"db-source-01-example-int\",    \"schema.history.internal.kafka.bootstrap.servers\": \"kafka:9092\",    \"schema.history.internal.kafka.topic\": \"schemachanges-example\",    \"include.schema.changes\": \"true\",    \"snapshot.mode\": \"initial\",    \"transforms\": \"unwrap\",    \"transforms.unwrap.type\": \"io.debezium.transforms.ExtractNewRecordState\",    \"transforms.unwrap.delete.handling.mode\": \"rewrite\",    \"transforms.unwrap.drop.tombstones\": \"false\",    \"max.batch.size\": \"100\",    \"max.queue.size\": \"500\"  }}'curl -s http:\/\/localhost:8083\/connectors\/mariadb-connector\/status | jq<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0421\u0442\u0430\u0442\u0443\u0441 (<code>connector.state<\/code> \u0438 <code>tasks[].state<\/code>) \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c <code>RUNNING<\/code>.<\/p>\n<h3>\u0428\u0430\u0433 3. Sink-\u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440 (PostgreSQL)<\/h3>\n<pre><code class=\"bash\">curl -i -X POST -H \"Content-Type:application\/json\" http:\/\/localhost:8083\/connectors\/ -d '{  \"name\": \"postgres-sink-connector\",  \"config\": {    \"connector.class\": \"io.debezium.connector.jdbc.JdbcSinkConnector\",    \"tasks.max\": \"1\",    \"topics.regex\": \"db-source-01-example-int\\\\.example_shop\\\\.(?!(device_fingerprints|viewed_products|migration_versions|region_zone|store_cell)$).*\",    \"connection.url\": \"jdbc:postgresql:\/\/db-target-01:5432\/example_shop?sslmode=disable\",    \"connection.username\": \"postgres\",    \"connection.password\": \"&lt;POSTGRES_PASSWORD&gt;\",    \"insert.mode\": \"upsert\",    \"primary.key.mode\": \"record_key\",    \"primary.key.fields\": \"id\",    \"auto.create\": \"true\",    \"auto.evolve\": \"true\",    \"delete.enabled\": \"true\",    \"quote.identifiers\": \"true\",    \"schema.evolution\": \"basic\",    \"transforms\": \"unwrap,route\",    \"transforms.unwrap.type\": \"io.debezium.transforms.ExtractNewRecordState\",    \"transforms.route.type\": \"org.apache.kafka.connect.transforms.RegexRouter\",    \"transforms.route.regex\": \"db-source-01-example-int\\\\.example_shop\\\\.(.*)\",    \"transforms.route.replacement\": \"$1\"  }}'curl -s http:\/\/localhost:8083\/connectors\/postgres-sink-connector\/status | jq<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h3>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0442\u0430\u0431\u043b\u0438\u0446 \u0431\u0435\u0437 \u043a\u043b\u044e\u0447\u0430 id<\/h3>\n<p>Debezium \u043e\u0436\u0438\u0434\u0430\u0435\u0442, \u0447\u0442\u043e \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 \u0437\u0430\u043f\u0438\u0441\u0438 \u0438 \u0435\u0441\u0442\u044c \u043a\u043b\u044e\u0447 Kafka-\u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f, \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e &#8212; \u043a\u043e\u043b\u043e\u043d\u043a\u0430 <code>id<\/code>. \u041d\u043e \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u0445\u0435\u043c\u0430\u0445 \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0434\u0435\u0441\u044f\u0442\u043e\u043a \u0442\u0430\u0431\u043b\u0438\u0446 \u0441 \u0441\u043e\u0441\u0442\u0430\u0432\u043d\u044b\u043c \u0438\u043b\u0438 \u043d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u043c \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u043c \u043a\u043b\u044e\u0447\u043e\u043c: \u0441\u0432\u044f\u0437\u043a\u0438 <code>many-to-many<\/code>, \u0441\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u0438\u043a\u0438 \u043f\u043e \u043a\u043e\u0434\u0443\/\u043d\u043e\u043c\u0435\u0440\u0443 \u0438 \u0442.\u043f. \u0414\u043b\u044f \u043d\u0438\u0445 \u043e\u0431\u0449\u0438\u0439 sink-\u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440 \u0438\u0437 regex-\u0444\u0438\u043b\u044c\u0442\u0440\u0430 \u0432\u044b\u0448\u0435 <strong>\u0438\u0441\u043a\u043b\u044e\u0447\u0451\u043d \u044f\u0432\u043d\u043e<\/strong> &#8212; \u0438\u043d\u0430\u0447\u0435 Debezium \u043f\u043e\u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u043f\u0438\u0441\u0430\u0442\u044c \u043f\u043e \u043d\u0435\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u043c\u0443 <code>id<\/code> \u0438 \u0437\u0430\u0432\u0430\u043b\u0438\u0442 upsert.<\/p>\n<p>\u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0442\u0430\u043a\u0438\u0445 \u0442\u0430\u0431\u043b\u0438\u0446 \u043d\u0430\u0431\u0440\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u0440\u044f\u0434\u043a\u0430 15: \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <code>email_blocklist<\/code> (\u043a\u043b\u044e\u0447 &#8212; <code>email<\/code>), <code>store_zone<\/code> (<code>store_id, zone_id<\/code>), <code>regions<\/code> (<code>number<\/code>) \u0438 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0435 \u0438\u043c \u043f\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 \u0441\u0432\u044f\u0437\u043a\u0438 \u0438 \u0441\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u0438\u043a\u0438.<\/p>\n<blockquote>\n<p><strong>\u0412\u0430\u0436\u043d\u043e.<\/strong> \u0422\u0430\u043a\u0443\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440, \u043d\u043e \u0438 \u0432 exclude-\u0441\u043f\u0438\u0441\u043e\u043a \u043e\u0431\u0449\u0435\u0433\u043e (\u0442\u043e\u0442 \u0441\u0430\u043c\u044b\u0439 <code>(?!(...)$)<\/code> \u0432 <code>topics.regex<\/code> \u0438\u0437 \u0448\u0430\u0433\u0430 3) &#8212; \u0438\u043d\u0430\u0447\u0435 \u0435\u0451 \u043f\u043e\u0434\u0445\u0432\u0430\u0442\u044f\u0442 \u043e\u0431\u0430 \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440\u0430 \u0438 \u043e\u0431\u0449\u0438\u0439 \u0443\u043f\u0430\u0434\u0451\u0442 \u0432 <code>FAILED<\/code>.<\/p>\n<\/blockquote>\n<p>\u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0442\u0430\u043a\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 sink-\u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440 \u0441\u043e \u0441\u0432\u043e\u0438\u043c <code>primary.key.fields<\/code>:<\/p>\n<pre><code class=\"bash\">#!\/bin\/bashtables=(  '{\"table\": \"email_blocklist\", \"keys\": \"email\"}'  '{\"table\": \"store_zone\", \"keys\": \"store_id,zone_id\"}'  '{\"table\": \"regions\", \"keys\": \"number\"}'  # ... \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441 \u043d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u043c \u043a\u043b\u044e\u0447\u043e\u043c)for t in \"${tables[@]}\"; do  table=$(echo \"$t\" | jq -r '.table')  keys=$(echo \"$t\" | jq -r '.keys')  connector_name=\"postgres-sink-${table}-connector\"  topics_regex=\"db-source-01-example-int\\\\.example_shop\\\\.${table}$\"  config=$(cat &lt;&lt;EOF{  \"name\": \"${connector_name}\",  \"config\": {    \"connector.class\": \"io.debezium.connector.jdbc.JdbcSinkConnector\",    \"tasks.max\": \"1\",    \"topics.regex\": \"${topics_regex}\",    \"connection.url\": \"jdbc:postgresql:\/\/db-target-01:5432\/example_shop?sslmode=disable\",    \"connection.username\": \"postgres\",    \"connection.password\": \"&lt;POSTGRES_PASSWORD&gt;\",    \"insert.mode\": \"upsert\",    \"primary.key.mode\": \"record_key\",    \"primary.key.fields\": \"${keys}\",    \"auto.create\": \"true\",    \"auto.evolve\": \"true\",    \"delete.enabled\": \"true\",    \"quote.identifiers\": \"true\",    \"schema.evolution\": \"basic\",    \"transforms\": \"unwrap,route\",    \"transforms.unwrap.type\": \"io.debezium.transforms.ExtractNewRecordState\",    \"transforms.route.type\": \"org.apache.kafka.connect.transforms.RegexRouter\",    \"transforms.route.regex\": \"db-source-01-example-int\\\\.example_shop\\\\.(.*)\",    \"transforms.route.replacement\": \"\\$1\"  }}EOF)  curl -i -X POST -H \"Content-Type: application\/json\" \\    http:\/\/localhost:8083\/connectors\/ -d \"${config}\"done<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h3>\u041c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u0441\u0442\u0430\u0442\u0443\u0441\u0430 \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440\u043e\u0432<\/h3>\n<p>\u041f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0438\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u00ab\u0443\u043f\u0430\u043b\u043e\u00bb \u0438 \u043d\u0435 \u0443\u0448\u043b\u043e \u0432 <code>FAILED<\/code>, &#8212; \u043e\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0442\u044c <code>\/status<\/code> \u0432 \u0446\u0438\u043a\u043b\u0435 \u043f\u043e \u0432\u0441\u0435\u043c \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440\u0430\u043c (\u043e\u0431\u0449\u0435\u043c\u0443 \u0438 per-table) \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440\u0430 \u0438 \u043a\u0430\u0436\u0434\u043e\u0439 \u0435\u0433\u043e \u0442\u0430\u0441\u043a\u0438:<\/p>\n<pre><code class=\"bash\">while true; do  error_found=false  for connector in \"${all_connectors[@]}\"; do    result=$(curl -s \"http:\/\/localhost:8083\/connectors\/${connector}\/status\")    [ -z \"$result\" ] &amp;&amp; { echo \"ERROR: \u043d\u0435\u0442 \u043e\u0442\u0432\u0435\u0442\u0430 \u043e\u0442 ${connector}\"; error_found=true; continue; }    state=$(echo \"$result\" | jq -r '.connector.state')    [ \"$state\" != \"RUNNING\" ] &amp;&amp; { echo \"ERROR: ${connector} -&gt; ${state}\"; error_found=true; }    for task_state in $(echo \"$result\" | jq -r '.tasks[].state'); do      [ \"$task_state\" != \"RUNNING\" ] &amp;&amp; { echo \"ERROR: task ${connector} -&gt; ${task_state}\"; error_found=true; }    done  done  sleep 5done<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440 \u0447\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u043f\u0430\u0434\u0430\u0435\u0442 \u0432 <code>FAILED<\/code> \u0438\u0437-\u0437\u0430 \u043d\u0435\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u0442\u0438\u043f\u043e\u0432 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <code>zerodate<\/code> \u0432 MySQL) \u0438\u043b\u0438 \u0438\u0437-\u0437\u0430 \u043f\u043e\u0442\u0435\u0440\u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0441 \u0411\u0414 &#8212; \u043e\u0431\u0430 \u0441\u043b\u0443\u0447\u0430\u044f \u0432\u0438\u0434\u043d\u043e \u0441\u0440\u0430\u0437\u0443 \u043f\u043e \u044d\u0442\u043e\u043c\u0443 \u0446\u0438\u043a\u043b\u0443, \u0431\u0435\u0437 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043b\u0435\u0437\u0442\u044c \u0432 \u043b\u043e\u0433\u0438 Connect.<\/p>\n<h3>\u041f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d-\u0437\u0430\u043f\u0443\u0441\u043a: Ansible-\u0440\u043e\u043b\u044c<\/h3>\n<p>\u0420\u0443\u0447\u043d\u044b\u0435 <code>curl<\/code>-\u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0443\u0434\u043e\u0431\u043d\u044b \u0434\u043b\u044f \u043e\u0442\u043b\u0430\u0434\u043a\u0438, \u043d\u043e \u043d\u0435\u0443\u0434\u043e\u0431\u043d\u044b \u0434\u043b\u044f \u0431\u043e\u0435\u0432\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u043e\u043d\u0430: \u043b\u0435\u0433\u043a\u043e \u0437\u0430\u0431\u044b\u0442\u044c \u0448\u0430\u0433, \u043e\u043f\u0435\u0447\u0430\u0442\u0430\u0442\u044c\u0441\u044f \u0432 regex \u0438\u043b\u0438 \u043d\u0435 \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440 \u0443\u0448\u0451\u043b \u0432 <code>FAILED<\/code>. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0435\u0441\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043c\u044b \u043e\u0431\u0435\u0440\u043d\u0443\u043b\u0438 \u0432 Ansible-\u0440\u043e\u043b\u044c &#8212; \u044d\u0442\u043e \u0434\u0430\u0451\u0442 \u0442\u0440\u0438 \u0432\u0435\u0449\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0435\u0442 \u0443 \u043d\u0430\u0431\u043e\u0440\u0430 bash-\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432:<\/p>\n<ul>\n<li>\n<p><strong>\u041e\u0434\u043d\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u043d\u0430 \u0432\u0435\u0441\u044c \u0446\u0438\u043a\u043b.<\/strong> <code>ansible-playbook migrate.yml --tags debezium_up<\/code> \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0435\u0442 \u0441\u0435\u0442\u044c, \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b, \u0442\u043e\u043f\u0438\u043a \u0438 \u0432\u0441\u0435 \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440\u044b (\u043e\u0431\u0449\u0438\u0439 + \u043f\u043e \u043a\u0430\u0436\u0434\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0441 \u043d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u043c \u043a\u043b\u044e\u0447\u043e\u043c) \u0437\u0430 \u043e\u0434\u0438\u043d \u043f\u0440\u043e\u0433\u043e\u043d, \u0431\u0435\u0437 \u0440\u0443\u0447\u043d\u043e\u0433\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u0435\u043d\u0438\u044f <code>curl<\/code> \u043f\u043e \u0441\u043f\u0438\u0441\u043a\u0443 \u0442\u0430\u0431\u043b\u0438\u0446.<\/p>\n<\/li>\n<li>\n<p><strong>\u0418\u0434\u0435\u043c\u043f\u043e\u0442\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u044c \u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u044b\u0439 \u0437\u0430\u043f\u0443\u0441\u043a.<\/strong> \u0420\u043e\u043b\u044c \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c: <code>uri<\/code>-\u043c\u043e\u0434\u0443\u043b\u044c \u0441\u0430\u043c \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440\u044b (<code>status_code: [201, 409]<\/code>), \u0430 \u043d\u0435 \u043f\u0430\u0434\u0430\u0435\u0442 \u043f\u0440\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u043c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438.<\/p>\n<\/li>\n<li>\n<p><strong>\u041f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u043c\u0435\u0436\u0434\u0443 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f\u043c\u0438.<\/strong> \u0425\u043e\u0441\u0442\u044b, \u043f\u0430\u0440\u043e\u043b\u0438, \u0441\u043f\u0438\u0441\u043e\u043a \u0442\u0430\u0431\u043b\u0438\u0446 \u0438 \u0438\u0445 \u043a\u043b\u044e\u0447\u0438, \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f &#8212; \u0432\u0441\u0451 \u0432\u044b\u043d\u0435\u0441\u0435\u043d\u043e \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 <code>defaults\/main.yml<\/code>. \u041f\u043e\u0434 \u043d\u043e\u0432\u0443\u044e \u043f\u0430\u0440\u0443 \u0431\u0430\u0437 \u0440\u043e\u043b\u044c \u0430\u0434\u0430\u043f\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u0430\u0432\u043a\u043e\u0439 \u043e\u0434\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430, \u0430 \u043d\u0435 \u043a\u043e\u0434\u0430.<\/p>\n<\/li>\n<\/ul>\n<p>\u041e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0442\u0435\u0433\u0438 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u044e\u0442 \u0432\u0435\u0441\u044c \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u044b\u0439 \u0446\u0438\u043a\u043b: <code>debezium_up<\/code> (\u043f\u043e\u0434\u043d\u044f\u0442\u044c \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c), <code>debezium_monitor<\/code> (\u043e\u043f\u0440\u043e\u0441\u0438\u0442\u044c \u0441\u0442\u0430\u0442\u0443\u0441 \u0432\u0441\u0435\u0445 \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440\u043e\u0432 \u0438 \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u0441\u0432\u043e\u0434\u043a\u0443) \u0438 <code>debezium_down<\/code> (\u0443\u0434\u0430\u043b\u0438\u0442\u044c \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440\u044b, \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b \u0438 \u0441\u0435\u0442\u044c \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438).<\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u044f\u0442 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438:<\/p>\n<pre><code class=\"yaml\"># roles\/database\/migration\/defaults\/main.ymlsource_db_host: source-db.example.internalsink_db_host: sink-db.example.internaltables:  - table: \"orders\"    keys: \"id\"  - table: \"regions\"    keys: \"number\"  # ...<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0421\u0430\u043c\u0430 \u0440\u043e\u043b\u044c (\u0442\u0430\u0441\u043a\u0438, \u0448\u0430\u0431\u043b\u043e\u043d\u044b \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432, \u0446\u0438\u043a\u043b \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430) &#8212; \u044d\u0442\u043e \u0443\u0436\u0435 \u0432\u043e\u043f\u0440\u043e\u0441 \u043e\u0444\u043e\u0440\u043c\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u0434 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 Ansible-\u043f\u0440\u043e\u0435\u043a\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u044b, \u0437\u0434\u0435\u0441\u044c \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0438\u0430\u043b\u044c\u043d\u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u0438\u0434\u0435\u044f: \u043e\u0431\u0435\u0440\u043d\u0443\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c <code>curl<\/code>-\u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u0432 \u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0442\u0438\u0432\u043d\u0443\u044e, \u0438\u0434\u0435\u043c\u043f\u043e\u0442\u0435\u043d\u0442\u043d\u0443\u044e \u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0438\u0437\u0443\u0435\u043c\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0438 \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0434\u043d\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439.<\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u0436\u0435 \u0443\u0434\u043e\u0431\u043d\u043e \u0437\u0430\u043a\u0440\u044b\u0442\u044c \u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u0438\u0437 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0430: <code>excluded_tables<\/code> \u0434\u043b\u044f \u043e\u0431\u0449\u0435\u0433\u043e \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440\u0430 \u0438\u043c\u0435\u0435\u0442 \u0441\u043c\u044b\u0441\u043b \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c \u0441\u043f\u0438\u0441\u043a\u043e\u043c, \u0430 \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0438\u0437 <code>tables<\/code> (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0447\u0435\u0440\u0435\u0437 <code>map(attribute='table')<\/code> \u0432 Jinja-\u0448\u0430\u0431\u043b\u043e\u043d\u0435 regex). \u0422\u043e\u0433\u0434\u0430 \u0441\u043f\u0438\u0441\u043e\u043a \u0442\u0430\u0431\u043b\u0438\u0446 \u0441 \u043d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u043c \u043a\u043b\u044e\u0447\u043e\u043c \u0438 exclude-\u0441\u043f\u0438\u0441\u043e\u043a \u043e\u0431\u0449\u0435\u0433\u043e \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440\u0430 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0435 \u0441\u043c\u043e\u0433\u0443\u0442 \u0440\u0430\u0437\u044a\u0435\u0445\u0430\u0442\u044c\u0441\u044f.<\/p>\n<h3>\u041d\u0430 \u0447\u0442\u043e \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0435 \u043d\u0430 \u0441\u0435\u0431\u044f<\/h3>\n<ul>\n<li>\n<p><strong>\u0414\u0438\u0441\u043a.<\/strong> Kafka \u0445\u0440\u0430\u043d\u0438\u0442 \u0432\u0441\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u0432\u0438\u0434\u0435 JSON, \u043e\u0431\u044a\u0451\u043c \u0431\u044b\u0441\u0442\u0440\u043e \u0440\u0430\u0441\u0442\u0451\u0442 &#8212; \u0437\u0430\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0439\u0442\u0435 disk-\u0437\u0430\u043f\u0430\u0441 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0441\u0430\u043c\u043e\u0439 \u0431\u0430\u0437\u044b. \u0423 \u043d\u0430\u0441 \u043d\u0430 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u043c \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0435 \u0443\u0448\u043b\u043e \u043e\u043a\u043e\u043b\u043e 50 \u0413\u0411 \u043f\u0440\u0438 \u043d\u0435 \u0441\u0430\u043c\u043e\u0439 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0431\u0430\u0437\u0435.<\/p>\n<\/li>\n<li>\n<p><strong>\u041e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u043c\u0430\u0448\u0438\u043d\u0430 \u043f\u043e\u0434 Debezium-\u0441\u0442\u0435\u043a.<\/strong> \u041d\u0435 \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0439\u0442\u0435 Kafka\/Connect \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u0441 \u0431\u043e\u0435\u0432\u043e\u0439 MariaDB &#8212; \u0441\u043d\u0435\u043f\u0448\u043e\u0442 \u0438 \u0442\u0430\u043a \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u043d\u0430 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a.<\/p>\n<\/li>\n<li>\n<p><strong>\u0422\u0430\u0431\u043b\u0438\u0446\u044b \u0431\u0435\u0437 <\/strong><code><strong>id<\/strong><\/code><strong>.<\/strong> \u041f\u0440\u043e\u0433\u043e\u043d\u0438\u0442\u0435 \u0441\u0445\u0435\u043c\u0443 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0438 \u044f\u0432\u043d\u043e \u0441\u043e\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u0441\u043f\u0438\u0441\u043e\u043a \u0442\u0430\u0431\u043b\u0438\u0446 \u0441 \u0441\u043e\u0441\u0442\u0430\u0432\u043d\u044b\u043c\/\u043d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u043c \u043a\u043b\u044e\u0447\u043e\u043c &#8212; \u0438\u043d\u0430\u0447\u0435 \u043e\u0431\u0449\u0438\u0439 sink-\u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440 \u043b\u0438\u0431\u043e \u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u0441\u0442 \u0438\u0445 \u0432 PostgreSQL, \u043b\u0438\u0431\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e.<\/p>\n<\/li>\n<li>\n<p><strong>\u0427\u0430\u0441\u043e\u0432\u043e\u0439 \u043f\u043e\u044f\u0441.<\/strong> <code>database.connectionTimeZone<\/code> \u0432 source-\u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440\u0435 \u0441\u0442\u043e\u0438\u0442 \u044f\u0432\u043d\u043e \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u043f\u043e\u0434 \u0447\u0430\u0441\u043e\u0432\u043e\u0439 \u043f\u043e\u044f\u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 MariaDB &#8212; \u0438\u043d\u0430\u0447\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044f \u0440\u0430\u0437\u044a\u0435\u0434\u0443\u0442\u0441\u044f \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0435.<\/p>\n<\/li>\n<li>\n<p><code><strong>schema.evolution: basic<\/strong><\/code><strong>.<\/strong> \u0414\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u043b\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u043e\u0432\u044b\u0445 \u043a\u043e\u043b\u043e\u043d\u043e\u043a \u00ab\u043d\u0430 \u043b\u0435\u0442\u0443\u00bb, \u043d\u043e \u043d\u0435 \u0434\u043b\u044f \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0439 \u0441\u0445\u0435\u043c\u044b (\u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u044f, \u0441\u043c\u0435\u043d\u0430 \u0442\u0438\u043f\u043e\u0432) &#8212; \u0438\u0445 \u043b\u0443\u0447\u0448\u0435 \u043a\u0430\u0442\u0438\u0442\u044c \u0440\u0443\u043a\u0430\u043c\u0438 \u0434\u043e \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f.<\/p>\n<\/li>\n<li>\n<p><strong>\u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/strong> \u0420\u0435\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043e\u0442 MariaDB \u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 PostgreSQL \u0441\u0442\u043e\u0438\u0442 \u0434\u0435\u043b\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u0433\u0434\u0430 \u043b\u0430\u0433 \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0438 (\u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u043c\u0435\u0436\u0434\u0443 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c \u0441\u043e\u0431\u044b\u0442\u0438\u0435\u043c \u0432 \u0431\u0438\u043d\u043b\u043e\u0433\u0435 \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u0451\u043d\u043d\u044b\u043c \u0432 Postgres) \u0431\u043b\u0438\u0437\u043e\u043a \u043a \u043d\u0443\u043b\u044e &#8212; \u0438\u043d\u0430\u0447\u0435 \u0447\u0430\u0441\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0445, \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u00ab\u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u0441\u0435\u043a\u0443\u043d\u0434\u0443\u00bb, \u0440\u0438\u0441\u043a\u0443\u0435\u0442 \u043f\u043e\u0442\u0435\u0440\u044f\u0442\u044c\u0441\u044f.<\/p>\n<\/li>\n<\/ul>\n<h3>\u0418\u0442\u043e\u0433<\/h3>\n<p>\u0413\u043e\u0442\u043e\u0432\u044b\u0435 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0435\u0440\u044b \u0432\u0440\u043e\u0434\u0435 pgloader \u0438\u043b\u0438 pg_chameleon \u0445\u043e\u0440\u043e\u0448\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0442 \u0434\u043b\u044f \u0440\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0430 \u0441\u0442\u0430\u0442\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0430\u043c\u043f\u0430, \u043d\u043e \u043f\u043b\u043e\u0445\u043e &#8212; \u0434\u043b\u044f \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438 \u0436\u0438\u0432\u043e\u0439, \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u043f\u0438\u0448\u0443\u0449\u0435\u0439 \u0431\u0430\u0437\u044b: \u043b\u0438\u0431\u043e \u043d\u0435\u0442 \u0434\u043e\u0433\u043e\u043d\u044f\u044e\u0449\u0435\u0439 \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0438, \u043b\u0438\u0431\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u043c\u043e\u043b\u0447\u0430 \u0432\u044b\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043d\u044b\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0438\u0437 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438. \u0421\u0432\u044f\u0437\u043a\u0430 Debezium + Kafka Connect \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0438\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u0443 \u0437\u0430\u0434\u0430\u0447\u0443: \u0441\u043d\u0435\u043f\u0448\u043e\u0442 \u043f\u043b\u044e\u0441 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u044b\u0439 \u043f\u043e\u0442\u043e\u043a \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0438\u0437 \u0431\u0438\u043d\u043b\u043e\u0433\u043e\u0432, \u0447\u0442\u043e \u0434\u0430\u0451\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043c\u0438\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0438 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 \u043d\u043e\u0432\u0443\u044e \u0431\u0430\u0437\u0443 \u0441 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c (\u0441\u0435\u043a\u0443\u043d\u0434\u044b, \u0430 \u043d\u0435 \u0447\u0430\u0441\u044b) \u043e\u043a\u043d\u043e\u043c \u0440\u0430\u0441\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 &#8212; \u0437\u0430 \u0441\u0447\u0451\u0442 \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u043e\u0439 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0438 \u0437\u0430\u043c\u0435\u0442\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u0445\u043e\u0434\u0430 \u0434\u0438\u0441\u043a\u0430 \u043d\u0430 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0432 Kafka.<\/p>\n<\/div>\n<p>\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/1061438\/\">https:\/\/habr.com\/ru\/articles\/1061438\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u041f\u0435\u0440\u0435\u0434 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439, \u0432\u044b\u0440\u043e\u0441\u0448\u0435\u0439 \u043d\u0430 MySQL\/MariaDB, \u0432\u0441\u0442\u0430\u0451\u0442 \u0432\u043e\u043f\u0440\u043e\u0441 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u043d\u0430 PostgreSQL: \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438, \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439, \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0443\u0435\u043c\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043f\u0440\u0438 \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u044b\u0445 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0430\u0445 &#8212; \u043f\u0440\u0438\u0447\u0438\u043d \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e. \u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432 \u0434\u0440\u0443\u0433\u043e\u043c: \u043a\u0430\u043a \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u0431\u043e\u0435\u0432\u0443\u044e \u0431\u0430\u0437\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0435 \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0438 \u043d\u0430 \u043c\u0438\u043d\u0443\u0442\u0443, \u0431\u0435\u0437 \u0447\u0430\u0441\u043e\u0432 \u043f\u0440\u043e\u0441\u0442\u043e\u044f \u0438 \u0431\u0435\u0437 \u0440\u0438\u0441\u043a\u0430 \u043f\u043e\u0442\u0435\u0440\u044f\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435, \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0430.\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 &#8212; \u043a\u0430\u043a \u043c\u044b \u0440\u0435\u0448\u0430\u043b\u0438 \u044d\u0442\u0443 \u0437\u0430\u0434\u0430\u0447\u0443 \u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u043c\u0430\u0433\u0430\u0437\u0438\u043d\u0430 \u043d\u0430 MariaDB, \u043f\u043e\u0447\u0435\u043c\u0443 \u0433\u043e\u0442\u043e\u0432\u044b\u0435 \u043a\u043e\u043d\u0441\u043e\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0435\u0440\u044b \u043d\u0435 \u0433\u043e\u0434\u044f\u0442\u0441\u044f \u0434\u043b\u044f \u00ab\u0436\u0438\u0432\u043e\u0439\u00bb \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438, \u0438 \u043a\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0440\u0430\u0431\u043e\u0447\u0430\u044f \u0441\u0445\u0435\u043c\u0430 \u043d\u0430 Debezium + Kafka Connect, \u0432\u043a\u043b\u044e\u0447\u0430\u044f Ansible-\u0440\u043e\u043b\u044c \u0434\u043b\u044f \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u043c\u043e\u0433\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430.\u0412\u0441\u0435 \u0438\u043c\u0435\u043d\u0430 \u0445\u043e\u0441\u0442\u043e\u0432, \u0431\u0430\u0437, \u0442\u043e\u043f\u0438\u043a\u043e\u0432 \u0438 \u0443\u0447\u0451\u0442\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445 &#8212; \u0432\u044b\u043c\u044b\u0448\u043b\u0435\u043d\u043d\u044b\u0435.\u041f\u043e\u0447\u0435\u043c\u0443 \u043d\u0435 \u043f\u043e\u0434\u043e\u0448\u043b\u0438 \u0433\u043e\u0442\u043e\u0432\u044b\u0435 \u0443\u0442\u0438\u043b\u0438\u0442\u044b\u041f\u0435\u0440\u0432\u0430\u044f \u043c\u044b\u0441\u043b\u044c \u043f\u0440\u0438 \u0441\u043b\u043e\u0432\u0435 \u00ab\u043c\u0438\u0433\u0440\u0430\u0446\u0438\u044f MySQL \u2192 PostgreSQL\u00bb &#8212; \u0432\u0437\u044f\u0442\u044c \u043e\u0434\u0438\u043d \u0438\u0437 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0445 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0435\u0440\u043e\u0432 \u0438 \u043f\u0440\u043e\u0433\u043d\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u043d\u0435\u0433\u043e \u0434\u0430\u043c\u043f. \u041c\u044b \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432, \u0438 \u0443 \u0432\u0441\u0435\u0445 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u043b\u0441\u044f \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0439 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u043a: \u044d\u0442\u043e \u0443\u0442\u0438\u043b\u0438\u0442\u044b \u043e\u0434\u043d\u043e\u0440\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0430, \u0430 \u043d\u0435 \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0438. \u041e\u043d\u0438 \u0441\u043d\u0438\u043c\u0430\u044e\u0442 \u0441\u043d\u0435\u043f\u0448\u043e\u0442 \u043d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0438 \u043d\u0435 \u0443\u043c\u0435\u044e\u0442 \u0434\u043e\u043d\u0430\u043a\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f, \u0441\u043b\u0443\u0447\u0438\u0432\u0448\u0438\u0435\u0441\u044f \u0432 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0435 \u043f\u043e\u0441\u043b\u0435 \u043d\u0430\u0447\u0430\u043b\u0430 \u0440\u0430\u0431\u043e\u0442\u044b. \u0414\u043b\u044f \u0431\u0430\u0437\u044b, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0435 \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f, \u044d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0434\u0430\u0443\u043d\u0442\u0430\u0439\u043c\u0430 \u043d\u0430 \u0432\u0440\u0435\u043c\u044f \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0430 &#8212; \u0434\u043b\u044f \u043d\u0430\u0441 \u043d\u0435\u043f\u0440\u0438\u0435\u043c\u043b\u0435\u043c\u043e\u0435.\u041f\u043b\u044e\u0441 \u043a \u044d\u0442\u043e\u043c\u0443 \u0443 \u043a\u0430\u0436\u0434\u043e\u0439 \u0443\u0442\u0438\u043b\u0438\u0442\u044b \u043d\u0430\u0448\u043b\u0438\u0441\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0431\u043e\u043b\u044f\u0447\u043a\u0438:pgloader &#8212; \u0441\u0430\u043c\u044b\u0439 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442, \u043d\u043e \u0432 \u0435\u0433\u043e issue-\u0442\u0440\u0435\u043a\u0435\u0440\u0435 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0442 \u043f\u0430\u0434\u0435\u043d\u0438\u044f \u043f\u043e \u043f\u0430\u043c\u044f\u0442\u0438 (heap exhaustion) \u043d\u0430 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u0445, \u043e\u0448\u0438\u0431\u043a\u0438 \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 (ESRAP-PARSE-ERROR), \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441 \u00ab\u043d\u0443\u043b\u0435\u0432\u044b\u043c\u0438\u00bb \u0434\u0430\u0442\u0430\u043c\u0438 MySQL, \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u044b \u0438\u043c\u0451\u043d \u043f\u0440\u0438 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0438\u0438 \u043b\u0438\u043c\u0438\u0442\u0430 PostgreSQL \u0432 63 \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u0438 \u0434\u0443\u0431\u043b\u0438\u0440\u0443\u044e\u0449\u0438\u043c\u0438\u0441\u044f \u0438\u043c\u0435\u043d\u0430\u043c\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 MySQL \u0434\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u043d\u0435\u044f\u0432\u043d\u043e, \u0430 PostgreSQL &#8212; \u043d\u0435\u0442 (\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0449\u0451 \u043e\u0434\u0438\u043d, \u0438 \u0435\u0449\u0451). \u041d\u0430 \u0447\u0430\u0441\u0442\u0438 \u043d\u0430\u0448\u0438\u0445 \u0442\u0430\u0431\u043b\u0438\u0446 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u0432\u0438\u0441\u0430\u043b\u0430 \u043d\u0430 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0435.pg_chameleon &#8212; \u0431\u043b\u0438\u0436\u0435 \u043a \u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043d\u0430\u043c \u0431\u044b\u043b\u043e \u043d\u0443\u0436\u043d\u043e (\u0440\u0435\u0430\u043b\u044c\u043d\u0430\u044f \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u044f \u0447\u0435\u0440\u0435\u0437 \u0447\u0442\u0435\u043d\u0438\u0435 \u0431\u0438\u043d\u043b\u043e\u0433\u043e\u0432), \u043d\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442 binlog_format=ROW, \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e primary key \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u0435, \u0430 \u043f\u0440\u0438 \u043e\u0448\u0438\u0431\u043a\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442 \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u043d\u0443\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0438\u0437 \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0438 &#8212; \u0442\u043e \u0435\u0441\u0442\u044c \u0447\u0430\u0441\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u043e\u043b\u0447\u0430 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u0451\u0442 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f, \u0438 \u044d\u0442\u043e \u043b\u0435\u0433\u043a\u043e \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u00abPostgreSQL \u2192 MySQL\u00bb \u0443 \u043d\u0435\u0433\u043e \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u0438 \u0441\u0438\u043b\u044c\u043d\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u0435 &#8212; \u0436\u0438\u0437\u043d\u0435\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u044f \u0432 \u043e\u0434\u043d\u0443 \u0441\u0442\u043e\u0440\u043e\u043d\u0443.py-mysql2pgsql &#8212; \u043f\u043e \u0441\u0443\u0442\u0438, \u0437\u0430\u0431\u0440\u043e\u0448\u0435\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442: \u0440\u0435\u043b\u0438\u0437\u043e\u0432 \u043d\u0435\u0442 \u0443\u0436\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043b\u0435\u0442, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u043d\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u0430, \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0447\u0435\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043d\u0435 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u043b\u0438.\u041d\u0438 \u043e\u0434\u0438\u043d \u0438\u0437 \u044d\u0442\u0438\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043d\u0435 \u0434\u0430\u0451\u0442 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0431\u044b\u043b\u043e \u043d\u0443\u0436\u043d\u043e: \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0439 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u0438 \u043f\u0440\u0438\u0451\u043c\u043d\u0438\u043a\u0430, \u0447\u0442\u043e\u0431\u044b \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043c\u0438\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0437\u0430\u0440\u0430\u043d\u0435\u0435, \u0434\u0430\u0442\u044c \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u043c \u00ab\u0434\u043e\u0440\u0435\u043f\u043b\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f\u00bb \u0438 \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043e\u0442 MariaDB \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0435\u0433\u043e \u043d\u0430 PostgreSQL \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e \u0441 \u0440\u0430\u0437\u043d\u0438\u0446\u0435\u0439 \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u044b.\u0420\u0435\u0448\u0435\u043d\u0438\u0435: Debezium \u043a\u0430\u043a CDC-\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430Debezium &#8212; \u044d\u0442\u043e \u043d\u0430\u0431\u043e\u0440 \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440\u043e\u0432 \u0434\u043b\u044f Kafka Connect, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0438\u0445 Change Data Capture (CDC). \u0412 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u0440\u0430\u0437\u043e\u0432\u044b\u0445 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0435\u0440\u043e\u0432, Debezium:\u0441\u043d\u0438\u043c\u0430\u0435\u0442 \u043a\u043e\u043d\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u043d\u044b\u0439 \u0441\u043d\u0435\u043f\u0448\u043e\u0442 \u0442\u0435\u043a\u0443\u0449\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 (snapshot.mode: initial);\u0434\u0430\u043b\u044c\u0448\u0435 \u0447\u0438\u0442\u0430\u0435\u0442 \u0431\u0438\u043d\u043b\u043e\u0433\u0438 MariaDB \u043f\u043e\u0441\u0442\u0440\u043e\u0447\u043d\u043e \u0438 \u0441\u0442\u0440\u0438\u043c\u0438\u0442 \u043a\u0430\u0436\u0434\u043e\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 (insert\/update\/delete) \u0432 Kafka;\u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u043c \u043a\u043e\u043d\u0446\u0435 sink-\u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u0442 \u043f\u043e\u0442\u043e\u043a \u0438\u0437 Kafka \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 PostgreSQL \u0447\u0435\u0440\u0435\u0437 upsert.\u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 PostgreSQL-\u0440\u0435\u043f\u043b\u0438\u043a\u0430 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e \u00ab\u0434\u043e\u0433\u043e\u043d\u044f\u0435\u0442\u00bb \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a, \u0438 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u043d\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0432 \u043b\u044e\u0431\u043e\u0439 \u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442, \u043a\u043e\u0433\u0434\u0430 \u043b\u0430\u0433 \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u0431\u043b\u0438\u0437\u043e\u043a \u043a \u043d\u0443\u043b\u044e &#8212; \u0431\u0435\u0437 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 MariaDB \u043d\u0430 \u0432\u0440\u0435\u043c\u044f \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0430.\u041f\u043b\u0430\u0442\u0430 \u0437\u0430 \u044d\u0442\u043e &#8212; \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u043d\u0443\u0436\u0435\u043d Kafka \u0441 ZooKeeper, Kafka Connect, \u0434\u0438\u0441\u043a \u043f\u043e\u0434 \u043e\u0447\u0435\u0440\u0435\u0434\u044c) \u0438 \u0442\u043e, \u0447\u0442\u043e \u0432\u0441\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0443\u044e\u0442\u0441\u044f \u0432 Kafka \u0432 \u0432\u0438\u0434\u0435 JSON &#8212; \u0432 \u043d\u0430\u0448\u0435\u043c \u0442\u0435\u0441\u0442\u0435 \u043f\u0435\u0440\u0435\u043d\u043e\u0441 \u0434\u0430\u043d\u043d\u044b\u0445 \u0437\u0430\u043d\u044f\u043b \u043e\u043a\u043e\u043b\u043e 50 \u0413\u0411 \u0434\u0438\u0441\u043a\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u0438\u0437-\u0437\u0430 \u044d\u0442\u043e\u0433\u043e \u0444\u043e\u0440\u043c\u0430\u0442\u0430. \u0420\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c \u0441\u0442\u0435\u043a \u043b\u0443\u0447\u0448\u0435 \u043d\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435, \u0430 \u043d\u0435 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u0441 \u0431\u043e\u0435\u0432\u043e\u0439 \u0431\u0430\u0437\u043e\u0439.\u0412\u0435\u0440\u0441\u0438\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0412\u0435\u0440\u0441\u0438\u044fMariaDBv11.7.2PostgreSQLv15.12 (Debian 15.12-0+deb12u2)Debezium ZooKeeperquay.io\/debezium\/zookeeper:3.1.1.FinalDebezium Kafkaquay.io\/debezium\/kafka:3.1.1.FinalDebezium Connectquay.io\/debezium\/connect:3.1.1.Final\u041d\u0438\u0436\u0435 &#8212; \u043f\u0440\u0438\u043c\u0435\u0440 \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0430 db-source-01 (MariaDB) \u2192 db-target-01 (PostgreSQL).\u0428\u0430\u0433 1. \u0418\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430: ZooKeeper, Kafka, Kafka Connectdocker network create debezium-netdocker run -d &#8212;name zookeeper \\  &#8212;network debezium-net \\  -p 2181:2181 -p 2888:2888 -p 3888:3888 \\  quay.io\/debezium\/zookeeper:3.1.1.Finaldocker run -d &#8212;name kafka \\  &#8212;network debezium-net \\  -p 9092:9092 \\  -e KAFKA_LISTENERS=PLAINTEXT:\/\/0.0.0.0:9092 \\  -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT:\/\/kafka:9092 \\  -e ZOOKEEPER_CONNECT=zookeeper:2181 \\  -e KAFKA_AUTO_CREATE_TOPICS_ENABLE=true \\  quay.io\/debezium\/kafka:3.1.1.Finaldocker run -d &#8212;name connect \\  &#8212;network debezium-net \\  -p 8083:8083 \\  -e BOOTSTRAP_SERVERS=kafka:9092 \\  -e GROUP_ID=1 \\  -e CONFIG_STORAGE_TOPIC=my_connect_configs \\  -e OFFSET_STORAGE_TOPIC=my_connect_offsets \\  -e STATUS_STORAGE_TOPIC=my_connect_statuses \\  quay.io\/debezium\/connect:3.1.1.Finaldocker exec -it kafka \/kafka\/bin\/kafka-topics.sh \\  &#8212;bootstrap-server kafka:9092 &#8212;create \\  &#8212;topic schemachanges-example \\  &#8212;partitions 1 &#8212;replication-factor 1\u041e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0442\u043e\u043f\u0438\u043a schemachanges-example \u043d\u0443\u0436\u0435\u043d Debezium \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0441\u0445\u0435\u043c\u044b \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 &#8212; \u0431\u0435\u0437 \u043d\u0435\u0433\u043e source-\u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440 \u043d\u0435 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0441\u044f.\u0428\u0430\u0433 2. Source-\u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440 (MariaDB)curl -i -X POST -H &#171;Content-Type:application\/json&#187; http:\/\/localhost:8083\/connectors\/ -d &#8216;{  &#171;name&#187;: &#171;mariadb-connector&#187;,  &#171;config&#187;: {    &#171;connector.class&#187;: &#171;io.debezium.connector.mariadb.MariaDbConnector&#187;,    &#171;database.hostname&#187;: &#171;db-source-01.example.int&#187;,    &#171;database.port&#187;: &#171;3306&#187;,    &#171;database.user&#187;: &#171;debezium&#187;,    &#171;database.password&#187;: &#171;&lt;MARIADB_PASSWORD&gt;&#187;,    &#171;database.server.id&#187;: &#171;1&#187;,    &#171;database.include.list&#187;: &#171;example_shop&#187;,    &#171;database.connectionTimeZone&#187;: &#171;Europe\/Moscow&#187;,    &#171;topic.prefix&#187;: &#171;db-source-01-example-int&#187;,    &#171;schema.history.internal.kafka.bootstrap.servers&#187;: &#171;kafka:9092&#187;,    &#171;schema.history.internal.kafka.topic&#187;: &#171;schemachanges-example&#187;,    &#171;include.schema.changes&#187;: &#171;true&#187;,    &#171;snapshot.mode&#187;: &#171;initial&#187;,    &#171;transforms&#187;: &#171;unwrap&#187;,    &#171;transforms.unwrap.type&#187;: &#171;io.debezium.transforms.ExtractNewRecordState&#187;,    &#171;transforms.unwrap.delete.handling.mode&#187;: &#171;rewrite&#187;,    &#171;transforms.unwrap.drop.tombstones&#187;: &#171;false&#187;,    &#171;max.batch.size&#187;: &#171;100&#187;,    &#171;max.queue.size&#187;: &#171;500&#187;  }}&#8217;curl -s http:\/\/localhost:8083\/connectors\/mariadb-connector\/status | jq\u0421\u0442\u0430\u0442\u0443\u0441 (connector.state \u0438 tasks[].state) \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c RUNNING.\u0428\u0430\u0433 3. Sink-\u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440 (PostgreSQL)curl -i -X POST -H &#171;Content-Type:application\/json&#187; http:\/\/localhost:8083\/connectors\/ -d &#8216;{  &#171;name&#187;: &#171;postgres-sink-connector&#187;,  &#171;config&#187;: {    &#171;connector.class&#187;: &#171;io.debezium.connector.jdbc.JdbcSinkConnector&#187;,    &#171;tasks.max&#187;: &#171;1&#187;,    &#171;topics.regex&#187;: &#171;db-source-01-example-int\\\\.example_shop\\\\.(?!(device_fingerprints|viewed_products|migration_versions|region_zone|store_cell)$).*&#187;,    &#171;connection.url&#187;: &#171;jdbc:postgresql:\/\/db-target-01:5432\/example_shop?sslmode=disable&#187;,    &#171;connection.username&#187;: &#171;postgres&#187;,    &#171;connection.password&#187;: &#171;&lt;POSTGRES_PASSWORD&gt;&#187;,    &#171;insert.mode&#187;: &#171;upsert&#187;,    &#171;primary.key.mode&#187;: &#171;record_key&#187;,    &#171;primary.key.fields&#187;: &#171;id&#187;,    &#171;auto.create&#187;: &#171;true&#187;,    &#171;auto.evolve&#187;: &#171;true&#187;,    &#171;delete.enabled&#187;: &#171;true&#187;,    &#171;quote.identifiers&#187;: &#171;true&#187;,    &#171;schema.evolution&#187;: &#171;basic&#187;,    &#171;transforms&#187;: &#171;unwrap,route&#187;,    &#171;transforms.unwrap.type&#187;: &#171;io.debezium.transforms.ExtractNewRecordState&#187;,    &#171;transforms.route.type&#187;: &#171;org.apache.kafka.connect.transforms.RegexRouter&#187;,    &#171;transforms.route.regex&#187;: &#171;db-source-01-example-int\\\\.example_shop\\\\.(.*)&#187;,    &#171;transforms.route.replacement&#187;: &#171;$1&#187;  }}&#8217;curl -s http:\/\/localhost:8083\/connectors\/postgres-sink-connector\/status | jq\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0442\u0430\u0431\u043b\u0438\u0446 \u0431\u0435\u0437 \u043a\u043b\u044e\u0447\u0430 idDebezium \u043e\u0436\u0438\u0434\u0430\u0435\u0442, \u0447\u0442\u043e \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 \u0437\u0430\u043f\u0438\u0441\u0438 \u0438 \u0435\u0441\u0442\u044c \u043a\u043b\u044e\u0447 Kafka-\u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f, \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e &#8212; \u043a\u043e\u043b\u043e\u043d\u043a\u0430 id. \u041d\u043e \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u0445\u0435\u043c\u0430\u0445 \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0434\u0435\u0441\u044f\u0442\u043e\u043a \u0442\u0430\u0431\u043b\u0438\u0446 \u0441 \u0441\u043e\u0441\u0442\u0430\u0432\u043d\u044b\u043c \u0438\u043b\u0438 \u043d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u043c \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u043c \u043a\u043b\u044e\u0447\u043e\u043c: \u0441\u0432\u044f\u0437\u043a\u0438 many-to-many, \u0441\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u0438\u043a\u0438 \u043f\u043e \u043a\u043e\u0434\u0443\/\u043d\u043e\u043c\u0435\u0440\u0443 \u0438 \u0442.\u043f. \u0414\u043b\u044f \u043d\u0438\u0445 \u043e\u0431\u0449\u0438\u0439 sink-\u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440 \u0438\u0437 regex-\u0444\u0438\u043b\u044c\u0442\u0440\u0430 \u0432\u044b\u0448\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0451\u043d \u044f\u0432\u043d\u043e &#8212; \u0438\u043d\u0430\u0447\u0435 Debezium \u043f\u043e\u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u043f\u0438\u0441\u0430\u0442\u044c \u043f\u043e \u043d\u0435\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u043c\u0443 id \u0438 \u0437\u0430\u0432\u0430\u043b\u0438\u0442 upsert.\u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0442\u0430\u043a\u0438\u0445 \u0442\u0430\u0431\u043b\u0438\u0446 \u043d\u0430\u0431\u0440\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u0440\u044f\u0434\u043a\u0430 15: \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, email_blocklist (\u043a\u043b\u044e\u0447 &#8212; email), store_zone (store_id, zone_id), regions (number) \u0438 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0435 \u0438\u043c \u043f\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 \u0441\u0432\u044f\u0437\u043a\u0438 \u0438 \u0441\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u0438\u043a\u0438.\u0412\u0430\u0436\u043d\u043e. \u0422\u0430\u043a\u0443\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440, \u043d\u043e \u0438 \u0432 exclude-\u0441\u043f\u0438\u0441\u043e\u043a \u043e\u0431\u0449\u0435\u0433\u043e (\u0442\u043e\u0442 \u0441\u0430\u043c\u044b\u0439 (?!(&#8230;)$) \u0432 topics.regex \u0438\u0437 \u0448\u0430\u0433\u0430 3) &#8212; \u0438\u043d\u0430\u0447\u0435 \u0435\u0451 \u043f\u043e\u0434\u0445\u0432\u0430\u0442\u044f\u0442 \u043e\u0431\u0430 \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440\u0430 \u0438 \u043e\u0431\u0449\u0438\u0439 \u0443\u043f\u0430\u0434\u0451\u0442 \u0432 FAILED.\u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0442\u0430\u043a\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 sink-\u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440 \u0441\u043e \u0441\u0432\u043e\u0438\u043c primary.key.fields:#!\/bin\/bashtables=(  &#8216;{&#171;table&#187;: &#171;email_blocklist&#187;, &#171;keys&#187;: &#171;email&#187;}&#8217;  &#8216;{&#171;table&#187;: &#171;store_zone&#187;, &#171;keys&#187;: &#171;store_id,zone_id&#187;}&#8217;  &#8216;{&#171;table&#187;: &#171;regions&#187;, &#171;keys&#187;: &#171;number&#187;}&#8217;  # &#8230; \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441 \u043d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u043c \u043a\u043b\u044e\u0447\u043e\u043c)for t in &#171;${tables[@]}&#187;; do  table=$(echo &#171;$t&#187; | jq -r &#8216;.table&#8217;)  keys=$(echo &#171;$t&#187; | jq -r &#8216;.keys&#8217;)  connector_name=&#187;postgres-sink-${table}-connector&#187;  topics_regex=&#187;db-source-01-example-int\\\\.example_shop\\\\.${table}$&#187;  config=$(cat &lt;&lt;EOF{  &#171;name&#187;: &#171;${connector_name}&#187;,  &#171;config&#187;: {    &#171;connector.class&#187;: &#171;io.debezium.connector.jdbc.JdbcSinkConnector&#187;,    &#171;tasks.max&#187;: &#171;1&#187;,    &#171;topics.regex&#187;: &#171;${topics_regex}&#187;,    &#171;connection.url&#187;: &#171;jdbc:postgresql:\/\/db-target-01:5432\/example_shop?sslmode=disable&#187;,    &#171;connection.username&#187;: &#171;postgres&#187;,    &#171;connection.password&#187;: &#171;&lt;POSTGRES_PASSWORD&gt;&#187;,    &#171;insert.mode&#187;: &#171;upsert&#187;,    &#171;primary.key.mode&#187;: &#171;record_key&#187;,    &#171;primary.key.fields&#187;: &#171;${keys}&#187;,    &#171;auto.create&#187;: &#171;true&#187;,    &#171;auto.evolve&#187;: &#171;true&#187;,    &#171;delete.enabled&#187;: &#171;true&#187;,    &#171;quote.identifiers&#187;: &#171;true&#187;,    &#171;schema.evolution&#187;: &#171;basic&#187;,    &#171;transforms&#187;: &#171;unwrap,route&#187;,    &#171;transforms.unwrap.type&#187;: &#171;io.debezium.transforms.ExtractNewRecordState&#187;,    &#171;transforms.route.type&#187;: &#171;org.apache.kafka.connect.transforms.RegexRouter&#187;,    &#171;transforms.route.regex&#187;: &#171;db-source-01-example-int\\\\.example_shop\\\\.(.*)&#187;,    &#171;transforms.route.replacement&#187;: &#171;\\$1&#187;  }}EOF)  curl -i -X POST -H &#171;Content-Type: application\/json&#187; \\    http:\/\/localhost:8083\/connectors\/ -d &#171;${config}&#187;done\u041c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u0441\u0442\u0430\u0442\u0443\u0441\u0430 \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440\u043e\u0432\u041f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0438\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u00ab\u0443\u043f\u0430\u043b\u043e\u00bb \u0438 \u043d\u0435 \u0443\u0448\u043b\u043e \u0432 FAILED, &#8212; \u043e\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0442\u044c \/status \u0432 \u0446\u0438\u043a\u043b\u0435 \u043f\u043e \u0432\u0441\u0435\u043c&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-488053","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/488053","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=488053"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/488053\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=488053"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=488053"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=488053"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}