🐧 MySQL – Как сделать резервную копию пользовательских привилегий таких как CREATE USER и / или GRANT

Мануал

Вопрос: Как сделать резервную копию пользователей и их привилегий в виде операторов 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 и более ранних версиях это создаст пользователей с пустыми паролями!

Добавить комментарий