为什么我能用SELECT读取MySQL表但我有时无法INSERT或UPDATE?

时间:2014-05-15 02:53:38

标签: mysql

我有一个MySQL问题很长时间困扰我。为什么有时桌子可以SELECT但不能UPDATEINSERT

也许这就是桌面锁定的原因。但是我尝试了#34;显示表格",它没有显示表被锁定。

还有其他原因导致这个问题吗?

1 个答案:

答案 0 :(得分:1)

  

为什么有时表可以是SELECT但不能更新   还是INSERT?

很可能是因为您要与之关联的用户没有UPDATEINSERT权限。您可以使用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_namelocalhostpassword& 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向用户授予数据库的基本用法。下一行授予特定的访问权限,这是一个相当常见的堆栈,允许访问数据库中的UPDATEINSERTUNLOCK TABLES项以及其他杂项。

也就是说,基于您的评论,似乎这可能是一个问题,即有人或某些代码可以访问该数据库运行LOCK TABLES语句,从而导致您描述的行为。工作完成后,表将被锁定。之后会运行UPDATE以允许INSERTsudo 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_logsudo service mysql restart ,然后像这样重新启动MySQL:

tail

现在,您可以使用sudo tail -f -n 200 /var/log/mysql/mysql.log 跟踪MySQL日志:

LOCK TABLES

如果你看到{{1}}出现在那里,你知道这就是原因。要禁用日志记录,请注释掉这些行&再次重启MySQL。