<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Mysql &#8211; REMADMIN</title>
	<atom:link href="https://remadmin.com/tags/mysql/feed/" rel="self" type="application/rss+xml" />
	<link>https://remadmin.com</link>
	<description>Удалённый системный администратор</description>
	<lastBuildDate>Tue, 22 Sep 2026 20:29:06 +0000</lastBuildDate>
	<language>ru-RU</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.4</generator>
	<item>
		<title>Миграция домена WordPress без поломки serialized-данных</title>
		<link>https://remadmin.com/blog/vebmasteru/migraciya-domena-wordpress-bez-polomki-serialized-dannyh/</link>
					<comments>https://remadmin.com/blog/vebmasteru/migraciya-domena-wordpress-bez-polomki-serialized-dannyh/#respond</comments>
		
		<dc:creator><![CDATA[Cursor Blog]]></dc:creator>
		<pubDate>Tue, 22 Sep 2026 20:29:06 +0000</pubDate>
				<category><![CDATA[Вебмастеру]]></category>
		<category><![CDATA[Mysql]]></category>
		<category><![CDATA[Wordpress]]></category>
		<category><![CDATA[wp-cli]]></category>
		<category><![CDATA[миграция]]></category>
		<category><![CDATA[Резервное копирование]]></category>
		<category><![CDATA[шпаргалка]]></category>
		<guid isPermaLink="false">https://remadmin.com/?p=7426</guid>

					<description><![CDATA[Почему REPLACE по дампу оставляет рабочий siteurl и мёртвые виджеты. Как я меняю домен через WP-CLI с учётом сериализации, какие варианты URL не забыть и что проверить за ночь.]]></description>
										<content:encoded><![CDATA[<p>Типичная заявка: «переехали на новый домен, главная открывается, в админку пускает, а меню пустое, виджеты слетели, Elementor открывается белым экраном, в кастомайзере ошибка». Иногда мягче: «часть картинок с старого адреса, часть с нового», «письма клиентам уходят со старой ссылкой», «после смены домена пропал футер».</p>
<p>Я почти всегда нахожу одно и то же. Кто-то сделал в phpMyAdmin <code>REPLACE</code> по <code>option_value</code> или прогнал дамп через «найти и заменить» в редакторе. Поля <code>siteurl</code> и <code>home</code> в <code>wp_options</code> — обычные строки, они меняются и сайт «как будто живой». Виджеты, theme_mods, ACF, настройки кэша и куча plugin-опций лежат как PHP-сериализация. Наивная замена портит длину строк внутри этой каши. <code>unserialize()</code> возвращает <code>false</code>, WordPress считает «настроек нет» и рисует пустые сайдбары.</p>
<p>Ниже — как я перевожу домен, чтобы не чинить потом сериализацию руками. Хосты в примерах вымышленные: <code>old.example</code> → <code>shop.example</code>. Свои домены, префикс таблиц и путь к сайту подставляйте, чужой дамп из интернета на прод не накатывайте.</p>
<h5>Почему обычный REPLACE ломает сайт</h5>
<p>PHP пишет строку не как «текст», а как «длина плюс текст». Упрощённо:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">s:19:"https://old.example";</pre>
<p>«19» — это число байт внутри кавычек, не «примерно длина». Если в дампе или SQL вы меняете <code>old.example</code> на <code>shop.example</code>, букв становится больше, а префикс <code>s:19:</code> остаётся. Для интерпретатора это уже не валидная сериализация. Массив вокруг тоже разваливается: один битый кусок — и весь option «не читается».</p>
<p>Отсюда картина, которую путают с «плагин не перенёсся»:</p>
<ul>
<li>Админка работает: логин, список записей, даже медиатека. Это не сериализация, это обычные таблицы.</li>
<li>Виджеты пустые или «сбросились на дефолт». Классика — <code>sidebars_widgets</code> и <code>widget_*</code>.</li>
<li>Кастомайзер/меню выглядят как новый сайт на чистой теме: <code>theme_mods_*</code> не распаковался.</li>
<li>Страница открывается, визуальный редактор — нет. У конструкторов URL ещё и в JSON/CSS, не только в serialize.</li>
<li>В PHP-логах за ночь: <code>unserialize(): Error at offset …</code> на <code>option_value</code> или postmeta. Это не «хостер глючит», это вы вчера поправили домен в БД.</li>
</ul>
<p><code>siteurl</code>/<code>home</code> я вообще не считаю критерием успеха. Их можно поменять руками за минуту. Критерий — живые виджеты, меню, конструктор и отсутствие старого хоста в опциях, которые WordPress реально читает.</p>
<h5>Что я снимаю до любой замены</h5>
<p>Пока не лежит откат, я замену не запускаю. Испорченная сериализация откатывается из дампа за две минуты и чинится «на глаз» полдня.</p>
<p>Минимум:</p>
<ul>
<li>Дамп базы <em>до</em> замены, не «сейчас сниму, если что». И файл не в <code>wp-content/uploads</code> этого же сайта.</li>
<li>Архив файлов: тема, <code>uploads</code>, <code>mu-plugins</code>. Конструкторы после смены домена часто оставляют CSS со старым хостом уже в файлах, не в MySQL.</li>
<li>Текущие <code>siteurl</code> и <code>home</code>, плюс константы из <code>wp-config.php</code>. Если заданы <code>WP_HOME</code>/<code>WP_SITEURL</code>, база может врать, а сайт всё равно ходить на старый адрес — или наоборот, «замена в БД не действует».</li>
<li>Список вариантов URL, которые реально встречаются. Не один «красивый» https.</li>
</ul>
<p>Варианты, которые я выписываю в блокнот до команды, не в процессе:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">https://old.example
http://old.example
https://www.old.example
http://www.old.example
//old.example
old.example</pre>
<p>Слеш на конце — отдельная история. В опциях чаще без него, в контенте и в JSON конструктора бывает с ним. Менять «с слэшем» и «без» двумя проходами безопаснее, чем надеяться, что один проход поймает оба.</p>
<p>Голый <code>old.example</code> без схемы я оставляю на последний проход и смотрю отчёт: он может задеть e-mail вида <code>shop@old.example</code>, CDN, упоминания в тексте. Если почта на этом домене остаётся — голый хост не трогаю или меняю точечно.</p>
<p>Префикс таблиц не угадываю:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="bash"># каталог сайта подставьте свой
cd /var/www/example-site/public_html
wp config get table_prefix
wp option get siteurl
wp option get home
wp config get WP_HOME
wp config get WP_SITEURL</pre>
<p>Если две последние константы заданы и расходятся с тем, куда вы переезжаете, сначала правлю <code>wp-config.php</code>. Иначе search-replace в базе вы сделаете, а WordPress продолжит считать каноническим старый URL.</p>
<h5>WP-CLI: основной путь</h5>
<p>На VPS и нормальном хостинге с SSH я не открываю phpMyAdmin для этой задачи. <code>wp search-replace</code> ходит по ячейкам, понимает PHP-сериализацию (и в свежих версиях — JSON), первичные ключи не трогает.</p>
<p>Сначала сухой прогон, чтобы увидеть масштаб, а не «сразу на прод»:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="bash">cd /var/www/example-site/public_html

wp search-replace 'https://old.example' 'https://shop.example' \
  --all-tables-with-prefix \
  --precise \
  --dry-run \
  --report-changed-only</pre>
<p><code>--all-tables-with-prefix</code> нужен потому, что дефолт — таблицы, которые WordPress зарегистрировал в <code>$wpdb</code>. У Magento-в-WP это не про нас, а у WooCommerce, форм, кэша, самописных плагинов таблица <code>wp_something_extra</code> легко остаётся со старым хостом. <code>--all-tables</code> без префикса я на шареде с общей MySQL не включаю: можно вылезти в чужую базу на том же пользователе.</p>
<p><code>--precise</code> гоняет замену через PHP, не через быстрый SQL. Медленнее, зато меньше шансов проскочить колонку, где сериализация не похожа на «очевидную». На магазине в сотни мегабайт дампа это не мгновенно — зато не потом ночью ловить пустую корзину.</p>
<p>Если сухой прогон выглядит здраво (есть попадания в <code>wp_options</code>, postmeta, может быть post content — и нет сюрприза в <code>wp_users.user_email</code> на тысячи строк), снимаю ещё один свежий дамп и запускаю без <code>--dry-run</code>.</p>
<p>GUID записей я обычно пропускаю:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="bash">wp search-replace 'https://old.example' 'https://shop.example' \
  --all-tables-with-prefix \
  --precise \
  --skip-columns=guid \
  --report-changed-only</pre>
<p><code>guid</code> в WordPress — идентификатор, не «красивая ссылка». Менять его при переезде домена не обязательно, а фиды и импорты от этого иногда едут. Если у вас старый зоопарк, где в GUID руками писали permalink — смотрите отчёт dry-run по колонке и решайте точечно, не «всем REPLACE».</p>
<p>Дальше те же команды для <code>http://</code>, <code>www</code> и протоколо-относительного <code>//old.example</code>. Один проход по «основному» https почти никогда не вычищает всё: редирект на https могли включить год назад, а в виджете 2019 года лежит http.</p>
<p>Если WP-CLI есть на старом сервере, а на новом ещё нет, удобен экспорт уже с заменой:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="bash">wp search-replace 'https://old.example' 'https://shop.example' \
  --all-tables-with-prefix \
  --precise \
  --skip-columns=guid \
  --export=/root/shop-example-after-replace.sql</pre>
<p>Накатываю этот SQL на новое место, а не «сырой дамп плюс sed». <code>sed</code> по <code>.sql</code> — тот же класс ошибки, что REPLACE в phpMyAdmin, только в файле на 400 МБ её ещё и не видно.</p>
<h5>Если WP-CLI нет</h5>
<p>На дешёвом shared без SSH люди ставят плагин вроде Better Search Replace. Под капотом та же идея, что у interconnect/it: идти по ячейкам и пересобирать serialize. Это лучше, чем правка дампа. Это хуже, чем WP-CLI, потому что плагин работает из-под веба, на больших таблицах упирается в timeout, и его ещё надо не забыть удалить.</p>
<p>Правила, без которых я этот путь не рекомендую:</p>
<ul>
<li>Сначала дамп. Плагин «умеет dry-run» — dry-run обязателен, как у CLI.</li>
<li>Ставить, прогнать, снести. Search-Replace, оставленный в корне сайта, — готовая дыра: это скрипт с доступом к базе, который не должен торчать в интернет ни минуты после работы.</li>
<li>Не мешать в одном заходе «домен» и «путь на диске». Это разные строки. Путь <code>/home/u1234/public_html</code> в сериализации тоже бывает, его меняют отдельно, когда переезд ещё и на другой аккаунт хостинга.</li>
</ul>
<p>Перенос «архивом плагина миграции» (Duplicator и родственники) сериализацию обычно переживает, потому что замену они делают своим движком, не вашим REPLACE. Имеет смысл, когда нет SSH. Не имеет смысла, когда вы уже на VPS и можете одну команду. Я не тащу лишний плагин на прод ради смены домена.</p>
<h5>Что search-replace не видит</h5>
<p>База — не весь сайт. После удачной замены в MySQL у меня регулярно всплывает старый хост в файлах.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="bash">cd /var/www/example-site/public_html
grep -R --binary-files=without-match -l 'old.example' \
  wp-content/themes wp-content/plugins wp-content/mu-plugins \
  wp-content/uploads wp-config.php 2&gt;/dev/null | head</pre>
<p>Типичные находки:</p>
<ul>
<li><code>WP_HOME</code>/<code>WP_SITEURL</code> в <code>wp-config.php</code> — перекрывают базу, спор «я же заменил в опциях» решается здесь.</li>
<li>CSS/JSON конструктора в <code>wp-content/uploads/elementor/</code> (и аналоги у других билдеров). Это файлы. Их WP-CLI не трогает. У Elementor после смены домена я ещё регенерирую CSS из админки или, если есть их CLI, отдельной командой замены URL, не надеясь только на MySQL.</li>
<li>Жёстко прошитый адрес в дочерней теме: логотип, пиксель, кастомный endpoint. Это уже код, не контент.</li>
<li>Объектный кэш. Redis/Memcached продолжает отдавать старые сериализованные blobs. После замены — flush. Иначе «в базе уже новый домен, в браузере старый» до истечения TTL, и вы начнёте чинить то, что уже починено.</li>
</ul>
<p>Мультисайт — не тот же чеклист. Там <code>wp_blogs</code>, <code>wp_site</code>, домены блогов, и CLI нужно звать с <code>--url</code> конкретного сайта плюс <code>--network</code>, когда меняете сразу сеть. Если у вас не мультисайт, не копируйте чужие однострочники с <code>--network</code> «на всякий случай».</p>
<h5>Как понять, что сериализация жива</h5>
<p>Первая проверка — не «главная открылась». Я смотрю то, что сериализация обычно убивает, и то, что REPLACE обычно забывает.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="bash"># канонические URL — уже новый домен, без редиректа в голове
wp option get siteurl
wp option get home

# остатки старого хоста по всем таблицам с префиксом
wp db search 'old.example' --all-tables-with-prefix --table_column_once

# виджеты реально читаются, не «таблица на месте»
wp widget list sidebar-1
wp option get sidebars_widgets</pre>
<p>Если <code>sidebars_widgets</code> печатает массив с именами сайдбаров — сериализация этого option жива. Если пусто, <code>false</code> или PHP Notice на unserialize — откатились к дампу, не «восстанавливаем виджеты руками».</p>
<p>Грубый проход по опциям, которые WordPress считает сериализованными, но уже не может распаковать:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="bash">wp eval '
foreach ( wp_load_alloptions() as $name =&gt; $value ) {
  if ( ! is_serialized( $value ) ) { continue; }
  $restored = @unserialize( $value );
  if ( $value === "b:0;" || $restored !== false || $value === serialize( false ) ) { continue; }
  echo $name, PHP_EOL;
}
'</pre>
<p>Пустой вывод — хороший знак. Имена вроде <code>widget_block</code>, <code>theme_mods_…</code>, <code>external_updates</code> в этом списке — плохой: именно они после «успешного» REPLACE приезжают битыми.</p>
<p>В админке руками:</p>
<ul>
<li>Внешний вид → Виджеты / редактор блоков виджетов: блоки на месте, не пустой холст.</li>
<li>Меню и расположения меню. «Меню существует, но нигде не назначено» часто значит, что theme_mods не прочитался.</li>
<li>Медиа: открыть пару старых записей, не главную. В контенте <code>https://old.example/wp-content/uploads/…</code> после нормальной замены быть не должно.</li>
<li>Конструктор: открыть на редактирование страницу, которую точно верстали не вчера. Белый экран при живой публичной странице — почти всегда JSON/CSS со старым хостом или битая meta.</li>
</ul>
<p>Смешанный контент (главная по https, картинки по http старого домена) я проверяю не глазами, а по исходнику и по логам. Браузер может дорисовать из кэша.</p>
<h5>Что смотреть overnight</h5>
<p>Днём вы видите то, что кликнули. Ночью всплывает cron, письма и боты.</p>
<p>За ночь мне нужны:</p>
<ul>
<li>Письма сайта: сброс пароля, WooCommerce, формы. В теле и в заголовке <code>From</code>/ссылках не должен торчать старый хост. Это часто не <code>siteurl</code>, а отдельная опция плагина или константа SMTP.</li>
<li>Cron: <code>wp cron event list</code> и системный crontab. Старый URL в HTTP-cron (wget на <code>wp-cron.php</code>) продолжает дергать прежний домен, пока DNS жив.</li>
<li>Карта сайта и robots: плагины SEO пишут абсолютные URL. Rank Math/Yoast после переезда я открываю и пересохраняю карту, не надеясь, что «само подхватит».</li>
<li>Редирект со старого домена. Пока он не 301 на тот же путь нового, Google и закладки клиентов будут кормить оба хоста. Сам search-replace редирект не настраивает — это nginx/хостер.</li>
<li>Логи PHP на unserialize и на mixed content в error_log. Одна-две строки offset — повод не «подождать», а свернуть на дамп и прогнать замену нормально.</li>
<li>REST и превью: <code>/wp-json/</code> должен отдавать новый <code>home</code> в <code>url</code>/<code>home</code>. Иначе мобильные приложения и часть плагинов продолжают стучать на старое имя.</li>
</ul>
<p>Если старый домен ещё резолвится в тот же DocumentRoot без редиректа, вы будете неделю ловить «то новый, то старый» в кэше и в сериализации, которую кто-то снова сохранит из админки, зайдя по старому имени. Схема одна: один канонический хост, второй только 301, константы и опции смотрят на канон.</p>
<p>Переезд домена в WordPress — это не «поменять две опции в wp_options». Две опции как раз переживают любой REPLACE. Ломается то, что вы не видите в phpMyAdmin с первого экрана: длины строк внутри serialize. Я меняю URL инструментом, который эти длины пересчитывает, потом отдельно ищу хвосты в файлах и кэше, и только после живых виджетов и пустого поиска по старому хосту считаю переезд состоявшимся — не в момент, когда открылась главная.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://remadmin.com/blog/vebmasteru/migraciya-domena-wordpress-bez-polomki-serialized-dannyh/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Перенос большой базы MySQL, если не достаточно места для дампа</title>
		<link>https://remadmin.com/blog/linux/perenos-bolshoj-bazy-mysql-esli-dlya-dampa-ne-hvataet-mesta/</link>
					<comments>https://remadmin.com/blog/linux/perenos-bolshoj-bazy-mysql-esli-dlya-dampa-ne-hvataet-mesta/#respond</comments>
		
		<dc:creator><![CDATA[REMADMIN]]></dc:creator>
		<pubDate>Wed, 08 Feb 2023 13:34:51 +0000</pubDate>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[curlftpfs]]></category>
		<category><![CDATA[Mysql]]></category>
		<category><![CDATA[ssh]]></category>
		<guid isPermaLink="false">https://remadmin.com/?p=7123</guid>

					<description><![CDATA[Сегодня при переносе сайта с огромной базой MySQL с одного виртуального сервера столкнулся с интересной проблемой. Ни на старом, ни на новом сервере не хватало свободного места, чтобы сделать дамп базы, скопировать его на новый сервер, и там развернуть. Как быстро перенести сайт с одного сервера на другой, я писал в этой статье, рекомендую почитать. [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Сегодня при переносе сайта с огромной базой MySQL с одного виртуального сервера столкнулся с интересной проблемой. Ни на старом, ни на новом сервере не хватало свободного места, чтобы сделать дамп базы, скопировать его на новый сервер, и там развернуть.<span id="more-7123"></span></p>
<p>Как быстро перенести сайт с одного сервера на другой, я писал в <a href="https://remadmin.com/blog/linux/bystryj-perenos-sajta-na-drugoj-server-cherez-ssh/">этой статье</a>, рекомендую почитать.</p>
<p>Итак, исходные данные: база MySQL весит 50Гб, на старом сервере свободно на диске 5Гб. Дамп сделать не возможно, так как не помещается, даже, если использовать сжатие gzip.</p>
<p>На новом сервере свободно 55ГБ, но если залить на него дамп, то опять же, останется всего 5ГБ, и здесь уже обратная проблема &#8211; не получится этот дамп восстановить, снова не хватит места.</p>
<p>Идея родилась быстро. А что, если задействовать для переноса третий сервер, где свободного места предостаточно?</p>
<p>Реализовать решил так: на новом сервере смонтировать как папку удалённое ftp место с третьего сервера, и прямо туда сделать дамп, а потом оттуда же восстановить. При этом свободное место ни на одном из серверов вообще не задействуется. Кстати эту ftp папку можно было смонтировать и на старом сервере, там сделать в неё дамп, а потом из неё восстановить на новом. Но я решил сделать быстрее, управлять переносом только с нового сервера.</p>
<h5>Приступаем к реализации задуманного.</h5>
<p>Всё выполняем только на новом сервере. Кстати, на обоих установлена Centos 7.</p>
<p>Для начала <strong>устанавливаем curlftpfs:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="powershell">yum install curlftpfs</pre>
<p>Дальше <strong>в файл /etc/fstab добавляем:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="shell">curlftpfs#ftp://USER:PASSWORD@SERVER/ /remote fuse rw,uid=1000,allow_other,user 0 1</pre>
<p>Где:</p>
<ul>
<li><strong>USER:PASSWORD@SERVER</strong> &#8211; данные от нашего ftp аккаунта на удалённом, третьем сервере.</li>
<li><strong>/remote</strong> &#8211; локальная папка, в которую мы хотим примонтироваться.</li>
</ul>
<p>Заставляем mount перечитать данные из /etc/fstab:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="powershell">mount -a</pre>
<p>Проверить, что всё хорошо, и у нас появилось новое место командой:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="powershell">df -h</pre>
<p>Дальше делаем дамп базы старого сервера прямо сюда, на новый, в эту удалённую папку:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="powershell">ssh root@192.168.0.1 mysqldump -udbuser -pdbpass dbname &gt; /remote/dump.sql</pre>
<p>Здесь:</p>
<ul>
<li><strong>root@192.168.0.1</strong> &#8211; данные для подключения к старому серверу.</li>
<li><strong>dbuser, dbpass и dbname</strong> &#8211; соответственно данные, для подключения к базе на старом сервере.</li>
</ul>
<p>Ну и теперь осталось дело за малым &#8211; восстановить базу из дампа на новом сервере:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="powershell">mysql -udbuser -pdbpass dbname &lt; /remote/dump.sql</pre>
<p>Всё, конечно, происходит не очень быстро, но главное, завершается успешно. Очередная проблема решена <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p>Для того, чтобы отмонтировать папку, удалите строку из /etc/fstab и выполните команду:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="powershell">umount -l /remote</pre>
]]></content:encoded>
					
					<wfw:commentRss>https://remadmin.com/blog/linux/perenos-bolshoj-bazy-mysql-esli-dlya-dampa-ne-hvataet-mesta/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Быстрый перенос сайта на другой сервер через SSH</title>
		<link>https://remadmin.com/blog/linux/bystryj-perenos-sajta-na-drugoj-server-cherez-ssh/</link>
					<comments>https://remadmin.com/blog/linux/bystryj-perenos-sajta-na-drugoj-server-cherez-ssh/#respond</comments>
		
		<dc:creator><![CDATA[REMADMIN]]></dc:creator>
		<pubDate>Tue, 24 Jan 2023 10:55:24 +0000</pubDate>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Mysql]]></category>
		<category><![CDATA[rsync]]></category>
		<category><![CDATA[ssh]]></category>
		<guid isPermaLink="false">https://remadmin.com/?p=7012</guid>

					<description><![CDATA[Современные сайты и их базы данных могут быть очень большими, и перенос таких сайтов по протоколу FTP может быть очень долгим. К тому же при таком переносе часто могут возникать различные проблемы. Поэтому рассмотрим быстрый перенос сайта на другой сервер через SSH. Переносим базу данных mysql На старом сервере выполняем команду для экспорта базы: mysqldump [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Современные сайты и их базы данных могут быть очень большими, и перенос таких сайтов по протоколу FTP может быть очень долгим. К тому же при таком переносе часто могут возникать различные проблемы.</p>
<p>Поэтому рассмотрим быстрый перенос сайта на другой сервер через SSH.<span id="more-7012"></span></p>
<h4>Переносим базу данных mysql</h4>
<p>На старом сервере выполняем команду для <strong>экспорта</strong> базы:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">mysqldump -uимя -pпароль dbname &gt; /var/www/domain.ru/dbname.sql</pre>
<p>Можно указать в качестве пути для сохранения файла папку сайта, чтобы дальше скопировать этот файл дампа базы вместе с файлами сайта.</p>
<p>Для <strong>импорта</strong> базы на новом сервере переходим в директорию с базой и используем команду:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="powershell">mysql -uимя -pпароль dbname &lt; dbname.sql</pre>
<p>Если при импорте базы данных Mysql нужно указать хост или порт, сделать это можно вот так:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="powershell">mysql -hхост -Pпорт -uимя -pпароль dbname &lt; dbname.sql</pre>
<h4>Переносим файлы сайта</h4>
<h5>Перенос при помощи утилиты rsync</h5>
<p>Если на обоих серверах есть доступ к ssh и установлен <strong>rsync</strong>, перенести файлы можно командой со старого сервера:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="powershell">rsync -av /var/www/site.ru/  root@192.168.0.1:/var/www/site.ru/</pre>
<p>Или с нового сервера вытащить файлы со старого:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="powershell">rsync -av root@192.168.1.2:/var/www/site.ru/  /var/www/site.ru/</pre>
<h5>Перенос с помощью архивирования.</h5>
<p>Если на обоих серверах достаточно свободного места, можно упаковать файлы в архив, затем перебросить его на новый сервер и там распаковать.</p>
<p>Упаковываем командой:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">tar -czvf file.tar.gz /full/path</pre>
<p>Перебросить можно любым способом, например через scp:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">scp file.tar.gz  root@192.168.0.1:/var/www/site.ru/</pre>
<p>Распаковать на новом сервере можно командой:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="powershell">tar -xvf file.tar.gz</pre>
<h5>Перенос файлов между серверами по FTP.</h5>
<p>Если на одном из серверов есть только FTP, то тогда можно переносить файлы по ftp сразу между серверами. Например используя Midnight Commander (mc). Переходим в нём к ftp подключению:</p>
<p><a href="https://remadmin.com/wp-content/uploads/2023/01/rZ7yaFeXSf.jpg" rel="lightbox[7012]"><img fetchpriority="high" decoding="async" class="aligncenter size-full wp-image-7014" src="https://remadmin.com/wp-content/uploads/2023/01/rZ7yaFeXSf.jpg" alt="mc ftp" width="742" height="308" srcset="https://remadmin.com/wp-content/uploads/2023/01/rZ7yaFeXSf.jpg 742w, https://remadmin.com/wp-content/uploads/2023/01/rZ7yaFeXSf-300x125.jpg 300w" sizes="(max-width: 706px) 89vw, (max-width: 767px) 82vw, 740px" /></a></p>
<p>И в появившемся окне</p>
<p><a href="https://remadmin.com/wp-content/uploads/2023/01/6aSeft5xL5.jpg" rel="lightbox[7012]"><img decoding="async" class="aligncenter size-full wp-image-7015" src="https://remadmin.com/wp-content/uploads/2023/01/6aSeft5xL5.jpg" alt="" width="890" height="123" srcset="https://remadmin.com/wp-content/uploads/2023/01/6aSeft5xL5.jpg 890w, https://remadmin.com/wp-content/uploads/2023/01/6aSeft5xL5-300x41.jpg 300w, https://remadmin.com/wp-content/uploads/2023/01/6aSeft5xL5-768x106.jpg 768w" sizes="(max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px" /></a></p>
<p>вводим данные для подключения, вида:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="powershell">ftp://login:pass@host</pre>
<p>После этого в одном окне MC будут файлы текущего сервера, в другом удалённого. И их можно копировать между ними в любую сторону.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://remadmin.com/blog/linux/bystryj-perenos-sajta-na-drugoj-server-cherez-ssh/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Автоматическое завершение долгих процессов Mysql</title>
		<link>https://remadmin.com/blog/linux/avtomaticheskoe-zavershenie-dolgih-processov-mysql/</link>
					<comments>https://remadmin.com/blog/linux/avtomaticheskoe-zavershenie-dolgih-processov-mysql/#respond</comments>
		
		<dc:creator><![CDATA[REMADMIN]]></dc:creator>
		<pubDate>Fri, 18 Nov 2022 20:47:22 +0000</pubDate>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Mysql]]></category>
		<guid isPermaLink="false">https://remadmin.com/?p=6977</guid>

					<description><![CDATA[Бывают случаи, когда некоторые запросы Mysql подвисают и выполняются невероятно долго, создавая приличную нагрузку на сервер. Этот способ помогает автоматически отслеживать и завершать все запросы которые длятся больше заданного количества секунд. Процедура mysql_kill_query убивает все запросы, за исключением запущенных с правами супер пользователя, время выполнения которых превышает runtime секунд. Выполняем запрос к базе данных: DELIMITER [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Бывают случаи, когда некоторые запросы Mysql подвисают и выполняются невероятно долго, создавая приличную нагрузку на сервер.</p>
<p>Этот способ помогает автоматически отслеживать и завершать все запросы которые длятся больше заданного количества секунд.<span id="more-6977"></span></p>
<p>Процедура <strong>mysql_kill_query</strong> убивает все запросы, за исключением запущенных с правами супер пользователя, время выполнения которых превышает <strong>runtime</strong> секунд.</p>
<p>Выполняем запрос к базе данных:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="mariadb">DELIMITER //
CREATE PROCEDURE `mysql_kill_query` ( IN runtime TINYINT UNSIGNED )
LANGUAGE SQL
NOT DETERMINISTIC
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE connid INT UNSIGNED;
DECLARE cur1 CURSOR FOR SELECT ID FROM information_schema.PROCESSLIST
WHERE CONCAT ("'", USER, "'@'", SUBSTRING_INDEX(HOST,':',1), "'") IN
( SELECT `USER_PRIVILEGES`.`GRANTEE` AS `GRANTEE` FROM `information_schema`.`USER_PRIVILEGES`
WHERE NOT(`USER_PRIVILEGES`.`GRANTEE` IN
(SELECT GRANTEE FROM `information_schema`.`USER_PRIVILEGES`
WHERE `USER_PRIVILEGES`.`PRIVILEGE_TYPE` = 'SUPER' GROUP BY `USER_PRIVILEGES`.`GRANTEE`)))
AND COMMAND ='Query'
AND TIME&gt;= runtime;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1; 
OPEN cur1;
REPEAT
FETCH cur1 INTO connid;
IF NOT done THEN
KILL connid;
END IF;
UNTIL done END REPEAT;
CLOSE cur1;
END//
DELIMITER ;</pre>
<p>И затем добавляем ещё один запрос, чтобы создать в планировщике mysql задание которое будет выполнять нашу функции каждые N секунды (в примере это 2 секунды) с максимальным временем запроса в две секунды:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="mariadb">SET GLOBAL event_scheduler=ON;
 CREATE EVENT IF NOT EXISTS `mysql_kill_query`
ON SCHEDULE EVERY 2 SECOND
ON COMPLETION PRESERVE ENABLE
DO CALL mysql_kill_query(2);</pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://remadmin.com/blog/linux/avtomaticheskoe-zavershenie-dolgih-processov-mysql/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>