1) К нам обратились с проблемой что на слейве не работает создание тепмовых таблиц(в нашем коде такой происходит ) . Дали вот такой пример
Код:
1.
Так создает -
==============================================
create temporary table Bor_tmp like contract
Statement executed - no rows updated - 96ms
==============================================
2.
так не создает
==============================================
create temporary table Bor_tmp select * from contract
SQL Error [1142] [42000]: INSERT command denied to user 'bill-repl'@'10.10.10.2' for table 'Bor_tmp'
==============================================
и даже так не создает (эта выборка не возвращает строк)
==============================================
create temporary table Bor_tmp select * from contract c where c.title = 'z'
SQL Error [1142] [42000]: INSERT command denied to user 'bill-repl'@'10.10.10.2' for table 'Bor_tmp'
==============================================
2) В нашей документации написано
Цитата:
Для каждого приложения биллинга реплики указываются отдельно в *.properties файле, что позволяет регулировать использование реплик различными приложениями. Необходимо проконтролировать, чтобы пользователь <user> имел права только на SELECT и CREATE TEMPORARY TABLES в реплике. Также хорошим вариантом является выдача полного набора прав с установкой опции --read_only=1 при старте сервера MySQL (либо установка этой же опции в my.cnf файле).
3) В
Причем в документации Mysql написано что так и должно быть
Цитата:
Before MySQL 5.6.3, other operations on a temporary table, such as INSERT, UPDATE, or SELECT, require additional privileges for those operations for the database containing the temporary table, or for the nontemporary table of the same name. To keep privileges for temporary and nontemporary tables separate, a common workaround for this situation is to create a database dedicated to the use of temporary tables. Then for that database, a user can be granted the CREATE TEMPORARY TABLES privilege, along with any other privileges required for temporary table operations done by that user."
Смысл получается такой - Для записи в темповые таблицы нужны права insert и т.п. Как решение проблемы - надо это делать в отдельной базе(чисто для темовых таблиц) и на нее давать права insert и т.п. С 5.6.3 типа все нормально, но это достаточно свежая версия.
4) Я попробовал у себя(версия 5.5.29). Вначале с правами SELECT и CREATE TEMPORARY TABLES без read_only.
Цитата:
mysql> show variables like 'read_only';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| read_only | OFF |
+---------------+-------+
1 row in set (0.00 sec)
mysql> show grants for current_user;
+-----------------------------------------------------------------------------------------------------+
| Grants for test@% |
+-----------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'test'@'%' IDENTIFIED BY PASSWORD '*94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29' |
| GRANT SELECT, CREATE TEMPORARY TABLES ON `bgbilling`.* TO 'test'@'%' |
+-----------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)
mysql> create temporary table test11 like contract;
Query OK, 0 rows affected (0.03 sec)
mysql> create temporary table test22 select * from contract;
ERROR 1142 (42000): INSERT command denied to user 'test'@'localhost' for table 'test22'
mysql>
Потом с read_only
Цитата:
mysql> show variables like 'read_only';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| read_only | ON |
+---------------+-------+
1 row in set (0.00 sec)
mysql> show grants for current_user;
+-------------------------------------------------------------------------------------------------------------+
| Grants for bill@localhost |
+-------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'bill'@'localhost' IDENTIFIED BY PASSWORD '*5CFAA65DE2C8101B4E2C0DB8F362A603B6B57209' |
| GRANT ALL PRIVILEGES ON `bgbilling`.* TO 'bill'@'localhost' |
+-------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)
mysql> create temporary table test33 like contract;
Query OK, 0 rows affected (0.04 sec)
mysql> create temporary table test44 select * from contract;
ERROR 1290 (HY000): The MySQL server is running with the --read-only option so it cannot execute this statement
mysql>
Т.е не работает
5) На моей памяти в helpdesk к нам обращались несколько раз подобной проблемой .И было 2 случая
a) Было неверно настроены права , мы кидали ссылку на нашу доку и проблема решалась .
б) Был косяк в коде , вместо темповой таюлицы мы создавали обычную(забывали слово TEMPORARY) .Выкладывали обновление, проблема решалась.
6) Вопрос - у всех так же не работает ? Как вариант может оно раньше работало , а потом mysql поправил логику (причем для всех версии сразу ) . Или вообще никогда не работало . Но как могло так получится - я не понимаю пока .