Вопрос: Как сделать резервную копию пользователей и их привилегий в виде операторов CREATE USER и / или GRANT?
Метод, который вы можете использовать, зависит от версии MySQL, которую вы используете.
Содержание
MySQL 5.7 и новее
В MySQL 5.7 и более поздних версиях рекомендуемый способ резервного копирования пользователей – использовать mysqlpump.
Инструмент имеет встроенную поддержку для резервного копирования пользователей и их привилегий с помощью опции –users:
$ mysqlpump --exclude-databases=% --users
Примечание. Может потребоваться добавить параметры подключения, такие как –socket, –host, –port и т. д.
MySQL 5.6 и более старые
Самый простой способ сделать это – автоматически генерировать запросы и передавать их обратно в MySQL:
$ mysql --skip-column-names --execute "SELECT CONCAT('SHOW GRANTS FOR ', QUOTE(user), '@', QUOTE(host), ';') FROM mysql.user" | mysql --skip-column-names
Примечание. Может потребоваться добавить параметры подключения, такие как –socket, –host, –port и т. д.
Будут созданы операторы GRANT, необходимые для каждого пользователя, однако в конце в качестве разделителя не будет точки с запятой.
Чтобы добавить точку с запятой, вы можете использовать команду sed, или в Windows конструкцию FOR:
Используя sed:
$ mysql --skip-column-names --execute "SELECT CONCAT('SHOW GRANTS FOR ', QUOTE(user), '@', QUOTE(host), ';') FROM mysql.user" | mysql --skip-column-names | sed -e 's/$/;/'
Используя FOR:
FOR /F "usebackq delims=" %G IN (`mysql --skip-column-names --execute "SELECT CONCAT('SHOW GRANTS FOR ', QUOTE(user), '@', QUOTE(host), ';') FROM mysql.user" | mysql --skip-column-names`) DO echo %G;
Для экспорта в MySQL 5.7 и новее
В MySQL 5.7 стало устаревшим создавать пользователя с помощью оператора GRANT, а в MySQL 8.0 он вообще больше не поддерживается.
Вместо этого пользователь создается с помощью оператора CREATE USER.
Примечание: CREATE USER также существует в более ранней версии MySQL, но с ограниченной поддержкой опций. Например, не полностью поддерживается указание плагина аутентификации и пароля.
Вы можете сгенерировать операторы CREATE USER с помощью следующего запроса:
$ mysql --silent --skip-column-names --execute "SELECT CONCAT('CREATE USER ', QUOTE(user), '@', QUOTE(host), IF(LENGTH(plugin) > 0, CONCAT(' IDENTIFIED WITH ', plugin, IF(LENGTH(password) > 0, CONCAT(' AS ', QUOTE(password)), '')), IF(LENGTH(password) > 0, CONCAT(' IDENTIFIED BY PASSWORD ', QUOTE(password)), '')), ';') FROM mysql.user"
Операторы GRANT можно экспортировать, как указано выше, но вам нужно будет удалить часть, устанавливающую пароль.
В Linux вы можете сделать это, например, с помощью sed, например:
$ mysql --skip-column-names --execute "SELECT CONCAT('SHOW GRANTS FOR ', QUOTE(user), '@', QUOTE(host), ';') FROM mysql.user" | mysql --skip-column-names | sed -e "s/ IDENTIFIED BY PASSWORD '.*'//"
Важное примечание: пример должен использоваться только для резервного копирования пользователей, которые будут импортированы в MySQL 5.7 или более позднюю. В MySQL 5.6 и более ранних версиях это создаст пользователей с пустыми паролями!