Search the MySQL manual:
MySQL Manual

Buy this Reference Manual in softcover from Barnes & Noble!

/ / Up / Table of Contents

4.3.5 Добавление новых пользователей в MySQL

Пользователей можно добавлять двумя различными способами - при помощи команды GRANT или напрямую в таблицы назначения привилегий MySQL. Предпочтительнее использовать команду GRANT - этот способ проще и дает меньше ошибок. See section 4.3.1 Синтаксис команд GRANT и REVOKE.

Существует также большое количество программ (таких как phpmyadmin), которые служат для создания и администрирования пользователей. @xref{Portals}.

В приведенных ниже примерах демонстрируется, как использовать клиент mysql для задания новых пользователей. В примерах предполагается, что привилегии установлены в соответствии с принятыми по умолчанию значениями, описанными в предыдущем разделе. Это означает, что для внесения изменений на том же компьютере, где запущен mysqld, необходимо подсоединиться к серверу как пользователь MySQL root, и у пользователя root должна быть привилегия INSERT для базы данных mysql, а также административная привилегия RELOAD. Кроме того, если был изменен пароль пользователя root, его необходимо указать здесь для команды mysql.

Новых пользователей можно добавлять, используя команду GRANT:

shell> mysql --user=root mysql
mysql> GRANT ALL PRIVILEGES ON *.* TO monty@localhost
    ->     IDENTIFIED BY 'some_pass' WITH GRANT OPTION;
mysql> GRANT ALL PRIVILEGES ON *.* TO monty@"%"
        -> IDENTIFIED BY 'some_pass' WITH GRANT OPTION;
mysql> GRANT RELOAD,PROCESS ON *.* TO admin@localhost;
mysql> GRANT USAGE ON *.* TO dummy@localhost;

Эти команды GRANT создают трех новых пользователей:

monty
Полноценный суперпользователь - он может подсоединяться к серверу откуда угодно, но должен использовать для этого пароль some_pass. Обратите внимание на то, что мы должны применить операторы GRANT как для monty@localhost, так и для monty@"%". Если не добавить запись с localhost, запись анонимного пользователя для localhost, которая создается при помощи mysql_install_db, будет иметь преимущество при подсоединении с локального компьютера, так как в ней указано более определенное значение для поля Host, и она расположена раньше в таблице user.
admin
Пользователь, который может подсоединяться с localhost без пароля; ему назначены административные привилегии RELOAD и PROCESS. Эти привилегии позволяют пользователю запускать команды mysqladmin reload, mysqladmin refresh и mysqladmin flush-*, а также mysqladmin processlist. Ему не назначено никаких привилегий, относящихся к базам данных (их можно назначить позже, дополнительно применив оператор GRANT).
dummy
Пользователь, который может подсоединяться к серверу без пароля, но только с локального компьютера. Все глобальные привилегии установлены в значение 'N'-тип привилегии USAGE, который позволяет создавать пользователей без привилегий. Предполагается, что относящиеся к базам данных привилегии будут назначены позже.

Можно напрямую добавить точно такую же информацию о пользователе при помощи оператора INSERT, а затем дать серверу команду перезагрузить таблицы назначения привилегий:

shell> mysql --user=root mysql
mysql> INSERT INTO user VALUES('localhost','monty',PASSWORD('some_pass'),
    ->              'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');
mysql> INSERT INTO user VALUES('%','monty',PASSWORD('some_pass'),
    ->              'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');
mysql> INSERT INTO user SET Host='localhost',User='admin',
    ->               Reload_priv='Y', Process_priv='Y';
mysql> INSERT INTO user (Host,User,Password)
    ->               VALUES('localhost','dummy','');
mysql> FLUSH PRIVILEGES;

В зависимости от версии MySQL в примере, приведенном выше, может указываться различное количество значений 'Y' (в версиях до Version 3.22.11 было меньше столбцов привилегий). Для пользователя admin используется более удобочитаемый расширенный синтаксис команды INSERT, который доступен начиная с версии 3.22.11.

Обратите внимание: чтобы создать суперпользователя, необходимо создать запись таблицы user с полями привилегий, установленными в значение 'Y'. Нет необходимости задавать значения в записях таблиц db или host.

Столбцы привилегий в таблице user в последнем операторе INSERT (для пользователя dummy) не были заданы явно, поэтому данным столбцам был присвоено принятое по умолчанию значение 'N'. Точно так же действует команда GRANT USAGE.

