.mysql_history未自动保存

时间:2016-02-08 02:21:52

标签: mysql linux debian

我一直无法让mysql命令行历史记录为我的用户工作,即使它适用于同一台机器上的其他用户(Debian上的mysql 5.5“wheezy”发行版)。我现在已经结束了,我希望有人可以帮助我...

每当我启动mysql时,我都没有回滚的历史记录(例如,当我尝试向上箭头时,它只会发出视觉警报)。

然而,正如我正在使用它,历史记录正常(在一个会话中)。也就是说,自从我启动mysql以来,我可以回到之前的命令。但是,第二次我退出了mysql,我失去了我的所有历史,并且必须在下次重新开始。

毋庸置疑,这非常令人沮丧!

为了排除故障,我做了三件事,其中没有任何一件事有任何不同:

(1)我明确设置环境变量(使用bash):

% MYSQL_HISTFILE=~/.mysql_history
% echo $MYSQL_HISTFILE
/var/home/userx/.mysql_history

...我仔细检查了权限是否设置正确(在文件和目录上都有 - 注意,我创建了一个空文件,以确保它本身没有创建它):

drwxr-xr-x  53 userx userx 4096 Jan 24 15:26 /var/home/userx
-rw-------   1 userx userx    0 Jan 31 04:14 /var/home/userx/.mysql_history

我确认它是“-rw -------”并且文件由有问题的用户(我)拥有,与同一台机器上的所有其他用户完全相同。虽然,mysql客户端文档并没有说您需要设置此环境变量,除非您想要更改它(所以我当然尝试了它而不设置该变量)。

(2)我尝试在/etc/mysql/my.cnf中设置/调整各种与日志相关的配置(从查看文档;但是,所有设置似乎都是关于记录,而不是命令行历史记录。)

/etc/mysql/*.cnf中的任何设置似乎都与命令行日志记录无关(仅限服务器级日志记录,例如/var/log/mysql...)。

可以肯定的是,我将所有内容都恢复到了标准安装中的状态(通过debian wheezy apt-get install mysql),所以我的任何一次捣乱实际上都不是原因。 (注意:它适用于同一台机器上的其他用户!)

(3)我尝试在mysql本身内检查/调整各种变量(根据我发过的各种内容)。但是很难找到好的信息,因为它适用于同一台机器上的其他用户,我对这是否重要持怀疑态度。无论如何,这就是我在这里所做的:

首先,为了获得所有当前设置变量的列表,我做了:

% echo "show variables" | mysql > /tmp/vars

透过它们,我没有看到任何与之相关的东西。但是这里有一些例子(在这里把它们全部转储太长了;让我知道如果有一个变量或者我可以做的一个搜索可能会得到答案):

% grep -i hist /tmp/vars
performance_schema_events_waits_history_long_size       10000
performance_schema_events_waits_history_size    10
profiling_history_size  15

......以及......

% grep -i log /tmp/vars    (note: irrelevant binlog stuff excerpted)
back_log        50
expire_logs_days        10
general_log     OFF
general_log_file        /var/lib/mysql/xxx.log
innodb_log_group_home_dir       ./
innodb_mirrored_log_groups      1
log     OFF
log_error
log_output      FILE
log_queries_not_using_indexes   OFF
log_slave_updates       OFF
log_slow_queries        OFF
log_warnings    1
slow_query_log  OFF
slow_query_log_file     /var/lib/mysql/rimu3-slow.log

这些似乎都不相关,也没有根据与变更变量相关的各种网络搜索做出的任何事情解决了我的问题 - 并且,请记住:同一台机器上的其他用户都没有这个问题。因此,除非我找不到的变量或其他服务器状态实际上是指我的用户,或者某个地方有某些访问策略我没有发现具体指我的用户(例如),这只是不可解释的。 / p>

我能找到的关于mysql_history文件的唯一文档 here。但它没有告诉你如何启用 mysql_history! (它只说明如何禁用,或改变它的位置,这对我来说也没有任何改变。)

总结一下,我已经确认,最后,我的故障排除最终没有留下任何错误设置:我回到标准环境变量,服务器配置,变量等。

我真的很难过这里。任何帮助都会非常感激!

史蒂夫

1 个答案:

答案 0 :(得分:1)

我发现了问题。

实际上有两个用于mysql历史记录的两个文件:~/.mysql_history~/.mysql_history.TMP。我只使用ptrace发现了第二个文件:

open("/var/home/userx/.mysql_history.TMP", O_WRONLY|O_CREAT|O_TRUNC|O_LARGEFILE, 0600) = -1 EACCES (Permission denied)

知道有两个文件,问题变得更加清晰:

% ls ~/.mysql_history*
-rw-------   1 userx userx      0 Jan 31 04:14 /var/home/userx/.mysql_history
-rw-------   1 root  root  279506 May 11  2014 /var/home/userx/.mysql_history.TMP

(是的,这个问题已经回到了2014年5月,所以现在这一切都变得非常有意义。)

在我的情况下,我通过sudo进行了root访问,因此我可以轻松修复它:

% sudo chown userx:userx /home/userx/.mysql_history.TMP

随后mysql的使用工作得非常完美(虽然我之间的所有历史仍然永远丢失)。 : - (

根本问题是:  (a)mysql文档没有提到这个文件(事实上,不应该真的需要它),和  (b)mysql客户端不会向最终用户发出任何错误消息,让他们知道此文件在启动或退出时都是不可修改的。

-

所以,简而言之,你有它:

(1)mysql文档未提及它使用.mysql_history.TMP需要相同权限的任何地方。

(2)使用像rlwrap这样的包装器解决了这个问题(参见上面的评论),因为它显然没有使用该文件的.TMP版本。

史蒂夫