Flush privileges mysql для чего
GRANT реализован в MySQL Version 3.22.11 или позже. Для более ранних версий MySQL инструкция GRANT не делает ничего.
Команды GRANT и REVOKE позволяют администраторам системы создавать пользователей, предоставлять и отменять права на MySQL-пользователей в четырех уровнях привилегий:
Если Вы даете привилегии пользователю, который не существует, он будет автоматически создан. За примерами по работе GRANT обратитесь к разделу «4.3.5 Добавление новых пользователей к MySQL».
Для инструкций GRANT и REVOKE аргумент priv_type может быть определен как любой из следующего списка:
В настоящий момент GRANT поддерживает имена хоста, базы данных, таблицы и столбца длиной только до 60 символов. Имя пользователя может быть длиной до 16 символов.
Привилегии для столбца могут быть вычислены следующим образом:
В большинстве случаев Вы предоставляете права пользователю только в одном из уровней привилегии, так что обычно это просто. Детали проверяющей привилегии процедуры подробно рассмотрены в разделе «4.2 Общие проблемы защиты и система привилегий доступа MySQL».
Если пользователь не имеет привилегий на таблице, данная таблица не отображается вообще, когда пользователь запрашивает список таблиц (например, инструкцией SHOW TABLES ).
Вы не можете предоставлять другому пользователю привилегию, которую Вы не имеете сами. Привилегия grant позволяет Вам передавать только те привилегии, которыми Вы реально обладаете.
Вы не должны предоставлять привилегию alter нормальному пользователю. Если Вы это сделаете, пользователь может попробовать разрушить систему привилегии, переименовывая таблицы!
Обратите внимание, что, если Вы используете привилегии столбца или таблицы даже для одного пользователя, сервер исследует привилегии столбца и таблицы для всех пользователей, и это замедлит немного MySQL.
Самые большие различия между ANSI SQL и MySQL версиями оператора GRANT :
Имеются несколько различий между использованием имен и паролей MySQL и Unix или Windows:
Или в кратком виде:
Обратите внимание, что в последнем примере пароль НЕ database_name.
На некоторых системах библиотечный вызов, который MySQL использует для запроса пароля, автоматически урежет пароль до длины в 8 символов. Внутренне MySQL не имеет ограничений на длину пароля.
При запуске mysqld все содержание таблиц предоставления привилегий читается в память и становится действующим.
Когда сервер обращает внимания, что таблицы предоставления были изменены, на существующие подключения пользователей это воздействуют следующим образом:
Изменения глобальных привилегий и пароля воздействуют, когда пользователь соединится в следующий раз.
ОБРАТИТЕ ВНИМАНИЕ: заданные по умолчанию привилегии иные для Windows. Подробности в разделе » 2.6.2.3 Запуск MySQL под Windows».
Вы можете, в MySQL версии 3.22 и выше, использовать инструкцию SET PASSWORD :
Другой способ устанавливать пароль: применить команду mysqladmin :
Как только пароль root был установлен, Вы должны использовать его при соединении с сервером.
Изучение скрипта scripts/mysql_install_db весьма пригодится при сборе информации по созданию и настройке других пользователей.
Если Вы хотите, чтобы начальные привилегии были иными, чем те, которые только что я описал, Вы можете изменять скрипт mysql_install_db прежде, чем Вы его выполните.
Вы можете добавлять пользователей двумя различными путями: используя инструкции GRANT или непосредственно управляя таблицами MySQL.
Вы можете добавлять новых пользователей, выдавая инструкции GRANT :
Эти инструкции GRANT устанавливают трех новых пользователей:
Вы можете также добавлять то же самое, обращаясь к информации непосредственно, выдавая инструкции INSERT и затем сообщая серверу перезагрузить таблицы:
Чтобы установить привилегии пользователя, изменяя таблицы предоставления привилегий непосредственно, выполните эти команды (обратите внимание на вызов FLUSH PRIVILEGES в конце):
Если Вы хотите давать специфический доступ пользователю с любой машины в данном домене, Вы можете выдать инструкцию GRANT таким образом:
Чтобы сделать ту же самую работу, изменяя таблицы предоставления привилегий непосредственно, сделайте так:
ОБРАТИТЕ ВНИМАНИЕ: PASSWORD() не выполняет шифрование пароля так, как это делается в Unix.
Нецелесообразно определять Ваш пароль так, что его могут увидеть другие пользователи. Методы, которые Вы можете использовать, чтобы определить Ваш пароль, когда Вы выполняете программы-клиенты, перечислены ниже, наряду с оценкой рисков каждого метода:
Создание нового пользователя и настройка прав в MySQL
Введение
В статье речь пойдет о работе с пользователями открытой реляционной системы управления базами данных (СУБД) MySQL, появившейся в 1994 году. В 2008 году Sun Microsystems купил MySQL AB, а в 2010 уже Sun была поглощена Oracle. Эти продажи побудили авторов исходной СУБД создать форк — MariaDB, свободный от лицензионных ограничений текущего владельца и совместимый с Oracle MySQL. Помимо «Марии» известен другой форк, Percona, — от Петра Зайцева и Вадима Ткаченко. Оба форка совместимы с MySQL.
БД от Percona обладает дополнительными функциями, направленными на повышение производительности. Многие дистрибутивы (например, Red Hat) перешли на MariaDB из-за предсказуемой лицензионной политики. В своих проектах автор использует MariaDB.
Есть несколько способов работы с БД MySQL: через графические phpMyAdmin, MySQL WorkBench и т.д.
Поскольку работа с пользователями задача больше административная и нерегулярная, рассмотрим наиболее надежный способ — через консоль.
Для этого понадобится минимум — консольный клиент mysql. Запускать его можно на своей рабочей станции (mysql —host= [—user= ] [—password=
] [database]) или через ssh на самом сервере (в случае ОС Linux).
Зачем нужны пользователи
После установки MySQL технически мы можем подключаться из нашего ПО от имени root’а, но это не безопасно. Работая с информационными системами, мы всегда должны помнить и соблюдать принцип наименьших привилегий. Для более безопасной работы и создаются пользователи БД. Привилегии должны быть предоставлены пользователю строго только те, что действительно необходимы.
Администратору MariaDB в работе требуется создавать учетные записи «обычных» пользователей с ограниченным доступом к данным, определять права доступа, при необходимости — создавать дополнительных (привилегированных) суперпользователей. Также важно проводить аудит — просматривать выданные полномочия и корректировать их по мере необходимости.
Пользователи MySQL
Имя пользователя MySQL
В MySQL имя пользователя состоит из 2-х частей: имени пользователя (обязательно) и хоста (может быть опущена, тогда она означает ‘%’):
‘someuser’@’somehost’, аналогично, почтовому адресу.
Поняв это правило, посмотрим, как по умолчанию выглядит суперпользователь. На самом деле полностью учетка записывается трижды: ‘root’@’localhost’, ‘root’@’127.0.0.1’ и ‘root’@’::1’ с одинаковым парольным хешем.
В хостовой части могут использоваться DNS-имена, IP-адреса и символ подстановки %, обозначающий любой (любые) символы.
Примеры записи хоста:
Примечание: имена и адреса следует указывать в том формате, в каком возвращает системный DNS resolver сервера.
Просмотр всех пользователей
Давайте проверим, какие пользователи есть в нашей БД. Выведем основную информацию о пользователях:
Когда список получается большим, мы можем добавить фильтр (в примере — по хостам, начинающимся с msk):
Или использовать в конце модификатор \G, оптимизирующий вывод для отображения в консоли:
Создание нового пользователя MySQL
Новый пользователь в MySQL добавляется командой:
Теперь давайте создадим нашего первого пользователя:
Полезная возможность — добавление комментария:
FLUSH PRIVILEGES
Обратите внимание на эту команду: она дает серверу команду перечитать привилегии. Как следует из документации, команда FLUSH PRIVILEGES в MySQL нужна только в случае прямой модификации таблиц привилегий MySQL операторами типа INSERT, UPDATE или DELETE. Но для простоты запоминания будем указывать ее и для «правильных» операторов таких как GRANT, REVOKE, SET PASSWORD и RENAME USER, как в примере выше и остальных, используемых в статье.
Удаление пользователя MySQL
Для удаления пользователя используется команда
На нашем предыдущем примере:
Создание дополнительного суперпользователя
Это не лучшая практика, но бывают ситуации, когда у СУБД несколько хозяев и всем нужно быть суперпользователями. В MySQL добавить пользователя с root-правами можно так:
Теперь пользователь root безопасно хранится у нас, а для административной работы с БД мы можем передать коллегам или партнерам учетную запись admin.
Отзыв полномочий у пользователя
Команда отзыва привилегий функционально обратна GRANT, “TO” заменяется на “FROM”:
Смена пароля
Для изменения пароля учетной записи пользователя применяется команда ALTER USER:
Предоставление доступа пользователю MySQL
Доступ предоставляется командой:
Допустим, наше ПО использует базу данных test_db. Для его работы мы создали пользователя test_user, а FQDN хоста, где работает ПО — наш локальный хост (localhost). Наше приложение только считывает данные из БД — выполняет SELECT.
Создадим пользователя и БД (часто БД называют схемой, в терминах MySQL):
Команда для предоставления доступа будет выглядеть так:
Наследование привилегий
В предыдущем примере наш пользователь сможет только читать данные из базы test_db, но передать свои права другому пользователю не сможет. Используя GRANT OPTION, мы можем позволить ему сделать это. Тогда пользователь получит возможность передавать другим то, что разрешено ему самому.
В этом примере some_user может поделиться правами на SELECT, INSERT, UPDATE, DELETE для базы some_db.
Из соображений безопасности использовать GRANT OPTION небезопасно! В случае компрометации учетной записи злоумышленник сможет не только получить доступ к данным, но и сделать закладку в виде копии учетной записи.
Доступ к таблице
Примеры выше дают доступ ко всей БД. Часто доступ должен быть ограничен строго определенным набором таблиц:
Выполнение команды приведет к ошибке, т.к. этой таблицы еще нет.
и повторим предоставление доступа:
Доступ к столбцу
Предоставляется перечислением столбцов:
В этом примере пользователю дано право читать идентификатор, читать и менять имя пользователя, а парольный хэш доступен не будет.
Просмотр привилегий пользователей MySQL
Часто возникает задача выяснить полномочия учетной записи или определить, кому дан доступ к базе или таблице. Остановимся на этом подробнее.
Проверка текущих полномочий пользователя
Нам пригодится команда:
Проверка полномочий к данным
Через read-only БД information_schema доступно множество метаданных — системной информации. Информация о доступе на БД (схемы), таблицы и столбцы доступны в таблицах schema_privileges, table_privileges и column_privileges. Работа с ними — обычные SQL-запросы:
Просмотр привилегий через системную БД mysql
Аналогичных результатов можно добиться, обратившись к системным таблицам напрямую.
Информация о пользователях:
Привилегии на базы данных:
Права, назначенные на таблицы:
Просмотр глобальных привилегий
Глобальные полномочия смотрим здесь:
Заключение
Полученная информация поможет выполнить базовые операции при работе с пользователями: создание и удаление учетных записей, предоставление и отзыв привилегий, а также просмотр прав доступа.
При выдаче прав избегайте избыточности. Права не нужно выдавать с запасом, часто выполнение GRANT ALL PRIVILEGES ON *.* TO ‘myUser’@’%’ — не лучший выход. Другой важный момент, часто упускаемый из виду новичками, — наличие в имени хостовой части. Игнорирование хоста может привести к ошибкам.
Всем высоких скоростей, безаварийной работы и долгого аптайма!
Создание пользователя MySQL
После того, как вы установили и настроили MySQL, вам необходимо создать базы данных, таблицы и пользователей. Конечно, вы можете сделать это от имени суперпользователя root, но это не безопасно. Да и большинство приложений не позволят вам такой вольности, например, Phpmyadmin не даст авториrзоваться от имени суперпользователя.
Поэтому для каждой базы данных нужно создавать отдельных пользователей и настраивать для них права. В этой статье мы рассмотрим, как выполняется создание пользователя mysql, а также настройка его прав.
Создание пользователя mysql
1. Как создать пользователя MySQL
Предположим, что база данных уже создана и называется test_database. Нам нужно открыть клиент базы данных. Для этого наберите в терминале:
Теперь можно работать. Для создания пользователя используется команда CREATE USER, её синтаксис такой:
CREATE USER ‘имя_пользователя’ @ ‘хост’ IDENTIFIED BY ‘пароль’ ;
Кроме имени пользователя, здесь нужно задать хост, с которого может авторизоваться этот пользователь. Здесь может быть доменное имя, IP-адрес, адрес подсети или знак «%», который означает все возможные хосты. Это очень удобно, потому что вы можете создать пользователя, к которому можно будет подключится только локально или настроить отдельно права для локального или удалённого пользователя.
Например, давайте создадим локального пользователя test_user с паролем password:
CREATE USER ‘test_user’@’localhost’ IDENTIFIED BY ‘password’;
Или можно создать пользователя, который будет доступен со всех хостов:
CREATE USER ‘test_user’@’%’ IDENTIFIED BY ‘password’;
Смотрим наших пользователей:
SELECT User,Host FROM mysql.user;
Все пользователи созданы.
2. Права пользователя MySQL
Также доступны такие привилегии администрирования баз данных:
Чтобы дать права пользователю MySQL на обновление и добавление записей для базы данных test_database, выполните:
Дальше дадим этому же пользователю все права над этой базой данных:
Теперь посмотрим привилегии нашего пользователя:
SHOW GRANTS FOR ‘test_user’@’localhost’;
Мы видим, что для всех баз данных и таблиц привелегий нет, но зато есть все привилегии для базы данных test_database. Вот так это работает. После обновления прав пользователя необходимо обновить таблицу прав пользователей MySQL в памяти. Для этого выполните:
3. Удаление прав пользователя MySQL
Чтобы отозвать права у пользователя MySQL, используйте команду REVOKE вместо GRANT. Её синтаксис похож на GRANT:
Например, заберём все права на базу данных test_database у нашего пользователя:
4. Создание суперпользователя MySQL
Если вам необходимо создать пользователя со всеми правами MySQL на замену для root, то можно использовать такую конструкцию:
Даём все привилегии для пользователя test_user над всеми базами данными и всеми таблицами. Но наш пользователь не сможет давать права другим пользователям. Чтобы это исправить, нужно дать ему привилегию GRANT, а для этого используется такая команда:
Теперь этот пользователь является суперпользователем для MySQL и, авторизовавшись от его имени в PhpMyAdmin, вы можете делать всё то же самое, что и с помощью root.
Выводы
MySQL: When is Flush Privileges in MySQL really needed?
When creating new tables and a user to go along with it, I usually just invoke the following commands:
I have never ever needed to utilize the FLUSH PRIVILEGES command after issuing the previous two commands. Users can log in and use their database and run PHP scripts which connect to the database just fine. Yet I see this command used in almost every tutorial I look at.
When is the FLUSH PRIVILEGES command really needed and when is it unnecessary?
4 Answers 4
If you modify the grant tables directly using statements such as INSERT, UPDATE, or DELETE, your changes have no effect on privilege checking until you either restart the server or tell it to reload the tables. If you change the grant tables directly but forget to reload them, your changes have no effect until you restart the server. This may leave you wondering why your changes seem to make no difference!
To tell the server to reload the grant tables, perform a flush-privileges operation. This can be done by issuing a FLUSH PRIVILEGES statement or by executing a mysqladmin flush-privileges or mysqladmin reload command.
If you modify the grant tables indirectly using account-management statements such as GRANT, REVOKE, SET PASSWORD, or RENAME USER, the server notices these changes and loads the grant tables into memory again immediately.
Flush privileges mysql для чего
The FLUSH statement has several variant forms that clear or reload various internal caches, flush tables, or acquire locks. Each FLUSH operation requires the privileges indicated in its description.
It is not possible to issue FLUSH statements within stored functions or triggers. However, you may use FLUSH in stored procedures, so long as these are not called from stored functions or triggers. See Section 25.8, “Restrictions on Stored Programs”.
Sending a SIGHUP or SIGUSR1 signal to the server causes several flush operations to occur that are similar to various forms of the FLUSH statement. Signals can be sent by the root system account or the system account that owns the server process. This enables the flush operations to be performed without having to connect to the server, which requires a MySQL account that has privileges sufficient for those operations. See Section 4.10, “Unix Signal Handling in MySQL”.
The following list describes the permitted FLUSH statement flush_option values. For descriptions of the permitted tables_option values, see FLUSH TABLES Syntax.
Closes and reopens any binary log file to which the server is writing. If binary logging is enabled, the sequence number of the binary log file is incremented by one relative to the previous file.
This operation requires the RELOAD privilege.
Closes and reopens any flushable logs for installed storage engines. This causes InnoDB to flush its logs to disk.
This operation requires the RELOAD privilege.
Closes and reopens any error log file to which the server is writing.
This operation requires the RELOAD privilege.
Closes and reopens any general query log file to which the server is writing.
This operation requires the RELOAD privilege.
This operation has no effect on tables used for the general query log (see Section 5.4.1, “Selecting General Query Log and Slow Query Log Output Destinations”).
Empties the host cache and the Performance Schema host_cache table that exposes the cache contents, and unblocks any blocked hosts.
This operation requires the RELOAD privilege.
For information about why host cache flushing might be advisable or desirable, see Section 5.1.12.3, “DNS Lookups and the Host Cache”.
FLUSH HOSTS is deprecated as of MySQL 8.0.23; expect it to be removed in a future MySQL release. Instead, truncate the Performance Schema host_cache table:
The TRUNCATE TABLE operation requires the DROP privilege for the table rather than the RELOAD privilege.
Closes and reopens any log file to which the server is writing.
This operation requires the RELOAD privilege.
The effect of this operation is equivalent to the combined effects of these operations:
Re-reads the cost model tables so that the optimizer starts using the current cost estimates stored in them.
This operation requires the FLUSH_OPTIMIZER_COSTS or RELOAD privilege.
The server writes a warning to the error log for any unrecognized cost model table entries. For information about these tables, see Section 8.9.5, “The Optimizer Cost Model”. This operation affects only sessions that begin subsequent to the flush. Existing sessions continue to use the cost estimates that were current when they began.
Re-reads the privileges from the grant tables in the mysql system schema. As part of this operation, the server reads the global_grants table containing dynamic privilege assignments and registers any unregistered privileges found there.
This operation requires the RELOAD privilege.
Clears the in-memory cache used by the caching_sha2_password authentication plugin. See Cache Operation for SHA-2 Pluggable Authentication.
Closes and reopens any relay log file to which the server is writing. If relay logging is enabled, the sequence number of the relay log file is incremented by one relative to the previous file.
This operation requires the RELOAD privilege.
Closes and reopens any slow query log file to which the server is writing.
This operation requires the RELOAD privilege.
This operation has no effect on tables used for the slow query log (see Section 5.4.1, “Selecting General Query Log and Slow Query Log Output Destinations”).
Flushes status indicators.
This operation requires the FLUSH_STATUS or RELOAD privilege.
This operation adds the session status from all active sessions to the global status variables, resets the status of all active sessions, and resets account, host, and user status values aggregated from disconnected sessions. See Section 27.12.15, “Performance Schema Status Variable Tables”. This information may be of use when debugging a query. See Section 1.6, “How to Report Bugs or Problems”.
Resets all per-hour user resource indicators to zero.
This operation requires the FLUSH_USER_RESOURCES or RELOAD privilege.
Resetting resource indicators enables clients that have reached their hourly connection, query, or update limits to resume activity immediately. FLUSH USER_RESOURCES does not apply to the limit on maximum simultaneous connections that is controlled by the max_user_connections system variable. See Section 6.2.21, “Setting Account Resource Limits”.
FLUSH TABLES Syntax
Closes all open tables, forces all tables in use to be closed, and flushes the prepared statement cache.
This operation requires the FLUSH_TABLES or RELOAD privilege.
With a list of one or more comma-separated table names, this operation is like FLUSH TABLES with no names except that the server flushes only the named tables. If a named table does not exist, no error occurs.
This operation requires the FLUSH_TABLES or RELOAD privilege.
Closes all open tables and locks all tables for all databases with a global read lock.
This operation requires the FLUSH_TABLES or RELOAD privilege.
This operation is a very convenient way to get backups if you have a file system such as Veritas or ZFS that can take snapshots in time. Use UNLOCK TABLES to release the lock.
FLUSH TABLES WITH READ LOCK acquires a global read lock rather than table locks, so it is not subject to the same behavior as LOCK TABLES and UNLOCK TABLES with respect to table locking and implicit commits:
Flushes and acquires read locks for the named tables.
This operation requires the FLUSH_TABLES or RELOAD privilege. Because it acquires table locks, it also requires the LOCK TABLES privilege for each table.
This operation applies only to existing base (non- TEMPORARY) tables. If a name refers to a base table, that table is used. If it refers to a TEMPORARY table, it is ignored. If a name applies to a view, an ER_WRONG_OBJECT error occurs. Otherwise, an ER_NO_SUCH_TABLE error occurs.
Use UNLOCK TABLES to release the locks, LOCK TABLES to release the locks and acquire other locks, or START TRANSACTION to release the locks and begin a new transaction.
This FLUSH TABLES variant applies to InnoDB tables. It ensures that changes to the named tables have been flushed to disk so that binary table copies can be made while the server is running.
This operation requires the FLUSH_TABLES or RELOAD privilege. Because it acquires locks on tables in preparation for exporting them, it also requires the LOCK TABLES and SELECT privileges for each table.
The operation works like this:
It acquires shared metadata locks for the named tables. The operation blocks as long as other sessions have active transactions that have modified those tables or hold table locks for them. When the locks have been acquired, the operation blocks transactions that attempt to update the tables, while permitting read-only operations to continue.
The operation notifies the storage engine for each table to make the table ready for export. The storage engine must ensure that any pending changes are written to disk.
The operation puts the session in lock-tables mode so that the metadata locks acquired earlier are not released when the FOR EXPORT operation completes.
This operation applies only to existing base (non- TEMPORARY ) tables. If a name refers to a base table, that table is used. If it refers to a TEMPORARY table, it is ignored. If a name applies to a view, an ER_WRONG_OBJECT error occurs. Otherwise, an ER_NO_SUCH_TABLE error occurs.
For the procedure to reimport the copied table data into a MySQL instance, see Section 15.6.1.3, “Importing InnoDB Tables”.
After you are done with the tables, use UNLOCK TABLES to release the locks, LOCK TABLES to release the locks and acquire other locks, or START TRANSACTION to release the locks and begin a new transaction.