В приведенном ниже примере добавляется пользователь custom, который может подсоединяться с компьютеров localhost, server.domain и whitehouse.gov. Он хочет получать доступ к базе данных bankaccount только с компьютера localhost, к базе данных expenses - только с whitehouse.gov, и к базе данных customer - со всех трех компьютеров, а также использовать пароль stupid при подсоединении со всех трех компьютеров.

Чтобы задать эти привилегии пользователя при помощи оператора GRANT, выполните следующие команды:

shell> mysql --user=root mysql
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
    ->         ON bankaccount.*
    ->         TO custom@localhost
    ->     IDENTIFIED BY 'stupid';
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
    ->     ON expenses.*
    ->     TO [email protected]
    ->     IDENTIFIED BY 'stupid';
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
    ->     ON customer.*
    ->     TO custom@'%'
    ->     IDENTIFIED BY 'stupid';

Привилегии для пользователя custom мы назначаем потому, что этот пользователь хочет получать доступ к MySQL как с локального компьютера через сокеты Unix, так и с удаленного компьютера whitehouse.gov через протокол TCP/IP.

Чтобы задать привилегии пользователя путем непосредственного внесения изменений в таблицы назначения привилегий, выполните следующие команды (обратите внимание на команду FLUSH PRIVILEGES в конце примера):

shell> mysql --user=root mysql
mysql> INSERT INTO user (Host,User,Password)
    -> VALUES('localhost','custom',PASSWORD('stupid'));
mysql> INSERT INTO user (Host,User,Password)
    -> VALUES('server.domain','custom',PASSWORD('stupid'));
mysql> INSERT INTO user (Host,User,Password)
    -> VALUES('whitehouse.gov','custom',PASSWORD('stupid'));
mysql> INSERT INTO db
    -> (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,
    -> Create_priv,Drop_priv)
    -> VALUES
    -> ('localhost','bankaccount','custom','Y','Y','Y','Y','Y','Y');
mysql> INSERT INTO db
    -> (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,
    -> Create_priv,Drop_priv)
    -> VALUES
    -> ('whitehouse.gov','expenses','custom','Y','Y','Y','Y','Y','Y');
mysql> INSERT INTO db
    -> (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,
    -> Create_priv,Drop_priv)
    -> VALUES('%','customer','custom','Y','Y','Y','Y','Y','Y');
mysql> FLUSH PRIVILEGES;

Первые три оператора INSERT добавляют в таблицу user записи, которые позволят пользователю custom подключаться с различных компьютеров с указанным паролем, но не дают ему никаких привилегий (все привилегии установлены в принятое по умолчанию значение 'N'). Следующие три оператора INSERT добавляют записи в таблицу db, в которой назначаются привилегии для пользователя custom по отношению к базам данных bankaccount, expenses и customer, но только если доступ осуществляется с определенных компьютеров. Как обычно, после внесения изменений непосредственно в таблицы назначения привилегий серверу необходимо дать команду на перезагрузку этих таблиц (при помощи FLUSH PRIVILEGES), чтобы внесенные изменения вступили в силу.

Если необходимо предоставить определенному пользователю доступ с любого компьютера к определенному домену, можно воспользоваться оператором GRANT следующим образом:

mysql> GRANT ...
    ->         ON *.*
    ->     TO myusername@"%.mydomainname.com"
    ->     IDENTIFIED BY 'mypassword';

Чтобы сделать то же самое путем непосредственного внесения изменений в таблицы назначения привилегий, выполните следующие действия:

mysql> INSERT INTO user VALUES ('%.mydomainname.com', 'myusername',
    ->                 PASSWORD('mypassword'),...);
mysql> FLUSH PRIVILEGES;

