Как скопировать пользовательские привилегии с 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")

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

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

Попробуйте!


2

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


В частности таблица mysql.user
Coops

2
Необходимо убедиться, что оба экземпляра MySQL работают с одной и той же основной версией, в противном случае вам нужно будет запустить сценарии обновления, связанные с целевым сервером MySQL.
Максвелл
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.