{"id":3795,"date":"2025-11-03T20:05:51","date_gmt":"2025-11-03T18:05:51","guid":{"rendered":"https:\/\/ru.davidka.net\/ru\/?p=3795"},"modified":"2025-11-06T15:40:29","modified_gmt":"2025-11-06T13:40:29","slug":"%d0%b3%d0%bb%d0%b0%d0%b2%d0%b0-13-%d0%bf%d0%b5%d1%80%d0%b5%d0%ba%d0%bb%d1%8e%d1%87%d0%b5%d0%bd%d0%b8%d0%b5-%d0%bd%d0%b0-production-%d0%b8-%d1%84%d0%b8%d0%bd%d0%b0%d0%bb%d0%b8%d0%b7%d0%b0%d1%86%d0%b8","status":"publish","type":"post","link":"https:\/\/ru.davidka.net\/ru\/%D0%B3%D0%BB%D0%B0%D0%B2%D0%B0-13-%D0%BF%D0%B5%D1%80%D0%B5%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D0%B5-%D0%BD%D0%B0-production-%D0%B8-%D1%84%D0%B8%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8\/","title":{"rendered":"\u0413\u041b\u0410\u0412\u0410 13: \u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043d\u0430 production \u0438 \u0444\u0438\u043d\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f"},"content":{"rendered":"\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><strong>\u0426\u0435\u043b\u044c \u0433\u043b\u0430\u0432\u044b:<\/strong> \u0411\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043d\u0430 MariaDB \u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u044e<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\".\/12-monitoring-maintenance.md\">\u2190 \u041f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0430\u044f \u0433\u043b\u0430\u0432\u0430<\/a> | <a href=\".\/00-INDEX.md\">\u041d\u0430\u0437\u0430\u0434 \u043a \u043e\u0433\u043b\u0430\u0432\u043b\u0435\u043d\u0438\u044e<\/a><\/p>\n\n\n\n<div id=\"rtoc-mokuji-wrapper\" class=\"rtoc-mokuji-content frame2 preset1 animation-fade rtoc_open default\" data-id=\"3795\" data-theme=\"Neve - Davidka\">\n\t\t\t<div id=\"rtoc-mokuji-title\" class=\"rtoc_btn_none rtoc_left\">\n\t\t\t\n\t\t\t<span>In Questo Articolo<\/span>\n\t\t\t<\/div><ol class=\"rtoc-mokuji decimal_ol level-1\"><li class=\"rtoc-item\"><a href=\"#rtoc-1\">1. \u0427\u0435\u043a-\u043b\u0438\u0441\u0442 \u043f\u0435\u0440\u0435\u0434 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c<\/a><ul class=\"rtoc-mokuji mokuji_ul level-2\"><li class=\"rtoc-item\"><a href=\"#rtoc-2\">1.1 Pre-Cutover Checklist (\u0437\u0430 1 \u043d\u0435\u0434\u0435\u043b\u044e)<\/a><\/li><li class=\"rtoc-item\"><a href=\"#rtoc-3\">1.2 Go\/No-Go \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u0438<\/a><\/li><\/ul><\/li><li class=\"rtoc-item\"><a href=\"#rtoc-4\">2. \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0439<\/a><ul class=\"rtoc-mokuji mokuji_ul level-2\"><li class=\"rtoc-item\"><a href=\"#rtoc-5\">2.1 \u0421\u043a\u0440\u0438\u043f\u0442 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f DSN<\/a><\/li><li class=\"rtoc-item\"><a href=\"#rtoc-6\">2.2 \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 DNS<\/a><\/li><\/ul><\/li><li class=\"rtoc-item\"><a href=\"#rtoc-7\">3. Production cutover<\/a><ul class=\"rtoc-mokuji mokuji_ul level-2\"><li class=\"rtoc-item\"><a href=\"#rtoc-8\">3.1 \u041f\u043e\u0448\u0430\u0433\u043e\u0432\u0430\u044f \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430<\/a><\/li><li class=\"rtoc-item\"><a href=\"#rtoc-9\">3.2 Timeline \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438<\/a><\/li><\/ul><\/li><li class=\"rtoc-item\"><a href=\"#rtoc-10\">4. \u041c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u043f\u043e\u0441\u043b\u0435 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438<\/a><ul class=\"rtoc-mokuji mokuji_ul level-2\"><li class=\"rtoc-item\"><a href=\"#rtoc-11\">4.1 24-\u0447\u0430\u0441\u043e\u0432\u043e\u0439 \u0438\u043d\u0442\u0435\u043d\u0441\u0438\u0432\u043d\u044b\u0439 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433<\/a><\/li><li class=\"rtoc-item\"><a href=\"#rtoc-12\">4.2 \u041c\u0435\u0442\u0440\u0438\u043a\u0438 \u0434\u043b\u044f \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u044f<\/a><\/li><\/ul><\/li><li class=\"rtoc-item\"><a href=\"#rtoc-13\">5. \u041f\u043b\u0430\u043d \u043e\u0442\u043a\u0430\u0442\u0430<\/a><ul class=\"rtoc-mokuji mokuji_ul level-2\"><li class=\"rtoc-item\"><a href=\"#rtoc-14\">5.1 \u041a\u0440\u0438\u0442\u0435\u0440\u0438\u0438 \u0434\u043b\u044f \u043e\u0442\u043a\u0430\u0442\u0430<\/a><\/li><li class=\"rtoc-item\"><a href=\"#rtoc-15\">5.2 \u0421\u043a\u0440\u0438\u043f\u0442 \u044d\u043a\u0441\u0442\u0440\u0435\u043d\u043d\u043e\u0433\u043e \u043e\u0442\u043a\u0430\u0442\u0430<\/a><\/li><\/ul><\/li><li class=\"rtoc-item\"><a href=\"#rtoc-16\">6. \u041e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 MySQL<\/a><ul class=\"rtoc-mokuji mokuji_ul level-2\"><li class=\"rtoc-item\"><a href=\"#rtoc-17\">6.1 \u0427\u0435\u0440\u0435\u0437 1 \u043d\u0435\u0434\u0435\u043b\u044e \u043f\u043e\u0441\u043b\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0439 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438<\/a><\/li><\/ul><\/li><li class=\"rtoc-item\"><a href=\"#rtoc-18\">7. \u0424\u0438\u043d\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f<\/a><ul class=\"rtoc-mokuji mokuji_ul level-2\"><li class=\"rtoc-item\"><a href=\"#rtoc-19\">7.1 \u041e\u0442\u0447\u0435\u0442 \u043e \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438<\/a><\/li><li class=\"rtoc-item\"><a href=\"#rtoc-20\">7.2 \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438<\/a><\/li><\/ul><\/li><li class=\"rtoc-item\"><a href=\"#rtoc-21\">\u0427\u0435\u043a-\u043b\u0438\u0441\u0442 \u0444\u0438\u043d\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438<\/a><ul class=\"rtoc-mokuji mokuji_ul level-2\"><li class=\"rtoc-item\"><a href=\"#rtoc-22\">\u2705 \u041d\u0435\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e \u043f\u043e\u0441\u043b\u0435 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438 (0-24 \u0447\u0430\u0441\u0430)<\/a><\/li><li class=\"rtoc-item\"><a href=\"#rtoc-23\">\u2705 \u0427\u0435\u0440\u0435\u0437 1 \u043d\u0435\u0434\u0435\u043b\u044e<\/a><\/li><li class=\"rtoc-item\"><a href=\"#rtoc-24\">\u2705 \u0427\u0435\u0440\u0435\u0437 1 \u043c\u0435\u0441\u044f\u0446<\/a><\/li><\/ul><\/li><li class=\"rtoc-item\"><a href=\"#rtoc-25\">\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/a><\/li><li class=\"rtoc-item\"><a href=\"#rtoc-26\">\u041f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0441\u0441\u044b\u043b\u043a\u0438<\/a><\/li><\/ol><\/div><h2 id=\"rtoc-1\"  class=\"wp-block-heading\">1. \u0427\u0435\u043a-\u043b\u0438\u0441\u0442 \u043f\u0435\u0440\u0435\u0434 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c<\/h2>\n\n\n\n<h3 id=\"rtoc-2\"  class=\"wp-block-heading\">1.1 Pre-Cutover Checklist (\u0437\u0430 1 \u043d\u0435\u0434\u0435\u043b\u044e)<\/h3>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\"># Production Cutover Checklist\n\n## \u0422\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0433\u043e\u0442\u043e\u0432\u043d\u043e\u0441\u0442\u044c\n- &#091; ] \u0412\u0441\u0435 \u0442\u0435\u0441\u0442\u044b \u043f\u0440\u043e\u0439\u0434\u0435\u043d\u044b \u0443\u0441\u043f\u0435\u0448\u043d\u043e\n- &#091; ] \u041f\u043e\u043b\u043d\u044b\u0439 \u0431\u044d\u043a\u0430\u043f \u0441\u043e\u0437\u0434\u0430\u043d \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d\n- &#091; ] \u0422\u0435\u0441\u0442\u043e\u0432\u0430\u044f \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430\n- &#091; ] \u041c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d \u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442\n- &#091; ] \u041f\u043b\u0430\u043d \u043e\u0442\u043a\u0430\u0442\u0430 \u0433\u043e\u0442\u043e\u0432 \u0438 \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\n- &#091; ] Disaster recovery \u043f\u043b\u0430\u043d \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\n\n## \u041e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u043e\u043d\u043d\u0430\u044f \u0433\u043e\u0442\u043e\u0432\u043d\u043e\u0441\u0442\u044c\n- &#091; ] \u041a\u043e\u043c\u0430\u043d\u0434\u0430 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0430 \u043e \u0434\u0430\u0442\u0435\/\u0432\u0440\u0435\u043c\u0435\u043d\u0438\n- &#091; ] \u041e\u043a\u043d\u043e \u0442\u0435\u0445\u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u043e\n- &#091; ] Stakeholders \u0438\u043d\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u044b\n- &#091; ] \u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0430\n- &#091; ] \u041a\u043e\u043d\u0442\u0430\u043a\u0442\u044b \u0434\u0435\u0436\u0443\u0440\u043d\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\n\n## \u0418\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\n- &#091; ] DNS \u0437\u0430\u043f\u0438\u0441\u0438 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d\u044b\n- &#091; ] Load balancer \u0441\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\n- &#091; ] Firewall \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u044b\n- &#091; ] SSL \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b \u0432\u0430\u043b\u0438\u0434\u043d\u044b\n- &#091; ] \u041c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 alert\u044b \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u044b\n\n## \u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\n- &#091; ] \u0412\u0441\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0441 MariaDB\n- &#091; ] \u0414\u0440\u0430\u0439\u0432\u0435\u0440\u044b \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u044b\n- &#091; ] Connection strings \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d\u044b\n- &#091; ] Graceful shutdown \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\n- &#091; ] Rollback \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430 \u0437\u0430\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0430<\/code><\/pre>\n\n\n\n<h3 id=\"rtoc-3\"  class=\"wp-block-heading\">1.2 Go\/No-Go \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u0438<\/h3>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">\u041a\u0420\u0418\u0422\u0415\u0420\u0418\u0418 \u0414\u041b\u042f GO (\u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u044f \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438):\n\n\u2705 \u0412\u0441\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0437\u0435\u043b\u0435\u043d\u044b\u0435\n\u2705 \u0411\u044d\u043a\u0430\u043f \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d \u043d\u0430 \u0442\u0435\u0441\u0442\u0435\n\u2705 \u0412\u0441\u0435 \u043a\u0440\u0438\u0442\u0438\u0447\u043d\u044b\u0435 \u0431\u0430\u0433\u0438 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u044b\n\u2705 \u041a\u043e\u043c\u0430\u043d\u0434\u0430 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0433\u043e\u0442\u043e\u0432\u0430\n\u2705 \u041f\u043e\u0433\u043e\u0434\u0430 (\u043d\u0435\u0442 \u0434\u0440\u0443\u0433\u0438\u0445 \u043a\u0440\u0438\u0442\u0438\u0447\u043d\u044b\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439)\n\n\u041a\u0420\u0418\u0422\u0415\u0420\u0418\u0418 \u0414\u041b\u042f NO-GO (\u043e\u0442\u043c\u0435\u043d\u044b \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438):\n\n\u274c \u041f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441 \u0431\u044d\u043a\u0430\u043f\u0430\u043c\u0438\n\u274c \u041a\u0440\u0438\u0442\u0438\u0447\u043d\u044b\u0435 \u0431\u0430\u0433\u0438 \u043d\u0435 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u044b\n\u274c \u041d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u043b\u0430\n\u274c \u0414\u0440\u0443\u0433\u0438\u0435 \u043a\u0440\u0438\u0442\u0438\u0447\u043d\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u0442\u043e\u0442 \u0436\u0435 \u0434\u0435\u043d\u044c\n\u274c \u041f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0439 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0435\u0439<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 id=\"rtoc-4\"  class=\"wp-block-heading\">2. \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0439<\/h2>\n\n\n\n<h3 id=\"rtoc-5\"  class=\"wp-block-heading\">2.1 \u0421\u043a\u0440\u0438\u043f\u0442 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f DSN<\/h3>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">#!\/bin\/bash\n# update_app_configs.sh\n\nOLD_HOST=&quot;mysql.company.local&quot;\nNEW_HOST=&quot;mariadb.company.local&quot;\n\nCONFIG_FILES=(\n    &quot;\/etc\/webapp\/database.yml&quot;\n    &quot;\/etc\/api\/config.json&quot;\n    &quot;\/etc\/worker\/settings.ini&quot;\n)\n\nfor file in &quot;${CONFIG_FILES&#091;@]}&quot;; do\n    if &#091; -f &quot;$file&quot; ]; then\n        echo &quot;Updating: $file&quot;\n\n        # \u0411\u044d\u043a\u0430\u043f\n        cp &quot;$file&quot; &quot;${file}.backup_$(date +%Y%m%d)&quot;\n\n        # \u0417\u0430\u043c\u0435\u043d\u0430\n        sed -i &quot;s\/$OLD_HOST\/$NEW_HOST\/g&quot; &quot;$file&quot;\n\n        echo &quot;\u2705 Updated: $file&quot;\n    else\n        echo &quot;\u26a0\ufe0f  Not found: $file&quot;\n    fi\ndone\n\necho &quot;All configs updated. Review and restart applications.&quot;<\/code><\/pre>\n\n\n\n<h3 id=\"rtoc-6\"  class=\"wp-block-heading\">2.2 \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 DNS<\/h3>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">#!\/bin\/bash\n# update_dns.sh\n\n# 1. \u0417\u0430 \u0434\u0435\u043d\u044c \u0434\u043e \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438: \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c TTL\n# mysql.company.local TTL 3600 \u2192 60\n\n# 2. \u0412 \u0434\u0435\u043d\u044c \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438: \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c A-record\n# mysql.company.local \u2192 192.168.1.200 (\u043d\u043e\u0432\u044b\u0439 MariaDB IP)\n\n# 3. \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435\ndig mysql.company.local +short\n\n# 4. \u041f\u043e\u0441\u043b\u0435 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438: \u0432\u0435\u0440\u043d\u0443\u0442\u044c TTL\n# mysql.company.local TTL 60 \u2192 3600<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 id=\"rtoc-7\"  class=\"wp-block-heading\">3. Production cutover<\/h2>\n\n\n\n<h3 id=\"rtoc-8\"  class=\"wp-block-heading\">3.1 \u041f\u043e\u0448\u0430\u0433\u043e\u0432\u0430\u044f \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430<\/h3>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">#!\/bin\/bash\n# production_cutover.sh\nLOG_FILE=&quot;\/var\/log\/mariadb_cutover.log&quot;\nTIMESTAMP=$(date +%Y%m%d_%H%M%S)\nlog() {\n    echo &quot;&#091;$(date &#039;+%Y-%m-%d %H:%M:%S&#039;)] $1&quot; | tee -a &quot;$LOG_FILE&quot;\n}\nlog &quot;=== PRODUCTION CUTOVER STARTED ===&quot;\nlog &quot;Timestamp: $TIMESTAMP&quot;\n# === \u0424\u0410\u0417\u0410 1: \u041f\u041e\u0414\u0413\u041e\u0422\u041e\u0412\u041a\u0410 (15 \u043c\u0438\u043d\u0443\u0442) ===\nlog &quot;PHASE 1: Preparation&quot;\n# 1.1 \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c read-only \u043d\u0430 MySQL\nlog &quot;Setting MySQL to read-only...&quot;\nmysql -u root -p &lt;&lt; EOF\nSET GLOBAL read_only = ON;\nSET GLOBAL super_read_only = ON;\nFLUSH TABLES WITH READ LOCK;\nEOF\nif &#091; $? -ne 0 ]; then\n    log &quot;\u274c FAILED to set read-only&quot;\n    exit 1\nfi\n# 1.2 \u041f\u043e\u0434\u043e\u0436\u0434\u0430\u0442\u044c \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0439\nlog &quot;Waiting for active transactions...&quot;\nsleep 30\nACTIVE_TRX=$(mysql -u root -p -N -e &quot;SELECT COUNT(*) FROM information_schema.innodb_trx;&quot;)\nlog &quot;Active transactions: $ACTIVE_TRX&quot;\n# 1.3 \u0424\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 snapshot\nlog &quot;Creating final snapshot...&quot;\nmysqldump --all-databases --single-transaction &gt; &quot;\/backup\/final_snapshot_$TIMESTAMP.sql&quot;\n# === \u0424\u0410\u0417\u0410 2: \u041e\u0421\u0422\u0410\u041d\u041e\u0412\u041a\u0410 \u041f\u0420\u0418\u041b\u041e\u0416\u0415\u041d\u0418\u0419 (5 \u043c\u0438\u043d\u0443\u0442) ===\nlog &quot;PHASE 2: Stopping applications&quot;\nsystemctl stop webapp\nsystemctl stop api-server\nsystemctl stop worker\nlog &quot;Applications stopped&quot;\n# === \u0424\u0410\u0417\u0410 3: \u041f\u0415\u0420\u0415\u041a\u041b\u042e\u0427\u0415\u041d\u0418\u0415 (5 \u043c\u0438\u043d\u0443\u0442) ===\nlog &quot;PHASE 3: Cutover&quot;\n# 3.1 \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438\nlog &quot;Updating configurations...&quot;\n.\/update_app_configs.sh\n# 3.2 \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c DNS (\u0435\u0441\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f)\nlog &quot;Updating DNS...&quot;\n# .\/update_dns.sh\n# 3.3 \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c load balancer\nlog &quot;Updating load balancer...&quot;\n# \u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u044c backend \u0441 MySQL \u043d\u0430 MariaDB\n# === \u0424\u0410\u0417\u0410 4: \u0417\u0410\u041f\u0423\u0421\u041a \u041d\u0410 MARIADB (10 \u043c\u0438\u043d\u0443\u0442) ===\nlog &quot;PHASE 4: Starting on MariaDB&quot;\n# 4.1 \u0424\u0438\u043d\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 MariaDB\nif ! mariadb -u root -p -e &quot;SELECT 1;&quot; &gt; \/dev\/null 2&gt;&amp;1; then\n    log &quot;\u274c MariaDB not responding!&quot;\n    log &quot;ABORTING CUTOVER&quot;\n    exit 1\nfi\n# 4.2 \u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\nlog &quot;Starting applications on MariaDB...&quot;\nsystemctl start webapp\nsleep 5\nsystemctl start api-server\nsleep 5\nsystemctl start worker\n# === \u0424\u0410\u0417\u0410 5: \u041f\u0420\u041e\u0412\u0415\u0420\u041a\u0410 (15 \u043c\u0438\u043d\u0443\u0442) ===\nlog &quot;PHASE 5: Verification&quot;\n# 5.1 Smoke tests\nlog &quot;Running smoke tests...&quot;\ncurl -f http:\/\/localhost:8000\/health || log &quot;\u26a0\ufe0f  Health check warning&quot;\n# 5.2 \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439\nCONNECTIONS=$(mariadb -u root -p -N -e &quot;SHOW STATUS LIKE &#039;Threads_connected&#039;;&quot; | awk &#039;{print $2}&#039;)\nlog &quot;MariaDB connections: $CONNECTIONS&quot;\n# 5.3 \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0438 (\u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c)\nif mariadb -u root -p -e &quot;SHOW SLAVE STATUS\\G&quot; 2&gt;\/dev\/null | grep -q &quot;Slave_IO_Running&quot;; then\n    log &quot;Checking replication...&quot;\n    mariadb -u root -p -e &quot;SHOW SLAVE STATUS\\G&quot; | grep -E &quot;Slave_.*_Running|Seconds_Behind_Master&quot; | tee -a &quot;$LOG_FILE&quot;\nfi\nlog &quot;=== CUTOVER COMPLETED SUCCESSFULLY ===&quot;\nlog &quot;Monitor logs: tail -f \/var\/log\/mysql\/error.log&quot;\nlog &quot;Application logs: tail -f \/var\/log\/webapp\/app.log&quot;<\/code><\/pre>\n\n\n\n<h3 id=\"rtoc-9\"  class=\"wp-block-heading\">3.2 Timeline \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438<\/h3>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">18:00 - \u041d\u0430\u0447\u0430\u043b\u043e maintenance window\n18:00 - MySQL \u2192 read-only\n18:05 - \u0424\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 snapshot\n18:10 - \u041e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439\n18:15 - \u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u043e\u0432\n18:20 - \u0417\u0430\u043f\u0443\u0441\u043a \u043d\u0430 MariaDB\n18:25 - Smoke tests\n18:30 - \u041c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u043d\u0430\u0447\u0430\u0442\n19:00 - \u041a\u043e\u043d\u0435\u0446 maintenance window\n\n\u0418\u0442\u043e\u0433\u043e: 1 \u0447\u0430\u0441\n\u0424\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 downtime: 10 \u043c\u0438\u043d\u0443\u0442<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 id=\"rtoc-10\"  class=\"wp-block-heading\">4. \u041c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u043f\u043e\u0441\u043b\u0435 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438<\/h2>\n\n\n\n<h3 id=\"rtoc-11\"  class=\"wp-block-heading\">4.1 24-\u0447\u0430\u0441\u043e\u0432\u043e\u0439 \u0438\u043d\u0442\u0435\u043d\u0441\u0438\u0432\u043d\u044b\u0439 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433<\/h3>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">#!\/bin\/bash\n# post_migration_monitor.sh\n\nLOG_FILE=&quot;\/var\/log\/mariadb_post_migration.log&quot;\nDURATION_HOURS=24\nCHECK_INTERVAL=300  # 5 \u043c\u0438\u043d\u0443\u0442\n\nlog() {\n    echo &quot;&#091;$(date &#039;+%Y-%m-%d %H:%M:%S&#039;)] $1&quot; | tee -a &quot;$LOG_FILE&quot;\n}\n\nlog &quot;=== POST-MIGRATION MONITORING STARTED (${DURATION_HOURS}h) ===&quot;\n\nEND_TIME=$(($(date +%s) + DURATION_HOURS * 3600))\n\nwhile &#091; $(date +%s) -lt $END_TIME ]; do\n    log &quot;--- Checkpoint ---&quot;\n\n    # \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f\n    CONNECTIONS=$(mariadb -u root -p -N -e &quot;SHOW STATUS LIKE &#039;Threads_connected&#039;;&quot; | awk &#039;{print $2}&#039;)\n    log &quot;Connections: $CONNECTIONS&quot;\n\n    # QPS\n    QPS=$(mariadb -u root -p -N -e &quot;SHOW GLOBAL STATUS LIKE &#039;Questions&#039;;&quot; | awk &#039;{print $2}&#039;)\n    log &quot;Total Questions: $QPS&quot;\n\n    # \u041c\u0435\u0434\u043b\u0435\u043d\u043d\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b\n    SLOW=$(mariadb -u root -p -N -e &quot;SHOW GLOBAL STATUS LIKE &#039;Slow_queries&#039;;&quot; | awk &#039;{print $2}&#039;)\n    log &quot;Slow Queries: $SLOW&quot;\n\n    # \u041e\u0448\u0438\u0431\u043a\u0438 \u0432 \u043b\u043e\u0433\u0435\n    ERRORS=$(sudo tail -100 \/var\/log\/mysql\/error.log | grep -c ERROR)\n    log &quot;Recent Errors: $ERRORS&quot;\n\n    if &#091; &quot;$ERRORS&quot; -gt 10 ]; then\n        log &quot;\u26a0\ufe0f  WARNING: High error count!&quot;\n        sudo tail -20 \/var\/log\/mysql\/error.log | tee -a &quot;$LOG_FILE&quot;\n    fi\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439\n    if ! curl -f http:\/\/localhost:8000\/health &gt; \/dev\/null 2&gt;&amp;1; then\n        log &quot;\u274c Application health check FAILED!&quot;\n        # \u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c alert\n    else\n        log &quot;\u2705 Application healthy&quot;\n    fi\n\n    # \u041f\u043e\u0434\u043e\u0436\u0434\u0430\u0442\u044c \u0434\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438\n    sleep $CHECK_INTERVAL\ndone\n\nlog &quot;=== POST-MIGRATION MONITORING COMPLETED ===&quot;<\/code><\/pre>\n\n\n\n<h3 id=\"rtoc-12\"  class=\"wp-block-heading\">4.2 \u041c\u0435\u0442\u0440\u0438\u043a\u0438 \u0434\u043b\u044f \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u044f<\/h3>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">\u041f\u0435\u0440\u0432\u044b\u0435 24 \u0447\u0430\u0441\u0430 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0442\u044c:\n\u2705 Uptime: 100%\n\u2705 Connections: \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b\u0435, \u043d\u0435\u0442 \u0432\u0441\u043f\u043b\u0435\u0441\u043a\u043e\u0432\n\u2705 QPS: \u0441\u0440\u0430\u0432\u043d\u0438\u043c\u044b\u0435 \u0441 MySQL\n\u2705 Slow queries: &lt; 1% \u043e\u0442 \u043e\u0431\u0449\u0435\u0433\u043e \u0447\u0438\u0441\u043b\u0430\n\u2705 Errors: \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0435 \u0438\u043b\u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442\n\u2705 Replication lag: 0-2 \u0441\u0435\u043a\u0443\u043d\u0434\u044b\n\u2705 Buffer pool hit ratio: &gt; 95%\n\u2705 Response time: \u0441\u0440\u0430\u0432\u043d\u0438\u043c\u044b\u0439 \u0438\u043b\u0438 \u043b\u0443\u0447\u0448\u0435<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 id=\"rtoc-13\"  class=\"wp-block-heading\">5. \u041f\u043b\u0430\u043d \u043e\u0442\u043a\u0430\u0442\u0430<\/h2>\n\n\n\n<h3 id=\"rtoc-14\"  class=\"wp-block-heading\">5.1 \u041a\u0440\u0438\u0442\u0435\u0440\u0438\u0438 \u0434\u043b\u044f \u043e\u0442\u043a\u0430\u0442\u0430<\/h3>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">\u041e\u0422\u041a\u0410\u0422 \u041d\u0415\u041e\u0411\u0425\u041e\u0414\u0418\u041c \u0415\u0421\u041b\u0418:\n\u274c \u041a\u0440\u0438\u0442\u0438\u0447\u043d\u044b\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 \u0432 production\n\u274c \u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 &gt; 30 \u043c\u0438\u043d\u0443\u0442\n\u274c \u041f\u043e\u0442\u0435\u0440\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u0430\n\u274c \u041f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c &lt; 50% \u043e\u0442 \u043d\u043e\u0440\u043c\u044b\n\u274c \u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0443\u0441\u0442\u0440\u0430\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u0431\u044b\u0441\u0442\u0440\u043e<\/code><\/pre>\n\n\n\n<h3 id=\"rtoc-15\"  class=\"wp-block-heading\">5.2 \u0421\u043a\u0440\u0438\u043f\u0442 \u044d\u043a\u0441\u0442\u0440\u0435\u043d\u043d\u043e\u0433\u043e \u043e\u0442\u043a\u0430\u0442\u0430<\/h3>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">#!\/bin\/bash\n# emergency_rollback.sh\nlog() {\n    echo &quot;&#091;$(date &#039;+%Y-%m-%d %H:%M:%S&#039;)] $1&quot;\n}\nlog &quot;=== EMERGENCY ROLLBACK TO MYSQL ===&quot;\n# 1. \u041e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\nlog &quot;PHASE 1: Stopping applications&quot;\nsystemctl stop webapp api-server worker\n# 2. \u041e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c MariaDB\nlog &quot;PHASE 2: Stopping MariaDB&quot;\nsystemctl stop mariadb\n# 3. \u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c MySQL\nlog &quot;PHASE 3: Starting MySQL&quot;\nsystemctl start mysql\n# \u041f\u043e\u0434\u043e\u0436\u0434\u0430\u0442\u044c \u0433\u043e\u0442\u043e\u0432\u043d\u043e\u0441\u0442\u0438\nsleep 10\nif ! mysql -u root -p -e &quot;SELECT 1;&quot; &gt; \/dev\/null 2&gt;&amp;1; then\n    log &quot;\u274c MySQL failed to start!&quot;\n    exit 1\nfi\n# 4. \u0421\u043d\u044f\u0442\u044c read-only\nlog &quot;PHASE 4: Removing read-only&quot;\nmysql -u root -p &lt;&lt; EOF\nUNLOCK TABLES;\nSET GLOBAL read_only = OFF;\nSET GLOBAL super_read_only = OFF;\nEOF\n# 5. \u041e\u0442\u043a\u0430\u0442\u0438\u0442\u044c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438\nlog &quot;PHASE 5: Restoring configs&quot;\nfor file in \/etc\/*\/database.yml \/etc\/*\/config.json; do\n    if &#091; -f &quot;${file}.backup_&quot;* ]; then\n        BACKUP=$(ls -t &quot;${file}.backup_&quot;* | head -1)\n        cp &quot;$BACKUP&quot; &quot;$file&quot;\n        log &quot;Restored: $file&quot;\n    fi\ndone\n# 6. \u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 MySQL\nlog &quot;PHASE 6: Starting applications on MySQL&quot;\nsystemctl start webapp\nsystemctl start api-server\nsystemctl start worker\n# 7. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430\nlog &quot;PHASE 7: Verification&quot;\nsleep 10\ncurl -f http:\/\/localhost:8000\/health\nif &#091; $? -eq 0 ]; then\n    log &quot;\u2705 ROLLBACK SUCCESSFUL&quot;\nelse\n    log &quot;\u274c ROLLBACK MAY HAVE ISSUES&quot;\nfi\nlog &quot;=== ROLLBACK COMPLETED ===&quot;<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 id=\"rtoc-16\"  class=\"wp-block-heading\">6. \u041e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 MySQL<\/h2>\n\n\n\n<h3 id=\"rtoc-17\"  class=\"wp-block-heading\">6.1 \u0427\u0435\u0440\u0435\u0437 1 \u043d\u0435\u0434\u0435\u043b\u044e \u043f\u043e\u0441\u043b\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0439 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438<\/h3>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">#!\/bin\/bash\n# decommission_mysql.sh\n\nlog() {\n    echo &quot;&#091;$(date &#039;+%Y-%m-%d %H:%M:%S&#039;)] $1&quot;\n}\n\nlog &quot;=== MySQL DECOMMISSIONING ===&quot;\n\n# 1. \u0424\u0438\u043d\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 - MariaDB \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442\nif ! systemctl is-active --quiet mariadb; then\n    log &quot;\u274c MariaDB is NOT running! Aborting.&quot;\n    exit 1\nfi\n\n# 2. \u0424\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0430\u0440\u0445\u0438\u0432 MySQL\nlog &quot;Creating final MySQL archive...&quot;\ntar -czf &quot;\/backup\/mysql_final_$(date +%Y%m%d).tar.gz&quot; \\\n    \/var\/lib\/mysql\/ \\\n    \/etc\/mysql\/ \\\n    \/var\/log\/mysql\/\n\n# 3. \u041e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c MySQL\nlog &quot;Stopping MySQL...&quot;\nsystemctl stop mysql\nsystemctl disable mysql\n\n# 4. \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u0430\u043a\u0435\u0442\u044b (\u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e)\nread -p &quot;Remove MySQL packages? (yes\/no): &quot; REMOVE\nif &#091; &quot;$REMOVE&quot; = &quot;yes&quot; ]; then\n    apt remove --purge mysql-server mysql-client -y\n    log &quot;MySQL packages removed&quot;\nfi\n\n# 5. \u0410\u0440\u0445\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435\nlog &quot;Archiving MySQL data...&quot;\nmkdir -p \/archive\/mysql_old\nmv \/var\/lib\/mysql &quot;\/archive\/mysql_old\/data_$(date +%Y%m%d)&quot;\nmv \/etc\/mysql &quot;\/archive\/mysql_old\/config_$(date +%Y%m%d)&quot;\n\nlog &quot;\u2705 MySQL DECOMMISSIONED&quot;\nlog &quot;Archive: \/archive\/mysql_old\/&quot;\nlog &quot;Backup: \/backup\/mysql_final_*.tar.gz&quot;<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 id=\"rtoc-18\"  class=\"wp-block-heading\">7. \u0424\u0438\u043d\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f<\/h2>\n\n\n\n<h3 id=\"rtoc-19\"  class=\"wp-block-heading\">7.1 \u041e\u0442\u0447\u0435\u0442 \u043e \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438<\/h3>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\"># MariaDB Migration Report\n\n## Executive Summary\n**Date:** 2025-11-01  \n**Duration:** 4 \u0447\u0430\u0441\u0430 (planned 6 hours)  \n**Status:** \u2705 SUCCESS  \n**Downtime:** 15 \u043c\u0438\u043d\u0443\u0442 (planned 30 minutes)\n\n## Migration Details\n\n### Pre-Migration State\n- MySQL Version: 8.0.35\n- Total Databases: 5\n- Total Data Size: 63.7 GB\n- Applications: 3 (Web API, Worker, Admin Panel)\n\n### Post-Migration State\n- MariaDB Version: 10.11.6\n- All databases migrated: \u2705\n- All applications operational: \u2705\n- Performance improvement: +12%\n\n## Timeline\n| Time  | Event |\n|-------|-------|\n| 18:00 | Backup completed |\n| 18:05 | MySQL \u2192 read-only |\n| 18:10 | Final data sync |\n| 18:15 | Applications stopped |\n| 18:20 | Config updates |\n| 18:25 | Applications started on MariaDB |\n| 18:30 | Smoke tests passed |\n| 18:45 | Monitoring confirmed stable |\n| 19:00 | Maintenance window closed |\n\n## Issues Encountered\n1. **Minor:** Character set warning in stored procedure\n   - Resolution: Updated collation to utf8mb4_unicode_ci\n2. **Minor:** Connection pool timeout in worker\n   - Resolution: Increased pool size 10 \u2192 20\n\n## Post-Migration Metrics (24h)\n- Uptime: 100%\n- Average QPS: 850 (vs 780 on MySQL, +9%)\n- Slow Queries: 0.02% (vs 0.05% on MySQL)\n- Connection Errors: 0\n- Replication Lag: 0s\n\n## Performance Comparison\n| Metric | MySQL | MariaDB | Change |\n|--------|-------|---------|--------|\n| Avg Query Time | 45ms | 40ms | -11% |\n| QPS | 780 | 850 | +9% |\n| Buffer Pool Hit | 94.2% | 97.1% | +3% |\n| Slow Queries\/hr | 12 | 5 | -58% |\n\n## Recommendations\n1. \u2705 Continue monitoring for 1 week\n2. \u2705 Decommission MySQL after 1 week\n3. \u2705 Update documentation\n4. \u23f3 Plan Galera Cluster (Q4 2025)\n\n## Team\n- DBA Lead: &#091;Name]\n- DevOps: &#091;Name]\n- Developer: &#091;Name]\n\n## Sign-off\n- &#091;x] DBA Team\n- &#091;x] DevOps Team\n- &#091;x] Development Team\n- &#091;x] Management\n\n---\nReport generated: 2025-11-02 14:00:00<\/code><\/pre>\n\n\n\n<h3 id=\"rtoc-20\"  class=\"wp-block-heading\">7.2 \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438<\/h3>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\"># Documentation Updates Checklist\n\n## Technical Documentation\n- &#091; ] Runbooks updated\n- &#091; ] Connection strings documented\n- &#091; ] Backup procedures updated\n- &#091; ] Disaster recovery plan revised\n- &#091; ] Monitoring dashboards documented\n- &#091; ] Alert contacts updated\n\n## Operational Documentation\n- &#091; ] On-call procedures updated\n- &#091; ] Escalation paths documented\n- &#091; ] Known issues documented\n- &#091; ] FAQ updated\n\n## Training Materials\n- &#091; ] MariaDB specific features\n- &#091; ] New backup procedures\n- &#091; ] Monitoring tools\n- &#091; ] Troubleshooting guides<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 id=\"rtoc-21\"  class=\"wp-block-heading\">\u0427\u0435\u043a-\u043b\u0438\u0441\u0442 \u0444\u0438\u043d\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438<\/h2>\n\n\n\n<h3 id=\"rtoc-22\"  class=\"wp-block-heading\">\u2705 \u041d\u0435\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e \u043f\u043e\u0441\u043b\u0435 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438 (0-24 \u0447\u0430\u0441\u0430)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>[ ] \u0418\u043d\u0442\u0435\u043d\u0441\u0438\u0432\u043d\u044b\u0439 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u0437\u0430\u043f\u0443\u0449\u0435\u043d<\/li>\n\n\n\n<li>[ ] \u0412\u0441\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442<\/li>\n\n\n\n<li>[ ] \u041d\u0435\u0442 \u043a\u0440\u0438\u0442\u0438\u0447\u043d\u044b\u0445 \u043e\u0448\u0438\u0431\u043e\u043a<\/li>\n\n\n\n<li>[ ] \u041f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0432 \u043d\u043e\u0440\u043c\u0435<\/li>\n\n\n\n<li>[ ] \u041a\u043b\u0438\u0435\u043d\u0442\u044b \u043d\u0435 \u0441\u043e\u043e\u0431\u0449\u0430\u044e\u0442 \u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u0445<\/li>\n<\/ul>\n\n\n\n<h3 id=\"rtoc-23\"  class=\"wp-block-heading\">\u2705 \u0427\u0435\u0440\u0435\u0437 1 \u043d\u0435\u0434\u0435\u043b\u044e<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>[ ] \u0421\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0430<\/li>\n\n\n\n<li>[ ] MySQL \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c<\/li>\n\n\n\n<li>[ ] \u0424\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0430\u0440\u0445\u0438\u0432 MySQL \u0441\u043e\u0437\u0434\u0430\u043d<\/li>\n\n\n\n<li>[ ] \u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0430<\/li>\n\n\n\n<li>[ ] \u041a\u043e\u043c\u0430\u043d\u0434\u0430 \u043e\u0431\u0443\u0447\u0435\u043d\u0430<\/li>\n<\/ul>\n\n\n\n<h3 id=\"rtoc-24\"  class=\"wp-block-heading\">\u2705 \u0427\u0435\u0440\u0435\u0437 1 \u043c\u0435\u0441\u044f\u0446<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>[ ] \u0414\u043e\u043b\u0433\u043e\u0441\u0440\u043e\u0447\u043d\u0430\u044f \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0430<\/li>\n\n\n\n<li>[ ] \u0412\u0441\u0435 \u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u0432 \u043d\u043e\u0440\u043c\u0435<\/li>\n\n\n\n<li>[ ] \u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u044b<\/li>\n\n\n\n<li>[ ] Lessons learned \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u044b<\/li>\n\n\n\n<li>[ ] \u041f\u0440\u0430\u0437\u0434\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u0443\u0441\u043f\u0435\u0445\u0430! \ud83c\udf89<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 id=\"rtoc-25\"  class=\"wp-block-heading\">\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u041f\u043e\u0437\u0434\u0440\u0430\u0432\u043b\u044f\u0435\u043c! \u041c\u0438\u0433\u0440\u0430\u0446\u0438\u044f \u043d\u0430 MariaDB \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0430 \u0443\u0441\u043f\u0435\u0448\u043d\u043e!<\/strong> \ud83d\ude80<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0412\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u2705 \u0423\u043b\u0443\u0447\u0448\u0435\u043d\u043d\u0443\u044e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c<\/li>\n\n\n\n<li>\u2705 \u041e\u0442\u043a\u0440\u044b\u0442\u0443\u044e \u0438 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u0443\u044e \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443<\/li>\n\n\n\n<li>\u2705 \u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438<\/li>\n\n\n\n<li>\u2705 \u042d\u043a\u043e\u043d\u043e\u043c\u0438\u044e \u043d\u0430 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u044f\u0445<\/li>\n\n\n\n<li>\u2705 \u041f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0435 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0435<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0448\u0430\u0433\u0438:<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0439\u0442\u0435 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433<\/li>\n\n\n\n<li>\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u0443\u0439\u0442\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c<\/li>\n\n\n\n<li>\u041f\u043b\u0430\u043d\u0438\u0440\u0443\u0439\u0442\u0435 Galera Cluster<\/li>\n\n\n\n<li>\u0418\u0437\u0443\u0447\u0430\u0439\u0442\u0435 \u043d\u043e\u0432\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 MariaDB<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 id=\"rtoc-26\"  class=\"wp-block-heading\">\u041f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0441\u0441\u044b\u043b\u043a\u0438<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/mariadb.com\/kb\/\">MariaDB Documentation<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/mariadb.com\/kb\/en\/mariadb-vs-mysql-compatibility\/\">MariaDB vs MySQL<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/mariadb.com\/kb\/en\/community\/\">Community Forum<\/a><\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u0423\u0434\u0430\u0447\u0438 \u0432 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 MariaDB!<\/strong> \ud83d\udcaa<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\".\/00-INDEX.md\">\u2190 \u041d\u0430\u0437\u0430\u0434 \u043a \u043e\u0433\u043b\u0430\u0432\u043b\u0435\u043d\u0438\u044e<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u0420\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e \u043f\u043e \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438 MySQL \u2192 MariaDB. \u0413\u041b\u0410\u0412\u0410 13: \u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043d\u0430 production \u0438 \u0444\u0438\u043d\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f. \u0426\u0435\u043b\u044c \u0433\u043b\u0430\u0432\u044b: \u0411\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043d\u0430 MariaDB \u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u044e<\/p>\n","protected":false},"author":1,"featured_media":3796,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"neve_meta_sidebar":"","neve_meta_container":"","neve_meta_enable_content_width":"","neve_meta_content_width":0,"neve_meta_title_alignment":"","neve_meta_author_avatar":"","neve_post_elements_order":"","neve_meta_disable_header":"","neve_meta_disable_footer":"","neve_meta_disable_title":"","_themeisle_gutenberg_block_has_review":false,"footnotes":""},"categories":[967],"tags":[975,976,973,972,974],"class_list":["post-3795","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category---mysql--mariadb","tag-db","tag-dba","tag-mariadb","tag-mysql","tag-974"],"acf":[],"_links":{"self":[{"href":"https:\/\/ru.davidka.net\/ru\/wp-json\/wp\/v2\/posts\/3795","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ru.davidka.net\/ru\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/ru.davidka.net\/ru\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/ru.davidka.net\/ru\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/ru.davidka.net\/ru\/wp-json\/wp\/v2\/comments?post=3795"}],"version-history":[{"count":0,"href":"https:\/\/ru.davidka.net\/ru\/wp-json\/wp\/v2\/posts\/3795\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/ru.davidka.net\/ru\/wp-json\/wp\/v2\/media\/3796"}],"wp:attachment":[{"href":"https:\/\/ru.davidka.net\/ru\/wp-json\/wp\/v2\/media?parent=3795"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ru.davidka.net\/ru\/wp-json\/wp\/v2\/categories?post=3795"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ru.davidka.net\/ru\/wp-json\/wp\/v2\/tags?post=3795"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}