Перенос сайта, восстановление из резервной копии или клонирование тестовой среды сводятся к двум операциям: выгрузить базу в файл и загрузить её обратно. На VPS Linux Infrawire обе делаются несколькими командами и без веб-интерфейса. В руководстве разобраны согласованные дампы, сжатие, большие файлы, кодировка символов и прямая передача между серверами.
📋 Требования
- Linux VPS с Ubuntu 24.04 или Debian 12 и доступом по SSH под root (IP-адрес и пароль root есть в вашем личном кабинете)
- Установленный MySQL или MariaDB либо хотя бы клиент (
apt install mariadb-client) - Пользователь базы данных с правами
SELECT,SHOW VIEW,TRIGGER,LOCK TABLESиEVENTна выгружаемую базу - Достаточно свободного места на диске: проверьте командой
df -h
1. Экспорт базы с помощью mysqldump
Для таблиц InnoDB (движок по умолчанию) параметр --single-transaction создаёт согласованный снимок без блокировки таблиц, поэтому сайт продолжает работать во время выгрузки.
Bashmysqldump -u USER -p --single-transaction --quick DBNAME > DBNAME.sql
В свежих версиях MariaDB эта утилита доступна и как mariadb-dump с теми же параметрами.
2. Процедуры, триггеры и события
Триггеры выгружаются по умолчанию, а хранимые процедуры, функции и запланированные события нужно запрашивать явно. Явно заданная кодировка избавляет от проблем с кириллицей и эмодзи.
Bashmysqldump -u USER -p --single-transaction --routines --triggers --events \ --default-character-set=utf8mb4 DBNAME > DBNAME.sql
Полезные варианты:
Bash# Только структура, без строк mysqldump -u USER -p --no-data DBNAME > schema.sql # Несколько баз с командами CREATE DATABASE mysqldump -u USER -p --single-transaction --databases DB1 DB2 > two-dbs.sql # Все базы сервера mysqldump -u root -p --single-transaction --routines --events --all-databases > all.sql
3. Сжатие дампа с помощью gzip
SQL-текст отлично сжимается. Направьте вывод прямо в gzip, чтобы несжатый файл вообще не записывался на диск.
Bashmysqldump -u USER -p --single-transaction --routines --events DBNAME | gzip > DBNAME_$(date +%F).sql.gz
Чтобы не вводить пароль каждый раз (и не светить его в выводе ps), сохраните его в ~/.my.cnf:
INI[client] user=USER password=YOUR_PASSWORD
Bashchmod 600 ~/.my.cnf
4. Импорт дампа
Сначала создайте целевую базу с современной кодировкой, затем загрузите файл.
Bashmysql -u USER -p -e 'CREATE DATABASE IF NOT EXISTS DBNAME CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;' mysql -u USER -p --default-character-set=utf8mb4 DBNAME < DBNAME.sql # Из сжатого файла gunzip -c DBNAME.sql.gz | mysql -u USER -p --default-character-set=utf8mb4 DBNAME
Внимание: по умолчанию дамп содержит DROP TABLE IF EXISTS, поэтому импорт в существующую базу заменяет таблицы с теми же именами. Сначала сделайте резервную копию целевой базы.
5. Работа с большими файлами
Для дампов в несколько гигабайт запускайте импорт внутри tmux, чтобы обрыв SSH-сессии его не прервал, а прогресс отслеживайте через pv.
Bashapt install -y tmux pv tmux new -s import pv DBNAME.sql.gz | gunzip | mysql -u USER -p --max-allowed-packet=512M DBNAME
Отключитесь сочетанием Ctrl+B, затем D, а позже вернитесь командой tmux attach -t import.
6. Прямая передача на другой сервер по SSH
Промежуточный файл не нужен: дамп идёт по зашифрованному SSH-конвейеру и загружается на месте. Учётные данные читаются из ~/.my.cnf (или через локальный сокет для root) с обеих сторон.
Bashmysqldump --single-transaction --routines --events DBNAME | gzip \ | ssh root@NEW_VPS_IP 'gunzip | mysql DBNAME'
База DBNAME должна уже существовать на целевом сервере.
✅ Проверка результата
Bashgzip -t DBNAME.sql.gz && echo 'archive OK' mysql -e 'SHOW TABLES;' DBNAME mysql -e 'SELECT COUNT(*) FROM TABLENAME;' DBNAME mysql -e "SELECT default_character_set_name FROM information_schema.SCHEMATA WHERE schema_name='DBNAME';"
Сравните число строк в нескольких ключевых таблицах на источнике и на целевом сервере.
🔧 Устранение неполадок
ERROR 1045 Access denied : неверный пользователь или пароль, либо пользователю запрещено подключаться с этого хоста. Сначала проверьте вход командой mysql -u USER -p.
ERROR 2006 MySQL server has gone away : строка или запрос превышает max_allowed_packet. Увеличьте значение на сервере в разделе [mysqld] конфигурации и перезапустите службу либо передайте клиенту --max-allowed-packet=512M.
Нечитаемые символы после импорта : файл прочитан в неправильной кодировке. Экспортируйте с --default-character-set=utf8mb4 и импортируйте с тем же параметром.
ERROR 1227 или ошибки DEFINER : дамп ссылается на пользователя, которого нет на целевом сервере. Удалите эту часть при импорте:
Bashsed -E 's/DEFINER=`[^`]+`@`[^`]+`//g' DBNAME.sql | mysql -u USER -p DBNAME
🎉 Теперь ваши базы данных легко копировать, восстанавливать и переносить между серверами!