Можно также воспользоваться программами xmysqladmin, mysql_webadmin и даже xmysql, чтобы вставить, обновить или изменить значения в таблицах назначения привилегий. Эти утилиты можно найти в каталоге Contrib веб-сайта MySQL (http://www.mysql.com/Downloads/Contrib/).

User Comments

Posted by on Saturday February 16 2002, @10:21pm [Delete] [Edit]

!!! Process_priv=N does not generally mean NOT,

also:

4.5.6.6 SHOW PROCESSLIST
http://www.mysql.com/doc/S/H/SHOW_PROCESSLIST.html

"If you have the process privilege, you can see
all threads.
Otherwise, you can see only your own threads."

Posted by Paul on Saturday February 16 2002, @10:21pm [Delete] [Edit]

Newbies: replace ('new_password'); with your
desired password for accessing MySQL. Include
the single quotes and dont forget the semi-colon
at the end if the example has one.

Posted by Elaine Seery on Friday February 22 2002, @5:55am [Delete] [Edit]

How to remove users? It seems you have to do it
directly on the user table e.g. delete from user
where user='dummy';

I'm not sure if it's necessary to revoke
privileges first. Check also the Grant and Revoke
page.

Posted by on Thursday May 30 2002, @3:51pm [Delete] [Edit]

I just like to point out, that user@domain is NOT
a unix user, as I initially thought it was... I
only went and added a user called faq on my local
machine before someone told me it wasnt the same.

For some reason, it doesnt seem to say that here.

Posted by Adam Newby on Thursday March 14 2002, @2:05am [Delete] [Edit]

To allow a user to execute 'SHOW MASTER STATUS',
set 'Process_priv' to 'Y'

Posted by Alan on Sunday March 31 2002, @3:29pm [Delete] [Edit]

How can I add a user that has full rights to his
database only but cannot see test or mysql database?

Posted by Martin Meredith on Thursday April 11 2002, @7:44am [Delete] [Edit]

to add a user with access to only their database
do as so

GRANT USAGE ON *.* TO 'user'@'host'

GRANT Select, Insert, Update, Delete, Create,
Drop ON `database`.* TO 'user'@'host'

FLUSH PRIVELEGS

Posted by Martin Meredith on Thursday April 11 2002, @7:45am [Delete] [Edit]

oh, and dont forget the ;'s like I did!

Posted by babji L on Thursday April 25 2002, @2:52am [Delete] [Edit]

I am getting "User table: read only" all the
time, even after I started mysqld as root
# mysqld -u=root

Thanks

Posted by [name withheld] on Monday August 26 2002, @1:25pm [Delete] [Edit]

This guide is handy if you know what databases
someone will be using. What if I want to add users
who have the right to create databases, but not to
access anyone else's databases?

Posted by on Wednesday August 28 2002, @7:47am [Delete] [Edit]

it seems that a user who has grant privilege can
grant access to a(his) database to another user
although this other user doen't exist - in this case
the other user is newly created! can cause a mess in
your usertable when you have a site with some
databases to administer.

Posted by on Tuesday September 17 2002, @3:43am [Delete] [Edit]

Unfortunately this section does not show how to
give a user access to all databases, and then
exclude or limit access to a specific database(s).
This should really be in this section as well.
For example, it is wise to still exclude a "power"
user from the mysql database, because they can
surmount all permissions set to them!!!

Posted by on Friday October 18 2002, @9:49pm [Delete] [Edit]

I followed the example for the user 'monty' and
still could
not get access until I also did a grant to
monty@hostname
where hostname is the name of the local host. I
don't
know why this was necessary. Would be nice to
have
an example of a grant command that will add a user
and
give him the power to create a database and fiddle
with it
and nothing else.

Posted by Stephen Kawamoto on Sunday December 1 2002, @8:39pm [Delete] [Edit]

This documentation helped with my problem where
the error
"[hostname] is not allowed to connect to this
MySQL server"
kept appearing.

It helped me create in the appropriate database the
necessary users, hosts and passwords allowed to
remotely access the MYSQL server.

Posted by on Monday February 10 2003, @9:28am [Delete] [Edit]

Please advice: PostgreSQL / MySQL (DBA)

We have a Solaris operation system and about 600 users who are students. Is it possible to use somehow for DB login and authentication user's UNIX login & password (from /etc/passwd) without creating them manually. Any other ways of doing that, personal experience?

Sorry i did not find any particular good forum to ask this question :-(

Regards, alex

Posted by [name withheld] on Sunday February 16 2003, @7:28pm [Delete] [Edit]

For anyone who runs into the problem of all your tables being 'read-only' even for the root user, the problem is most likely that you just copied the mysql data files from a Win NT/2k/XP system to a Unix/Linux system. This wont work. You sould use mysqldump on the NT/2k/XP system and then import the SQL file into the Unix/Linux system.

Posted by Philip Fizur on Monday March 3 2003, @6:18am [Delete] [Edit]

I think this site was very helpful if you are working in an ideal environment. I have a decent amount of experience with Linux and had just setup a new Debian box with a fresh install of mySQL so I knew everything was straight from the get go. If you are new to things, or working on an old or modified system, espcilly one you don't personally adminsiter, some of the things here just won't apply but it's better then anything you'd get from Microsoft!

Add your own comment.

Top / / / Up / Table of Contents