Как мне сделать резервную копию пользователей MySQL и их привилегий?
Что-нибудь вроде mysqldump?
Я ищу что-то вроде:
mysqldump -d -u root -p MyTable > Schema.sql
Как мне сделать резервную копию пользователей MySQL и их привилегий?
Что-нибудь вроде mysqldump?
Я ищу что-то вроде:
mysqldump -d -u root -p MyTable > Schema.sql
mysql -BNe "select concat('\'',user,'\'@\'',host,'\'') from mysql.user where user != 'root'" | \
while read uh; do mysql -BNe "show grants for $uh" | sed 's/$/;/; s/\\\\/\\/g'; done > grants.sql
Вы можете создать резервную базу данных mysql, используя
mysqldump -u root -p mysql > mysql.sql
и восстановить базу данных mysql, выполнив
mysql -uroot -p mysql < mysql.sql
Не забывайте
FLUSH PRIVILEGES
после восстановления дампа.
Надеюсь, что это поможет...
До сих пор мой опыт работы с MySQL я не видел ничего для резервного копирования пользователя и их привилегий с помощью командной строки.
Но я могу сделать резервную копию этих критически важных данных, создав резервную копию mysql
mysqldump -u root -p mysql > mysql.sql
Пользователи и привилегии хранятся в базе данных с именем "mysql". Вы можете использовать mysqldump для резервного копирования таблиц в базе данных с именем "mysql".
У Percona есть отличный инструмент для этого. pt-show-grants
будет выгружать пользователей и их разрешения, чтобы вы могли легко их перезагрузить.
https://www.percona.com/doc/percona-toolkit/LATEST/pt-show-grants.html
Хорошей практикой является использование скрипта для ежедневного резервного копирования пользователей MySQL и их привилегий. Взгляните на один из них:
#!/bin/sh
HOSTNAME="localhost"
mysql -h $HOSTNAME -B -N -e "SELECT CONCAT('\'', user,'\'@\'', host, '\'') FROM user WHERE user != 'debian-sys-maint' AND user != 'root' AND user != ''" mysql > mysql_all_users_$HOSTNAME.txt
while read line; do mysql -h $HOSTNAME -B -N -e "SHOW GRANTS FOR $line"; done < mysql_all_users_$HOSTNAME.txt > mysql_all_users_$HOSTNAME.sql
sed -i.bak 's/$/;/' mysql_all_users_$HOSTNAME.sql
rm mysql_all_users_$HOSTNAME.txt
rm mysql_all_users_$HOSTNAME.sql.bak
Результатом этого скрипта будет файл mysqldump с пользователями и привилегиями.
Постскриптум Если ваш MySQL требует пароль - поместите -p
или -u username -p
после mysql -h $HOSTNAME
в двух местах.
Приведенные выше сценарии дают общее представление, но они неэффективны. Они разветвляются/исполняют mysql n + 1 раз. Это можно сделать всего за два вызова MySQL
mysql ${logininfo} -B -N -e "SELECT CONCAT('\'',user,'\'@\'',host,'\'') from user where user != 'root'" mysql | \
while read uh
do
echo "SHOW GRANTS FOR ${uh};"
done | mysql ${logininfo} -B -N | sed -e 's/$/;/' > ${outfile}
Если есть пользователи, отличные от root, которые вы не хотите использовать для резервного копирования, или укажите user! = 'what' в предложении where первого вызова mysql.
вероятно, довольно очевидно для командной строки mysql, но для ответа на спину выше нужно было добавить -u root -ppassword после обеих команд mysql
mysql -u root -ppassword -BNe "выберите concat ('\' ', user,'\'@\' ', host,'\'') из mysql.user, где user!= 'root'" | при чтении uh; do mysql -u root -ppassword -BNe "показать гранты за $uh" | sed 's/$/;/; s/\\/\/г '; done > grants.sql;