Как скопировать пользовательские привилегии с MySQL?

12

У меня есть установка MySQL со многими базами данных и пользователями, которые мне нужно перенести на новую установку MySQL. Я могу использовать phpMyAdmin для экспорта, а затем импортировать базы данных / таблицы, но я ничего не знаю, чтобы переместить пользователей и разрешения. Как я могу сделать это легко?

Натан Осман
источник

Ответы:

17

Сценарий, подобный этому, будет использовать клиент mysql cli для распечатки серии операторов предоставления, которые необходимо использовать для воссоздания учетных записей пользователей. Эта команда будет работать лучше всего, если у вас есть учетные данные базы данных .my.cnf

#!/bin/bash
# adapted from (http://www.pyrosoft.co.uk/blog/2006/10/18/show-grants-for-all-users-on-mysql/)
(
 mysql --batch --skip-column-names -e "SELECT user, host FROM user" mysql 
) | while read user host
do
  echo "# $user @ $host"
  mysql --batch --skip-column-names -e"SHOW GRANTS FOR '$user'@'$host'"
done

Если вы переходите с одной версии mysql на другую, вы можете использовать это вместо простого дампа базы данных mysql. Схема базы данных mysql иногда обновляется.

Это также позволит вам выбирать учетные записи, которые вы хотите воссоздать, если есть какая-то нечистота, которую вы хотели бы устранить.


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

IFS=$'\t'; while read user host; do
  echo "user:$user host:$host"
  mysql --batch --skip-column-names -e"SHOW GRANTS FOR '$user'@'$host'"
  echo ""
done < <(mysql --batch --skip-column-names -e "SELECT user, host FROM mysql.user")
Zoredache
источник
3

Это создаст SHOW GRANTS;файл для каждого пользователя.

Затем введите эхо каждого пользователя SHOW GRANTS;и добавьте точку с запятой в каждую строку.

MYSQL_CONN="-uroot -prootpassword"
SQLSTMT="SELECT CONCAT('SHOW GRANTS FOR ''',user,'''@''',host,''';')"
SQLSTMT="${SQLSTMT} FROM mysql.user WHERE user<>''"
mysql ${MYSQL_CONN} -ANe"${SQLSTMT}" > /tmp/ShowGrants.sql
mysql ${MYSQL_CONN} -ANe < /tmp/ShowGrants.sql | sed 's/$/;/g' > MySQLUserGrants.sql
rm -f /tmp/ShowGrants.sql

Вы также можете скачать и использовать эти инструменты, чтобы сделать то же самое:

Попробуйте!

RolandoMySQLDBA
источник
2

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

pkaeding
источник
В частности таблица mysql.user
Coops
2
Необходимо убедиться, что оба экземпляра MySQL работают с одной и той же основной версией, в противном случае вам нужно будет запустить сценарии обновления, связанные с целевым сервером MySQL.
Максвелл