我有一个MySQL问题很长时间困扰我。为什么有时桌子可以SELECT
但不能UPDATE
或INSERT
?
也许这就是桌面锁定的原因。但是我尝试了#34;显示表格",它没有显示表被锁定。
还有其他原因导致这个问题吗?
答案 0 :(得分:1)
为什么有时表可以是SELECT但不能更新 还是INSERT?
很可能是因为您要与之关联的用户没有UPDATE
或INSERT
权限。您可以使用MySQL中的命令检查GRANTS
中的SHOW GRANTS FOR 'user_name'@'localhost';
:
user_name
请务必将localhost
更改为用于连接服务器的用户名。另外,请确保GRANTS
与您要连接的主机相匹配。但话说回来,MySQL localhost
可能令人困惑。例如,我看到了一些服务器 - 当我不得不清理别人的工作时 - 127.0.0.1
不起作用,但SHOW GRANTS FOR 'user_name'@'127.0.0.1';
会起作用,所以你可能需要像这样运行上面的命令: / p>
GRANTS
如果你需要调整你的database_name
那么你可以运行它;请务必更改user_name
,localhost
,password
& GRANT USAGE ON `database_name`.* TO 'user_name'@'localhost' IDENTIFIED BY 'password';
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, EVENT, TRIGGER ON `database_name`.* TO 'user_name'@'localhost';
符合您的设置:
GRANT USAGE
第一行SELECT
向用户授予数据库的基本用法。下一行授予特定的访问权限,这是一个相当常见的堆栈,允许访问数据库中的UPDATE
,INSERT
或UNLOCK TABLES
项以及其他杂项。
也就是说,基于您的评论,似乎这可能是一个问题,即有人或某些代码可以访问该数据库运行LOCK TABLES
语句,从而导致您描述的行为。工作完成后,表将被锁定。之后会运行UPDATE
以允许INSERT
和sudo nano /etc/mysql/my.cnf
命令通过。
如果你想调试&具有服务器级访问权限,您可能希望暂时启用MySQL日志记录以查看正在进行的查询。但请记住:激活MySQL日志是一种资源匮乏的问题。可以减慢你的服务器速度。只有在你知道可以安全测试的窗口中才能这样做。
使用Ubuntu 12.04服务设置作为示例,您可以像这样打开MySQL配置文件:
general_log_file
然后搜索general_log
和# * Logging and Replication
#
# Both location gets rotated by the cronjob.
# Be aware that this log type is a performance killer.
# As of 5.1 you can enable the log at runtime!
#general_log_file = /var/log/mysql/mysql.log
#general_log = 1
的设置,这些设置应该被注释掉&看起来像这样:
general_log_file
取消注释general_log
和sudo service mysql restart
,然后像这样重新启动MySQL:
tail
现在,您可以使用sudo tail -f -n 200 /var/log/mysql/mysql.log
跟踪MySQL日志:
LOCK TABLES
如果你看到{{1}}出现在那里,你知道这就是原因。要禁用日志记录,请注释掉这些行&再次重启MySQL。