Создайте нового пользователя в MySQL и предоставьте ему полный доступ к одной базе данных.


628

Я хочу создать нового пользователя в MySQL и дать ему полный доступ только к одной базе данных, скажем dbTest, которую я создаю с помощью команды like create database dbTest;. Какими будут команды MySQL для этого?

Ответы:


829

Попробуйте это, чтобы создать пользователя:

CREATE USER 'user'@'hostname';

Попробуйте это, чтобы дать ему доступ к базе данных dbTest:

GRANT ALL PRIVILEGES ON dbTest.* To 'user'@'hostname' IDENTIFIED BY 'password';

Если вы выполняете код / ​​сайт, обращающийся к MySQL на той же машине, имя хоста будет localhost.

Теперь сломаться.

GRANT - Эта команда используется для создания пользователей и предоставления прав на базы данных, таблицы и т. Д.

ALL PRIVILEGES- Это говорит о том, что у пользователя будут все стандартные привилегии. Это не включает привилегию использовать команду GRANT как бы то ни было.

dbtest.*- Эта инструкция MySQL для применения этих прав для использования во всей базе данных dbtest. Вы можете заменить * определенными именами таблиц или хранить процедуры, если хотите.

TO 'user'@'hostname'- «пользователь» - это имя пользователя учетной записи, которую вы создаете. Примечание: там должны быть одинарные кавычки. «hostname» сообщает MySQL, с каких хостов пользователь может подключиться. Если вы хотите использовать его только на одной машине, используйтеlocalhost

IDENTIFIED BY 'password' - Как вы уже догадались, это устанавливает пароль для этого пользователя.


82
Если вы разрешаете доступ к сети и хотите установить соединение с любого хоста, вы можете изменить «имя хоста» на «%». Например, ... TO 'dbuser' @ '%' IDENTIFIED ... '%' является групповым символом хоста.
физика Майкл

17
Не забывайте сбрасывать привилегии при работе с пользователями и таблицами! :-)
corsiKa

31
Это сработало для меня: CREATE USER 'user1' @ 'localhost', ИДЕНТИФИЦИРОВАНЫМ 'паролем'; ПРЕДОСТАВЛЯЙТЕ ВСЕ ПРИВИЛЕГИИ В db_database1. * «User1» @ «localhost», идентифицированному «паролем»; ПРИВИЛЕГИИ ПРОМЫВКИ;
Мохамад Факих

4
@DanMcGrath: является ли обязательным условие IDENTIFIED BY 'пароль', если пользователь уже существует и имеет пароль?
нанософт

8
Использование GRANT для создания нового пользователя будет удалено в будущих выпусках MySQL (на момент написания этого не рекомендуется). В будущем это нужно будет сделать двумя вызовами: CREATE USER, затем GRANT.
Даррен Фелтон

325

Синтаксис

Чтобы создать пользователя в MySQL / MariaDB 5.7.6 и выше, используйте CREATE USERсинтаксис :

CREATE USER 'new_user'@'localhost' IDENTIFIED BY 'new_password';

затем, чтобы предоставить всем доступ к базе данных (например my_db), используйте GRANTсинтаксис , например

GRANT ALL ON my_db.* TO 'new_user'@'localhost';

Где ALL( priv_type ) может быть заменен на определенной привилегии , такие как SELECT, INSERT, UPDATE, ALTER, и т.д.

Затем для перезагрузки вновь назначенных разрешений выполните:

FLUSH PRIVILEGES;

проведение

Для запуска вышеуказанных команд вам нужно запустить mysqlкоманду и ввести их в командной строке, а затем выйти из системы по quitкоманде или Ctrl- D.

Для запуска из оболочки используйте -eпараметр (замените SELECT 1на одну из приведенных выше команд):

$ mysql -e "SELECT 1"

или выведите выписку из стандартного ввода:

$ echo "FOO STATEMENT" | mysql

