Назад | Перейти на главную страницу

Как я могу экспортировать привилегии из MySQL, а затем импортировать их на новый сервер?

Я знаю, как экспортировать / импортировать базы данных с помощью 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

Надеюсь, это поможет кому-то другому достичь того, что должно быть простой задачей!

создайте файл сценария оболочки со следующим кодом:

##############################################3
echo "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 пользователя можно прочитать.