У меня есть установка MySQL с множеством баз данных и пользователей, которых мне нужно перенести на новую установку MySQL. Я могу использовать phpMyAdmin для экспорта, а затем импорта баз данных / таблиц, но я ничего не знаю, чтобы переместить пользователей и разрешения. Как мне это легко сделать?
Сценарий, подобный этому, будет использовать клиент 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")
Это создаст 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
Вы также можете скачать и использовать эти инструменты для того же:
Попробуйте !!!
Я считаю, что вы сможете перенести эти данные, создав резервную копию и восстановив mysql
база данных.