Если у вас есть Доступ запрещен с помощью выше, укажите -u(для пользователя) и -p(для пароля) параметры, или для долгосрочного доступа установите свои учетные данные ~/.my.cnf, например,

[client]
user=root
password=root

Интеграция с оболочкой

Для людей, не знакомых с синтаксисом MySQL, вот удобные функции оболочки, которые легко запомнить и использовать (чтобы использовать их, вам нужно загрузить функции оболочки, включенные ниже).

Вот пример:

$ mysql-create-user admin mypass
| CREATE USER 'admin'@'localhost' IDENTIFIED BY 'mypass'

$ mysql-create-db foo
| CREATE DATABASE IF NOT EXISTS foo

$ mysql-grant-db admin foo
| GRANT ALL ON foo.* TO 'admin'@'localhost'
| FLUSH PRIVILEGES

$ mysql-show-grants admin
| SHOW GRANTS FOR 'admin'@'localhost'
| Grants for admin@localhost                                                                                   
| GRANT USAGE ON *.* TO 'admin'@'localhost' IDENTIFIED BY PASSWORD '*6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4' |
| GRANT ALL PRIVILEGES ON `foo`.* TO 'admin'@'localhost'

$ mysql-drop-user admin
| DROP USER 'admin'@'localhost'

$ mysql-drop-db foo
| DROP DATABASE IF EXISTS foo

Чтобы использовать вышеупомянутые команды, вам нужно скопировать и вставить следующие функции в ваш rc- файл (например .bash_profile) и перезагрузить вашу оболочку или исходный файл. В этом случае просто введите source .bash_profile:

# Create user in MySQL/MariaDB.
mysql-create-user() {
  [ -z "$2" ] && { echo "Usage: mysql-create-user (user) (password)"; return; }
  mysql -ve "CREATE USER '$1'@'localhost' IDENTIFIED BY '$2'"
}

# Delete user from MySQL/MariaDB
mysql-drop-user() {
  [ -z "$1" ] && { echo "Usage: mysql-drop-user (user)"; return; }
  mysql -ve "DROP USER '$1'@'localhost';"
}

# Create new database in MySQL/MariaDB.
mysql-create-db() {
  [ -z "$1" ] && { echo "Usage: mysql-create-db (db_name)"; return; }
  mysql -ve "CREATE DATABASE IF NOT EXISTS $1"
}

# Drop database in MySQL/MariaDB.
mysql-drop-db() {
  [ -z "$1" ] && { echo "Usage: mysql-drop-db (db_name)"; return; }
  mysql -ve "DROP DATABASE IF EXISTS $1"
}

# Grant all permissions for user for given database.
mysql-grant-db() {
  [ -z "$2" ] && { echo "Usage: mysql-grand-db (user) (database)"; return; }
  mysql -ve "GRANT ALL ON $2.* TO '$1'@'localhost'"
  mysql -ve "FLUSH PRIVILEGES"
}

# Show current user permissions.
mysql-show-grants() {
  [ -z "$1" ] && { echo "Usage: mysql-show-grants (user)"; return; }
  mysql -ve "SHOW GRANTS FOR '$1'@'localhost'"
}

Примечание. Если вы предпочитаете не оставлять следы (например, пароли) в своей истории Bash, установите флажок: Как предотвратить отображение команд в истории Bash?


1
Вам нужно создать пользователя и предоставить привилегии отдельно? Я обнаружил, что команда grant создает самого пользователя, по крайней мере, глядя в таблицу mysql.user, она выглядит именно так.
Тим

@CreativityKills Будет работать с паролем, если вы добавите их в свой, ~/.my.cnfкак предложено выше.
Кенорб

Оставлять следы пароля в истории оболочки - не
самая лучшая

@dmirkitanov Вы можете предотвратить это, добавив пробел, см .: Как предотвратить отображение команд в истории bash?
Кенорб

58

Создать пользователя и предоставить все привилегии для базы данных.

Войдите в MySQL:

mysql -u root

Теперь создайте и предоставьте

