it-swarm.xyz

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

Я знаю, как экспортировать/импортировать базы данных, используя mysqldump, и это нормально, но как мне получить права на новый сервер.

Что касается дополнительных баллов, на новой уже есть пара существующих баз данных, как мне импортировать привилегии старых серверов, не удаляя пару существующих.

Старый сервер: сообщество 5.0.67

Новый сервер: 5.0.51a-24 + lenny1

Правка: я получил дамп базы данных "mysql" со ​​старого сервера и теперь хочу знать, как правильно объединить с базой данных "mysql" на новом сервере.

Я попытался выполнить прямой импорт с помощью phpMyAdmin, и в результате возникла ошибка, связанная с дубликатом (который я уже перенес вручную).

У кого-нибудь есть элегантный способ слияния двух баз данных mysql?

90
Gareth

Не связывайтесь с mysql db. Там происходит намного больше, чем просто таблица пользователей. Ваша лучшая ставка - это команда " SHOW GRANTS 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

Это правильный способ перемещения пользователей. Ваш ACL MySQL модифицируется чистым SQL.

171
Bruno Bronosky

Существует два метода извлечения грантов SQL из экземпляра MySQL

МЕТОД №1

Вы можете использовать pt-show-grants из 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

Попробуйте!

48
RolandoMySQLDBA

Ответ Ричарда Броноски был чрезвычайно полезен для меня. Большое спасибо!!!

Вот небольшой вариант, который был полезен для меня. Это полезно для переноса пользователей, например между двумя установками 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;}'
}
15
rmldj

Или используйте percona-toolkit (бывший maatkit) и используйте pt-show-grants (или mk-show-grants) для этой цели. Нет необходимости в громоздких скриптах и ​​/ или хранимых процедурах.

7
MrkiMile

Вы можете mysqldump базу данных "mysql" и импортировать в новую; потребуется flush_privileges или перезагрузка, и вы определенно захотите сначала сделать резервную копию существующей базы данных mysq.

Чтобы избежать удаления существующих привилегий, обязательно добавляйте, а не заменяйте строки в таблицах привилегий (db, columns_priv, Host, func и т.д.).

5
nedm

Как насчет сценария 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";
    }
}
4
Ibrahim Lawal

Вы также можете сделать это как хранимую процедуру:

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, чтобы получить резервную копию привилегий.

4
Lenny

Хотя, похоже, ответ @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
Tom

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

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. ****

2
Rony

One-liner делает почти то же самое, что и удивительный 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 Пользователь может быть прочитан.

0
sjas