为什么我可以用SELECT读取MySQL表,但有时无法插入或更新?

为什么我可以用SELECT读取MySQL表,但有时无法插入或更新?,mysql,Mysql,我有一个MySQL问题,困扰了我很长时间。为什么有时一个表可以选择,但不能更新或插入 可能是桌子锁的原因吧。但我尝试了“显示打开的表”,它并没有显示表已锁定 是否有其他原因会导致此问题 为什么有时表可以选择但不能更新 还是插入 很可能是因为您连接的用户没有UPDATE或INSERT权限。您可以在MySQL中使用如下命令检查您所拥有的授权: SHOW GRANTS FOR 'user_name'@'localhost'; 确保将user\u name更改为用于连接服务器的用户名。还要确保loca

我有一个MySQL问题,困扰了我很长时间。为什么有时一个表可以
选择
,但不能
更新
插入

可能是桌子锁的原因吧。但我尝试了“显示打开的表”,它并没有显示表已锁定

是否有其他原因会导致此问题

为什么有时表可以选择但不能更新 还是插入

很可能是因为您连接的用户没有
UPDATE
INSERT
权限。您可以在MySQL中使用如下命令检查您所拥有的
授权

SHOW GRANTS FOR 'user_name'@'localhost';
确保将
user\u name
更改为用于连接服务器的用户名。还要确保
localhost
与您要连接的主机匹配。但也就是说,MySQL
GRANTS
可能令人困惑。例如,当我不得不清理其他人的工作时,我看到一些服务器,
localhost
无法工作,但
127.0.0.1
可以工作,因此您可能需要像这样运行上述命令:

SHOW GRANTS FOR 'user_name'@'127.0.0.1';
# * 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 
sudo service mysql restart
如果你需要调整你的
授权
,那么你可以运行这个;确保更改
数据库名称
用户名
本地主机
密码
,以匹配您的设置:

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
项以及其他杂项项

也就是说,根据您的评论,这可能是一个问题,即具有该数据库访问权限的某人或某些代码正在运行一条语句,这将导致您描述的行为。工作完成时,表将被锁定。然后将运行
解锁表
,以允许执行
更新
插入
命令

如果您希望调试并具有服务器级访问权限,您可能希望临时启用MySQL日志记录,以查看正在进行的查询。但是请记住:激活MySQL日志是一项资源消耗,它会降低服务器的运行速度。只有在您知道可以安全测试的情况下,才能在窗口期间执行此操作

以Ubuntu12.04服务器设置为例,您可以打开MySQL配置文件,如下所示:

sudo nano /etc/mysql/my.cnf
然后搜索
常规日志文件
常规日志
的设置,这些设置应该被注释掉,如下所示:

SHOW GRANTS FOR 'user_name'@'127.0.0.1';
# * 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 
sudo service mysql restart
取消对
general\u log\u文件
general\u log
的注释,然后像这样重新启动MySQL:

SHOW GRANTS FOR 'user_name'@'127.0.0.1';
# * 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 
sudo service mysql restart
现在,您可以使用
tail
跟踪MySQL日志:

sudo tail -f -n 200 /var/log/mysql/mysql.log

如果您看到
锁表
弹出在那里,您就知道这是原因。要禁用日志记录,只需注释掉这些行并重新启动MySQL。

登录的DB用户是否具有插入或更新权限?显示当前用户的权限将显示当前用户可以执行的操作如果“表”是视图,您可能无法修改它。有时我可以更新它,意味着执行更新或插入查询所需的时间不到0.01秒,但有时无法执行,这将需要很长时间才能超时。那么在这种情况下,是否仍然存在权限问题?我已经检查了权限,它显示“授予所有权限…”,因此我认为权限没有问题。“这可能与外键有关吗?”保林刚刚更新了我的答案。请检查一下。似乎能解决你所看到的问题。特别是
LOCK TABLES
语句的使用&如何尝试通过MySQL日志调试正在发生的事情。