GRANT ALL PRIVILEGES ON dbTest.* To 'user'@'hostname' IDENTIFIED BY 'password';

Анонимный пользователь (только для локального тестирования)

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

GRANT ALL PRIVILEGES ON dbTest.* To ''@'hostname'

Знать

Это хорошо для ненужных данных в разработке. Не делайте этого с тем, что вас волнует.


3
Вы можете создать анонимного пользователя, но не надо! Нет веской причины иметь пользователя с полными привилегиями и без пароля, но он может испортить вам день / год / бизнес / работу, если кто-то получит доступ к вашему серверу, но не должен иметь его. Зачем им что-то еще проще?
Люк Казинс

2
Если кто-то получил удаленный доступ к моему macbook, у меня есть больше поводов для беспокойства, чем содержимое моей базы данных разработки. Я должен повторить, это только для локального тестирования, не делайте этого с реальными данными.
Сверхсветовой

4
Точно, со всеми этими другими вещами, о которых нужно беспокоиться, также не беспокойтесь о содержимом вашей базы данных разработчиков. Ваша база данных разработчиков может (вероятно, будет) иметь фрагменты данных базы данных в реальном времени (например, для воспроизведения ошибки), которые должны быть приложены все усилия для обеспечения безопасности. Просто нет необходимости иметь доступ к базе данных без пароля. Это даже не экономит время. Не стоит потенциальных хлопот.
Люк Казинс

1
Может быть. В моем случае это ненужные данные, я буду жить с риском.
суперсветовой

17
$ mysql -u root -p -e "grant all privileges on dbTest.* to
`{user}`@`{host}` identified by '{long-password}'; flush privileges;"

игнорируйте опцию -p , если у пользователя mysql нет пароля, или просто нажмите кнопку «[Enter]», чтобы пропустить. строки, окруженные фигурными скобками, необходимо заменить фактическими значениями.


13

Вы можете создавать новых пользователей с помощью оператора CREATE USER и предоставлять им права с помощью GRANT .


СОЗДАТЬ ПОЛЬЗОВАТЕЛЯ 'jeffrey' @ 'localhost', ИДЕНТИФИЦИРОВАННОГО 'mypass';
cgl

6

Для меня это сработало.

CREATE USER 'spowner'@'localhost' IDENTIFIED BY '1234'; 
GRANT ALL PRIVILEGES ON test.* To 'spowner'@'localhost'; 
FLUSH PRIVILEGES;

где

  • spowner: имя пользователя
  • 1234: пароль владельца
  • тест: база данных «spowner» имеет право доступа к

2

Команда ниже будет работать, если вы хотите создать нового пользователя и предоставить ему все права доступа к определенной базе данных (не ко всем базам данных в вашем Mysql) на вашем локальном хосте.

GRANT ALL PRIVILEGES ON test_database.* TO 'user'@'localhost' IDENTIFIED BY 'password';

Это предоставит все привилегии одной базе данных test_database(в вашем случае dbTest) этому пользователю на локальном хосте.

Проверьте, какие разрешения предоставлены вышеупомянутой командой этому пользователю, выполнив приведенную ниже команду.

SHOW GRANTS FOR 'user'@'localhost'

На всякий случай, если вы хотите ограничить доступ пользователя только одной таблицей

GRANT ALL ON mydb.table_name TO 'someuser'@'host';

Синтаксическая ошибка & опечатка в первой строке, "PRIVILEGES ON 'test_datase'" не должна содержать кавычек, после нее должна быть буква ". *", Например, test_datase. *, И это опечатка, должна быть "test_database ».
Бреттинс

0

В случае, если hostчасть не указана, по умолчанию используется подстановочный знак %, разрешающий все узлы.

CREATE USER 'service-api';

GRANT ALL PRIVILEGES ON the_db.* TO 'service-api' IDENTIFIED BY 'the_password'

SELECT * FROM mysql.user;
SHOW GRANTS FOR 'service-api'
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.