Русский (Russian)

Экспорт и импорт базы MySQL/MariaDB на Linux VPS

2 min
VPS/VDS-хостинг

Перенос сайта, восстановление из резервной копии или клонирование тестовой среды сводятся к двум операциям: выгрузить базу в файл и загрузить её обратно. На 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 создаёт согласованный снимок без блокировки таблиц, поэтому сайт продолжает работать во время выгрузки.

Bash
mysqldump -u USER -p --single-transaction --quick DBNAME > DBNAME.sql

В свежих версиях MariaDB эта утилита доступна и как mariadb-dump с теми же параметрами.

2. Процедуры, триггеры и события

Триггеры выгружаются по умолчанию, а хранимые процедуры, функции и запланированные события нужно запрашивать явно. Явно заданная кодировка избавляет от проблем с кириллицей и эмодзи.

Bash
mysqldump -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, чтобы несжатый файл вообще не записывался на диск.

Bash
mysqldump -u USER -p --single-transaction --routines --events DBNAME | gzip > DBNAME_$(date +%F).sql.gz

Чтобы не вводить пароль каждый раз (и не светить его в выводе ps), сохраните его в ~/.my.cnf:

INI
[client] user=USER password=YOUR_PASSWORD
Bash
chmod 600 ~/.my.cnf

4. Импорт дампа

Сначала создайте целевую базу с современной кодировкой, затем загрузите файл.

Bash
mysql -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.

Bash
apt 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) с обеих сторон.

Bash
mysqldump --single-transaction --routines --events DBNAME | gzip \ | ssh root@NEW_VPS_IP 'gunzip | mysql DBNAME'

База DBNAME должна уже существовать на целевом сервере.

✅ Проверка результата

Bash
gzip -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 : дамп ссылается на пользователя, которого нет на целевом сервере. Удалите эту часть при импорте:

Bash
sed -E 's/DEFINER=`[^`]+`@`[^`]+`//g' DBNAME.sql | mysql -u USER -p DBNAME

🎉 Теперь ваши базы данных легко копировать, восстанавливать и переносить между серверами!

Следите за последними предложениями, скидками и специальными акциями.

Смотреть акции

Мы используем файлы cookie

Аналитические cookie улучшают работу сайта. Данные не продаются третьим лицам. Подробнее в политике конфиденциальности.