Иногда, бывает так, что железо устаривает, машина начинает тормозить, доступ к ней усложняется, а апгрейд просто не пройдёт, в такой ситуации может спасти только новый сервер.
А новый сервер означает, что нужен будет перенос всех важных данных со старого сервера. MySQL данные относятся именно к таким. Перенести бекап баз не составит большого труда, а вот если нужно перенести всех пользователей и их привилегии — задача становится труднее. И эту задачу мы постараемся сегодня решить.
Основная функция системы привилегий MySQL (которые хранятся в таблице mysql.user) это авторизация пользователей, которые присоединяются с выделенного им хоста и ассоциация этих пользователей с привилегиями на базы данных (SELECT, INSERT, UPDATE, и DELETE).
Что нам нужно сделать
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
+-------+ | db1 | -------------------------> -+ +-------+ Старый Mysql сервер (192.168.0.8) +-----+ | db2 | --------------> -------+----> Интернет (Роутер провайдера) +-----+ Новый Mysql сервер (192.168.0.10) +-----+ | Веб1| -------------------------> -+ +-----+ <a href="https://logi.cc/kaketo-kak-mne-perezagruzit-apache-2-web-server-pod-linux-unix/">Apache</a> Веб сервер (192.168.0.12) |
Как видно из схемы, нам нужно перенести все MySQL данные, включая пользователей и их привилегии, с сервера db1 на сервер db2.
Установим MySQL на db2
Конечно, пути установки MySQL зависят от используемого дистрибутива. Я люблю Gentoo Linux:
1 2 3 4 5 |
#Вы должны быть "под" root'ом emerge -av mysql rc-update add mysql default |
Сразу ставим пароль для root’а
1 2 3 |
mysqladmin -u root password NEWPASSWORD |
Ну, если Вы вдруг используете одну из систем семейства Ubuntu, то Ваш листинг установки будет следующий:
1 2 3 4 5 6 |
sudo apt-get install mysql-server mysql-client sudo service mysql start # Сразу ставим пароль для root'а mysqladmin -u root password NEWPASSWORD |
Тоже ничего сложного.
Получаем текущие данные MySQL: Пользователей, Хосты и привилегии
На сервере db1 выполняем следующую команду:
1 2 3 |
mysql -u root -B -N -p -e "SELECT user, host FROM user" mysql |
Вывод этой команды будет примерно таким:
1 2 3 4 5 6 7 8 9 |
bloger 192.168.0.5 Kicker 192.168.0.5 Katya 192.168.0.7 Pavel 192.168.0.12 root localhost db1.logi.cc root db1.logi.cc |
Первая колонка — это имена пользователей, вторая хосты. Теперь, для того чтобы узнать привилегии пользователей используйте следующую команду:
1 2 3 |
mysql -u root -p -B -N -e"SHOW GRANTS FOR 'userName'@hostName" |
Вместо userName подставляем имя пользователя, а вместо hostName соответственно его хост. Например:
1 2 3 |
mysql -u root -p -B -N -e"SHOW GRANTS FOR 'Pavel'@192.168.0.12" |
Вывод команды будет такой:
1 2 3 4 |
GRANT USAGE ON *.* TO 'Pavel'@192.168.0.12' IDENTIFIED BY PASSWORD 'какойнитьпарольвMd5' GRANT ALL PRIVILEGES ON `sitedb`.* TO 'Pavel'@192.168.0.12' |
Где,
- Pavel — Имя пользователя MySQL
- 192.168.0.12 — IP адрес хоста, который имеет доступ к MySQL серверу
- какойнитьпарольвMd5 — Пароль пользователя в MD5 шифровании
- sitedb — Имя базы данных, к которой пользователь имеет полные привилегии
Теперь нам известна вся нужная информация, и мы можем начать перенос с сервера db1 на сервер db2. Делать мы это будем при помощи SSH:
1 2 3 4 5 6 |
ssh user@db2 mysql -u root -p'password' -e "create database IF NOT EXISTS sitedb;" ssh user@db2 mysql -u root -p'password' -e "GRANT USAGE ON *.* TO 'Pavel'@'192.168.0.12' IDENTIFIED BY PASSWORD 'какойнитьпарольвMd5';" ssh user@db2 mysql -u root -p'password' -e "GRANT ALL PRIVILEGES ON `sitedb`.* TO 'Pavel'@'192.168.0.12';" mysqldump -u root -p'password' -h 'localhost' sitedb| ssh user@db2 mysql -u root -p'password' sitedb |
Теперь можно протестировать проделанную работу с машины Веб1:
1 2 3 |
mysql -u Pavel -h 192.168.0.10 -p sitedb -e 'show tables;' |
Простой скрипт для миграции MySQL базы данных
Скрипт для Миграции базы данных MySQL
В архиве присутствует файл readme.txt, в нём описана работа и требуемые настройки скрипта.
Не столкнувшись с проблемой переноса баз данных вплотную — даже не мог себе представить, что в MySQL, фактически, — НАЧИСТО отсутствует штатный механизм переноса привилегий пользователей!
P.S. До этого, считал MySQL довольно-таки приличной СУБД, которая подходит для большинства задач, а теперь — хочется плеваться.
Ну, привилегии переносятся не каждый день…
Так что можно и потерпеть
*** Getting info about blabla…
и висим
разобрался, скопипастил в файл неудачно)
а вот ошибка уже при импорте на удаленном вылезла
ERROR 1064 (42000) at line 3: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘GRANT ALL PRIVILEGES ON
user\\_number2
.* TO ‘user_number2’@’%’Три года прошло с момента публикации статьи, а как пригодилась сегодня. Столкнулся с такой же бедой как и у тебя, понятно что для тебя это уже неактуально, но может быть кто-то еще найдет эту статью и попадет на те же грабли
Вот подправленный вариант, мб кому и пригодится
http://thelinuxforce.org/upload/files/MysqlMigrate_v2.rar
Можно копировать папку /var/lib/mysql целиком, предварительно остановив mysql на обоих серверах. Если баз огромная куча, будет быстрее.