Spec-Zone.ru › MySQL 5.7

21.6.13 Распределённые привилегии с использованием общих таблиц предоставления

Кластер NDB поддерживает распределение пользователей MySQL и привилегий по всем узлам SQL в кластере NDB. Эта поддержка по умолчанию отключена; необходимо следовать процедуре, описанной в данном разделе.

Обычно таблицы привилегий пользователей каждого сервера MySQL в базе данных mysql должны использовать движок хранения MyISAM, что означает, что учётная запись пользователя и её связанные привилегии, созданные на одном узле SQL, недоступны на других узлах SQL кластера. Файл SQL ndb_dist_priv.sql, предоставляемый с дистрибутивом NDB Cluster, можно найти в каталоге share в каталоге установки MySQL.

Первый шаг для включения распределённых привилегий — это загрузка этого скрипта в сервер MySQL, который функционирует как узел SQL (который далее обозначается как целевой узел SQL или сервер MySQL). Это можно сделать, выполнив следующую команду из системной оболочки на целевом узле SQL после перехода в каталог установки MySQL (где options обозначает любые дополнительные параметры, необходимые для подключения к этому узлу SQL):

$> mysql options -uroot < share/ndb_dist_priv.sql

Импорт ndb_dist_priv.sql создаёт ряд хранимых процедур (шесть хранимых процедур и одну хранимую функцию) в базе данных mysql на целевом узле SQL. После подключения к узлу SQL в клиенте mysql (как пользователь MySQL root) можно проверить, что они были созданы, как показано ниже:

mysql> SELECT ROUTINE_NAME, ROUTINE_SCHEMA, ROUTINE_TYPE
    ->     FROM INFORMATION_SCHEMA.ROUTINES
    ->     WHERE ROUTINE_NAME LIKE 'mysql_cluster%'
    ->     ORDER BY ROUTINE_TYPE;
+---------------------------------------------+----------------+--------------+
| ROUTINE_NAME                                | ROUTINE_SCHEMA | ROUTINE_TYPE |
+---------------------------------------------+----------------+--------------+
| mysql_cluster_privileges_are_distributed    | mysql          | FUNCTION     |
| mysql_cluster_backup_privileges             | mysql          | PROCEDURE    |
| mysql_cluster_move_grant_tables             | mysql          | PROCEDURE    |
| mysql_cluster_move_privileges               | mysql          | PROCEDURE    |
| mysql_cluster_restore_local_privileges      | mysql          | PROCEDURE    |
| mysql_cluster_restore_privileges            | mysql          | PROCEDURE    |
| mysql_cluster_restore_privileges_from_local | mysql          | PROCEDURE    |
+---------------------------------------------+----------------+--------------+
7 rows in set (0.01 sec)

Хранимая процедура с именем mysql_cluster_move_privileges создаёт резервные копии существующих таблиц привилегий, а затем преобразует их в NDB.

mysql_cluster_move_privileges выполняет резервное копирование и преобразование в два этапа. Первый шаг — это вызов mysql_cluster_backup_privileges, который создаёт две группы копий в базе данных mysql:

  • Группа локальных копий, использующих движок хранения MyISAM. Их имена генерируются путём добавления суффикса _backup к исходным именам таблиц привилегий.

  • Группа распределённых копий, использующих движок хранения NDBCLUSTER. Эти таблицы имеют имена, образованные путём добавления префикса ndb_ и суффикса _backup к именам исходных таблиц.

После создания копий mysql_cluster_move_privileges вызывает mysql_cluster_move_grant_tables, которая содержит инструкции ALTER TABLE ... ENGINE = NDB для преобразования системных таблиц MySQL в NDB.

Обычно не следует вызывать mysql_cluster_backup_privileges или mysql_cluster_move_grant_tables вручную; эти хранимые процедуры предназначены только для использования mysql_cluster_move_privileges.

Хотя исходные таблицы привилегий резервируются автоматически, всегда рекомендуется создавать резервные копии существующих таблиц привилегий на всех затронутых узлах SQL вручную перед продолжением. Это можно сделать с помощью mysqldump аналогичным образом, как показано ниже:

$> mysqldump options -uroot \
    mysql user db tables_priv columns_priv procs_priv proxies_priv > backup_file

Для выполнения преобразования необходимо подключиться к целевому узлу SQL с помощью клиента mysql (снова, как пользователь MySQL root). Вызовите хранимую процедуру следующим образом:

mysql> CALL mysql.mysql_cluster_move_privileges();
Query OK, 0 rows affected (22.32 sec)

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

mysql> SELECT CONCAT(
    ->    'Conversion ',
    ->    IF(mysql.mysql_cluster_privileges_are_distributed(), 'succeeded', 'failed'),
    ->    '.')
    ->    AS Result;
+-----------------------+
| Result                |
+-----------------------+
| Conversion succeeded. |
+-----------------------+
1 row in set (0.00 sec)

