Linux mysql перенос базы
Со временем базы данных растут, иногда перерастая место на файловой системе. Не важно, хотите ли вы использовать более просторное хранилище под базу данных, или использовать RAID, сетевые блочные устройства или разместить базы данных на другом диске, а не на котором расположена основная система, данная инструкция проведёт вас по процессу смены расположения директории data вашей СУБД MySQL.
Шаг 1 — Перемещение директории Data MySQL
Подготавливаясь для перемещения директории MySQL data, давайте проверим текущее расположения, для этого запустите интерактивную сессию MySQL с учётными данными администратора.
Когда появится запрос, введите пароль рута MySQL. Затем в приглашении MySQL выполните запрос для показа текущего расположения директории data:
Этот вывод подтверждает, что MySQL настроена на использование директории data по умолчанию, /var/lib/mysql/, т.е. эту директорию нам и нужно перемещать. После подтверждения этого, напечатайте exit; для выхода.
Чтобы быть уверенными в целостности данных, вы отключим MySQL перед тем, как начнём делать наши изменения:
systemctl не показывает результат выполнения команды управления сервисом, поэтому если вы хотите убедиться, что всё прошло успешно, используйте следующую команду:
Теперь, когда сервер отключён, мы скопируем с rsync существующую директорию с базой данных в новое расположение. Использование флага -a сохраняет права доступа и другие свойства каталога, -v обеспечивает вербальный вывод, поэтому вы можете следить за прогрессом.
Внимание: убедитесь, что отсутствуют завершающие слеши после имён директорий, они могут появиться при использовании автозавершения по tab. Когда присутствует завершающий слеш, rsync сбросит содержимое директории в точку монтирования вместо перенесения директории mysql.
Когда rsync закончит, переименуйте текущую папку, добавив к её имени расширение .bak и сохраните её до тех пор, пока не подтвердится, что перемещение было успешным. Переименовывая папку, мы с одной стороны убедимся, что сервер точно работает с новым расположением, при этом мы сохраним резервную копию на случай, если что-то пошло не так:
Теперь мы готовы переключиться на настройку.
Шаг 2 — Указание на новое расположение Data
MySQL имеет несколько способов переписать значения конфигурации. В зависимости от того, используете ли вы MySQL или MariaDB расположение и название конфигурационных файлов может различаться. Например, для MySQL это файл /etc/mysql/mysql.conf.d/mysqld.cnf
Отредактируйте этот файл в соответствии с вашей новой директорией data. Найдите строку, которая начинается с datadir= и измените на путь, который соответствует новому расположению. В моём случае (новой директорией является /home/mial/mysql/) обновлённая строка выглядит так:
Эта строка расположена в секции [mysqld].
Если вы используете MariaDB, то отредактируйте, например, файл /etc/mysql/mariadb.conf.d/50-server.cnf:
В нём также после секции [mysqld] можно изменить значение datadir. Ещё обратите внимание для секции [mariadb] – значения, вписанные здесь, будут распространяться только на MariaDB, и на секцию [mariadb-10.0] – опции, указанные в ней, будут влиять только на MariaDB десятой версии.
Казалось бы, уже пора снова поднимать MySQL, но нам ещё нужно кое-что настроить перед тем, как мы успешно сможем это сделать.
Шаг 3 — Настройка правил контроля доступа AppArmor
Нам нужно сообщить AppArmor, чтобы он разрешил MySQL записывать в новую директорию. Это будет сделано посредством создания псевдонима между директорией по умолчанию и новым расположением. Чтобы сделать это, отредактируйте файл псевдонимов AppArmor:
В конце этого файла добавьте следующее правило псевдонимов:
Чтобы изменения вступили в силу, перезапустите AppArmor:
Вывод для systemctl и journalctl заканчивается:
Шаг 4 — Перезапуск MySQL
Теперь мы готовы запустить MySQL.
Чтобы убедиться, что новая директория data действительно используется, зайдите в MySQL:
И снова чтобы увидеть информацию о директории data введите:
Примечание: если значение не изменилось, то попробуйте перезапустить весь сервер, а не только службу MySQL.
Теперь, когда мы перезапустили MySQL и подтвердили, что используется новое расположение, воспользуйтесь возможностью убедиться, что ваша база данных полностью функционально. После того, как вы удостоверились в целостности всех существующих данных, вы можете удалить резервную копию директории data:
Перезапустите MySQL последний раз, чтобы проверить, что всё работает как и ожидалось:
Создание символической ссылки на директорию данных MySQL
Вместо правки конфигурационного файла, можно было бы создать символическую ссылку до нового расположения.
Далее создаём символическую ссылку:
Заключение
В этой инструкции мы переместили директорию MySQL с базами данных data в новое расположение и обновили правила контроля доступа AppArmor в Ubuntu для соответствия изменениям.
У меня дома стоит небольшой сервер, где у друга крутятся его сайтики, который используют mysql. Сейчас я обновил там ОС и все снес (точнее сделал это на другом винте, исходный винт жив). Теперь хочу перенести его сайтики самым простым способом. Возникает вопрос о переносе баз mysql. Можно ли перенести сразу все (настройки, базы, пользователей), положить на новой машине и запустить там mysql? Был ubuntu 10.4, теперь ubuntu 13.4. Какие директории надо переносить? Ни когда не имел дело с mysql, больше с postgres
даммпит все, включая настройки пользователей?
Ну это уже в зависимости от желаний, да? Можно сдампить отдельно, можно --all-databases
а как потом востановить? я просто хочу перетащить вообще все тупа, не разбираяс в содержании
формат может между версиями поменять и ппц.
mysqldump --all-databases -uUser -pPass > dumpfile.sql
mysql -uUser -pPass << dumpfile.sql
Сохраняйте свои пароли в истории шелла, сохраняйте.
тут не до секрюрности. Мне надо тупо перенсти.
я не думую, что так кардинально поменяется. Но все ли там, что надо?
--routines можно добавить к опциям mysqldump
Просто не переноси sql файлами.
формат может между версиями поменять и ппц.
Может. Но происходит это не очень часто, на самом деле. Можно и попробовать скопировать. Кроме того, именно это же и происходит просто при обновлении MySQL. Когда последний раз проблемы возникали ? Я вот не помню. Кроме того, есть mysql_upgrade, который следует запустить после операции такого рода.
если имеется phpmyadmin, то в нем можно все базы сбекапить в файлы себе на рабочую тачку, используя лишь для этого браузер. Отключить Ubuntu 10.04 Подключить Ub 13.4 И на 13.4 так же через phpmyadmin залить базы. Я например так делал при переезде.
если имеется phpmyadmin, то в нем можно все базы сбекапить в файлы себе на рабочую тачку, используя лишь для этого браузер. Отключить Ubuntu 10.04 Подключить Ub 13.4 И на 13.4 так же через phpmyadmin залить базы. Я например так делал при переезде.
Нахрена такой оверхед на элементарную операцию ?
Я например так делал при переезде.
я боюсь представить что ты будешь с электронным микроскопом делать.
если версии mysql совпадают и юзается MyISAM, то можно и /var/lib/mysql затарить.
Как переносил я: на старом сервере был мускул 5.1, на новом - mariaDB 5.5. Использовал утилиту xtrabackup/innobackupex. Можно временно добавить репозиторий, только её установить. То, что выбрал xtrabackup - не пожалел, базы скопировал и InnoDB, и MyISAM, быстрее mysqldump'a точно.
даммпит все, включая настройки пользователей?
у меня всё сохранил, даже после mysql_upgrade
тут не до секрюрности. Мне надо тупо перенсти.
я тоже так хотел, и получил :)
Для ТС операция не элементарна выходит, раз он тему завёл. ТС надо перенести все базы грубо говоря с одной тачки на другую. (с винта на винт) И судя по вопросу, он не столь опытен, для него легче будет как новичку именно решить проблему двумя кликами. Согласен, если нет phpmyadmin то можно сделать и по другому как описывают другие участники. Но если БЛ*** имеется пыхыпыадмин, то нафига мучаться с монтированием дисков одной тачки к другой чтоб перетащить файл, или лазить по sftp. Проще все сделать в два клика сидя в браузере. а не задротить в консоли. ИМХО!
/me переносит только базы.
его ставить надо, а я этого не хочу.
Я опытен в линуксе, просто мускул для меня темный лес и другая сторона силы. Была бы постгря
Базы можно тупо скопировать. Даже между разными платформами. Я например так переносил с венды на линукс. У них и в документации это подчёркивается. Главное сервер корректно погасить.
Часто возникают ситуации с переездами базы между серверами. Здесь расскажу как перенести базу MySQL с одного сервера на другой без даунтайма.
Имеется такая ситуация:
Есть приложение, в настройках которого прописан адрес MySQL сервера в виде домена mysql.server.loc . Этот домен прописан в DNS и резолвится в 1.1.1.1. Есть новый сервер 2.2.2.2. Надо перенести mysql базу со старого сервера на новый. Нацеливать приложение можно как через его настройки, так и через DNS, меняя запись A-типа.
Перенос в несколько шагов:
- Создать новый сервер
- Настроить репликацию мастер-мастер. Приложение при этом смотрит на старый сервер.
- Перенацелить приложение на новый сервер.
- Выключить репликацию на новом. Выключить старый сервер.
Создание нового сервера
В данном случае я использую Ubuntu 16.04.3 и MySQL 5.7. Установим mysql на новый сервер:
Настройка репликации master-slave
Для того чтобы работала репликация в конфиге mysql надо добавить опцию записи binlog-ов. В них будут записываться изменения которые происходят в базе в бинарном формате. После этого эти изменения разъезжаются по репликам и тем самым поддерживается консистентное состояние данных.
Включаем binlog в my.cnf:
- log-bin - имя файла или путь до файлов с бинлогами. Если версия 5.6 или ниже - нужно указывать имя файла (как выше в примере), бинлоги будут хранится в data-директории. MySQL 5.7 и выше может принимать значения с путем, например /tmp/mysql-binlog
- expire-logs-days - длина логов в днях. За это время надо поднять и запустить слейв.
- max-binlog-size - максимальный размер логов. Если достигнут максимум, то логи будут ротироваться, не смотря на expire-logs-days
- server-id - id-сервера в реплике. должен быть разным на разных серверах
Создадим пользователя, под которым будет происходить репликация и дадим права на репликацию:
Теперь сделаем бэкап базы с помощью innobackupex (это утилита от Percona которая делает бэкап с указанием позиции в bin-логе) в директорию /tmp/mysqlbackup. Здесь инструкция по инсталяции innobackupex.
В конце вывода будет что-то типа:
Нам нужны filename и position. Запоминаем их, они пригодятся во время развертывания этого бэкапа на новом сервере. Эти значения также есть в файле xtrabackup_binlog_info в папке с бэкапом.
Копируем папку с бэкапом на новый сервер. Например rsync-ом (предварительно надо сделать доступ на новый сервер со старого по ssh):
Когда перенос закончится, логинимся на новый сервер и разворачиваем бэкап. Для этого скопируем содержимое папки бэкапа в /var/lib/mysql и запустим innobackupex:
Запускаем MySQL на новом сервере, заходим в mysql-консоль и прописываем адрес мастера и момент времени с которого надо начинать подтягивать данные:
Проверяем Master_Host должен быть ip старого сервера, Master_Log_File и Read_Master_Log_Pos должны быть те, которые показал innobackupex.
Стартуем слэйв и смотрим статус:
Теперь сервера между собой работают в master-slave режиме. Писать можно только в master, читать из обоих.
Ждем пока новый сервер догонит мастера. Время отставания слейва от мастера - Seconds_Behind_Master. Exec_Master_Log_Pos на новом сервере должен быть такой же как position у master ноды. В примере выше слейв уже догнал мастера. Посмотреть position на мастер ноде можно с помощью команды:
Настройка репликации master-master
Когда слейв догнал мастера, идем на старый инстанс и добавляем параметры для репликации, чтобы репликация была master+master. Здесь уже не надо указывать MASTER_LOG_POS и MASTER_LOG_FILENAME:
Теперь сервера работают как мастер-мастер. В таком режиме лучше всегда писать только в одну голову. Если писать в обеи - может возникнуть неконсистентность. Мастер-мастер у MySQL работает не всегда хорошо.
Выключение старого сервера
После того как получилась конструкция мастер-мастер, можно перенацелить приложение, изменив его настройки или изменить A запись в DNS.
Когда к старому серверу кончатся обращения (посмотреть - mysql> show full processlist; , можно остановить слейв на новом сервере:
Всё. MySQL теперь работает на новом сервере, приложение ходит в него. Старый можно выключать.
База данных MySQL 8 при установке на Ubuntu по умолчанию пишется в папку /var/lib/mysql. Со временем база растёт и поднимается вопрос переноса её на другой раздел диска. Перенесём базу данных в /u01/mysql/mysql.
Требования
- ОС Ubuntu 18.04 LTS. Или Ubuntu 16.04.
- Работаем из-под root.
- Сервер MySQL 8
Подготовка
Проверим где находится текущая БД MySQL.
Видим, что файлы базы находятся в /var/lib/mysql/. Чтобы закрыть командную строку MySQL, введите exit.
Останавливаем сервер MySQL:
Проверяем статус, мы должны убедиться, что сервер MySQL остановлен:
Видим — Status: "Server shutdown complete".
Перемещаем каталог данных MySQL
Создадим папку /u01/mysql, в неё будем переносить папку с данными MySQL.
С помощью rsync переносим MySQL в другую папку:
Флаг –a сохраняет привилегии и другие свойства каталога. Флаг –v предоставляет подробный вывод. Теперь внимание, папка /var/lib/mysql теперь находится по адресу /u01/mysql/mysql (ну так мне было нужно).
Переименуем старую папку /var/lib/mysql, сохраним её на случай сбоя:
По умолчанию путь настроен в файле /etc/mysql/mysql.conf.d/mysqld.cnf, редактируем.
Найдите строку datadir= и укажите в ней путь к новому каталогу данных /u01/mysql/mysql.
AppArmor
Настроим AppArmor, чтобы предоставить MySQL право на изменение нового каталога. Редактируем файл /etc/apparmor.d/tunables/alias:
Если этого не сделать, то получим ошибку:
Перезапуск MySQL
MySQL при запуске проверяет наличие директории /var/lib/mysql/mysql (ЗАЧЕМ?). Чтобы он не ругался, создадим пустую папку:
Читайте также: