Я знаю, как экспортировать / импортировать базы данных с помощью mysqldump, и это нормально, но как мне получить права на новый сервер.
Для дополнительных баллов, в новой уже есть пара существующих баз данных, как мне импортировать привилегии старых серверов, не уничтожая пару существующих из них.
Старый сервер: 5.0.67-сообщество
Новый сервер: 5.0.51a-24 + lenny1
РЕДАКТИРОВАТЬ: У меня есть дамп базы данных mysql со старого сервера, и теперь я хочу знать, как правильно слиться с mysql db на новом сервере.
Я попробовал выполнить прямой импорт с помощью phpMyAdmin и получил ошибку, касающуюся дубликата (который я уже перенес вручную).
У кого-нибудь есть элегантный способ слияния двух баз данных mysql?
Не связывайтесь с mysql db. Там происходит гораздо больше, чем просто таблица пользователей. Лучше всего "ПОКАЗАТЬ ГРАНТЫ FOR ". У меня есть много псевдонимов и функций обслуживания CLI в моем .bashrc (на самом деле мои .bash_aliases, которые я использую в своем .bashrc). Эта функция:
mygrants()
{
mysql -B -N $@ -e "SELECT DISTINCT CONCAT(
'SHOW GRANTS FOR \'', user, '\'@\'', host, '\';'
) AS query FROM mysql.user" | \
mysql $@ | \
sed 's/\(GRANT .*\)/\1;/;s/^\(Grants for .*\)/## \1 ##/;/##/{x;p;x;}'
}
Первая команда mysql использует SQL для генерации действительного SQL, который передается второй команде mysql. Затем вывод передается через sed для добавления красивых комментариев.
$ @ В команде позволит вам называть его как: mygrants --host = prod-db1 --user = admin --password = secret
Вы можете использовать свой полный набор инструментов unix следующим образом:
mygrants --host=prod-db1 --user=admin --password=secret | grep rails_admin | mysql --host=staging-db1 --user=admin --password=secret
Это правильный способ переместить пользователей. Ваш MySQL ACL изменен с помощью чистого SQL.
Существует два метода извлечения грантов SQL из экземпляра MySQL.
МЕТОД №1
Ты можешь использовать пт-шоу-гранты из Percona Toolkit
MYSQL_CONN="-uroot -ppassword"
pt-show-grants ${MYSQL_CONN} > MySQLUserGrants.sql
МЕТОД №2
Вы можете подражать pt-show-grants
со следующими
MYSQL_CONN="-uroot -ppassword"
mysql ${MYSQL_CONN} --skip-column-names -A -e"SELECT CONCAT('SHOW GRANTS FOR ''',user,'''@''',host,''';') FROM mysql.user WHERE user<>''" | mysql ${MYSQL_CONN} --skip-column-names -A | sed 's/$/;/g' > MySQLUserGrants.sql
Любой метод создаст чистый SQL-дамп грантов MySQL. Осталось только выполнить скрипт на новом сервере:
mysql -uroot -p -A < MySQLUserGrants.sql
Попробуйте !!!
Ответ Ричарда Броноски был для меня чрезвычайно полезен. Большое спасибо!!!
Вот небольшой вариант, который мне пригодился. Это полезно для переноса пользователей, например между двумя установками Ubuntu под управлением phpmyadmin. Просто сбросьте привилегии для всех пользователей, кроме root, phpmyadmin и debian-sys-maint. Код тогда
mygrants()
{
mysql -B -N $@ -e "SELECT DISTINCT CONCAT(
'SHOW GRANTS FOR ''', user, '''@''', host, ''';'
) AS query FROM mysql.user WHERE user NOT IN ('root','phpmyadmin','debian-sys-maint')" | \
mysql $@ | \
sed 's/\(GRANT .*\)/\1;/;s/^\(Grants for .*\)/## \1 ##/;/##/{x;p;x;}'
}
Или используйте percona-toolkit (бывший maatkit) и используйте pt-show-grants
(или mk-show-grants
) для этой цели. Нет необходимости в громоздких скриптах и / или хранимых процедурах.
Вы можете выполнить mysqldump базу данных mysql и импортировать ее в новую; потребуется flush_privileges или перезагрузка, и вы определенно захотите сначала создать резервную копию существующей базы данных mysq.
Чтобы избежать удаления существующих привилегий, убедитесь, что вы добавляете, а не заменяете строки в таблицах привилегий (db, columns_priv, host, func и т. Д.).
Вы также можете сделать это как хранимую процедуру:
CREATE PROCEDURE spShowGrants()
READS SQL DATA
COMMENT 'Show GRANT statements for users'
BEGIN
DECLARE v VARCHAR(64) CHARACTER SET utf8;
DECLARE c CURSOR FOR
SELECT DISTINCT CONCAT(
'SHOW GRANTS FOR ', user, '@', host, ';'
) AS query FROM mysql.user;
DECLARE EXIT HANDLER FOR NOT FOUND BEGIN END;
OPEN c;
WHILE TRUE DO
FETCH c INTO v;
SET @v = v;
PREPARE stmt FROM @v;
EXECUTE stmt;
END WHILE;
CLOSE c;
END
и назови это с
$ mysql -p -e "CALL spShowGrants" mysql
затем направьте вывод через команду Richards sed, чтобы получить резервную копию привилегий.
Как насчет PHP-скрипта? :)
Просмотрите исходный код этого сценария, и вы получите все перечисленные привилегии:
//connect
mysql_select_db("mysql", mysql_connect("localhost","root",""));
//create grants select statements
$rs = mysql_query("SELECT DISTINCT CONCAT('SHOW GRANTS FOR ''', user, '''@''', host, ''';') AS query FROM user");
//iterate through grants
while ($row=mysql_fetch_array($rs)) {
//run grant query
$rs2 = mysql_query($row['query']);
//iterate through results
while($row2 = mysql_fetch_array($rs2)){
//print results
echo $row2[0] . ";\n\n";
}
}
Хотя кажется, что ответ @Richard Bronosky правильный, я столкнулся с этим вопросом после попытки перенести набор баз данных с одного сервера на другой, и решение было намного проще:
server1$ mysqldump -u root -p --all-databases > dbdump.sql
server2$ mysql -u root -p < dbdump.sql
На этом этапе все мои данные были видны, если я вошел в систему как root
, то mysql.user
В таблице было все, что я ожидал, но я не мог войти в систему как любой из других пользователей и нашел этот вопрос, предполагая, что мне придется повторно выпустить GRANT
заявления.
Однако оказывается, что сервер mysql просто необходимо перезапустить для получения обновленных привилегий в mysql.*
таблицы вступают в силу:
server2$ sudo restart mysql
Надеюсь, это поможет кому-то другому достичь того, что должно быть простой задачей!
создайте файл сценария оболочки со следующим кодом:
##############################################3echo "SELECT DISTINCT CONCAT (\"show grants for '\", user, \"'@'\", host, \"';\") AS query FROM mysql.user; " > script.sql
echo "*** You will be asked to enter the root password twice ******"
mysql -u root -p < script.sql > output.sql ;
cat output.sql | grep show > output1.sql ; rm output.sql -f ;
mysql -u root -p < output1.sql > output.sql ;
clear
echo "-----Exported Grants-----"
cat output.sql ; rm output.sql output1.sql -f
echo "-------------------------"
rm script.sql -f
# **** затем запустите его в оболочке следующим образом: вам будет предложено дважды ввести пароль root, а затем на экране отобразится GRANTS SQL. ****
Однострочник делает почти то же самое, что и классный pt-show-grants
:
mysql --skip-column-names -A -e"SELECT CONCAT('SHOW GRANTS FOR ''',user,'''@''',host,''';') FROM mysql.user WHERE user<>''" | mysql --skip-column-names -A | sed 's/$/;/g'
Основан только на инструментах unix, дополнительное программное обеспечение не требуется.
Выполнить из оболочки bash, если у вас есть работающий .my.cnf
где пароль твоего mysql root
пользователя можно прочитать.