mysql_cluster_privileges_are_distributed проверяет наличие распределённых таблиц привилегий и возвращает 1, если все таблицы привилегий распределены; в противном случае возвращает 0.

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

mysql> SELECT TABLE_NAME, ENGINE FROM INFORMATION_SCHEMA.TABLES
    ->     WHERE TABLE_SCHEMA = 'mysql' AND TABLE_NAME LIKE '%backup'
    ->     ORDER BY ENGINE;
+-------------------------+------------+
| TABLE_NAME              | ENGINE     |
+-------------------------+------------+
| db_backup               | MyISAM     |
| user_backup             | MyISAM     |
| columns_priv_backup     | MyISAM     |
| tables_priv_backup      | MyISAM     |
| proxies_priv_backup     | MyISAM     |
| procs_priv_backup       | MyISAM     |
| ndb_columns_priv_backup | ndbcluster |
| ndb_user_backup         | ndbcluster |
| ndb_tables_priv_backup  | ndbcluster |
| ndb_proxies_priv_backup | ndbcluster |
| ndb_procs_priv_backup   | ndbcluster |
| ndb_db_backup           | ndbcluster |
+-------------------------+------------+
12 rows in set (0.00 sec)

После преобразования привилегий в распределённые любой раз, когда учётная запись пользователя MySQL создаётся, удаляется или обновляются её привилегии на любом узле SQL, изменения вступают в силу немедленно на всех остальных серверах MySQL, подключенных к кластеру. После распределения привилегий любые новые серверы MySQL, подключающиеся к кластеру, автоматически участвуют в распределении.

Примечание

Для клиентов, подключенных к узлам SQL в момент выполнения mysql_cluster_move_privileges, возможно, потребуется выполнить FLUSH PRIVILEGES на этих узлах SQL или отключить и затем подключить клиентов, чтобы клиенты смогли увидеть изменения привилегий.

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

В случае, если узел SQL отключается от кластера во время выполнения mysql_cluster_move_privileges, необходимо удалить его таблицы привилегий после повторного подключения к кластеру, используя оператор, такой как DROP TABLE IF EXISTS mysql.user mysql.db mysql.tables_priv mysql.columns_priv mysql.procs_priv. Это заставляет узел SQL использовать общие таблицы привилегий вместо своих локальных копий. Это не нужно при первоначальном подключении нового узла SQL к кластеру.

В случае первоначальной перезагрузки всего кластера (все узлы данных выключены, затем снова включены с --initial) общие таблицы привилегий теряются. Если это произойдёт, вы можете восстановить их на исходном целевом узле SQL либо из резервных копий, созданных mysql_cluster_move_privileges, либо из файла дампов, созданного с помощью mysqldump. Если для восстановления нужно использовать новый сервер MySQL, при первом подключении к кластеру его следует запустить с --skip-grant-tables; после этого вы можете восстановить таблицы привилегий локально, затем снова распределить их с помощью mysql_cluster_move_privileges. После восстановления и распределения таблиц необходимо перезапустить этот сервер MySQL без опции --skip-grant-tables.

Также можно восстановить распределённые таблицы с помощью ndb_restore --restore-privilege-tables из резервной копии, созданной с помощью START BACKUP в клиенте ndb_mgm. (Таблицы MyISAM, созданные mysql_cluster_move_privileges, не резервируются командой START BACKUP.) ndb_restore по умолчанию не восстанавливает таблицы привилегий; опция --restore-privilege-tables заставляет её это сделать.

Вы можете восстановить локальные привилегии узла SQL, используя одну из двух процедур. mysql_cluster_restore_privileges работает следующим образом:

  1. Если копии таблиц mysql.ndb_*_backup доступны, попытайтесь восстановить системные таблицы из этих копий.

  2. В противном случае попытайтесь восстановить системные таблицы из локальных резервных копий с именем *_backup (без префикса ndb_).

Другая процедура с именем mysql_cluster_restore_local_privileges восстанавливает системные таблицы только из локальных резервных копий, без проверки резервных копий ndb_*.

Системные таблицы, пересозданные mysql_cluster_restore_privileges или mysql_cluster_restore_local_privileges, используют движок хранения по умолчанию сервера MySQL; они не являются общими или распределёнными и не используют движок хранения NDB кластера NDB.

Дополнительная хранимая процедура mysql_cluster_restore_privileges_from_local предназначена для использования mysql_cluster_restore_privileges и mysql_cluster_restore_local_privileges. Не следует вызывать её напрямую.

Важно

Приложения, которые напрямую обращаются к данным NDB Cluster, включая приложения NDB API и ClusterJ, не подчиняются системе привилегий MySQL. Это означает, что после распределения таблиц предоставления к ним могут свободно обращаться такие приложения, как и к другим таблицам NDB. В частности, следует помнить, что приложения NDB API и ClusterJ могут читать и записывать имена пользователей, имена хостов, хэши паролей и любое другое содержимое распределённых таблиц предоставления без каких-либо ограничений.

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/mysql-cluster-privilege-distribution.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API